1. 程式人生 > >【學習筆記:計算幾何基礎3】 Convex Hull

【學習筆記:計算幾何基礎3】 Convex Hull

排序 一個 流程 向上 pop while 幾何 兩個棧 其余

Ahead

10.6.2018

算法5(GS)

最優算法O(nlogn)

實現

1.預處理排序
選取LTL與第二LTL 對剩下的點進行極角排序 (ToLeft Text)
技術分享圖片
2.開兩個棧T與S (開頭相對!!! ,為了好看)將已連接的邊放入S,其余的按極角大小放入T
技術分享圖片
3.三個指針指向S的棧頂與次棧頂以及T的棧頂S[0],S[1],T[0]

代碼

   while(!T.empty()) 
    {
        ToLeft(S[1],S[0],T[0])?S.push(T.pop()):S.pop(); 
    }    

4.最後對S棧自底向上是凸包的環路描述
技術分享圖片
這是大概的流程圖

理解

每次退S棧表示一次回溯,否則是一次加邊,那麽對於彈S 表示S棧頂的元素偏內,而新節點更外面,就目前而言應該往右拐 (模擬一下就可以看出了)
技術分享圖片

正確性

技術分享圖片
下一個拓展點一定位於黃區或者藍區,如果黃區直接拓展,如果藍區,那麽顯然就是一個退棧的過程 也就是把在右邊的退了,從而達到我們需要的狀態

【學習筆記:計算幾何基礎3】 Convex Hull