【问题标题】:Triangle - Square intersection test in 2d三角形 - 二维正方形相交测试
【发布时间】:2012-12-09 18:12:33
【问题描述】:

如何测试三角形和正方形是否相交?

当我们知道它是正方形而不是矩形时,有什么方法可以优化它吗?此外,正方形是轴对齐的,因此应该会进一步提高性能吗?

或者我应该把正方形分成三角形,然后检查两次三角形与三角形的交点?

编辑:澄清:我正在尝试检查这两个形状是否以任何方式相互重叠。所以三角形可以在正方形里面,正方形可以在三角形里面,它也应该返回true。

【问题讨论】:

  • 您是要查看是否有任何边相交,还是要查看区域是否相交。对于后者,您还需要考虑其中一个形状完全包含在另一个形状中的情况。
  • @JayElston,基本上我想知道这两个形状是否以任何方式相互重叠。
  • @Rookie :: 如果你找到答案,你能更新答案吗?你能评论一下计算时间和你的实现的高级流程吗?谢谢

标签: c++ math geometry collision-detection intersection


【解决方案1】:

将矩形(或正方形)与三角形的每条边进行比较,方法是获取三角形的顶点并为每条边建立直线方程,并以一致的顺序(顺时针或逆时针围绕三角形)。

如果矩形在任何边上完全位于三角形之外,则它不相交。

用矩形的边缘对着三角形再次测试。

知道矩形是轴对齐的,可能会提高性能,因为您可以确定哪个角最有可能在三角形内,然后只测试那个角,而不是测试所有四个角。

这是否成功取决于实施。有时盲目检查四个坐标比实际计算最佳坐标更快。

根据矩形检查三角形应该更容易,因为当矩形轴对齐时,线方程是针对 x 或 y 的简单测试。

这是分离轴测试的一种通用形式 - 找到将两个对象分开的线或平面,从而证明它们不能相交。如果您想要更高的性能,您可以找到两个对象的最近特征来计算出最合适的线/平面来使用,而不是尝试所有这些。

【讨论】:

    【解决方案2】:

    这是一个经典的碰撞检测问题。如果满足以下任一条件,则形状相交:

    • 三角形中至少有一个顶点包含在矩形中。
    • 矩形的至少一个顶点包含在三角形内。
    • 三角形的任意一条边与矩形的任意一条边相交。

    前两个条件涵盖了其中一个形状完全包含在另一个形状中的可能性(在这种情况下,边不会相交)。

    可以进行一些优化。

    • 计算形状的外接圆。如果两个形状的中心点之间的距离大于外接圆的半径之和,则可以排除碰撞。请注意,外接矩形的圆的中心点是其对角线的中点。三角形外接圆的中心点可以通过求任意两条边的垂直平分线的交点来获得。找到完全包含三角形的悲观估计圆的两种方法是(1)使用最长的边作为圆的直径,以及(2)创建一个边界矩形,角在 (mintx, minty), (mintx, maxty), (maxtx, maxty) 和 (maxtx, minty) 其中 maxtx 是任意三角形角的最大 X 坐标,mintx 是任意三角形角的最小X坐标等

    • 可以平移和旋转形状,使矩形的一个顶点位于原点,矩形的底边沿 X 轴正方向。这使得查找三角形中的顶点是否包含在矩形内变得简单。

    平移、旋转和线相交是很好理解的问题,您应该可以轻松找到suitable code here on stackoverflowhere on stackoverflow 或网络上的其他地方。

    提示:

    • 翻译很简单 - 在每个 X 或 Y 坐标中添加或减去相同的值。
    • 从概念上讲,旋转很容易——对于每个点,转换为极坐标,加上或减去旋转角度,然后再转换回笛卡尔坐标。由于与极坐标之间的转换在计算上很昂贵,因此您可以使用以下公式进行旋转:

      Xrot = X * cos(theta) - Y * sin(theta)
      Yrot = X * sin(theta) + Y * cos(theta)

    • 你可以通过取矩形的一条边来找到角度theta,并注意

      theta = atan2(deltaX, deltaY)

    【讨论】:

    • 添加了旋转公式,感谢monster860的建议。
    【解决方案3】:

    作为对 Jay Elston 答案的改进,您可以将正方形/四边形拆分为两个三角形,然后使用 Möller–Trumbore 相交算法来比较包含的顶点。如果你阅读了paper 发布的文章,最后有一个算法的 C 实现。

    这可以让您检查是否包含顶点。然后使用 Jay 的其中一个链接作为交叉路口。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-21
      • 2014-05-03
      • 2015-01-04
      相关资源
      最近更新 更多