graham求凸包演算法

2021-08-25 23:43:11 字數 1767 閱讀 9625

問題: 點集q的凸包(convex hull)是指乙個最小凸多邊形,滿足q中的點或者在多邊形邊上或者在其內。

這個演算法是由數學大師葛立恆graham發明的,他曾經是美國數學學會ams、att 首席科學家... (see

模板:see

#include #include using namespace std; class point }; bool mult(point sp, point ep, point op) bool operator<(const point &l, const point &r) void print(point res, int n) cout << endl; } int graham(point pnt, int n, point res) res[0] = pnt[0]; if (n == 1) res[1] = pnt[1]; if (n == 2) res[2] = pnt[2]; for(int i = 2; i < n; i++) cout << "pusing point (" << pnt[i].x << ", " << pnt[i].y << ")" << endl; res[++top] = pnt[i]; print(res, top); } print(res, top); cout << "-----" << endl; len = top; res[++top] = pnt[n-2]; print(res, top); for(i = n-3; i>=0; i--) cout << "pusing point (" << pnt[i].x << ", " << pnt[i].y << ")" << endl; res[++top] = pnt[i]; print(res, top); } return top; } point pnt[1000]; point res[1000]; int n = 0; int main() int num = graham(pnt, n, res); print(res, num); }

測試結果:

/home/a/j/nomad2:cat input 1 1 2 2 3 2.5 4 1 /home/a/j/nomad2:cat input |./a.out checking (2,2),(4,1),(1,1) : 0 pusing point (2, 2) stack : (1, 1),(4, 1),(2, 2), checking (3,2.5),(2,2),(4,1) : 1 poping point (2, 2) stack : (1, 1),(4, 1), checking (3,2.5),(4,1),(1,1) : 0 pusing point (3, 2.5) stack : (1, 1),(4, 1),(3, 2.5), stack : (1, 1),(4, 1),(3, 2.5), ----- stack : (1, 1),(4, 1),(3, 2.5),(2, 2), checking (4,1),(2,2),(3,2.5) : 0 pusing point (4, 1) stack : (1, 1),(4, 1),(3, 2.5),(2, 2),(4, 1), checking (1,1),(4,1),(2,2) : 1 poping point (4, 1) stack : (1, 1),(4, 1),(3, 2.5),(2, 2), checking (1,1),(2,2),(3,2.5) : 0 pusing point (1, 1) stack : (1, 1),(4, 1),(3, 2.5),(2, 2),(1, 1), stack : (1, 1),(4, 1),(3, 2.5),(2, 2),(1, 1),

說明: 演算法的複雜度為sort的複雜度o(nlogn),後面的掃瞄為o(n)。

poj 1113

Graham演算法 凸包問題

graham演算法的思路,大概如下 對平面上的點的集合,從中找到有最小的y座標值的點p,然後根據其它點和p的連線與正x軸所成的角度將平面上的點進行排序,排序後,掃瞄從p開始的有序列表,如果所有的這些點都在凸包上,那麼每三個相繼的點,會組成乙個左旋,從另一方面說,如果相繼的三個點,p1,p2,p3,組...

Graham凸包演算法簡介

凸包真是乙個神奇的演算法。對於平面上的一些點,我們要求凸包上所有的點,可以使用graham演算法 時間複雜度o nlogn 先找到最左下的點,把其他的點按叉積排序。然後維護乙個堆疊,每次利用叉積和棧頂比較判斷當前列舉到的點是否是凸包上的點,是則彈出棧頂元素 具體演算法click here 常熟巨大的...

幾何 凸包(Graham)

在凸包內部的點肯定不會是最遠點對之一,可以不考慮,只列舉在凸包上的所有點對距離長度,並進行比較即可 建凸包 當加入乙個新的點1,這個點和上兩個點2 3組成的角是銳角,則表示點2凹進去了,不是凸包上的點,把點2刪去 include include include include include inc...