如果两个矩形重叠,你能解释一下这段代码发现方式背后的逻辑吗?
public static boolean overlaps(GRectangle r1, GRectangle r2) {
return (r1.getX() < r2.getX() + r2.getWidth())
&& (r1.getX() + r1.getWidth() > r2.getX())
&& (r1.getY() < r2.getY() + r2.getHeight())
&& (r1.getY() + r1.getHeight() > r2.getY());
}
答案 0 :(得分:0)
要使两个矩形重叠,它们必须在水平和垂直方向上重叠。前两个条件测试水平重叠,后两个测试垂直重叠。
要测试单个维度中区域的重叠,您需要考虑矩形不重叠的可能方式。一种可能性是第一个矩形的左边缘位于第二个矩形的右边缘的右侧,因此它们之间存在空间。第二种可能性反之亦然:第一个矩形的右边缘是第二个矩形的左边两个。如果这两种可能性都是假的,则必须存在重叠,因此if语句测试这两种情况的相反情况。
因为使用小于/大于且不小于或等于/大于或等于,所以触摸但不重叠的矩形将不被视为重叠。
答案 1 :(得分:0)
第一个条件检查以确保r1
的左侧不在r2
右侧的右侧。如果是这种情况,则矩形显然不会重叠。
其他条件检查类似的事情:
条件2确保r1
的右侧位于r2
左侧的右侧。
条件3确保底边r1
低于r2
的顶部。
条件4确保r1
的顶部高于r2
的底部。
如果这些条件中的任何一个失败,则矩形无法重叠。当所有条件都是true
时,它们会激动地重叠。
旁注:我假设坐标系左下角有(0,0)。对于坐标系的任何其他方向或反演,同样的基本逻辑也是如此。