凸包的定義如下:
在乙個點集d中,按一定順序選取子集q
使得q中所有點順次連線所構成的封閉凸多邊形包住d中所有點
可以形象地理解為:有許多個釘子釘在平面上,用一根牛皮筋把所有點包住
如下圖:
andrew演算法是graham演算法的變種。
其主要思想為把凸包上的點依次放入棧中,
如果發現形成了凹多邊形(叉積為負值)
就刪除一些點,使得又能夠維持凸的形態。
這時就會發現,處理各個點需要按照x從左往右的順序,排序即可
當然,這只是處理了下凸的乙個凸殼,倒過來再刷一次,就得到了整個凸包
例題:hdu1392
為了使**更有通用性,這裡使用double進行運算
#include
#include
#include
using
namespace
std;
const
double eps=1e-7;
const
int maxn=105;
int n;
struct point
point(double a,double b):x(a),y(b) {}
bool
operator
}a[maxn],stk[maxn];
typedef point vec;
int dcmp(double x)
double getdst(point a,point b)
double cross(vec a,vec b)
int andrew()
int k=len;
for (int i=n-1;i>=1;i--)
return len;
}int main()
return
0;}
凸包(Andrew演算法)模板
andrew演算法是graham的變種,相較graham,其更快,數值穩定性更好。藍書 struct nodep maxn ch maxn bool cmp node a,node b int cross node p0,node p1,node p2 凸包邊上可以有點,則 否則 int conve...
Andrew 演算法(構造凸包)
這是乙個基 graham 思想的又乙個演算法,我個人認為其中複雜度的改進應該是在 sort 的 cmp 部分吧,graham 的 cmp 部分需要對兩個點算出叉乘,甚至在某些情況還要算出兩個點的距離,這一步驟應該相對而言複雜度是較高的。而 andrew 很好的避免了這一步驟,直接通過對點的 x,y ...
二維凸包 Andrew演算法
把給定點包圍在內部的 面積最小的凸多邊形 設向量 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 叉積的乙個非常重要的性質是可以通過它的符號來判斷兩向量相互之間的順逆時針關...