通过沿矢量移动解决碰撞旋转矩形

Resolve colliding rotated rectangles by moving along vector

我有一个 javascript 程序,可以按 逆时针 顺序沿着房间的墙壁一次放置一个矩形。我使用矩形角的坐标进行碰撞检测。如果它与房间中的另一个矩形相交,它会跳过矩形的放置。



(房间可以是任何形状,所以碰撞可以发生在矩形的任何一边)



但是,我想沿着墙壁移动矩形,直到它不再碰撞而不是跳过它。我目前的想法是在循环中一次移动矩形1个坐标,直到它不再相交,但它似乎不是一个很好的性能解决方案。

有没有办法从数学上知道旋转的矩形在给定方向上需要移动多远才能不再与另一个旋转的矩形相交?

考虑使用分离轴定理。

两个盒子(广义的多边形)不相交,如果有一条轴平行于某条盒子的边,将盒子分开,则位于这条轴的不同边。

我有 arbitrary paper with good picture。在第 16-17 页,我们可以看到两个框和一些用于检查交集的公式。

您可以将 T - 框中心之间的差异向量表示为

T.x = pb.x - pa.x + t * dx
T.y = pb.y - pa.y + t * dy

其中t是参数(起始时刻为0),(dx, dy)是B框移动的方向向量(沿着你图片的倾斜墙)。

T分量代入公式(注意我把>符号改成了=)可以得到Ax成为分离轴时刻对应的参数t的方程.

| T • Ax | = WA + | ( WB*Bx ) • Ax  | + |( HB*By ) • Ax |

如果我们对其他轴(Ay,Bx,By)做同样的事情,我们得到t的4个值,最小的正值对应最小值分离箱子所需的位移。

请注意,右侧部分仅包含常数值(对于给定设置),我们可以使用 abs 函数轻松计算它,但左侧部分包含变量,因此我们必须考虑两种情况(负值和正值点积 T • Ax) 来找到解决方案。两种可能的解决方案对应“左右”框分离(反正你需要更小的正结果)