我正在尝试学习分离轴定理。这是因为我正在制作一个简单的2D游戏,我需要这个来检测两个多边形是否相交。
问题是,我吮吸数学。
到目前为止,据我所知,为了知道两个多边形是否相交,我需要做以下几点:
如果第一个多边形的所有投影重叠第二个多边形的所有投影,则形状相交。否则,形状不相交。
我想我明白了如何做第1步。但我不明白如何执行第2步。
如何将多边形投影到轴上?请用一种我能够理解的语言解释这一点,作为一个具有数学基础知识的人。
(虽然我 在基本级别上学习了一些数学概念,例如点积和向量。所以你可以使用这些术语与我交谈。)
理论上的解释会很棒,但是也欢迎在代码(最好是Java)中实现它的一个例子。
帮助将不胜感激。非常感谢
答案 0 :(得分:4)
查看两个向量的标量乘法:
(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) + ...;
所以现在只需占用所有线条并将它们投影为这样的矢量:
x0 = ((L0 - A0) ⋅ (A1 - A0)) / |(A1 - A0)|;
x1 = x0 + ((L1 - L0) ⋅ (A1 - A0)) / |(A1 - A0)|;
<强> [注释] 强>
如果您将轴向量(A1 - A0)
设置为单位... |A| = 1
,那么您可以忘记加速/ |(A1 - A0)|
的加热{{1}}。