HDU 1115 Lifting the Stone 计算几何

本文介绍了一种计算多边形重心的方法,适用于质量分布均匀的情况。通过将多边形分解成若干三角形并计算各三角形的重心及面积,再综合求得整个多边形的重心坐标。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1115

参考来源:http://www.cnblogs.com/try86/archive/2012/04/21/2462458.html(作者:Try86)


题意: 求一个任意多边形的重心

摘自:KIDxの博客 求多边形重心的题目大致有这么几种:

1、质量集中在顶点上 n个顶点坐标为(xi,yi),质量为mi,则重心  

 X = ∑( xi×mi ) / ∑mi  

 Y = ∑( yi×mi ) / ∑mi   

特殊地,若每个点的质量相同,则  

 X = ∑xi / n  

 Y = ∑yi / n

2、质量分布均匀   

特殊地,质量均匀的三角形重心:  

 X = ( x0 + x1 + x2 ) / 3  

 Y = ( y0 + y1 + y2 ) / 3

3、质量分布不均匀 只能用函数多重积分来算,不太会

这题的做法: 将n边形分成多个三角形,分别求出重心坐标以及质量m【因为质量分布均匀,所以可以设密度为1,则面积就是质量】 因为质量都集中在重心 所以把所有求出来的重心按逆时针连接起来又是一个多边形 但是这个多边形的质量集中在顶点上 所以可以利用上面公式进行计算 


#include<iostream>
#include<string>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<cctype>
#include<iomanip>

using namespace std;
const int maxn=1000000;

double x[maxn],y[maxn];
double gx,gy;

void Gravity(int n){
    double Sares=0;
    gx=gy=0;
    for(int i=2;i<n;++i){
        double ares=(x[i-1]-x[0])*(y[i]-y[0])-(y[i-1]-y[0])*(x[i]-x[0]);
        Sares+=ares;
        double xx=x[0]+x[i]+x[i-1];
        double yy=y[0]+y[i]+y[i-1];
        gx+=xx*ares;
        gy+=yy*ares;
    }
    gx/=Sares*3.0;
    gy/=Sares*3.0;
}

int main(){
    int T; cin>>T;
    while(T--){
        int n; cin>>n;
        for(int i=0;i<n;++i)
            cin>>x[i]>>y[i];
        Gravity(n);
        cout<<setiosflags(ios::fixed)<<setprecision(2)<<gx<<' '<<gy<<endl;
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值