0

我想检查两个正方形是否相互交叉。我的想法是这样的

for (i = 0; i < 4; i++)
   for (j = 0; j < 4; j++) {
       bool x = check line(i) of first square intersect with 
       line (j) of the second square
       if (x) return;
   }

有什么想法可以优化这段代码吗?

4

1 回答 1

5

您不必遍历所有坐标来检查两个正方形是否相交。

这是一个简单的解决方案,只要正方形不旋转,它就可以工作。

假设您用左上角坐标和边长表示一个正方形。设aXaY表示正方形的坐标和aLen边长,正方形A反之亦然B

然后检查 square 是否B与 square 相交A评估这个:

(aX < (bX + bLen) && (aX + aLen) > bX)
&& (aY < (bY - bLen) && (aY - aLen) > bY)

换句话说,有四种可能的情况,您检查 squareB的任一角是否在 square 的 X 范围内,A 以及square 的任B一角是否在 square 的 Y 范围内A

(Y)
 ^
 |             1:                        2:
 |       +--------+                   +--------+
 |       |        |                   |        |
 |       |   A +--|-----+       +-----+--+ A   |
 |       |     |  |     |       |     |  |     |
 |       +-----+--+ B   |       |   B +--+-----+
 |             |        |       |        |
 |             +--------+       +--------+
 |
 |             3:                        4:
 |       +--------+                   +--------+
 |       |        |                   |        |
 |       |   B +--|-----+       +-----+--+ B   |
 |       |     |  |     |       |     |  |     |
 |       +-----+--+ A   |       |   A +--+-----+
 |             |        |       |        |
 |             +--------+       +--------+
 |
 +-------------------------------------------------> (X)

有关更多信息,请参阅类似问题的答案:确定两个矩形是否相互重叠?

于 2013-08-11T15:16:27.950 回答