为什么 Triangle.Net 没有按预期对这些多边形进行三角剖分?

Why is Triangle.Net not triangulating these polygons as expected?

我一直在使用 Triangle.Net.

对某些带孔的多边形进行三角剖分时遇到问题

问题似乎是在某些情况下,我使用轮廓定义孔并将孔设置为 'true'(首先添加外部轮廓后,孔设置为 false)。 Polygon.Add(contour, true);

Triangle.Net 然后通过 Point.FindInteriorPoint 在该孔内找到一个点,由于我不知道的原因,有时它会找到一个位于该孔边缘的点,结果是唯一被三角化的是洞,多边形的其余部分将被忽略。

举个例子。具有相同外轮廓的两个多边形:

(3.5, 3.5), (-2.5, 3.5), (-2.5 -0.5), (-4.5, -0.5), (-4.5, -2.5), (3.5, -2.5) Image1

但是有一个洞被定义为这个轮廓:

(2.5, 2.5), (2.5, 0.5), (0.5, 2.5)

并将孔设置为 true。发现这个洞的内点是(1.5, 2.5),正好在边界上。结果是外部多边形未被三角化,但孔被三角化。 Result

另一个有一个孔定义为这个轮廓:

(0.5, 2.5), (2.5, 2.5), (2.5, 0.5)

并将孔设置为 true。发现这个洞的内点是 (2, 2),正好在中间。结果是外部多边形被正确地三角化,并且孔被正确切出。 Result

它们似乎都具有相同的轮廓方向,所以我不知道为什么一个工作正常而另一个工作不正常。如果我为第一个多边形提供多边形内的点作为 (2, 2) 而不是仅将孔设置为 'true' 则多边形将全部正确三角化。所以我相当肯定这个问题似乎归结为在孔轮廓内找到它自己的点。

但是如果我使用像这样的更简单的外部多边形会使事情变得更加混乱:

(3.5, 3.5), (-2.5, 3.5), (-2.5, -2.5), (3.5, -2.5) Image2

然后我可以像在第一个版本中一样定义一个洞,即使发现内点是 (1.5, 2.5),它也能正常工作。所以现在我觉得边上的点不是问题。

我现在有点迷路了。我真的不知道我做错了什么或在哪里看。任何建议,将不胜感激。谢谢。

这里发生了两件不同的事情,加在一起,这使得行为变得混乱。

第一个问题是 FindInteriorPoint 的行为。该方法存在一些鲁棒性问题,可以找到轮廓边界上的点。我怀疑您没有使用应该会产生良好结果的 this fork of Triangle.NET that contains some robustness improvements,尤其是在这些简单的情况下。

现在,如果您使用孔边界上的点指定孔,我们预计会发生什么?答案是结果是random/unpredictable。 Triangle 在最终网格中定位包含标识为孔的点的三角形,并删除所有与它相连的三角形,而不跨越任何约束线段。哪一侧(使用精确算法)取决于网格中子段端点的确切坐标,对于细化网格,这将取决于计算插入的额外顶点时发生的舍入。您的案例没有任何改进,因此位置确实在细分市场上。三角形从一个起点向洞口位置走,直到找到一个包含洞口点的三角形:起点的任意位置决定了它先到达哪一侧并最终选择。所以如果你有一个不同的周围域,你会得到一个不同的(任意)起点,你可以获得不同的结果。