2016-02-27 83 views
0

我在学校有一个程序,我必须告诉大家它在做什么。我得到的程序是计算面积和多边形质心的程序。现在,我几乎知道所有事情,但是在计划中有两个数字,我什么都不能做。 -10001和-47。如果我替换它们,程序不会使计算正确。你能告诉我为什么-10001和47?如果我不是加-10001和-47的caculating是正确的..面积和多边形的质心

#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; 
    } 
} 
+0

它是C还是C++?它不能兼而有之。 –

+0

@PreferenceBean它是C. –

+2

那么你为什么使用C++标签! –

回答

1

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

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

calculating the area of a polygon by summing traingle areas

三角形的面积经由每个三角形的两条边,(b - a) × (c - b)的叉积计算。结果矢量的绝对值是由两个矢量创建的平行四边形的面积。 x,y平面中两个矢量的叉积只有一个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); 
    } 

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

+0

你可以帮助我的数学吗?我在维基百科找到了一个公式。 https://upload.wikimedia.org/math/a/4/c/a4cee81a1d18e4d067f66d4d40a8a1fe.png 它适用于三角形,但对于多边形,它没有。我必须向其他人展示它的数学,但结果与我在程序中获得的结果不同。如果我把它做成一个三角形,结果就像我得到的结果一样。 –

+0

我已经扩展了答案。图像显示了多边形的面积是如何通过添加具有“远”边的三角形并减去“近”边来组成的。函数'ccw'计算一个叉积,它描述了矢量之间平行四边形的面积;因此除以2.所计算的重心是权重是三角形面积的三角形中心的加权平均值。 –

+0

非常感谢!现在我明白了! –