Bowyer-Watson算法:如何填充"洞"通过删除具有超三角形顶点的三角形左

时间:2015-06-09 19:45:53

标签: algorithm delaunay

我正在实施Wikipedia中提供的Bowyer-Watson算法。在我的实现中,一切正常,直到伪代码的最后一部分:

for each triangle in triangulation // done inserting points, now clean up
     if triangle contains a vertex from original super-triangle
        remove triangle from triangulation

如果我在字面上遵循伪代码,我的Delaunay三角剖分中最终会丢失三角形。

例如,请考虑下面的图片。我正在进行三角测量的网站呈现为蓝色圆圈。三角形用黑线(不包括图像边框)渲染,并连接网站或边界/超三角形顶点。外接圆是用灰色渲染的,它们的中心用红色圆圈渲染。 Voronoi细胞每个都涂有不同的颜色(希望)使问题更加明显。

此图显示了在执行上述伪代码中列出的步骤之前的三角测量的状态。请注意,超级三角形的两个顶点超出了图像的右侧和底部。

before super triangle removal

此图像显示删除任何包含超级三角形顶点的三角形后的步骤,无需进一步考虑:

after super triangle removal

前三个顶点应该有一个新的三角形,在绿色/褐色细胞相遇的点处有一个外心。问题是"之前"中出现的角顶点。图像在这个外接圆内,因此算法的常规处理从未生成此三角形。

如何在伪代码中表达这个边缘情况,以便我可以检查并解决它?我想避免一些可怕的"尝试每个共享一个三角形的网站组合有效外接圆的超三角形顶点"循环。

几年前我读了Bowyer和Watson的论文,如有必要,我会再次阅读。我希望(1)其他人可能有答案可用,(2)如果我再遇到这个问题,我可以使用Stack Overflow查找答案。

修改

所以我找到了一个相对便宜但不完美的解决方案。我的超级三角形是以编程方式确定的,以包围网站'边界框没有相交的边。这个想法是由Java的各种令人沮丧的问题引起的,考虑到我计算的一些外心坐标或坐标之间的距离是无限的。这种谨慎使我的超级三角形变得如此之小,以至于它的顶点有时会落入有效的三角形中。外心。增加超三角形的大小使问题似乎消失了。但是,凸包上的三角形可能是如此钝,以至于其中一个顶点仍然落入有效的外接圆内。

我认为这意味着我的初始问题在浮点数限制面前仍然有效。有没有一种廉价的方法来保证Bowyer-Watson算法产生有效的三角测量?

2 个答案:

答案 0 :(得分:3)

我在实现此处描述的Bowyer-Watson算法时遇到了同样的问题:http://paulbourke.net/papers/triangulate/。我在网上找不到任何有用的东西,甚至在我的大学里问过,但没有结果。过了一会儿,我想出了一个解决方案。 我开始发现,为了使问题消失,边界三角形的顶点理想地应该位于无穷大处,这是不实际的。那么,如果三角形在无穷远处有一个或两个顶点,那么三角形外接圆是什么样的呢?它只是通过其他点的线。因此测试点是否位于三角形外接圆周变化,测试点是否位于线的左侧或右侧。

然后

算法看起来像这样:

  1. 检查任何三角形顶点是否位于无穷远处。换句话说:检查三角形是否与边界三角形共享一些顶点。

  2. 如果它共享所有三个顶点:琐碎。

  3. 如果它共享零顶点:经典方法 - 检查从点到外心的距离是否短于圆周。

  4. 如果它共享一个顶点:检查点是否位于由其他两个顶点定义的直线的左/右。 one vertex in infinity

  5. 如果它共享两个顶点:检查点是否位于由这两个顶点定义的线的左/右,但是移到第三个点。换句话说:您只从这些共享顶点之间的线上获取斜率向量,并将其移动以使线穿过第三个点。 two vertices in infinity

  6. 测试点位于线的左侧还是右侧取决于您的三角形缠绕顺序。

答案 1 :(得分:-1)

您似乎可以找到问题的解决方案,但也可以检查三角形的外心是否超出超级角。您可以使用多边形点测试。也许它可以保证没有丢失的三角形。