判定凸多邊形:頂點凹凸性法
判斷點在凸多邊形內外:
①:與判定凸多邊形差不多,用判斷點與多邊形兩頂點叉乘,都大於0,點在多邊形內,小於0,點在多邊形外。
②:水平/垂直交叉點數判別法(適用於任意多邊形包括凹凸邊形)
注意到如果從p作水平向左的射線的話,如果p在多邊形內部,那麼這條射線與多邊形的交點必為奇數,如果p在多邊形外部,則交點個數必為偶數(0也在內)。所以,我們可以順序考慮多邊形的每條邊,求出交點的總個數。還有一些特殊情況要考慮。
判斷線段在任意多邊形內:
(1)首先,要判斷一條線段是否在多邊形內,先要判斷線段的兩個端點是否在多邊形內。如果兩個端點不全在多邊形內,那麼,線段肯定是不在多邊形內的。
(2)其次,如果線段和多邊形的某條邊內交(兩線段內交是指兩線段相交且交點不在兩線段的端點),則線段肯定不在多邊形內。
(3)如果多邊形的某個頂點和線段相交,則必須判斷兩相交交點之間的線段是否包含於多邊形內。
求多邊形重心:
以第乙個頂點為基準,分別連線p[i],p[i+1],1
具體**實現:
#include #include #include #define maxn 1000
#define offset 10000
#define eps 1e-8
#define zero(x) (((x)>0?(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;ieps)
if (fabs(t1)>eps)
ret.x/=t1,ret.y/=t1;
return ret;
}int main()
計算幾何 多邊形筆記
計算下乙個前後所組成向量的階乘,如果在計算時,出現負值,則此多邊形是凹多邊形,如果所有頂點計算完 畢,其結果都大於0,則多邊形是凸多邊形。判斷點在凸多邊形內外 與判定凸多邊形差不多,用判斷點與多邊形兩頂點叉乘,都大於0,點在多邊形內,小於0,點在多邊 形外。水平 垂直交叉點數判別法 適用於任意多邊形...
計算幾何 多邊形面積
彙總篇 計算幾何彙總 規定頂點逆時針方向的多邊形面積為正 取原點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.將交點和多邊形內部的點,按逆時針...