Delaunay三角網生成演算法
阿新 • • 發佈:2019-01-03
實驗要求
- 完成角度判別法生成Delaunay三角網的演算法。在給定矩形範圍(客戶區大小的80%)內隨機生成一系列隨機點(不少於100個),根據角度判別法生成Delaunay三角網,並在螢幕上繪製。
- 根據所生成的點,生成對應的Voronoi圖並繪製。
- 對生成的Voronoi圖進行四色填充。(選做)
演算法簡介
- Delaunay三角網和Voronoi圖
- Voronoi圖與Delaunay三角網
不規則三角網(Triangulated Irregular Network,簡稱TIN)。數學上的定義,假設S 表示歐式平面R2 上的一個點集,並且任意三點不共線,四點不共圓,d(pi,pj) 表示點pi 和pj 間的歐式距離,則區域V={x∈R2|d(x,pi)≤d(x,pj),i,j=1,2,...,n且i≠j} - Delaunay三角網的兩個重要性質
空外接圓性質:在由點集S構成的Delaunay三角網中,每個三角形的外接圓均不包含點集S中的其他任意點,即任何一個Delaunay三角形的外接圓不包含其他任何點。
最大的最小角性質:在由點集S所構成的三角網中,Delaunay三角網中三角形的最小角度是最大的,一個簡明的解釋:2個相鄰三角形構成的凸四邊形的對角線在相互交換後,6個內角的最小角不再增大。
- Voronoi圖與Delaunay三角網
- 角度判別法生成Delaunay三角網
輸入:點集S
輸出:Delaunay三角網
演算法過程:
- 任取一點,求與之相連的最短邊。從點集S中任選一點作為起點
p1 ,尋找與其距離最近的點作為第二點p2 。 - 初始化佇列資料。置一空佇列Q,儲存擴充套件邊。在連線
p1−p2 右側進行擴充套件,得到擴充套件點p3 ,在連線p2−p1 右側進行擴充套件,得到擴充套件點p4 ,記錄擴充套件得到的兩個三角形(擴充套件失敗則不記錄)。將p1−p3 、p3−p2 、p2−p4 和p4−p1 加入佇列Q(擴充套件失敗的邊不加入佇列)。(擴充套件方法為,在連線的右側尋找與其構成最大夾角的第三點,若其右側沒有滿足條件的點,則這條邊擴充套件失敗)。 - 進行迴圈,直至佇列Q為空。每次迴圈從佇列中取出一條邊
pi−pj ,在其右側進行擴充套件,得到擴充套件點pk ,記錄擴充套件得到的三角形,並將新生成的兩條邊pi−pk 和pk−pj 加入佇列Q。 - 演算法結束。
- 任取一點,求與之相連的最短邊。從點集S中任選一點作為起點
由Delaunay三角網生成Voronoi圖
根據已生成的Delaunay三角網,可以生成對應的Voronoi圖。
輸入:點集S構成的Delaunay三角網
輸出:點集S構成的Voronoi圖
演算法過程:- 對三角形集合進行遍歷,記錄每個三角形是由哪三個點構成的。
- 計算每個三角形的外接圓圓心,並記錄。
- 遍歷三角形集合,尋找與當前三角形
t 三邊共邊的相鄰三角形tA ,tb 和tc 。 - 如果找到對應邊的鄰接三角形,則把尋找到的三角形的外心與
t 的外心連線,存入Voronoi邊集合中。如果找不到,則求出該邊所對應的中垂線射線與邊緣的交點,將外心與其連線存入Voronoi邊集合中。 - 遍歷結束。
實驗結果參考圖
圖中綠色點線為Delaunay三角網,紅色實線為Voronoi圖。