螺旋三角剖分


點集的螺旋三角剖分是基於集合螺旋凸包的三角剖分圖。 
凸螺旋線可以通過如下方法構造:

  1. 從一個特定的端點開始(比如給定方向上的最小點), 這裏取有最小 x 座標的點。
  2. 通過那個點構造一條鉛垂線。
  3. 按照一個給定的方向旋轉線(總保持順時針或者是逆時針方向), 直到線“擊” 出另一個頂點。
  4. 將兩個點用一條線段連接。
  5. 重複步驟3和步驟4, 但是總忽略已經擊出的點。

大體上, 這個過程類似於計算凸包的捲包裹算法, 但是不同在於其循環永遠不會停止。 對於一個凸包上有 h 個點的點集, 存在 2h 個凸螺旋線: 對於每個起點有順時針和逆時針螺旋線兩種。 
 

一個點集(左邊), 及其順時針凸螺旋線, 以最小的 x 座標點作爲初始點。


有趣的是, 一個點集的凸螺旋線和洋蔥皮可以在線性時間內相互轉換。 進一步的, 類似於洋蔥三角剖分, 我們可以定義一個點集的子圖爲凸螺旋線的螺旋三角剖分。 

構造螺旋三角剖分的算法, 雖然是基於環面三角剖分的, 但是卻更爲複雜, 因爲螺旋線必須被分割爲合適的凸包鏈。 假設輸入是一個點集的順時針凸螺旋線 C , 且有 C = { p1 , ... , pn } 。

  1. 將凸螺旋線的邊作爲三角剖分的邊插入。
  2. 從 p1 開始, 尋找點集凸螺旋線上的最後一個點 ph 。
  3. 延長凸螺旋線上的最後一條邊 [p(n-1),pn] 直到其與凸螺旋線相交。 標記交點爲 q' 。
  4. 構造與 C 切於點 q' 的切線。 逆時針旋轉那條線直到他與 C 相交於一點 q 並且平行於 [p(n-1),pn] 。
  5. 將 [p(n-1),q] 插入三角剖分中。
  6. 此操作後將凸螺旋鏈分割稱了兩個部分: 鏈外的部分和鏈內的多邊形區域。 設 Co = { p1 , ... , q } 且 Ci = { ph , ... , q , ... , pn } 。 這個構造過程如下圖所示:
     

    左上角: 構造過程。 右上角: 螺旋外和內部的多邊形區域。 底部: 外部和內部的凸鏈 Co 和Ci 。


  7. 外部螺旋區域可以如環面一樣進行三角剖分。 Co 和 Ci 此時可以被看成一個嵌套凸包。
  8. 內部的多邊形區域可以很容易的在 pn 處星型劃分形成三角剖分。
  9. 這兩個三角剖分的組合構成了整個螺旋三角剖分的結構。

一個螺旋凸包的例子和其三角剖分如下所示:

 

上述的算法是線性時間複雜度的, 算法的時間依賴於環面剖分的運行時間。

 

 

原文地址:http://cgm.cs.mcgill.ca/~orm/sptri.html


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章