多边形的面积和质心

时间:2016-02-27 16:22:44

标签: c

我在学校有一个程序,我必须告诉每个人它在做什么。我得到的程序是一个计算面积和多边形质心的程序。现在,我几乎知道一切,但在程序中有两个数字,我什么也做不了。 -10001和-47。如果我替换它们,程序不会使计算正确。你能告诉我为什么-10001和47?如果我添加而不是-10001和-47,则计算是正确的..

#include <stdio.h>

#include <math.h>

typedef struct
{
    double x,y;
} POINT;

POINT c, o, p[10000];

double a, q=0.0;

int n;

double ccw(POINT a, POINT b, POINT c)
{
    return a.x*b.y + a.y*c.x + b.x*c.y - c.x*b.y - b.x*a.y - c.y*a.x;
}

int main(void)
{

    int i, j;

    o.x=-10001;
    o.y=-47;
    **/* THIS IS WHAT*/**
    while (scanf("%d", &n) > 0)
    {
        if(!n)
            break;
        for (i = 0; i < n; i++)
            scanf("%lf %lf", &p[i].x, &p[i].y);
        a=0;
        for(i=0; i<n; i++)
            a += ccw(o, p[i], p[(i+1)%n]);

        c.x = c.y = 0.0;
        for(i=0; i<n; i++)
        {
            q = ccw(o, p[i], p[(i+1)%n])/(3.0*a);
            c.x += q*(o.x + p[i].x + p[(i+1)%n].x);
            c.y += q*(o.y + p[i].y + p[(i+1)%n].y);
        }

        printf("%.3lf\n", fabs(a) / 2.0);
        printf("%.3lf %.3lf\n", c.x, c.y);

        return 0;
    }
}

1 个答案:

答案 0 :(得分:1)

o只是一个任意参考点。您可以添加由多边形的每个边和该点组成的三角形。因为该区域有一个标志,clockwisde和逆时针三角形将相互消除。这一点可能在任何地方;它甚至可能是多边形的顶点之一。

下图显示了三角形的权重不同:三角形23o是顺时针方向,对区域有正面贡献;三角形05o是逆时针方向,具有负面贡献。很容易看出正三角区域和负三角区域的差异是多边形的区域。

calculating the area of a polygon by summing traingle areas

三角形的面积是通过每个三角形的两边的叉积来计算的,(b - a)×(c - b)。所得矢量的绝对值是由两个矢量创建的平行四边形的面积。 xy平面中两个向量的叉积只有z个组件。取决于组件的正面或负面的周长感。

如果参考点远离三角形,浮点求和可能会导致不准确,尤其是在计算三角形的中心点时。 (请尝试使用参考点,例如{1.0e+12, 1.0e+12}。)

因此,将第一个顶点作为参考点是个好主意。然后,您还可以省略第一个和最后一个段,因为它们是退化的三角形,不会对区域或中心做出贡献:

    a = 0;
    for(i = 2; i < n; i++) {
        a += ccw(p[0], p[i - 1], p[i]);
    }

    c.x = c.y = 0.0;
    for(i = 2; i < n; i++) {
        q = ccw(p[0], p[i - 1], p[i]) / (3.0 * a);

        c.x += q*(p[0].x + p[i - 1].x + p[i].x);
        c.y += q*(p[0].y + p[i - 1].y + p[i].y);
    }

这也将摆脱包装索引的需要。