我在学校有一个程序,我必须告诉每个人它在做什么。我得到的程序是一个计算面积和多边形质心的程序。现在,我几乎知道一切,但在程序中有两个数字,我什么也做不了。 -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;
}
}
答案 0 :(得分:1)
点o
只是一个任意参考点。您可以添加由多边形的每个边和该点组成的三角形。因为该区域有一个标志,clockwisde和逆时针三角形将相互消除。这一点可能在任何地方;它甚至可能是多边形的顶点之一。
下图显示了三角形的权重不同:三角形23o
是顺时针方向,对区域有正面贡献;三角形05o
是逆时针方向,具有负面贡献。很容易看出正三角区域和负三角区域的差异是多边形的区域。
三角形的面积是通过每个三角形的两边的叉积来计算的,(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);
}
这也将摆脱包装索引的需要。