检查两个正方形是否相交

use*_*740 0 c++

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

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;
   }
Run Code Online (Sandbox Code Playgroud)

任何想法优化此代码?

Snp*_*nps 5

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

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

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

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

(aX < (bX + bLen) && (aX + aLen) > bX)
&& (aY < (bY - bLen) && (aY - aLen) > bY)
Run Code Online (Sandbox Code Playgroud)

换句话说,有四种可能的情况,以及您是否是直角的B的角落是方形的X-范围内,A 并且,要么广场B的角落是正方形的Y范围内A

(Y)
 ^
 |             1:                        2:
 |       +--------+                   +--------+
 |       |        |                   |        |
 |       |   A +--|-----+       +-----+--+ A   |
 |       |     |  |     |       |     |  |     |
 |       +-----+--+ B   |       |   B +--+-----+
 |             |        |       |        |
 |             +--------+       +--------+
 |
 |             3:                        4:
 |       +--------+                   +--------+
 |       |        |                   |        |
 |       |   B +--|-----+       +-----+--+ B   |
 |       |     |  |     |       |     |  |     |
 |       +-----+--+ A   |       |   A +--+-----+
 |             |        |       |        |
 |             +--------+       +--------+
 |
 +-------------------------------------------------> (X)
Run Code Online (Sandbox Code Playgroud)

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

  • 提议的公式似乎太复杂了,存在一个更简单的公式:http://silentmatt.com/rectangle-intersection/。另请参阅链接的可能重复问题。 (3认同)