Delaunay三角剖分學習筆記

??最近計算幾何課程要求交一個結課論文,借這個機會蔑滓,我就認真地學習了下Delaunay三角剖分。
  Delaunay三角剖分其實并不是一種算法,它只是給出了一個“好的”三角網(wǎng)格的定義巢块,它的優(yōu)秀特性是空圓特性和最大化最小角特性,這兩個特性避免了狹長三角形的產(chǎn)生巧号,也使得Delaunay三角剖分應用廣泛族奢。
  空圓特性其實就是對于兩個共邊的三角形,任意一個三角形的外接圓中都不能包含有另一個三角形的頂點丹鸿,這種形式的剖分產(chǎn)生的最小角最大越走。


不滿足空圓特性

  假如以AC來剖分四邊形ABCD,這里B點在三角形ACD的外接圓內靠欢,D點在三角形ABC的外接圓內廊敌,所以不具有空圓特性


滿足空圓特性

  以BD來剖分四邊形ABCD,C點不在三角形ABD的外接圓內掺涛,A點也不在三角形BCD的外接圓內庭敦,具有空圓特性,而且它的最小角要比不滿足空圓特性的最小角大薪缆。

問題描述

??現(xiàn)在給定了平面上的一個點集V秧廉,求出它的Delaunay三角剖分


點集

Delaunay三角剖分

Bowyer逐點插入法

??Bowyer逐點插入法是一個很經(jīng)典的實現(xiàn)方法,網(wǎng)上的資料大多數(shù)都是采用的這種算法拣帽。這里使用的算法是按照 Paul Bourke在論文中提供的偽代碼實現(xiàn)的疼电,這個偽代碼也寫的很好,非常容易懂

以下摘自他的論文

subroutine triangulate
input : vertex list   輸入:頂點鏈表
output : triangle list  輸出:三角形鏈表
initialize the triangle list  初始化三角形鏈表
determine the supertriangle  確定超級三角形
add supertriangle vertices to the end of the vertex list   將超級三角形的頂點加入到頂點鏈表中
add the supertriangle to the triangle list  將超級三角形加入到三角形鏈表中
for each sample point in the vertex list  對頂點鏈表中的每一個點
initialize the edge buffer  初始化邊數(shù)組
for each triangle currently in the triangle list  對于三角形鏈表中的每一個三角形
calculate the triangle circumcircle center and radius  計算出外接圓圓心和半徑
if the point lies in the triangle circumcircle then  如果這個點在三角形的外接圓內
add the three triangle edges to the edge buffer  把這個三角形的三條邊加入到邊數(shù)組中
remove the triangle from the triangle list  從三角形鏈表中將這個三角形刪除
endif
endfor
delete all doubly specified edges from the edge buffer  把邊數(shù)組中所有重復的邊都刪除减拭,注意這里是把所有的重復邊都刪除蔽豺,比如有邊e1,e2,e2,e3,刪除后應該只剩e1和e3
this leaves the edges of the enclosing polygon only  這步會得到一個閉合的多邊形
add to the triangle list all triangles formed between the point 用這個點和邊數(shù)組中的每一條邊都組合成一個三角形拧粪,加入到三角形鏈表中
and the edges of the enclosing polygon
endfor
remove any triangles from the triangle list that use the supertriangle vertices從三角形鏈表中刪除使用超級三角形頂點的三角形
remove the supertriangle vertices from the vertex list將超級三角形的頂點從頂點鏈表中刪除
end

??在使用過程中修陡,發(fā)現(xiàn)“把超級三角形的頂點加入到頂點鏈表中”似乎沒什么必要,另外可霎,頂點用數(shù)組存好一點魄鸦,因為不需要添加和刪除。

??以四個點A癣朗、B拾因、C、D舉例,首先建立一個超級三角形PQR绢记,這個三角形要把所有點都包含進去扁达。


建立超級三角形

??接著分析A點,因為A點在三角形PQR的外接圓內部蠢熄,所以利用A點將三角形PQR分拆成三個子三角形跪解。


A點

??再考慮B點,它只在三角形AQR的內部签孔,再將三角形AQR分拆成三個子三角形惠遏。


B點

??接著是C點,這時我們有5個三角形骏啰,對這5個三角形每一個檢查C點在不在它的外接圓內。經(jīng)過檢測抽高,發(fā)現(xiàn)它在三角形APR和三角形ABR的外接圓內判耕。


C點

??刪除三角形APR和三角形ABR的公共邊AR,得到四邊形ABPR翘骂,并將C點與每一個邊組成一個三角形壁熄。


刪除公共邊

??最后對D點進行分析,它在三角形ABC和三角形BCR的外接圓內碳竟,所以應刪除公共邊BC草丧,再用D點與這兩個三角形的其他邊形成子三角形。


D點

刪除公共邊

??最后把含有超級三角形的頂點的三角形全部刪除莹桅,就得到這四個點的三角剖分


刪除超級三角形

??我編寫程序的時候使用三個點進行測試昌执,有時候結果出不來,是因為在最后一步刪除超級三角形的時候是這樣的

然后刪除超級三角形相關頂點就把所有三角形都刪掉了诈泼。剛開始的時候我以為是和超級三角形的選取有關懂拾,紙異獸的文章中也沒有詳細分析,只提供了一個生成超級三角形的方案铐达。我很好奇這個超級三角形只要包含所有點就可以嗎岖赋,后來發(fā)現(xiàn)當遇到只有三個點的情況就直接相連就可以了,四個點以后就不會出現(xiàn)這種情況瓮孙。

??另外關于這個方法唐断,我在Github上看到了一個實現(xiàn),作者是jeanbroid杭抠,用openGL做顯示脸甘,里面用了很多C++標準庫的東西,讓我大開眼界祈争,非常感謝他斤程,不過他用到了雙緩存,需要把demo.cpp中的GLUT_SINGLE改成GLUT_DOUBLE才能運行。

分治法

??分治法是我在查看維基百科的時候看到的忿墅,據(jù)維基百科說分治法是效率最高的一種方法扁藕。在維基百科的引用中發(fā)現(xiàn)了一個介紹delaunay三角剖分的分治法的一個非常好的網(wǎng)站,網(wǎng)站作者是Samuel Peterson疚脐,這個網(wǎng)站主要介紹了在給定條件下的Delaunay三角剖分亿柑。

??分治法進行三角剖分需要對點集中所有點按照x坐標的升序進行排序,x坐標相同時棍弄,按照y坐標進行排序望薄,接著將整個點集遞歸地劃分數(shù)量相近的兩個子集,直到子集中點的數(shù)目小于等于3呼畸。


點集的分割

??先給出一個定義方便后面敘述痕支。對于一條邊,如果它的兩個端點都在分割線的左邊蛮原,稱它為LL邊卧须,一端在左邊一端在右邊稱為LR邊,兩個端點都在右邊稱為RR邊儒陨。

??分治法的重點在于如何遞歸地合并三角網(wǎng)格花嘶。
??首先是確定一條LR基線,這條線位于最下方蹦漠,且不與其他邊相交椭员,如27邊


確定基線

??接著,確定下一條LR邊笛园。以右側三角網(wǎng)為例隘击,按照順時針方向,計算出∠672研铆,∠872闸度,∠1072,∠972的值蚜印,并根據(jù)角度大小對頂點進行排序莺禁,角度最小的點為第一候選點,以此類推窄赋,這里第一候選點為6哟冬,第二候選點為8。


候選點的選取

??作三角形276的外接圓忆绰,發(fā)現(xiàn)第二候選點8不在該外接圓內浩峡,且∠672小于180°,故右側的候選點為6错敢。候選點的要求是以候選點與該側基線端點形成的角小于180°翰灾,且不包含下一候選點缕粹。若大于180°,則該側無候選點纸淮,若包含下一候選點平斩,則考慮下一候選點是否滿足該條件。按照這種方法對左側三角網(wǎng)格進行分析咽块,可得到左側候選點為點3绘面。
LR邊的選擇

  當左右兩側都存在候選點時,如當前情況侈沪,這時需要考慮下一條LR邊是37還是26揭璃。作三角形237的外接圓,可發(fā)現(xiàn)右側候選點6在此外接圓外亭罪,而左側候選點在三角形276外接圓內瘦馍,故下一條LR邊為邊37。

  當只有一側存在候選點時应役,將此候選點與基線另一側的端點連線作為下一條LR邊扣墩。

??將邊37作為下一條基線重復該過程,直到兩邊都不存在候選點扛吞,程序結束。

附一張Bowyer算法最后的顯示效果


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末荆责,一起剝皮案震驚了整個濱河市滥比,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌做院,老刑警劉巖盲泛,帶你破解...
    沈念sama閱讀 216,997評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異键耕,居然都是意外死亡寺滚,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評論 3 392
  • 文/潘曉璐 我一進店門屈雄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來村视,“玉大人,你說我怎么就攤上這事酒奶∫峡祝” “怎么了?”我有些...
    開封第一講書人閱讀 163,359評論 0 353
  • 文/不壞的土叔 我叫張陵惋嚎,是天一觀的道長杠氢。 經(jīng)常有香客問我,道長另伍,這世上最難降的妖魔是什么鼻百? 我笑而不...
    開封第一講書人閱讀 58,309評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上温艇,老公的妹妹穿的比我還像新娘因悲。我一直安慰自己,他們只是感情好中贝,可當我...
    茶點故事閱讀 67,346評論 6 390
  • 文/花漫 我一把揭開白布囤捻。 她就那樣靜靜地躺著,像睡著了一般邻寿。 火紅的嫁衣襯著肌膚如雪蝎土。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,258評論 1 300
  • 那天绣否,我揣著相機與錄音誊涯,去河邊找鬼。 笑死蒜撮,一個胖子當著我的面吹牛暴构,可吹牛的內容都是我干的。 我是一名探鬼主播段磨,決...
    沈念sama閱讀 40,122評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼取逾,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了苹支?” 一聲冷哼從身側響起砾隅,我...
    開封第一講書人閱讀 38,970評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎债蜜,沒想到半個月后晴埂,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,403評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡寻定,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,596評論 3 334
  • 正文 我和宋清朗相戀三年儒洛,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片狼速。...
    茶點故事閱讀 39,769評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡琅锻,死狀恐怖,靈堂內的尸體忽然破棺而出向胡,到底是詐尸還是另有隱情浅浮,我是刑警寧澤,帶...
    沈念sama閱讀 35,464評論 5 344
  • 正文 年R本政府宣布捷枯,位于F島的核電站滚秩,受9級特大地震影響,放射性物質發(fā)生泄漏淮捆。R本人自食惡果不足惜郁油,卻給世界環(huán)境...
    茶點故事閱讀 41,075評論 3 327
  • 文/蒙蒙 一本股、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧桐腌,春花似錦拄显、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蟆盐,卻和暖如春承边,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背石挂。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評論 1 269
  • 我被黑心中介騙來泰國打工博助, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人痹愚。 一個月前我還...
    沈念sama閱讀 47,831評論 2 370
  • 正文 我出身青樓富岳,卻偏偏與公主長得像,于是被迫代替她去往敵國和親拯腮。 傳聞我的和親對象是個殘疾皇子窖式,可洞房花燭夜當晚...
    茶點故事閱讀 44,678評論 2 354

推薦閱讀更多精彩內容

  • 我亦舉家清 愛見澄清晨 黃金答母恩 瑋勤瑋名姓 瑋別五秋螢
    黑色玫瑰d閱讀 447評論 3 7
  • 2018班車已經(jīng)到站,這一年收獲滿滿动壤,登山萝喘、跑馬、寫字狼电、繪畫、讀書弦蹂,當然也有失落肩碟、氣憤、傷心難過凸椿。 現(xiàn)在重整行裝邁...
    凌玉_cc23閱讀 248評論 0 1
  • ?如何擁有人脈 人脈=誠實+終身成長+對家人朋友好 ?人脈是你贏得的削祈,不是你要來的 不要去追一匹馬,用追馬的時間種...
    孤獨中的喧囂閱讀 192評論 0 0
  • 一 那年夏天雨水特別多脑漫,6月只有四天沒下雨髓抑,我掩好宿舍門,帶走了一臺電腦优幸、一皮箱書還有一編織袋的衣物吨拍,胡亂又倉促地...
    李布波閱讀 461評論 5 6
  • 湖正中,飄著一葉扁舟网杆,在這一葉扁舟之上羹饰,仰面朝天躺著一個頭發(fā)略微有些卷曲的男人伊滋,男人的一只手搭在船舷外,小拇指和無...
    13號的小貓閱讀 434評論 0 2