我正在實現如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