【问题标题】:How do you find the center-point of the intersection/overlap between two triangles in 2D?您如何找到二维中两个三角形之间的交点/重叠的中心点?
【发布时间】:2021-05-14 17:06:39
【问题描述】:

对于上下文,我正在尝试解决 3D 物理引擎中的碰撞细节。以下是在两个凸形的分离平面上的二维投影中发生的。

我有两个三角形,我们称它们为 A 和 B。它们存储为一组 3 个点(例如 A1、A2、A3)。我已经知道这两个三角形重叠。如何确定大致位于重叠中心的点“P”?

我能想到的最好方法是尝试找到 6 条线的交点,然后,根据存在的交点,包括来自任一三角形的任意数量的点。选择的点以及交叉点可以形成一个多边形,然后我可以找到它的中心。 但是,我知道这将是大量的计算,并且考虑到这是在实时环境中使用的,我想找到一个更好的方法。

以下是我所指的示例:

【问题讨论】:

  • 如果你知道它们重叠,你知道交点吗?您需要创建一个重叠区域的多边形,然后找到它的质心。
  • @JohnAlexiou 不,我不知道。它们是作为 EPA 通行证的最后一步生成的,这意味着当沿碰撞法线投影时,minkowski 空间的原点位于组合三角形内;由于外壳是凸面的,这意味着当这些三角形投影到法线平面上时,它们也必须重叠。
  • 根据分轴原理,如果将一个三角形的每个顶点的坐标代入另一个三角形的边方程,反之,就可以证明不存在交集。据此,我推测您无法使用少于六次的比较来解决您的问题,其中涉及一些 2x2 行列式。
  • 你怎么知道三角形重叠?在得出这个结论的过程中,也许有一些有用的数据/属性可以重复使用以获得更快的解决方案。

标签: math collision-detection computational-geometry


【解决方案1】:

除了寻找两个凸多边形(不是三角形的通用术语)的交点的著名算法,如the Toussaint algorithm(与java implementationoriginal paper of the method),您还可以使用this paper(三角形-三角形交点)的算法算法)找到两个三角形之间的相交区域。

现在,由于两个凸对象的交集是凸的,您可以使用this formula 基于从上述算法之一获得的交集区域的顶点轻松计算交集的质心。

【讨论】:

  • 您似乎喜欢矫枉过正的解决方案。对于三角形,Toussaint 算法将比“蛮力”更昂贵,并且实现起来更复杂。 Triangle-Triangle 论文增加了一层复杂性,因为它解决了 3D 问题。我认为没有充分的理由更喜欢周长质心而不是顶点质心,这更容易计算。
  • 亲爱的@YvesDaoust,你是对的。但是,不需要从头开始实施 Toussaint。有很多很好的库和实现(我以其中一个为例)。顺便说一句,这是一个正确的解决方案,但在你的脑海中是一个困难的解决方案。另外,我认为这是一个基于意见的讨论,因为我更喜欢 Toussant 的通用性,并且我在合理的时间内实施了它。
  • OP 正在寻求一种高效的实时解决方案。不是大锤。
【解决方案2】:

Toussaint 算法并不像看起来那么简单,而且对于两个三角形来说完全是矫枉过正。我会使用 Sutherland–Hodgman 裁剪算法。它将在其中一个三角形上进行三遍,并从三到六个顶点输出形成一个凸多边形。

顶点的平均值将在该多边形内。您甚至可以通过扩展鞋带公式来计算该区域的质心。 https://en.wikipedia.org/wiki/Centroid#Of_a_polygon

为了简化一些计算,您可以首先应用基的变化,使三角形之一减少到顶点 (0, 0)、(0, 1)、(1, 0),这样方程的半平面只是 x≥0, y≥0, 1-x-y≥0。这将使测试和交叉点更容易。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-28
    • 2019-09-08
    • 1970-01-01
    相关资源
    最近更新 更多