多邊形判斷模板

2021-07-17 04:05:15 字數 1668 閱讀 6313

#include 

#include

#define maxn 1000

#define offset 10000

#define eps 1e-8

#define zero(x) (((x)>0?(x):-(x))#define _sign(x) ((x)>eps?1:((x)<-eps?2:0))

struct point;

struct line;

double xmult(point p1,point p2,point p0)

//判定凸多邊形,頂點按順時針或逆時針給出,允許相鄰邊共線

int is_convex(int n,point* p);

for (i=0

;is[_sign(xmult(p[(i+1)%n],p[(i+2)%n],p[i]))]=0

; return s[1]|s[2];

}//判定凸多邊形,頂點按順時針或逆時針給出,不允許相鄰邊共線

int is_convex_v2(int n,point* p);

for (i=0

;is[_sign(xmult(p[(i+1)%n],p[(i+2)%n],p[i]))]=0

; return s[0]&&s[1]|s[2];

}//判點在凸多邊形內或多邊形邊上,頂點按順時針或逆時針給出

int inside_convex(point q,int n,point* p);

for (i=0

;is[_sign(xmult(p[(i+1)%n],q,p[i]))]=0

; return s[1]|s[2];

}//判點在凸多邊形內,頂點按順時針或逆時針給出,在多邊形邊上返回0

int inside_convex_v2(point q,int n,point* p);

for (i=0

;is[_sign(xmult(p[(i+1)%n],q,p[i]))]=0

; return s[0]&&s[1]|s[2];

}//判點在任意多邊形內,頂點按順時針或逆時針給出

//on_edge表示點在多邊形邊上時的返回值,offset為多邊形座標上限

int inside_polygon(point q,int n,point* p,int on_edge=1)

inline int opposite_side(point p1,point p2,point l1,point l2)

inline int dot_online_in(point p,point l1,point l2)

//判線段在任意多邊形內,頂點按順時針或逆時針給出,與邊界相交返回1

int inside_polygon(point l1,point l2,int n,point* p)

return 1;}

point intersection(line u,line v)

point barycenter(point a,point b,point c)

//多邊形重心

point barycenter(int n,point* p)

if (fabs(t1)>eps)

ret.x/=t1,ret

.y/=t1;

return ret

;}

多邊形與多邊形 位置關係的判斷

c 判斷點的位置方法一 public intisleft point p0,point p1,point p2 private boolpointinfences point pnt1,point fencepnts else if wn 0 return false else return tru...

判斷多邊形重疊 多邊形碰撞檢測

在討論多邊形碰撞檢測之前,我們可以先思考一下遊戲物件怎麼判斷2d圖形有碰撞,靠的是判斷2d圖形在遊戲世界中有接觸,或者有重疊區域,大到包含,小到重疊接觸乙個點。那麼我們就需要精確計算2d圖形在某一幀有重疊部分,或者預判到下一幀有重疊部分,那麼就是碰撞到了。先從簡單的模型來討論碰撞。判斷乙個點是否在多...

Matlab生成多邊形,並且判斷多邊形是否相交

隨機生成若干個點,就可以生成多邊形。嚴格來說,是要判斷產生的點是否共線的,但是這樣概率太低,所以我就沒有判斷。生成的點不能直接連起來,因為點的順序有可能是錯亂的,所以首先要進行順序判斷,方法是計算角度。找到平面內某一點,計算多邊形每乙個點到這個點連線和x軸的夾角,對這個夾角進行排序,就可以得到點的順...