求重心方法参考
求多边形重心(整理)
计算几何-多边形的重心
重心计算公式:
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
double a[5][2] = {
{0,0},
{0,1},
{1,2},
{2,1},
{2,0}
};
double b[4][2] = {
{0,0},
{0,1},
{1,1},
{1,0}
};
int main()
{
int n=( sizeof(a) / sizeof(double) )/ ( sizeof(a[0]) / sizeof(double) );//统计点个数
double sum_x, sum_y, sum, tmp;
sum = sum_x = sum_y = 0.0;
for (int i=2; i<n; i++)//计算重心坐标
{
tmp = ((a[i-1][0]-a[0][0])*(a[i][1]-a[0][1])-(a[i][0]-a[0][0])*(a[i-1][1]-a[0][1]))/2.0;
sum += tmp;
sum_x += ((a[0][0]+a[i-1][0]+a[i][0]) * tmp);
sum_y += ((a[0][1]+a[i-1][1]+a[i][1]) * tmp);
}
double a00=a[0][0];
double a01=a[0][1];
int j=0;
double point[4][2];
for (int i=0; i<n; i++)//找到两侧交点
{
if (i==n-1)
{
if(((a[i][1]-(sum_y/sum/3))*(a01-(sum_y/sum/3)))<=0)
{
point[j][0]=a[i][0];
point[j][1]=a[i][1];
point[j+1][0]=a00;
point[j+1][1]=a01;
j=j+2;
}
}
else if(((a[i][1]-(sum_y/sum/3))*(a[i+1][1]-(sum_y/sum/3)))<=0)
{
point[j][0]=a[i][0];
point[j][1]=a[i][1];
point[j+1][0]=a[i+1][0];
point[j+1][1]=a[i+1][1];
j=j+2;
}
}
//计算两交点横坐标
double crossoverx1=(point[1][0]-point[0][0])*((sum_y/sum/3-point[0][1])/(point[1][1]-point[0][1]))+point[0][0];
double crossoverx2=(point[3][0]-point[2][0])*((sum_y/sum/3-point[2][1])/(point[3][1]-point[2][1]))+point[2][0];
double distance=abs(crossoverx1-crossoverx2);
printf("%.2lf %.2lf\n", crossoverx1,crossoverx2);
printf("%.2lf\n", distance);
return 0;
}