这样做的一个特别糟糕(但直观)的方法是沿着这条推理线:
如果两个 2D 矩形重叠,那么其中一个的某些边肯定会与另一个的某些边相交。实际上,即使构成其中一个的线段之一与另一个的线段之一相交,矩形也会重叠。
因此,您可以遍历它们的两侧并逐对检查它们的交叉点。查找线段相交的代码或想法一点也不难。
重要提示:您需要自己定义在矩形之间共享边是否构成重叠。如果没有,那么您在执行上述方法时必须格外小心。
对于轴对齐的矩形(边平行于轴的矩形),解决方案非常简单:
假设这两个矩形被命名为A
and 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 */
再次注意,带有接触边的矩形需要小心处理。