求凸包或者閉包的順序

2021-08-20 02:47:53 字數 1177 閱讀 2132

已知乙個多邊形n有點a,b,c,d,e,f,g,h組成,切多邊形的凹凸性不確定,如何判斷多邊形的方向呢。

如果多邊形為凸多邊形,則判斷方法很簡單,只需要取出順序的三個點,如:a,b,c 三點,計算向量ab,bc的叉乘,得到的結果如果大於0,則表示c點在ab的左側,多邊形的頂點是順時針序,這樣也能判斷該凸多邊形為順時針序,反之,則為逆時針序。

上述方法只適合於凸多邊形,若為凹多邊形則判斷會出錯,因為當選擇的點剛好為凹點的時候,結果剛好與上述相反,

比如選擇了c點作為頂點來判斷,bc,cd的叉乘結果

此時,我們就需要選擇好用來判斷的點。

解決方法為:選擇多邊形的凸點進行判斷,選擇該凸點的前乙個和後乙個點按上述方法判斷,這樣判斷結果依然正確。

為了簡單,凸點的選擇可以選取x或者y值中最大或者最小的點,這個點必然是凸點。

叉乘:向量p(x1,y1),向量q(x2,y2),則pxq=x1*y2-x2*y1

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

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

若pxq=0,則p和q共線,但可能同向也可能反向

#include#include#include#include#include#include#include#define ls 2*rt

#define rs 2*rt+1

#define lson ls,l,mid

#define rson rs,mid+1,r

#define ll long long

using namespace std;

typedef pairpii;

const ll inf = 0x3f3f3f3f;

/*void dis(int a, int n)

if(y[i] > max_y)

}// int f = (x[2]-x[1])*(y[3]-y[2])-(y[2]-y[1])*(x[3]-x[2]);

int f= (x[id_x]-x[id_x-1+n%n])*(y[id_x+1%n]-y[id_x]) - (x[id_x+1%n]-x[id_x])*(y[id_x]-y[id_x-1+n%n]);

if(f== 0)

if(f < 0)

puts("clockwise");

else

return 0;

}

求對稱閉包以及傳遞閉包

include include define n 50 求對稱閉包以及傳遞閉包 intmain else break int r n n 關係矩陣 for int i 0 iprintf 請輸入關係的個數 n int k 0 scanf d k printf 請輸入具有關係的兩個數以,分隔,回車輸入...

poj1113 求凸包 計算凸包周長

經典的求凸包題,模板題。要求用資源最少,那肯定這個多邊形是個凸多邊形,也就是凸包。所以先求出凸包,計算它的周長。還有就是這道題所說的,要離城牆l遠,其實就是在加上乙個圓的周長,圓的半徑就是l。都說到這了,這道題還差什麼?還差乙個經典的凸包模板!哈哈 如下 include include includ...

graham求凸包演算法

問題 點集q的凸包 convex hull 是指乙個最小凸多邊形,滿足q中的點或者在多邊形邊上或者在其內。這個演算法是由數學大師葛立恆graham發明的,他曾經是美國數學學會ams att 首席科學家.see 模板 see include include using namespace std cl...