計算幾何 graham 最大凸包

2021-07-16 12:02:16 字數 2010 閱讀 2736

凸包的嚴格凸多邊形

time limit:1000ms,special time limit:2500ms,memory limit:32768kb

total submit users:39,accepted users:35

problem 11326 :no special judgement

problem description

凸包(convex hull),對於給定集合x,所有包含x的凸集的交集稱為x的凸包,記作con(x)。

對於acmer來說,這麼嚴格複雜的定義可能是沒有必要的。我們只要知道平面有限點集的凸包是乙個凸多邊形就行了。

現在的問題是給定乙個平面點集,求出其「嚴格凸多邊形」的凸包。「嚴格」的意思是凸多邊形的邊上沒有任意三點共線。

input

輸入有多個案例。每個案例的第一行是乙個整數n,n≤100。隨後n行,每一行有2個整數,表示點的x、y座標,0≤x、y≤2147483647。乙個單獨的0表示輸入結束。沒有任何點的座標是完全一樣的。

output

對每乙個案例,首先輸出一行為其端點的個數,然後按逆時針輸出其凸包的頂點的座標。輸出起點是所有頂點的最下最左點(首先是最下,如果有多個點同樣處於最下,則取最靠左的)。每個頂點輸出一行,中間用空格隔開。

sample input

3

0 0100 100

100 0

0

sample output

3

0 0100 0

100 100

//嚴格凸包

#include #include #include using namespace std;

typedef long long llt;

#define size 101

struct point_tp[101];

//叉積,oa×ob

llt cross(point_t const&o,point_t const&a,point_t const&b)

//a如果比b更靠下更靠左返回真

bool islowleft(point_t const&a,point_t const&b)

//按照對於po的極角排序,極角相等的距離遠的排在前面,因為後面要做乙個unique

point_t* po;

bool comp4graham(point_t const&a,point_t const&b)

//相對於po是否極角相等

bool iseqpolar(point_t const&a,point_t const&b)

//graham求凸包,結果當中沒有共線點,起點總是最下最左點

int graham(point_t p,int n)

return top;

}int main()p[101];

llt cross(point_t const&o,point_t const&a,point_t const&b)

bool islowleft(point_t const&a,point_t const&b)

point_t* po;

bool comp4graham(point_t const&a,point_t const&b)

bool iseqpolar(point_t const&a,point_t const&b)

int graham(int n)

return top;

}int main(){

int n;

while( scanf("%d",&n) && n ){

for(int i=0;i

幾何 凸包(Graham)

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

計算幾何 凸包

有多個手機訊號發射器,求解乙個最小區域,要求所有的發射器都包含在這個最小區域中,並且任意兩台發射器之間的交流包含於在這個區域內。將所有的發射器看做為點,任意兩個點之間的連線都包含於乙個平面s 乙個平面的子集s 是凸的,當且僅當 s中的任意兩個點之間的連線都包含於 s中。點集 p的凸包是所有包含 p的...

計算幾何 凸包

如求凸包周長 include include include include include include using namespace std define pi 3.1415926 define eps 1e 10 class point 建立point類,裡面包含很多point的運算子 定...