凸包的嚴格凸多邊形
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
30 0100 100
100 0
0
sample output
30 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的運算子 定...