我正在实现如Wikipedia所示的Bowyer-Watson算法。在我的实现,一切都按我所期望的,直到伪代码的最后一部分: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单元每个都涂上不同的颜色(希望)会使问题更加明显。
该图显示了在执行上面伪代码中列出的步骤之前的三角测量的状态。请注意,超三角形的两个顶点超出了图像的右侧和底部。
此图像显示去除包含超级三角形顶点不经任何进一步的考虑任何三角形之后的步骤:
顶部三个顶点应该有一个外心在一个新的三角形绿色/褐色细胞相遇的地方。问题在于,“之前”图像中显示的角点在该外接圆内,因此算法的常规处理从未生成该三角形。
如何以伪代码表示此边缘案例,以便我可以检查并解决它?我想避免一些可怕的“尝试每个组合的网站共享一个三角形的超级三角形顶点有效circumcircle”循环。
几年前,我读了Bowyer和Watson的论文,如果有必要,我会再次阅读他们的答案。我希望(1)其他人可能有答案,并且(2)如果我再次遇到这个问题,我可以使用Stack Overflow来查找答案。
编辑
所以我已经找到了相对便宜,但不完美的变通。我的超级三角形以编程方式确定为围绕网站的边框而不与其两侧相交。这个想法是由Java的各种令人沮丧的问题引起的,这些问题考虑了我的一些计算的外心坐标或坐标之间的距离是无限的。这种谨慎让我的超级三角形变得如此之小,以至于它的顶点有时会落在有效的三角形的外心中。增加超三角形的大小使问题似乎消失。但是,凸包上的三角形可能非常钝,以致其中一个顶点仍然可能落入有效的外接圆内。
我认为这意味着我最初的问题在面对浮点数限制时仍然有效。有没有廉价的方法来保证Bowyer-Watson算法生成有效的三角剖分?
你能详细说明为什么应该有一个三角形,但有一个蓝色的网站丢失?我错过了什么吗? – Bytemain
我遇到了完全相同的问题。我很惊讶,BW算法有这么大的缺陷。我所看到的唯一解决方案是在最后运行[凸包算法](https://en.wikipedia.org/wiki/Convex_hull_algorithms),这种方式打败了目的... – Axel
您是否找到了解决方案?我也有同样的问题。 – Somnium