java - 如何在轴上投影多边形

标签 java math geometry polygons

我正在尝试学习分离轴定理。这是因为我正在制作一个简单的 2D 游戏,我需要用它来检测两个多边形是否相交。

问题是,我的数学很烂。

到目前为止,我明白为了知道两个多边形是否相交,我需要执行以下操作:

  1. 为两个多边形的每条边创建一条垂直线。
  2. 将每个多边形投影到创建的每条新线(轴)。

如果第一个多边形的所有投影与第二个多边形的所有投影重叠,则形状相交。否则,形状不相交。

我想我了解如何执行第 1 步。但我不了解如何执行第 2 步。

如何将多边形投影到轴上?请用我能够理解的语言解释这一点,作为一个具有相当基本数学知识的人。

(尽管我确实学习了一些基本的数学概念,例如点积和 vector 。所以您可以使用这些术语与我交谈。)

理论上的解释会很好,但也欢迎提供有关如何在代码(最好是 Java)中实现它的示例。

帮助将不胜感激。非常感谢

最佳答案

看看两个 vector 的标量乘法:

(A ⋅ B) = |A| ⋅ |B| ⋅ cos(a);
  • A, B是载体。
  • aA, 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) + ...;

scalar multiplication

现在把所有的线都投影成像这样的 vector :

line projection

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/

相关文章:

algorithm - 如何生成二维凹多边形的 "inner shape"?

java - 如何调整现有 pdf 页面大小

java - 使用 JUnit 在注释中创建注释

java - 在 eclipse 插件中查找资源的路径

c++ - 计算 char 数组中的字符数,包括空格,直到 null char

javascript - 锦标赛配对算法

math - 如何找到有向距离的符号?

geometry - 鲁棒线性插值

java - 如何在 Hibernate 上比较同一实体的延迟加载对象?

c# - 寻找第一和第三四分位数