已知乙個多邊形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...