通过坐标计算多边形重心,过重心做一水平线交两侧于两点,返回两点间距离,仅适用于凸多边形

求重心方法参考
求多边形重心(整理)
计算几何-多边形的重心

重心计算公式:

在这里插入图片描述
在这里插入图片描述

#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;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值