多边形重心公式算法

多边形重心公式算法,有需要的朋友可以参考下。

网上看了很多,但是有的需要序列逆序,但是,对顶点序列转置后计算的重心坐标还是不正确,话费好长时间找到这个,测试一些可以使用,如果有什么不正确的,希望可以指出来,我也好及时的更正。

多边形的重心公式:

1、多边形重心公式,需要知道每个顶点坐标,令面积为area,则

            | Xi  X(i+1)| 
area = sum{ |           | /2}
            | Yi  Y(i+1)|


          | Xi  X(i+1)| 
Cx = sum{ |           | * (Xi + X(i+1) ) / (6 * area) }
          | Yi  Y(i+1)|


          | Xi  X(i+1)| 
Cy = sum{ |           | * (Yi + Y(i+1) )/ (6 * area) }
          | Yi  Y(i+1)|

算法:

#include <iostream>
using std::cin;
using std::cout;
using std::endl;

// 定义点坐标
struct Point
{ 
	double x;
	double y;
};

struct test
{
	int x;
	int y;
};

Point centerPoint(Point* array, const int point_size);

int main(int argc, char* argv[])
{
  const int point_size = 4; // 顶点个数
  Point array[point_size] = {{1,1}, {1,2}, {2,2}, {2,1}}; //顶点数组  
  Point center = centerPoint(array,point_size);
  cout<<"输出图多边形重心:";
  cout<<"("<<center.x <<", "<<center.y<<")"<<endl;
  return 0;
}
Point centerPoint(Point* array,const int point_size)
{
  double temp;
  double area=0;
  double cx = 0, cy = 0;
  for (int i = 0;i<point_size-1;i++)
  {
    temp = array[i].x * array[i+1].y - array[i].y *array[i+1].x;
    area+= temp;
    cx+= temp * (array[i].x+array[i+1].x);
    cy+= temp * (array[i].y+array[i+1].y);
  }
  temp = array[point_size-1].x * array[0].y - array[point_size-1].y *array[0].x;
  area+= temp;
  cx+= temp * (array[point_size-1].x+array[0].x);
  cy+= temp * (array[point_size-1].y+array[0].y);

  area = area/2;
  cx = cx/(6*area);
  cy = cy/(6*area);

  Point C = {cx,cy};
  return C;
}

2、

X = (x1*M1+x2*M2+...+xn*Mn) /(M1+M2+....+Mn)

n Y = (y1*M1+y2*M2+...+yn*Mn) /(M1+M2+....+Mn)
公式解析:x1,y1;x2,y2;...xn,yn 依次为多边形逆时针的坐标。
取一个扇心(x0,y0)(可以不在多边形内)和相邻两点组成三角形面积:
如(x0,y0)(x1,y1)(x2,y2)组成的三角形为M1,以此类推。然后根据
公式就可得结果。

转于:http://www.aichengxu.com/view/42396

计算几何-多边形的重心-2

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值