二维几何-多边形

如何计算多边形的有向面积?如果多边形是凸的,可以从第一个顶点出发把凸多边形分成n-2个三角形,然后把面积加起来。

double ConvexPolygonArea(Point *p, int n)
{
    double area;
    int i;

    area = 0;
    for(i = 1; i < n-1; i++)
        area += Cross(p[i]-p[0], p[i+1]-p[0]);

    return area / 2;
}

其实这个方法对非凸多边形也适用。由于三角形面积是有向的,在外面的部分可以正负抵消掉。实际上,可以以任意点出发进行划分。

可以取p[0]点为划分顶点,一方面可以少算两个叉积(0和任意向量的叉积都等于0),另一方面也减少乘法溢出的可能性,还不用特殊处理(i=n-1的时候,下一个顶点是p[0]而不是p[n],因为p[n]不存在)。

double PolygonArea(Point *p, int n)
{
    double area;
    int i;

    area = 0;
    for(i = 1; i < n-1; i++)
        area += Cross(p[i]-p[0], p[i+1]-p[0]);

    return area / 2;
}

圆与凸多边形的公共面积。把凸多边形的每条边与圆判断关系,如果边的两点都在圆内,包括边界,两条边对应一个三角形的面积。如果一个点在圆外一个在圆内,则是一个三角形加一个扇形。两点都在圆外和圆有两个交点是两个扇形和一个三角形,无交点是一个扇形。

double CircleIntersectPolygon(Point *P, int n, Circle C)
{
    double area, t1, t2;
    int i, num;

    area = 0;
    for(i = 0; i < n; i++)
    {
        if(InCircle(P[i], C) && InCircle(P[(i+1)%n], C))
            area += Area(P[i], P[(i+1)%n], C.c);
        else
        {
            vector<Point> sol;
            num = getSegmentCircleIntersection(P[i], P[(i+1)%n], C, t1, t2, sol);
            if(InCircle(P[i], C))
            {
                area += Area(P[i], C.c, sol[1]);
                area += arcArea(sol[1], P[(i+1)%n], C.r);
            }
            else if(InCircle(P[(i+1)%n], C))
            {
                area += Area(P[(i+1)%n], C.c, sol[0]);
                area += arcArea(sol[0], P[i], C.r);
            }
            else
            {
                if(num == 2)
                {
                    area += Area(sol[0], sol[1], C.c);
                    area += arcArea(P[i], sol[0], C.r);
                    area += arcArea(P[(i+1)%n], sol[1], C.r);
                }
                else
                    area += arcArea(P[i], P[(i+1)%n], C.r);
            }
        }
    }

    return area;
}

 

 

正n边形的面积:

S=1/2*n*R*R*sina

R为多边形外接圆半径,a为各边所对圆心角。

n边形内角和:180度 * (n-2).

 

    原文作者:算法
    原文地址: https://www.twblogs.net/a/5bd3a0592b717778ac209bf5
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞