理论 - 如何判断元素是否重叠?

时间:2013-05-20 23:14:25

标签: c++ vector collision-detection theory

我有一个问题,我不想要一个实现。我只想在我的推理中得到一些帮助。

我想确定两个对象是否重叠(它们的x和y坐标,以及它们的高度和宽度是否存储在向量中)然后,如果它们存在,则将它们从当前向量中移除并将它们添加到另一个对象中综合性能。

我的问题是,一般来说,你怎么知道什么时候重叠?显然,由于y的不同,它们可以具有相同的x并且不重叠,反之亦然。我想我需要有关宽度和高度的信息以及对象边缘的位置,但我现在甚至不知道如何将其转换为伪代码。

非常感谢帮助我解决这个问题的任何帮助!

编辑:对象严格为矩形,坐标遵循像素监视器约定。即0,0是对象的左上角,x的增加对应于向右,而y的增加意味着向下。

3 个答案:

答案 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矩形重叠,那么其中一个的一些边必然与另一个的一些边相交。实际上,即使构成其中一个线段的其中一个线段与另一个线段相交,矩形也会重叠。

所以,你可以绕过它们的边并按对检查它们的交叉点。查找线段交叉点的代码或想法应该不会很难。

重要提示:您需要自己定义矩形之间共享是否构成重叠。如果没有,那么在实施上述方法时你必须格外小心。

对于轴对齐的矩形(边长平行于轴的矩形),解决方案非常简单:

假设两个矩形的名称为AB,并假设它们的4个边被命名为left(最小X坐标),right(最大X坐标) ,top(最小Y坐标)和bottom(最大Y坐标。)然后我认为你可以说它们重叠如果(并且只有)任何这些是真的:

  1. A.right小于B.left(A完全位于B的左侧)
  2. A.left大于B.right(A完全位于B的右侧)
  3. A.bottom小于B.top(A完全高于B)
  4. A.top大于B.bottom(A完全低于B)
  5. 在(有些)伪代码中,你可以写:

    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)

也许一张照片会有所帮助。这是包含两个对象的坐标系。

enter image description here

如果x1x2之间的距离小于更靠近x轴的对象的宽度,则x轴上有两个对象重叠(图片中的情况为w1 )。

伪代码:

w = width of leftmost object
if ( abs (x1-x2) < w ) /* overlap on x axis */

您需要对y轴执行相同操作。如果两个检查都返回true,则对象重叠。