什麼是凸包(convex hull)
請看維基百科
簡單的想,在二維平面,就是所有的點組成的最外層的凸多邊形演算法思路
從上面的兩個圖可以看到:
以凸包上相鄰的兩點連成的直線,所有的點都在該直線的同一側
非凸包上的點連成的直線,所有的點分布在直線的兩側
演算法實現
/**
* 凸包計算
** @param pts
* @return
*/def convexhull(pts: list[point]) = else }}
if (set.size == 1)
}pset.tolist
}
我們以上圖的點為例就算該點集的凸包
val list2 = list(point(0, 0), point(2, 0), point(2, 2), point(0, 2),
point(1, 1), point(2, 4), point(1, 3),point(1,2))
convexhull(list2).foreach(println)
得結果和實際一致,我們可以看到點c,在直線bd之上,這個點可以作為凸包的點,也可以不作為凸包的點。
point(0.0,0.0)
point(2.0,0.0)
point(2.0,2.0)
point(2.0,4.0)
凸包Graham Scan演算法實現
凸包演算法實現點集合中搜尋凸包頂點的功能,可以處理共線情況,可以輸出共線點也可以不輸出而只輸出凸包頂點。經典的graham scan演算法,點排序使用極角排序方式,並對共線情況做特殊處理。一般演算法是將共線的點去掉距離小的,保留最遠的,這樣處理會導致不能輸出凸包邊上的點,只能輸出頂點。但是有時候需要...
Graham Scan凸包演算法實現
今天實現以下graham scan演算法演算法,看了網上的資料,個人理解 1 找左下角點 2 對所有點相對該點的極角進行排序 3 將1 2入棧,以後的點逐個入棧,下乙個新點如果滿足逆時針旋轉 右手準則 則該點入棧,如果是順時針則該點放棄,再重複步驟 3,直到掃瞄到最後乙個點結束 這裡可以參考 一下 ...
凸包 Graham Scan演算法
graham scan演算法是一種靈活的凸包演算法,時間複雜度是o nlogn 演算法細節 1.選出最左下角的點 排序 x最小,其次是y最小 2.其餘點按極角排序,在極角相等的情況下距離極點 p 0 最近的優先 3.用乙個棧 陣列 儲存凸包上的點,先把p 0 p 1 壓入棧。4.掃瞄每乙個點,用叉積...