0

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

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

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

任何帮助我解决这个问题的帮助将不胜感激!

编辑:对象是严格的矩形,坐标遵循像素监视器约定。即0,0是物体的左上角,x增加对应向右,y增加表示向下。

4

3 回答 3

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。请注意,我使用的是伪语言

于 2013-05-20T23:23:34.643 回答
0

这样做的一个特别糟糕(但直观)的方法是沿着这条推理线:

如果两个 2D 矩形重叠,那么其中一个的某些边肯定会与另一个的某些边相交。实际上,即使构成其中一个的线段之一与另一个的线段之一相交,矩形也会重叠。

因此,您可以遍历它们的两侧并逐对检查它们的交叉点。查找线段相交的代码或想法一点也不难。

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

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

假设这两个矩形被命名为Aand B,并且假设它们的 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)

在(有点)伪代码中,您可以编写:

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 */

再次注意,带有接触边的矩形需要小心处理。

于 2013-05-20T23:28:56.820 回答
0

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

在此处输入图像描述

x1如果 和 之间的距离x2小于靠近 x 轴的对象的宽度(w1在图片上的情况下),则两个对象在 x 轴上重叠。

伪代码:

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

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

于 2013-05-20T23:44:34.137 回答