旋轉卡殼總結

來源:互聯網
上載者:User

以下所有文章均轉載( http://blog.csdn.net/acmaker/article/details/3176910) 轉載請註明出處。


1、旋轉卡殼——翻譯說明文檔 

 前一段時間看了一位國外大牛的網站,是關於旋轉卡殼技術的,內容很不錯,就嘗試著翻譯一下。

     關於旋轉卡殼技術,最早是在劉汝佳、黃亮的《演算法藝術與資訊學競賽》上看到的,是計算幾何相關的技術,開始覺得很神奇,因為其對於凸多邊形的問題給出了很好的解決方案,於是上網查了一下,就發現了這份資料。

     通過個人的學習研究,我發現其可以用於解決大量的多邊形的問題,而非僅僅局限於原來瞭解的基於凸包的一些具體問題,十分具有研究價值,因此發出來與大家共用一下。

     由於個人水平有限,某些地方可能翻譯的不好,特別是一些名詞接近直譯,還有一些專業術語由於沒有進行過研究所以沒有翻譯出來。比如對於anti-podal據我所知有“對踵點”的命名法,十分的貼切,“對踵”的構造法就是兩個點輪流順著外圍移動,十分的貼切,然而文中另一個相似的名詞co-podal怎麼翻譯呢。雖然知道意思,但是我實在找不到好的詞,所以我根據其與對踵點相近的意思,根據其操作暫且稱之為“並踵點”,很牽強;又如關於motion planning, visibility,range fitting,scattered data interpolation 以及 finite element method等詞彙實在不知道該怎麼翻譯,因為他們都是具體學科裡的一些問題,比如motion planning是關於機器人的,是我從未涉及過的學科,因此我就留了英文名稱在譯文處。

     雖然是十年前發表的,但是文章提出的十五個具體問題的實現還是非常值得學習了,閑話少說,後面幾篇文章將是文獻的具體內容。

旋轉卡殼——目錄頁  曆史: 1978年, M.I. Shamos's Ph.D. 的論文"Computational Geometry"標誌著電腦科學的這一領域的誕生。 當時他發表成果的是一個尋找凸多邊形直徑的一個非常簡單的演算法, 即根據多邊形的一對點距離的最大值來確定。 
後來直徑演化為由一對對踵點對來確定。 Shamos提出了一個簡單的  O(n) 時間的演算法來確定一個凸  n 角形的對踵點對。 因為他們最多隻有 3 n/2 對, 直徑可以在  O(n) 時間內算出。 
如同Toussaint後來提出的, Shamos的演算法就像繞著多邊形旋轉一對卡殼。 因此就有了術語“旋轉卡殼”。 1983年, Toussaint發表了一篇論文, 其中用同樣的技術來解決許多問題。 從此, 基於此模型的新演算法就確立了, 解決了許多問題。 

他們包括: 
計算距離 凸多邊形直徑 凸多邊形寬 凸多邊形間最大距離 凸多邊形間最小距離 外接矩形 最小面積外接矩形 最小周長外接矩形 三角剖分 洋蔥三角剖分 螺旋三角剖分 四邊形剖分 凸多邊形屬性 合并凸包 找共切線 凸多邊形交 臨界切線 凸多邊形向量和 最薄截面 最薄橫截帶

 

原文地址:http://cgm.cs.mcgill.ca/~orm/rotcal.frame.html
旋轉卡殼——凸多邊形直徑  多邊形直徑 我們將一個多邊形上任意兩點間的距離的最大值定義為多邊形的直徑。 確定這個直徑的點對數可能多於一對。 事實上, 對於擁有  n 個頂點的多邊形, 就可能有  n 對“直徑點對”存在。 

 

一個多邊形直徑的簡單例子如左圖所示。 直徑點對在圖中顯示為被平行線穿過的黑點 (紅色的一對平行線). 直徑用淺藍色高亮顯示。
顯然, 確定一個凸多邊形  P 直徑的點對不可能在多邊形  P 內部。 故搜尋應該在邊界上進行。 事實上, 由於直徑是由多邊形的平行切線的最遠距離決定的, 所以我們只需要查詢對踵點。 Shamos (1978) 提供了一個  O(n) 時間複雜度計算n點凸包對踵點對的演算法。直徑通過遍曆頂點列表, 得到最大距離即可。 如下是1985年發表於 Preparata 和 Shamos 文章中的 Shamos 演算法的虛擬碼。 
輸入是一個多邊形  P={ p1,..., pn}. 

begin     p0:=pn;     q:=NEXT[p];     while (Area(p,NEXT[p],NEXT[q]) > Area(p,NEXT[p],q)) do          q:=NEXT[q];          q0:=q;          while (q != p0) do               begin                    p:=NEXT[p];                    Print(p,q);                    while (Area(p,NEXT[p],NEXT[q]) > Area(p,NEXT[p],q) do                         begin                              q:=NEXT[q];                              if ((p,q) != (q0,p0)) then Print(p,q)                              else return                         end;                    if (Area(p,NEXT[p],NEXT[q]) = Area(p,NEXT[p],q)) then                      if ((p,q) != (q0,p0)) then Print(p,NEXT[q])                      else Print(NEXT[p],q)               endend.


此處  Print(p,q) 表示將  (p,q) 作為一個對踵點對輸出,  Area(p,q,r) 表示三角形  pqr 的有向面積。 
雖然直觀上看這個過程與常規旋轉卡殼演算法不同, 但他們在本質上是相同的, 並且避免了所有角度的計算。 

如下是一個更直觀的演算法: 計算多邊形 y 方向上的端點。 我們稱之為 ymin 和 ymax 。 通過 ymin 和 ymax 構造兩條水平切線。 由於他們已經是一對對踵點, 計算他們之間的距離並維護為一個當前最大值。 同時旋轉兩條線直到其中一條與多邊形的一條邊重合。 一個新的對踵點對此時產生。 計算新的距離, 並和當前最大值比較, 大於當前最大值則更新。 重複步驟3和步驟4的過程直到再次產生對踵點對 (ymin,ymax) 。 輸出確定最大直徑的對踵點對。 至此, 上述的過程(虛擬碼中的)顯得十分有用, 我們可以從對踵點對中得到其他的資訊, 如多邊形的寬度 。

 

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

  旋轉卡殼——凸多邊形的寬度  凸多邊形的寬度定義為平行切線間的最小距離。 這個定義從寬度這個詞中已經略有體現。 雖然凸多邊形的切線有不同的方向, 並且每個方向上的寬度(通常)是不同的。 但幸運的是, 不是每個方向上都必須被檢測。 

    我們假設存在一個線段 [ a,b], 以及兩條通過  a 和  b 的平行線。 通過繞著這兩個點旋轉這兩條線, 使他們之間的距離遞增或遞減。 特別的, 總存在一個  特定旋轉方向 使得兩條線之間的距離通過旋轉變小。 

    這個簡單的結論可以被應用於寬度的問題中: 不是所有的方向都需要考慮。 假設給定一個多邊形, 同時還有兩條平行切線。 如果他們都未與邊重合, 那麼我們總能通過旋轉來減小他們之間的距離。 因此, 兩條平行切線只有在其中至少一條與邊重合的情況下才可能確定多邊形的寬度。 

    這就意味著“對踵點 點-邊”以及“邊-邊”對需要在計算寬度過程中被考慮。 

 

一個凸多邊形寬度的示意圖。 直徑對如圖由平行切線(紅線)穿過的黑點所示。 直徑如高亮的淡藍色線所示。
    一個與計算直徑問題非常相似的演算法可以通過遍曆多邊形對踵點對列表得到, 確定頂點-邊以及邊-邊對來計算寬度。 選擇過程如下: 計算多邊形 y 方向上的端點。 我們稱之為 ymin 和 ymax。 通過 ymin 和 ymax 構造兩條水平切線。如果一條(或者兩條)線與邊重合, 那麼一個“對踵點 點-邊”對或者“邊-邊”對已經確立了。 此時, 計算兩線間的距離, 並且存為當前最小距離。 同時旋轉兩條線直到其中一條與多邊形的一條邊重合。 一個新的“對踵點 點-邊”對(或者當兩條線都與邊重合,“邊-邊”對)此時產生。 計算新的距離, 並和當前最小值比較, 小於當前最小值則更新。 重複步驟3和步驟4(卡殼)的過程直到再次達到最初平行邊的位置。 將獲得的最小值的對作為確定寬度的對輸出。

    更為直觀的演算法再次因為需要引進角度的計算而體現出其不足。 然而, 就如在凸多邊形間最大距離問題中一樣, 有時候更為簡單、直觀的旋轉卡殼演算法必須被引入計算。 

 

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

 
旋轉卡殼——凸多邊形間最小距離  凸多邊形間最小距離 給定兩個非串連(比如不相交)的凸多邊形  P 和  Q, 目標是找到擁有最小距離的點對 ( p, q) ( p 屬於  P 且  q 屬於  Q)。 

事實上, 多邊形非串連十分重要, 因為我們所說的多邊形包含其內部。 如果多邊形相交, 那麼最小距離就變得沒有意義了。 然而, 這個問題的另一個版本, 凸多邊形頂點對間最小距離對於相交和非相交的情況都有解存在。 

回到我們的主問題: 直觀的, 確定最小距離的點不可能包含在多邊形的內部。 與最大距離問題相似, 我們有如下結論: 

兩個凸多邊形  P 和  Q 之間的最小距離由多邊形間的對踵點對確立。 存在凸多邊形間的三種多邊形間的對踵點對, 因此就有三種可能存在的最小距離模式: “頂點-頂點”的情況 “頂點-邊”的情況 “邊-邊”的情況
換句話說, 確定最小距離的點對不一定必須是頂點。 下面的三個圖例表明了以上結論: 
     
給定結果, 一個基於旋轉卡殼的演算法自然而然的產生了: 
考慮如下的演算法, 演算法的輸入是兩個分別有 m 和 n 個順時針給定頂點的凸多邊形 P 和 Q。 計算 P 上 y 座標值最小的頂點(稱為 yminP ) 和 Q 上 y 座標值最大的頂點(稱為 ymaxQ)。 為多邊形在 yminP 和 ymaxQ 處構造兩條切線 LP 和 LQ 使得他們對應的多邊形位於他們的右側。 此時 LP 和 LQ 擁有不同的方向, 並且 yminP 和 ymaxQ 成為了多邊形間的一個對踵點對。 計算距離(yminP,ymaxQ) 並且將其維護為當前最小值。 順時針同時旋轉平行線直到其中一個與其所在的多邊形的邊重合。 如果只有一條線與邊重合, 那麼只需要計算“頂點-邊”對踵點對和“頂點-頂點”對踵點對距離。 都將他們與當前最小值比較, 如果小於當前最小值則進行替換更新。 如果兩條切線都與邊重合, 那麼情況就更加複雜了。 如果邊“交疊”, 也就是可以構造一條與兩條邊都相交的公垂線(但不是在頂點處相交), 那麼就計算“邊-邊”距離。 否則計算三個新的“頂點-頂點”對踵點對距離。 所有的這些距離都與當前最小值進行比較, 若小於當前最小值則更新替換。 重複執行步驟4和步驟5, 直到新的點對為(yminP,ymaxQ)。 輸出最大距離。 旋轉卡殼模式保證了所有的對踵點對(和所有可能的子情況)都被考慮到。 此外, 整個演算法擁有現行的時間複雜度, 因為(除了初始化), 只有與頂點數同數量級的操作步數需要執行。 

最小距離和最大距離的問題表明了旋轉卡殼模型可以用在不同的條件下(與先前的直徑和寬度問題比較)。 這個模型可以應用於兩個多邊形的問題中。 
“最小盒子”問題(最小面積外接矩形)通過同一多邊形上兩個正交切線集合展示了另一種條件下旋轉卡殼的應用。  


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

 

6、旋轉卡殼——凸多邊形間最大距離  凸多邊形間最大距離

給定兩個凸多邊形 P 和 Q, 目標是需要找到點對 (p,q) (p 屬於 P 且 q 屬於 Q) 使得他們之間的距離最大。 

很直觀地,這些點不可能屬於他們各自多邊形的內部。 這個條件事實上與直徑問題非常相似: 

兩凸多邊形 P 和 Q 間最大距離由多邊形間的對踵點對確定。 
雖然說法一樣, 但是這個定義與給定凸多邊形的對踵點對的不同。 
與凸多邊形間的對踵點對本質上的區別在於切線是有向且反向的。 下圖展示了一個例子: 
 
上述結論暗示不單純只是頂點對需要檢測, 而僅僅是特定的頂點對需要被考慮到。 事實上他們只檢測一個基於旋轉卡殼模式的演算法確立的平行切線。 
考慮如下的演算法, 演算法的輸入是兩個分別有 m 和 n 個順時針給定頂點的凸多邊形 P 和 Q。 計算 P 上 y 座標值最小的頂點(稱為 yminP ) 和 Q 上 y 座標值最大的頂點(稱為 ymaxQ)。 為多邊形在 yminP 和 ymaxQ 處構造兩條切線 LP 和 LQ 使得他們對應的多邊形位於他們的右側。 此時 LP 和 LQ 擁有不同的方向, 並且 yminP 和 ymaxQ 成為了多邊形間的一個對踵點對。 計算距離(yminP,ymaxQ) 並且將其維護為當前最大值。 順時針同時旋轉平行線直到其中一個與其所在的多邊形的邊重合。 一個新的對踵點對產生了。 計算新距離, 與當前最大值比較, 如果大於當前最大值則更新。 如果兩條線同時與邊發生重合, 此時總共三個對踵點對(先前頂點和新頂點的組合)需要考慮在內。 重複執行步驟4和步驟5, 直到新的點對為(yminP,ymaxQ)。 輸出最大距離。

旋轉卡殼模式確保了所有的對踵點對都被考慮到。 此外, 整個演算法擁有線性時間複雜度, 因為(除了初始化), 執行步數與頂點數相同。

類似的演算法可以被用於凸多邊形間最小距離問題中。 

 

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

  7、旋轉卡殼——凸多邊形最小面積外接矩形  凸多邊形最小面積外接矩形

給定一個凸多邊形 P , 面積最小的能裝下 P (就外圍而言)的矩形是怎樣的呢。 從技術上說, 給定一個方向, 能計算出 P 的端點並且構由此造出外接矩形。 但是我們需要測試每個情形來獲得每個矩形來計算最小面積嗎。 謝天謝地, 我們不必那麼幹。 

對於多邊形 P 的一個外接矩形存在一條邊與原多邊形的邊共線。 

上述結論有力地限制了矩形的可能範圍。 我們不僅不必去檢測所有可能的方向, 而且只需要檢測與多邊形邊數相等數量的矩形。 

圖示上述結論: 四條切線(紅色), 其中一條與多邊形一條邊重合, 確定了外接矩形(藍色)。


一個簡單的演算法是依次將每條邊作為與矩形重合的邊進行計算。 但是這種構造矩形的方法涉及到計算多邊形每條邊端點, 一個花費 O(n) 時間(因為有 n 條邊)的計算。 整個演算法將有二次時間複雜度。 

一個更高效的演算法已經發現。 利用旋轉卡殼, 我們可以在常數時間內即時更新, 而不是重新計算端點。 
實際上, 考慮一個凸多邊形, 擁有兩對和 x 和 y 方向上四個端點相切的切線。 四條線已經確定了一個多邊形的外接矩形。 但是除非多邊形有一條水平的或是垂直的邊, 這個矩形的面積就不能算入最小面積中。 
然而, 可以通過旋轉線直到條件滿足。 這個過程是下屬演算法的核心。 假設按照順時針順序輸入一個凸多邊形的 n 個頂點。 
計算全部四個多邊形的端點, 稱之為 xminP, xmaxP, yminP, ymaxP。 通過四個點構造 P 的四條切線。 他們確定了兩個“卡殼”集合。 如果一條(或兩條)線與一條邊重合, 那麼計算由四條線決定的矩形的面積, 並且儲存為當前最小值。 否則將當前最小值定義為無窮大。 順時針旋轉線直到其中一條和多邊形的一條邊重合。 計算新矩形的面積, 並且和當前最小值比較。 如果小於當前最小值則更新, 並儲存確定最小值的矩形資訊。 
重複步驟4和步驟5, 直到線旋轉過的角度大於90度。 輸出外接矩形的最小面積。

因為兩對的“卡殼”確定了一個外接矩形, 這個演算法考慮到了所有可能算出最小面積的矩形。 進一步, 除了初始值外, 演算法的主迴圈只需要執行頂點總數多次。 因此演算法是線性時間複雜度的。 

一個相似但是鮮為人知的問題是最小周長外接矩形問題。 有趣的是這兩個問題是完全不同的問題, 因為存在(儘管極少)最小面積外接矩形和最小周長外接矩形多邊形不重合的多邊形。

 

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


8、旋轉卡殼——凸多邊形最小周長外接矩形  凸多邊形最小周長外接矩形

這個問題和最小面積外接矩形相似。 我們的目標是找到一個最小盒子(就周長而言)外接多邊形 P 。 

有趣的是通常情況下最小面積的和最小周長的外接矩形是重合的。 有人不禁想問這是不是總成立的。 下面的例子回答了這個問題: 多邊形(灰色的)及其最小面積外接矩形(左邊的)和最小周長外接矩形(右邊的)。 
 


現在, 給定一個方向, 我們可以算出 P 的端點, 以此來確定一個外接矩形。 但是, 就如同面積問題中一樣, 由於有下面的結論, 我們不必檢測每個狀態來獲得擁有最小周長的矩形: 

凸多邊形 P 的最小周長外接矩形存在一條邊和多邊形的一條邊重合。 

這個結論通過枚舉多邊形的一條重合邊有力地限制了矩形的可能範圍。 

 

圖示上述結論: 四條切線(紅色), 其中一條與多邊形邊重合, 確定了外接矩形(藍色)。


因為與其面積問題相當, 這個問題可以通過一個基於旋轉卡殼的相似的演算法來解決。 
下屬演算法的輸入是順時針順序給定的一個凸多邊形的 n 個頂點。 
計算全部四個多邊形的端點, 稱之為 xminP, xmaxP, yminP, ymaxP。 通過四個點構造 P 的四條切線。 他們確定了兩個“卡殼”集合。 如果一條(或兩條)線與一條邊重合, 那麼計算由四條線決定的矩形的面積, 並且儲存為當前最小值。 否則將當前最小值定義為無窮大。 順時針旋轉線直到其中一條和多邊形的一條邊重合。 計算新矩形的周長, 並且和當前最小值比較。 如果小於當前最小值則更新, 並儲存確定最小值的矩形資訊。 
重複步驟4和步驟5, 直到線旋轉過的角度大於90度。 輸出外接矩形的最小周長。

因為兩對的“卡殼”確定了一個外接矩形, 這個演算法考慮到了所有可能算出最小周長的矩形。 進一步, 除了初始值外, 演算法的主迴圈只需要執行頂點總數多次。 因此演算法是線性時間複雜度的。 

問題處理同樣包含三角形。 有兩個特例, 具體參見洋蔥三角剖分和螺旋三角剖分。


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

 

9、旋轉卡殼——螺旋三角剖分  螺旋三角剖分

點集的螺旋三角剖分是基於集合螺旋凸包的三角剖分圖。 
凸螺旋線可以通過如下方法構造: 從一個特定的端點開始(比如給定方向上的最小點), 這裡取有最小 x 座標的點。 通過那個點構造一條鉛垂線。 按照一個給定的方向旋轉線(總保持順時針或者是逆時針方向), 直到線“擊” 出另一個頂點。 將兩個點用一條線段串連。 重複步驟3和步驟4, 但是總忽略已經擊出的點。

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

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


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

構造螺旋三角剖分的演算法, 雖然是基於環面三角剖分的, 但是卻更為複雜, 因為螺旋線必須被分割為合適的凸包鏈。 假設輸入是一個點集的順時針凸螺旋線 C , 且有 C = { p1 , ... , pn } 。 將凸螺旋線的邊作為三角剖分的邊插入。 從 p1 開始, 尋找點集凸螺旋線上的最後一個點 ph 。 延長凸螺旋線上的最後一條邊 [p(n-1),pn] 直到其與凸螺旋線相交。 標記交點為 q' 。 構造與 C 切於點 q' 的切線。 逆時針旋轉那條線直到他與 C 相交於一點 q 並且平行於 [p(n-1),pn] 。 將 [p(n-1),q] 插入三角剖分中。 此操作後將凸螺旋鏈分割稱了兩個部分: 鏈外的部分和鏈內的多邊形地區。 設 Co = { p1 , ... , q } 且 Ci = { ph , ... , q , ... , pn } 。 這個構造過程如下圖所示:
 

左上方: 構造過程。 右上方: 螺旋外和內部的多邊形地區。 底部: 外部和內部的凸鏈 Co 和Ci 。
外部螺旋地區可以如環面一樣進行三角剖分。 Co 和 Ci 此時可以被看成一個嵌套凸包。 內部的多邊形地區可以很容易的在 pn 處星型劃分形成三角剖分。 這兩個三角剖分的組合構成了整個螺旋三角剖分的結構。

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

上述的演算法是線性時間複雜度的, 演算法的時間依賴於環面剖分的已耗用時間。

 

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

 
10、旋轉卡殼——洋蔥三角剖分  洋蔥三角剖分

給定一個平面上的點集, 目標是構造一個點集的三角剖分。 

從Lennes 1911年二次時間複雜度的源演算法到Chazelle 1991線性時間複雜度的演算法, 前人已經做了許多關於提高三角剖分演算法效率的研究。 

這裡的焦點是關於一種特殊的三角剖分, 一種基於對點集進行“剝洋蔥皮”操作。 
考慮平面上一個有 n 個點的集合 S 。 計算 S 的凸包, 並且設 S' 為在凸包內的點集。 然後計算 S' 的凸包並且反覆執行這個操作直到沒有點剩下。 最後剩下了一個像鳥巢一樣層層覆蓋的凸包序列, 稱為洋蔥皮集合 S 。 感謝Chazelle的演算法, 這個結構能夠在 O(n log n) 時間操作內實現。 

一個點集的洋蔥皮。 注意除了凸多邊形外, 最裡面的結構可能是一條線段或者是一個單一點。 這個圖給出了點的層次資訊, 比如點間哪個相對更“深”。


兩個嵌套的凸包間的地區稱為一個環面。 Toussaint在1986年發表了一個利用旋轉卡殼計算環面三角剖分的簡單演算法。 利用這個方法, 一旦構造出洋蔥皮, 就能在現行時間內構造出三角剖分。 進一步, 這個三角剖分有兩個特點: 他的子圖仍然是洋蔥皮, 並且他是一個哈密爾頓圖, 即三角剖分圖的頂點可以是鏈狀的。 

一個環面的三角剖分演算法是非常簡單的。 演算法輸入一個被凸包 P 包裹的凸包 Q, 他們的頂點都是順時針序的。 將凸包的邊作為三角剖分的邊插入。 計算 P 和 Q 的 x 座標最小的點, 分別稱為 xmin(P) 和 xmin(Q) 。 在 xmin(P) 和 xmin(Q) 處構造兩條鉛垂切線, 稱之為 LP 和 LQ 。 將 (xmin(P), xmin(Q)) 作為三角剖分的一條邊插入。 當前 LP 和 LQ 對應的 p 和 q 點分別是 xmin(P) 和 xmin(Q)。 將線順時針旋轉直到其中一個與一條邊重合。 一個新的頂點由此被一條線“擊”出。 如果他屬於 P (稱為 p'), 插入 (p', q) 到三角剖分中。 更新當前的點為 p' 和 p' 。 如果他屬於 Q (稱為 q'), 插入 (p, q') 到三角剖分中。 更新當前的點為 p 和 q' 。 對於平行邊的情況, 兩條切線都和邊重合, 並且兩個新的頂點被“擊”出(稱他們為 p' 和 q')。 然後插入 (p', q') , 以及 (p, q') 和 (p', q) 到三角剖分中。 更新當前的點為p' 和 q' 。 重複執行上述步驟直到達到開始的最小點。

一個換面的三角剖分如下所示:

 

上述的演算法擁有線性時間複雜度。 當對於一個點集進行三角剖分的時候, 一個凸包在整個過程中遍曆(最多)兩次, 最裡面和最外部的凸包都只執行遍曆一次。 因此對於一個 n 個點的三角剖分的總已耗用時間是 O(n) 。 

另一個有效且與三角剖分有關的問題是基於點集的凸螺旋線的螺旋三角剖分。 

原文地址:http://cgm.cs.mcgill.ca/~orm/ontri.html
11、旋轉卡殼——四邊形剖分  四邊形剖分

雖然三角剖分是一個更常用的結構, 但最近四邊形剖分在某些特定條件下顯得更適用, 比如 scattered data interpolation 以及 finite element method 等。 

一個四邊形剖分實際上是一個點集的四邊形分割。 一些與三角剖分本質上的區別(除了特別明顯的)應該引起注意: 
首先, 不是所有的點集都存在四邊形剖分。 事實

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.