• hdu 1115 求多边形重心


    //求多边形的重心算法
    //说明:
    //求多边形重心并不是简单的把求三角形的重心公式推广就行了
    //我的算法是在平面上取一点(一般取原点, 这样可以减少很多计算, 而且使思路更清晰^_^)
    //这样就得到了N个三角形OP[i]P[i+1](其中点的顺序要为逆时针的),
    //分别求出这N个三角形的重心Ci和面积Ai(注意此处面积是又向面积, 就是用叉乘求面积时保留其正负号)
    //在求出A = A1+A2+...+AN(同样保留正负号的代数相加)
    //最终重心C = sigma(Ai+Ci)/A;

    #include <iostream>
    #include <cmath>
    #include <iomanip>
    using namespace std;
    
    struct point
    {
    double x;
    double y;
    }pi[1000010];
    
    //求多边形的重心算法
    //说明:
    //求多边形重心并不是简单的把求三角形的重心公式推广就行了
    //我的算法是在平面上取一点(一般取原点, 这样可以减少很多计算, 而且使思路更清晰^_^)
    //这样就得到了N个三角形OP[i]P[i+1](其中点的顺序要为逆时针的),
    //分别求出这N个三角形的重心Ci和面积Ai(注意此处面积是又向面积, 就是用叉乘求面积时保留其正负号)
    //在求出A = A1+A2+...+AN(同样保留正负号的代数相加)
    //最终重心C = sigma(Ai+Ci)/A;
    point gravity(point *p, int n)
    {
    double area = 0;
    point center;
    center.x = 0;
    center.y = 0;
    
    for (int i = 0; i < n-1; i++)
    {
       area += (p[i].x*p[i+1].y - p[i+1].x*p[i].y)/2;
       center.x += (p[i].x*p[i+1].y - p[i+1].x*p[i].y) * (p[i].x + p[i+1].x);
       center.y += (p[i].x*p[i+1].y - p[i+1].x*p[i].y) * (p[i].y + p[i+1].y);
    }
    
    area += (p[n-1].x*p[0].y - p[0].x*p[n-1].y)/2;
    center.x += (p[n-1].x*p[0].y - p[0].x*p[n-1].y) * (p[n-1].x + p[0].x);
    center.y += (p[n-1].x*p[0].y - p[0].x*p[n-1].y) * (p[n-1].y + p[0].y);
    
    center.x /= 6*area;
    center.y /= 6*area;
    
    return center;
    }
    
    int main()
    {
    	int t;
    	scanf("%d",&t);
    	while(t--)
    	{
    		int n;
    		scanf("%d",&n);
    		for(int i=0;i<n;i++)
    			scanf("%lf %lf",&pi[i].x,&pi[i].y);
    		point out=gravity(pi,n);
    		printf("%.2f %.2f\n",out.x,out.y);
    	}
    	return 0;
    }
    
  • 相关阅读:
    大三学长带我学习JAVA.作业8。。1 有1、2、3、4这几个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
    详解Manifest
    反射机制和配置文件的用法
    大三学长带我学习JAVA.作业8。 判断101200之间有多少个素数,并输出所有素数。
    序曲
    java打包生成jar和exe全过程
    大三学长带我学习JAVA.作业6 编写日历表 和vim
    大三学长带我学习JAVA.作业7 利用for循环打印 9*9 表
    动态代理类
    pku 3522 Slim Span
  • 原文地址:https://www.cnblogs.com/nanke/p/2121046.html
Copyright © 2020-2023  润新知