計算下乙個前後所組成向量的階乘,如果在計算時,出現負值,則此多邊形是凹多邊形,如果所有頂點計算完
畢,其結果都大於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.將交點和多邊形內部的點,按逆時針...