我正在尝试学习分离轴定理。这是因为我正在制作一个简单的 2D 游戏,我需要用它来检测两个多边形是否相交。
问题是,我的数学很烂。
到目前为止,我明白为了知道两个多边形是否相交,我需要执行以下操作:
- 为两个多边形的每条边创建一条垂直线。
- 将每个多边形投影到创建的每条新线(轴)。
如果第一个多边形的所有投影与第二个多边形的所有投影重叠,则形状相交。否则,形状不相交。
我想我了解如何执行第 1 步。但我不了解如何执行第 2 步。
如何将多边形投影到轴上?请用我能够理解的语言解释这一点,作为一个具有相当基本数学知识的人。
(尽管我确实学习了一些基本的数学概念,例如点积和 vector 。所以您可以使用这些术语与我交谈。)
理论上的解释会很好,但也欢迎提供有关如何在代码(最好是 Java)中实现它的示例。
帮助将不胜感激。非常感谢
最佳答案
看看两个 vector 的标量乘法:
(A ⋅ B) = |A| ⋅ |B| ⋅ cos(a);
-
A, B
是载体。 -
a
是A, B
之间的角度.
所以如果你想要 A
的大小投影到 B = C
:
|C| = |A| ⋅ cos(a);
|C| = (A ⋅ B) / |B|;
如果您不知道公式或不确定符号,那么:
|B| = sqrt((B.x)² + (B.y)² + (B.z)² + ...);
A ⋅ B = (A.x ⋅ B.x) + (A.y ⋅ B.y) + (A.z ⋅ B.z) + ...;
现在把所有的线都投影成像这样的 vector :
x0 = ((L0 - A0) ⋅ (A1 - A0)) / |(A1 - A0)|;
x1 = x0 + ((L1 - L0) ⋅ (A1 - A0)) / |(A1 - A0)|;
[注释]
如果设置轴 vector (A1 - A0)
作为单位... |A| = 1
那么你就可以忘记热 / |(A1 - A0)|
这大大加快了速度。
关于java - 如何在轴上投影多边形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20957749/