1. 程式人生 > >初學計算幾何(三)——多邊形的簡單操作

初學計算幾何(三)——多邊形的簡單操作

前言

去學習了一下一些多邊形相關的簡單操作。


多邊形

下面是一個多邊形的基本定義:

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;//返回答案
}

後記

關於多邊形的內容貌似就這些?

如果還有的話我會繼續進行補充的。