andrew演算法是graham演算法的變種。
其主要思想為把凸包上的點依次放入棧中,
如果發現形成了凹多邊形(叉積為負值)
就刪除一些點,使得又能夠維持凸的形態。
這時就會發現,處理各個點需要按照x從左往右的順序,排序即可
當然,這只是處理了下凸的乙個凸殼,倒過來再刷一次,就得到了整個凸包
**:
#include #include #include #include #include #include #include using namespace std;
struct point pt[1005];
int sta[1005], ans[1005], cnt;
int cmp(point a, point b)
int cross(point p0, point p1, point p2)
//andrew演算法
void convex(int n)
sta[top++] = i;
}for(int i = 0; i < top; ++i)
top = 0; //求上凸包,並將pt[n-1]與pt[0]連線起來
sta[top++] = n - 1;
sta[top++] = n - 2;
for(int i = n - 3; i >= 0; --i)
sta[top++] = i;
}for(int i = 0; i < top; ++i)
}int main()
else
}//cout << "num = " << num << endl; // num == 9
//計算9個點組成的凸包
convex(9);
//輸出凸包點的座標
for(int i = 0; i < cnt; ++i)
} else
return 0;
}/************points.txt*******************
91 3
2 73 1
4 55 4
6 97 8
8 29 6
******************************************/
二維凸包 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 叉積的乙個非常重要的性質是可以通過它的符號來判斷兩向量相互之間的順逆時針關...
計算幾何 二維凸包問題 Andrew演算法
凸包 把給定點包圍在內部的 面積最小的凸多邊形。andrew演算法是graham演算法的變種,速度更快穩定性也更好。首先把所有點排序,按照第一關鍵字x第二關鍵字y從小到大排序,刪除重複點後得到點序列p1.pn。1 把p1,p2放入凸包中,凸包中的點使用棧儲存 2 從p3開始,當下乙個點在凸包當前前進...
凸包 Andrew演算法
凸包的定義如下 在乙個點集d中,按一定順序選取子集q 使得q中所有點順次連線所構成的封閉凸多邊形包住d中所有點 可以形象地理解為 有許多個釘子釘在平面上,用一根牛皮筋把所有點包住 如下圖 andrew演算法是graham演算法的變種。其主要思想為把凸包上的點依次放入棧中,如果發現形成了凹多邊形 叉積...