java确定一个形状是否高于另一个形状
我试图确定一个四边形是否高于另一个四边形,并返回未覆盖量的比率。我对“未覆盖”的定义是,如果在y轴上被检查的形状上方没有其他形状,以及它们在x轴上相交的程度
例如:
在上图中,所需输出应为0.6363。在110个像素中,70个与上面的对象相交,70/110=0.6363
另一个例子:
在本例中,所需输出为0.3636
到目前为止,我尝试的是从double out = 1;
开始,然后如果形状2的y轴小于形状1,我从带有out-=(c.getX2()-b.getX2())/Math.abs(c.getX1()-c.getX2());
变量的比率中减去两个形状在x轴上相交的量
然而,这似乎不起作用,我试图更正代码的尝试似乎只是增加了越来越多不必要的复杂性。我想有一种更简单的方法来做我想做的事情,但我对几何不太在行
c
是正在检查的当前形状,而b
是正在与之进行比较的形状
if(((b.getX2() < c.getX2()) && (b.getX2()>c.getX1()))||((b.getX2()>c.getX2())&&(b.getX2()<c.getX1()))||((b.getX1()>c.getX2())&&(b.getX1()<c.getX1()))) {
if(b.getY2() < c.getY2()) {
if((b.getX2() < c.getX2()) && (b.getX2()>c.getX1())) {
out-= (c.getX2()-b.getX2())/Math.abs(c.getX1()-c.getX2());
}
if(((b.getX2()>c.getX2())&&(b.getX2()<c.getX1()))) {
out-=(b.getX2()-c.getX2())/Math.abs(c.getX1()-c.getX2());
}
if(((b.getX1()>c.getX2())&&(b.getX1()<c.getX1()))) {
out-=(c.getX2()-b.getX2())/Math.abs(c.getX1()-c.getX2());
}
}
}
# 1 楼答案
我认为您的方法非常复杂,您可能只是在所有不同的可能条件和配置中迷失了方向
如果我理解正确,那么最简单的解决方案是根据两种形状的最小和最大X值进行计算
旁注:
您没有说明您的“形状”对象} 对象,但它们并不是真正的“四边形”。在任何情况下,您都可以计算最小值和最大值,如下所示:
b
和c
是什么类型。从您正在调用的方法来看,它们可能是^{在下面的程序中,我使用实际的
Shape
对象并调用getBounds2D
方法来获得边界框,它方便地提供这些最小/最大值。但您也可以手动执行此操作当具有这些最小/最大值时,可以排除对象完全位于另一个对象左侧或右侧的情况。如果不是这样,它们是重叠的。在这种情况下,您可以计算重叠的最小值和最大值,然后将其除以相关对象的宽度
下面是一个程序,其中一个示例对象是根据您在问题中给出的坐标创建的。可以使用鼠标在对象周围拖动。将绘制重叠部分并打印其值
计算在
computeOverlap
方法中进行