計算幾何 多邊形筆記

2021-06-28 17:59:22 字數 2320 閱讀 4500

計算下乙個前後所組成向量的階乘,如果在計算時,出現負值,則此多邊形是凹多邊形,如果所有頂點計算完

畢,其結果都大於0,則多邊形是凸多邊形。

判斷點在凸多邊形內外:

①:與判定凸多邊形差不多,用判斷點與多邊形兩頂點叉乘,都大於0,點在多邊形內,小於0,點在多邊

形外。

②:水平/垂直交叉點數判別法(適用於任意多邊形包括凹凸邊形)

注意到如果從p作水平向左的射線的話,如果p在多邊形內部,那麼這條射線與多邊形的交點必為奇數,如果p

在多邊形外部,則交點個數必為偶數(0也在內)。所以,我們可以順序考慮多邊形的每條邊,求出交點的總

個數。還有一些特殊情況要考慮。

判斷線段在任意多邊形內:

(1)首先,要判斷一條線段是否在多邊形內,先要判斷線段的兩個端點是否在多邊形內。如果兩個端點

不全在多邊形內,那麼,線段肯定是不在多邊形內的。

(2)其次,如果線段和多邊形的某條邊內交(兩線段內交是指兩線段相交且交點不在兩線段的端點),

則線段肯定不在多邊形內。

(3)如果多邊形的某個頂點和線段相交,則必須判斷兩相交交點之間的線段是否包含於多邊形內。

具體**如下:

#include 

#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))

using namespace std

;struct pointp[maxn];

struct line;

double xmult(point p1,point p2,point p0) //計算向量p1p2,p2p3的叉積

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];

}int inside_convex_v2(point q,int n,point* p) //判點在凸多邊形內,頂點按順時針或逆時針給出,在多邊形邊上返回0

; for (i=0

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

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

}int inside_polygon(point q,int n,point* p,int on_edge=2) //判點在任意多邊形內,頂點按順時針或逆時針給出,on_edge表示點在多邊形邊上時的返回值,offset為多邊形座標上限

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

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

int inside_polygon(point l1,point l2,int n,point* p) //判線段在任意多邊形內,頂點按順時針或逆時針給出,與邊界相交返回1

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;}

int main()

計算幾何 多邊形

判定凸多邊形 頂點凹凸性法 判斷點在凸多邊形內外 與判定凸多邊形差不多,用判斷點與多邊形兩頂點叉乘,都大於0,點在多邊形內,小於0,點在多邊形外。水平 垂直交叉點數判別法 適用於任意多邊形包括凹凸邊形 注意到如果從p作水平向左的射線的話,如果p在多邊形內部,那麼這條射線與多邊形的交點必為奇數,如果p...

計算幾何 多邊形面積

彙總篇 計算幾何彙總 規定頂點逆時針方向的多邊形面積為正 取原點0 0,0 s a,b,c,d s o,a,b s o,b,c s o,c,d s o,d,a 圖中o在外部,obc,ocd,oda 全部是正的,加起來構成了5變形 obcda 的面積,但 oab是負面積,因此最後剛好等於 abcd 的...

計算幾何 多邊形交集

問題描述 已知兩個多邊形poly1和poly2,分別由點集c1 和c2 表示,求這兩個多邊形的交集。演算法思想 兩個多邊形相交後,其頂點要麼是兩個多邊形邊的交點,要麼是在多邊形內部的點。演算法步驟 1.計算兩個多邊形每條邊之間的交點。2.計算包含在多邊形內部的點。3.將交點和多邊形內部的點,按逆時針...