二維凸包 Andrew演算法

2021-08-07 15:37:45 字數 956 閱讀 7685

把給定點包圍在內部的、面積最小的凸多邊形

設向量 p = (x1, y1), q = (x2, y2),則 p * q = x1 * y2 - x2 * y1; 其結果是乙個由 (0, 0), p, q, p + q 所組成的平行四邊形的 帶符號的面積,p * q = -(q * p), p * (- q) = -(p * q)

叉積的乙個非常重要的性質是可以通過它的符號來判斷兩向量相互之間的順逆時針關係:

若 p * q > 0,則 p 在 q 的順時針方向

若 p * q < 0, 則 p 在 q 的逆時針方向

若 p * q = 0,則 p 與 q 共線,但不確定 p, q 的方向是否相同

(1)把所有的點按橫座標從小到大排序。y作為第二關鍵字也從小到大排序

(2)建乙個棧,把排序後第一,二個點放入棧。

(3)for(i,3,n)迴圈掃一遍所有點,如果當前點在棧中前兩個點的外部(用叉積求得,在逆時針方向),就把棧頂彈出

(4)求完上凸包,for(i,n-1,1)  倒著求下凸包,但要記錄棧的邊界,防止影響以求好的上凸包

對應例題

#include#include#include#include#include#include#define for(i,a,b) for(register int i=a;i<=b;++i)

#define rep(i,a,b) for(register int i=a;i>=b;--i)

const int oo=1e9+7,maxx=10010;

using namespace std;

int n,top,k;

double ans=0;

double pf(double a)

struct node

bool operator < (const node dog) const

int main()

二維凸包求解(Andrew演算法 )

andrew演算法是graham演算法的變種。其主要思想為把凸包上的點依次放入棧中,如果發現形成了凹多邊形 叉積為負值 就刪除一些點,使得又能夠維持凸的形態。這時就會發現,處理各個點需要按照x從左往右的順序,排序即可 當然,這只是處理了下凸的乙個凸殼,倒過來再刷一次,就得到了整個凸包 include...

計算幾何 二維凸包問題 Andrew演算法

凸包 把給定點包圍在內部的 面積最小的凸多邊形。andrew演算法是graham演算法的變種,速度更快穩定性也更好。首先把所有點排序,按照第一關鍵字x第二關鍵字y從小到大排序,刪除重複點後得到點序列p1.pn。1 把p1,p2放入凸包中,凸包中的點使用棧儲存 2 從p3開始,當下乙個點在凸包當前前進...

凸包 Andrew演算法

凸包的定義如下 在乙個點集d中,按一定順序選取子集q 使得q中所有點順次連線所構成的封閉凸多邊形包住d中所有點 可以形象地理解為 有許多個釘子釘在平面上,用一根牛皮筋把所有點包住 如下圖 andrew演算法是graham演算法的變種。其主要思想為把凸包上的點依次放入棧中,如果發現形成了凹多邊形 叉積...