你如何找到 2D 中两个三角形之间 intersection/overlap 的中心点?

How do you find the center-point of the intersection/overlap between two triangles in 2D?

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

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

我能想到的最好的方法是尝试找到 6 条线的交点,然后根据存在的交点,包括来自任一三角形的任意数量的点。选择的点连同交点可以形成一个多边形,然后我可以找到它的中心。 但是,我知道这会是一个很大的计算量,鉴于这是在实时上下文中使用的,我想找到一个更好的方法。

下面是我所指的示例:

除了著名的求两个凸多边形(比三角形更通用的术语)交点的算法,如 the Toussaint algorithm (with java implementation and original paper of the method), you can use the algorithm of this paper(三角形-三角形交点算法)求两个三角形之间的交点区域。

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

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。这将使测试和交集更容易。