两个三角形的交叉区域,或一组半平面,或凸点集的区域

时间:2010-06-19 04:40:36

标签: algorithm math geometry computational-geometry

我需要计算2D平面中两个三角形之间重叠区域的面积。奇怪的是,我已经为code写了triangle-circle problem,并且效果很好而且非常强大,但我遇到了三角形 - 三角形问题。

我已经先检查一个是否完全包含另一个,或者另一个是否包含第一个,以及获得所有边缘交叉点。这些交叉点(最多6个,如大卫之星)与另一个三角形中包含的三角形顶点相结合,是交叉区域的顶点。这些点必须形成凸多边形。

我寻求的解决方案是这两个问题的答案:

  1. 给定所有已知的一组点位于点集的凸包上,计算凸包的面积。请注意,它们是随机排列的。
  2. 给定一组半平面,确定交叉区域。这相当于将两个三角形描述为三个半平面的交点,并将解决方案计算为此描述的直接交集。
  3. 我已经考虑过问题1,简单地将所有可能三角形的所有区域相加,然后除以计数中的多重性,但这看起来很愚蠢,我不确定它是否正确。我觉得有某种扫描线算法可以解决这个问题。但是,解决方案还必须具有相对数值的稳健性。

    我根本不知道如何解决问题2,但一般的答案非常有用,提供代码会让我的一天。这将允许直接计算凸多边形的交叉区域,而不必对它们执行三角形分解。

    编辑:我知道this article,它描述了查找两个凸多边形的交叉多边形的一般情况。它似乎只涉及三角形,而且,我真的不需要生成的多边形本身。所以也许这个问题只是在懒惰时才被问到。

1 个答案:

答案 0 :(得分:3)

问题1:为什么这些点是随机顺序的?如果是,则必须对它们进行排序,以便用直线连接连续点会产生凸多边形。如何订购 - 例如,通过运行凸包算法(尽管可能还有更简单的方法)。订购后,按照here所述计算区域。

-

问题2更简单。半平面由具有隐式方程a*x+b*y+c=0的单个线定义; a*x+b*y+c <= 0(注意不等式)在半平面“后面”的所有点(x,y)。现在,您需要至少三个平面,以便它们的负半空间的交点关闭(这是必要的,但不是充分的条件)。如果交叉点已关闭,则它将是凸多边形。

我建议你维护一个顶点的链表。该算法用三行初始化。计算线相交的三个点(一般情况下);这些是您所在地区(三角形)的起始顶点。您还必须检查每个顶点是否在通过另外两个顶点的线所定义的半平面“后面”;这保证了交叉路口实际上是一个封闭的区域。

这三个顶点也定义了三角形的三条边。当您通过新的半平面相交时,只需检查定义半平面的线与当前区域的每条边之间的交点;一般来说,你会得到两个交叉点,但你必须注意线路穿过该区域顶点的退化情况。 (你也可以得到一个空集!)

新的交点顶点定义了一条分割两个区域中当前区域的线。再次,使用新半平面的方向来决定将两个新区域中的哪一个分配给新的“当前区域”,以及丢弃哪一个。

定义当前区域边缘的列表中的点将被正确排序,因此您可以在上面的链接中应用公式来计算其区域。

如果这个描述不详细/可理解,那么我能给你的最佳建议就是你投资了一本关于计算几何和线性代数的书。