1. 程式人生 > >Delaunay三角網生成演算法

Delaunay三角網生成演算法

實驗要求

  1. 完成角度判別法生成Delaunay三角網的演算法。在給定矩形範圍(客戶區大小的80%)內隨機生成一系列隨機點(不少於100個),根據角度判別法生成Delaunay三角網,並在螢幕上繪製。
  2. 根據所生成的點,生成對應的Voronoi圖並繪製。
  3. 對生成的Voronoi圖進行四色填充。(選做)

演算法簡介

  1. Delaunay三角網和Voronoi圖
    1. Voronoi圖與Delaunay三角網
      不規則三角網(Triangulated Irregular Network,簡稱TIN)。數學上的定義,假設 S
      ={p1,p2,...,pn},n3
      表示歐式平面 R2 上的一個點集,並且任意三點不共線,四點不共圓, d(pi,pj) 表示點 pi pj 間的歐式距離,則區域 V={xR2|d(x,pi)d(x,pj),i,j=1,2,...,nij}
      稱為平面點集S的Voronoi多邊形,又稱為Voronoi圖。平面上的Voronoi圖也可以看做是點集S中的每個點作為生長核,以相同的速率向外擴張,直到彼此相遇為止在平面上所形成的圖形。除最外層的點形成開放的區域外,其餘每個點都形成一個凸多邊形。
    2. Delaunay三角網的兩個重要性質
      空外接圓性質:在由點集S構成的Delaunay三角網中,每個三角形的外接圓均不包含點集S中的其他任意點,即任何一個Delaunay三角形的外接圓不包含其他任何點。
      最大的最小角性質:在由點集S所構成的三角網中,Delaunay三角網中三角形的最小角度是最大的,一個簡明的解釋:2個相鄰三角形構成的凸四邊形的對角線在相互交換後,6個內角的最小角不再增大。
  2. 角度判別法生成Delaunay三角網
    輸入:點集S
    輸出:Delaunay三角網
    演算法過程:
    1. 任取一點,求與之相連的最短邊。從點集S中任選一點作為起點 p1 ,尋找與其距離最近的點作為第二點 p2
    2. 初始化佇列資料。置一空佇列Q,儲存擴充套件邊。在連線 p1p2 右側進行擴充套件,得到擴充套件點 p3 ,在連線 p2p1 右側進行擴充套件,得到擴充套件點 p4 ,記錄擴充套件得到的兩個三角形(擴充套件失敗則不記錄)。將 p1p3 p3p2 p2p4 p4p1 加入佇列Q(擴充套件失敗的邊不加入佇列)。(擴充套件方法為,在連線的右側尋找與其構成最大夾角的第三點,若其右側沒有滿足條件的點,則這條邊擴充套件失敗)。
    3. 進行迴圈,直至佇列Q為空。每次迴圈從佇列中取出一條邊 pipj ,在其右側進行擴充套件,得到擴充套件點 pk ,記錄擴充套件得到的三角形,並將新生成的兩條邊 pipk pkpj 加入佇列Q。
    4. 演算法結束。
  3. 由Delaunay三角網生成Voronoi圖
    根據已生成的Delaunay三角網,可以生成對應的Voronoi圖。
    輸入:點集S構成的Delaunay三角網
    輸出:點集S構成的Voronoi圖
    演算法過程:

    1. 對三角形集合進行遍歷,記錄每個三角形是由哪三個點構成的。
    2. 計算每個三角形的外接圓圓心,並記錄。
    3. 遍歷三角形集合,尋找與當前三角形 t 三邊共邊的相鄰三角形 tA tb tc
    4. 如果找到對應邊的鄰接三角形,則把尋找到的三角形的外心與 t 的外心連線,存入Voronoi邊集合中。如果找不到,則求出該邊所對應的中垂線射線與邊緣的交點,將外心與其連線存入Voronoi邊集合中。
    5. 遍歷結束。
  4. 四色填充參考
    http://www.cnblogs.com/moondark/p/3594188.html

實驗結果參考圖

Voronoi圖與Delaunay三角網
圖中綠色點線為Delaunay三角網,紅色實線為Voronoi圖。