【计算几何】多边形与凸包

多边形的面积计算:

double PolygonArea(Point* p, int n) 
{
    double area=0;
    for (int i=1; i<n-1; i++)
        area+=Cross(p[i]-p[0],p[i+1]-p[0]);
    return area/2;
}

点在多边形内判定:

bool isPointOnSegment(Point P, Point A, Point B) { return OnSegment(P,A,B); }

int isPointInPolygon(Point p, Point* poly, int n)//仍不是很理解,希望有大神详细解释下~
{
    int wn=0;
    for (int i=0; i<n; i++)
    {
        if (isPointOnSegment(p,poly[i],poly[(i+1)%n])) return -1;
        int k=dcmp(Cross(poly[(i+1)%n]-poly[i],p-poly[i]));
        int d1=dcmp(poly[i].y-p.y),d2=dcmp(poly[(i+1)%n].y-p.y);
        if (k>0 && d1<=0 && d2>0) wn++;
        if (k<0 && d1<=0 && d2>0) wn--;
        if (wn!=0) return 1;
        return 0; 
    }
}

凸包:

//Anderew算法
//输入点数组为p,个数为n,输出点数组ch。返回值为凸包定点数。
int ConvexHull(Point* p, int n, Point* ch)
{
    int m=0;
    sort(p,p+n);//数组已去重,x为第一关键字
    for (int i=0; i<n; i++)
    {
        while (m>1 && dcmp(Cross(ch[m-1]-ch[m-2],p[i]-ch[m-2]))<=0) m--;
        ch[m++]=p[i];       
    }
    int k=m;
    for (int i=n-2; i>=0; i--)
    {
        while (m>k && dcmp(Cross(ch[m-1]-ch[m-2],p[i]-ch[m-2]))<=0) m--;
        ch[m++]=p[i];
    }
    if (n>1) m--;
    return m;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值