scala 實現凸包演算法

2021-08-28 10:39:35 字數 945 閱讀 8052

什麼是凸包(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.掃瞄每乙個點,用叉積...