【问题标题】:How to project a polygon on an axis如何在轴上投影多边形
【发布时间】:2014-01-24 07:35:28
【问题描述】:

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

问题是,我数学很烂。

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

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

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

我想我明白如何执行第 1 步。但我不明白如何执行第 2 步。

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

(虽然我确实在基本层面上学习了一些数学概念,例如点积和向量。所以你可以使用这些术语与我交谈。)

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

我们将不胜感激。非常感谢

【问题讨论】:

  • 这是一个有用的教程:codezealot.org/archives/55
  • Point in polygon 算法可能会为您提供所需的东西。您只需要知道其中一个顶点是否真的在另一个多边形中。好吧...除非一个只与一条线相交。
  • @gtgaxiola 我正在通过本教程学习。但是我被困在解释如何将多边形投影到轴上的点上。这就是教程中写的:“将多边形投影到轴上相对简单;遍历所有顶点,执行与轴的点积并存储最小值和最大值。” 我没有'不明白这一点。 什么最小值和最大值?
  • 如果没有一个多边形完全包含在另一个多边形中,您可能只需检查一个多边形的任何线是否与另一个多边形的任何线相交
  • @Felix Castor 不是这样。考虑顶点为 (10, 0) (10, 10), (11, 0) 的三角形和顶点为 (12, 5), (12, 6), (3, 6) 的三角形。它们相交,但另一个三角形中没有角。

标签: java math geometry polygons


【解决方案1】:

看两个向量的标量乘法:

(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) + ...;

所以现在只需将所有线条投影为矢量,如下所示:

x0 = ((L0 - A0) ⋅ (A1 - A0)) / |(A1 - A0)|;
x1 = x0 + ((L1 - L0) ⋅ (A1 - A0)) / |(A1 - A0)|;

[备注]

如果您将轴矢量(A1 - A0) 设置为单位...|A| = 1,那么您可以忘记热力/ |(A1 - A0)|,它会大大加快速度。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-30
    • 1970-01-01
    • 2012-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多