我将假设您的正方形轴对齐,但展示一种即使它们不是也可以工作的技术。
一般结果(凸多边形)
该方法依赖于两组的 Minkowski 差,这是一种寻找交叉点的常用技术。
两个凸形状的 Minkowski 差是凸的,如果两个原始集合都是多边形,则结果形状是多边形。这意味着它可以表示为一组方程,其中每个 n i都是单位法线。
因此,确定两个形状是否相交的算法是:
- 确定两种形状的闵可夫斯基差。
- 确定原点是否落入闵可夫斯基和内(如果所有 都为真
c_i<0
)
然后是深度的度量max(c_i)
轴对齐正方形的特殊情况
现在对于两个轴对齐的正方形,Minkowski 和只是另一个轴对齐的正方形。以正方形 A 为中心,(cA_x,cA_y)
以宽WA
和高为中心,HA
我们可以将其表示为:
A = { (cA_x + a WA/2, cA_y + b HA/2), where -1<=a<=1, -1<=b<=1 }
同样,正方形 B 将是:
B = { cB_x + c WB/2, cB_y + d HB/2), where -1<=c<=1, -1<=b<=1 }
那么闵可夫斯基差是
A-B = { (cA_x - cB_x + a WA/2 - c WB/2, cA_y - cB_y + b HA/2 - d HB/2), where ... }
= { (cA_x - cB_x + r (WA-WB)/2, A_y - cB_y + s (HA-HB)/2), where -1<=s<=1, -1<=r<=1 }
那么的 4 个边A-B
是
x > (cA_x-cB_x) - |WA-WB|/2
y > (cA_y-cB_y) - |HA-HB|/2
x < (cA_x-cB_x) + |WA-WB|/2
y < (cA_y-cB_y) + |HA-HB|/2
最后两个可以改写为
x > -(cA_x-cB_x) - |WA-WB|/2
y > -(cA_y-cB_y) - |HA-HB|/2
因此我们发现相交的深度为:
min(
(cA_x-cB_x) - |WA-WB|/2,
(cA_y-cB_y) - |HA-HB|/2,
-(cA_x-cB_x) - |WA-WB|/2,
-(cA_y-cB_y) - |HA-HB|/2 )
仅当此深度为正时才会发生相交。
(注意:我在写这篇文章时一直在计算数学,所以很可能我在这里或那里有一个不正确的符号......请随时纠正任何此类错误......)