三角形 - 二维方形交点试验

时间:2012-12-09 18:12:34

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

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

当我们知道它是方形而不是矩形时,有没有什么方法可以优化它?此外,正方形是轴对齐的,这样可以提高性能吗?

或者我应该将正方形分成三角形,并进行两次三角形 - 三角形交叉检查?

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

3 个答案:

答案 0 :(得分:4)

将矩形(或正方形)与三角形的每个边缘进行比较,方法是采用三角形的顶点并为每条边构建一条线的方程,并采用一致的顺序(围绕三角形顺时针或逆时针)。

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

再次测试矩形的边缘与三角形的对比。

通过知道矩形是轴对齐的,可以提高性能,因为你可以找出哪个角最有可能在三角形内部,并且只测试那个角,而不是测试所有四个角。

这是否取胜取决于实施。有时盲目检查四个坐标而不是实际计算最佳坐标可能会更快。

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

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

答案 1 :(得分:3)

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

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

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

可以进行一些优化。

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

答案 2 :(得分:2)

作为Jay Elston答案的改进,您可以将Square / quadrilateral分割成两个三角形,然后使用Möller–Trumbore交点算法来比较顶点的包含。如果您阅读已发布的paper,那么最后会有一个C算法实现。

这可以让你检查顶点包含。然后使用Jay的链接之一进行交叉。