初學計算幾何(三)——多邊形的簡單操作
阿新 • • 發佈:2018-12-10
前言
去學習了一下一些多邊形相關的簡單操作。
多邊形
下面是一個多邊形的基本定義:
struct Polygon//一個結構體用來儲存一個多邊形
{
int n;Point p[10005];//n儲存點數,P陣列儲存點
};
精度控制
在多邊形問題中,我們需要好好控制精度:
#define eps 1e-10//設定eps減小精度誤差
inline int dcmp(double x) {return fabs(x)<eps?0:(x>0?1:-1);}//判斷正負
判斷一個點是否在多邊形內部
我們可以以該點向外引一條射線,如果與多邊形邊界相交奇數次,就說明該點在多邊形內,否則就在多邊形外。
特殊地,如果該點在多邊形邊上,我們可以返回\(-1\)。
程式碼如下:
inline int IsInPolygon(Point A,Polygon P)//判斷一個點是否在多邊形內部 { register int i,flag=0,k,d1,d2; for(i=1;i<=P.n;++i)//列舉邊 { if(!dcmp(PToS(A,Segment(P.p[i],P.p[i%P.n+1])))) return -1;//如果點在邊上,返回-1 k=dcmp(Cro(P.p[i%P.n+1]-P.p[i],A-P.p[i])),d1=dcmp(P.p[i].y-A.y),d2=dcmp(P.p[i%P.n+1].y-A.y), k>0&&d1<=0&&d2>0&&++flag,k<0&&d1>0&&d2<=0&&--flag;//更新flag } return flag?1:0;//flag>0表示在多邊形內部,否則說明在多邊形外部 }
求多邊形面積
求多邊形面積,我們可以選一個點作為端點,然後列舉與它不相臨的邊,計算出該點與這些邊所構成的三角形的面積和即可。
程式碼如下:
inline double PolygonArea(Polygon P)//求多邊形面積
{
register int i;register double res=0;//res統計和
for(i=2;i<P.n;++i) res+=Cro(P.p[i]-P.p[1],P.p[i+1]-P.p[1])/2;//計算由1號節點,i號節點,i+1號節點構成的三角形面積
return res;//返回答案
}
後記
關於多邊形的內容貌似就這些?
如果還有的話我會繼續進行補充的。