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

问题描述 投票:2回答:1

我在使用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),而不仅仅是将hole设置为“ true”,那么该多边形将全部正确地三角剖分。因此,我相当确定问题似乎在于在孔轮廓内找到自己的点。

但是如果使用这样的更简单的外部多边形,事情就更加令人困惑:

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

然后,我可以像在第一个版本中一样定义孔,即使发现内部点为(1.5, 2.5),也可以正常工作。所以现在我认为边缘的问题不成问题。

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

c# triangulation point-in-polygon triangle.net
1个回答
1
投票

这里发生了两种不同的事情,在一起,这使行为令人困惑。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.