http://en.wikipedia.org/wiki/Centroid#Centroid_of_polygon
我访问了上面的链接,并尝试实现由n个顶点(x0,y0),(x1,y1),…,(xn-1,yn-1)定义的非自相交闭合多边形的质心公式。
例如,如果坐标为:(0,1)(1,0)(-1,0)(0,-1),则得到的质心坐标应为:
0.00 0.00

#include<stdio.h>
#include<iostream>
#include<utility>
using namespace std;
int main()
{
    int t,points;
    scanf("%d",&points);
    pair<float,float>p[points];
    int i;
    for(i=0;i<points;i++)
    {
        scanf("%f %f",&p[i].first,&p[i].second);

    }
    float ar,x,y;
    for(i=0;i<points-1;i++)
    {
         ar+=(p[i].first*p[i+1].second-(p[i+1].first*p[i].second));
         x+=((p[i].first+p[i+1].first)*ar);
         y+=((p[i].second+p[i+1].second)*ar);
    }
    x/=(3*ar);
    y/=(3*ar);
    printf("%.2f %.2f\n",x,y);
}

然而,当我对给定坐标运行上述代码时,得到的质心坐标为:
-1. -1.

最佳答案

我看到以下问题:
arxy未初始化。
行中的计算是错误的:

x+=((p[i].first+p[i+1].first)*ar);
y+=((p[i].second+p[i+1].second)*ar);

使用以下命令将丢失循环的一次迭代:
for(i=0;i<points-1;i++)

下面是一个对我有效的函数版本:
int main()
{
   int points;
   scanf("%d",&points);
   pair<float,float>p[points];
   int i;
   for(i=0;i<points;i++)
   {
      scanf("%f %f",&p[i].first,&p[i].second);
   }

   float ar = 0.0;
   float x = 0.0;
   float y = 0.0;

   for(i=0;i<points;i++)
   {
      // This allows wrap-around when are you dealing with
      // the last point in the list.
      int j = (i+1)%points;

      float common = (p[i].first*p[j].second - p[j].first*p[i].second);
      ar += common;
      x+=(p[i].first+p[j].first)*common;
      y+=(p[i].second+p[j].second)*common;
   }

   ar *= 0.5;
   x /= (6*ar);
   y /= (6*ar);

   printf("area: %.2f, xc: %.2f, yc: %.2f\n", ar, x, y);
}

关于c - 如果给出了多边形的顶点,如何计算多边形的质心?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28906308/

10-11 15:39