我有一个问题,我不想要一个实现。我只想在我的推理中得到一些帮助。
我想确定两个对象是否重叠(它们的x和y坐标,以及它们的高度和宽度是否存储在向量中)然后,如果它们存在,则将它们从当前向量中移除并将它们添加到另一个对象中综合性能。
我的问题是,一般来说,你怎么知道什么时候重叠?显然,由于y的不同,它们可以具有相同的x并且不重叠,反之亦然。我想我需要有关宽度和高度的信息以及对象边缘的位置,但我现在甚至不知道如何将其转换为伪代码。
非常感谢帮助我解决这个问题的任何帮助!
编辑:对象严格为矩形,坐标遵循像素监视器约定。即0,0是对象的左上角,x的增加对应于向右,而y的增加意味着向下。
答案 0 :(得分:1)
考虑两个矩形R1和R2。
重叠x:
if (R2.x < R1.x + R1.width) AND (R1.x < R2.x + R2.width)
重叠y
if (R2.y < R1.y + R1.height) AND (R1.y < R2.y + R2.height)
PS。请注意,我使用伪语言
答案 1 :(得分:0)
这样做的一个特别糟糕(但直观)的方法就是这样的推理:
如果两个2D矩形重叠,那么其中一个的一些边必然与另一个的一些边相交。实际上,即使构成其中一个线段的其中一个线段与另一个线段相交,矩形也会重叠。
所以,你可以绕过它们的边并按对检查它们的交叉点。查找线段交叉点的代码或想法应该不会很难。
重要提示:您需要自己定义矩形之间共享是否构成重叠。如果没有,那么在实施上述方法时你必须格外小心。
对于轴对齐的矩形(边长平行于轴的矩形),解决方案非常简单:
假设两个矩形的名称为A
和B
,并假设它们的4个边被命名为left
(最小X坐标),right
(最大X坐标) ,top
(最小Y坐标)和bottom
(最大Y坐标。)然后我认为你可以说它们重叠如果(并且只有)任何这些是真的:
A.right
小于B.left
(A完全位于B的左侧)A.left
大于B.right
(A完全位于B的右侧)A.bottom
小于B.top
(A完全高于B)A.top
大于B.bottom
(A完全低于B)在(有些)伪代码中,你可以写:
if (A.right < B.left || A.left > B.right || A.bottom < B.top || A.top > B.bottom)
/* don't overlap */
或用另一种(更对称,也许更容易理解)形式写成:
if (A.right < B.left || B.right < A.left || A.bottom < B.top || B.bottom < A.top)
/* don't overlap */
再次注意,需要稍微小心处理具有接触面的矩形。
答案 2 :(得分:0)
也许一张照片会有所帮助。这是包含两个对象的坐标系。
如果x1
和x2
之间的距离小于更靠近x轴的对象的宽度,则x轴上有两个对象重叠(图片中的情况为w1
)。
伪代码:
w = width of leftmost object
if ( abs (x1-x2) < w ) /* overlap on x axis */
您需要对y轴执行相同操作。如果两个检查都返回true,则对象重叠。