标题的含义:

给定一个n刚n顶点。这是获得n分众协调多边形。

http://acm.hdu.edu.cn/showproblem.php?

pid=1115

题目分析:

/**

*出处:http://blog.csdn.net/ysc504/article/details/8812339

*①质量集中在顶点上

 *  n个顶点坐标为(xi,yi)。质量为mi,则重心

 * X = ∑( xi×mi ) / ∑mi

 * Y = ∑( yi×mi ) / ∑mi

 * 特殊地。若每一个点的质量同样。则

 * X = ∑xi / n

 * Y = ∑yi / n

 *②质量分布均匀

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

 * X = ( x0 + x1 + x2 ) / 3

 * Y = ( y0 + y1 + y2 ) / 3

 *③三角形面积公式:S =  ( (x2 - x1) * (y3 - y1) - (x3 - x1) * (y2 - y1) ) / 2 ;

 *做题步骤:1、将多边形切割成n-2个三角形。依据③公式求每一个三角形面积。

 *            2、依据②求每一个三角形重心。

 *            3、依据①求得多边形重心。

**/

如今根据此算法给出两种代码,一种是将n个点。以当中一个点为标准。分成n-2个三角形。再进行求重心。

还有一种是以原点为根据分成n+1个三角形,再进行求重心。

AC代码:

第一种代码:

#include<iostream>

#include<cmath>

#include<cstdio>

using namespace std;

struct Point{

 double x,y;

};

double Area(Point p1,Point p2,Point p3){//叉乘求三角形面积

    return ((p2.x-p1.x)*(p3.y-p1.y)-(p3.x-p1.x)*(p2.y-p1.y))/2;

}

int main()

{

    int n,t;

    scanf("%d",&t);

    while(t--){

        scanf("%d",&n);

        Point p1,p2,p3;

        double gx,gy,sumarea;

        gx=gy=sumarea=0;

        scanf("%lf%lf%lf%lf",&p1.x,&p1.y,&p2.x,&p2.y);

        for(int i=2;i<n;i++){//分成n-2个三角形

            scanf("%lf%lf",&p3.x,&p3.y);

            double area=Area(p1,p2,p3);//单个三角的面积

            gx+=(p1.x+p2.x+p3.x)*area;//重心乘以其权值(面积),由于每个都要除以3,所医院放在最后

            gy+=(p1.y+p2.y+p3.y)*area;

            sumarea+=area;//计算全部权值

            p2=p3;//替换p2,计算下一个三角形

        }

        gx=gx/sumarea/3;//求的多边形重心

        gy=gy/sumarea/3;

        printf("%.2lf %.2lf\n",gx,gy);

    }

    return 0;

}

另外一种代码:

#include<iostream>

#include<cmath>

#include<cstdio>

using namespace std;

struct Point{

 double x,y;

}p[10005];

double Area(Point p1,Point p2,Point p3){//叉乘求三角形面积

    return ((p2.x-p1.x)*(p3.y-p1.y)-(p3.x-p1.x)*(p2.y-p1.y))/2.0;

}

int main()

{

    int n,t;

    Point p0;

    p0.x=p0.y=0.0;

    scanf("%d",&t);

    while(t--){

        scanf("%d",&n);

        double gx,gy,sumarea,area;

        gx=gy=sumarea=0;

        for(int i = 0; i < n; ++i)

            scanf("%lf%lf", &p[i].x, &p[i].y);

        for(int i=1;i<=n;i++){

            area=Area(p0,p[i%n],p[i-1]);//与原点单个三角的面积

            gx+=(p[i%n].x+p[i-1].x)*area;//重心乘以其权值(面积),由于每个都要除以3,所医院放在最后

            gy+=(p[i%n].y+p[i-1].y)*area;

            sumarea+=area;//计算全部权值

        }

        gx=gx/(sumarea*3);//求的多边形重心

        gy=gy/(sumarea*3);

        printf("%.2lf %.2lf\n",gx,gy);

    }

    return 0;

}

版权声明:本文博主原创文章,博客,未经同意不得转载。

hdu1115(重力算法的多边形中心)的更多相关文章

  1. Java实现 蓝桥杯VIP 算法训练 会议中心

    算法训练 会议中心 时间限制:2.0s 内存限制:512.0MB 会议中心 Siruseri政府建造了一座新的会议中心.许多公司对租借会议中心的会堂很感兴趣,他们希望能够在里面举行会议. 对于一个客户 ...

  2. 【计算几何初步:多边形中心】【HDU1115】Lifting the Stone

    一.质点系重心公式 x=(x1*m1+x2*m2+x3*m3.....xn*mn)/M  (M=m1+m2+m3+m4...+mn) 二.三角形重心 可直接求得,但在多边形剖分中 各三角形的质点的质量 ...

  3. python实现算法: 多边形游戏 数塔问题 0-1背包问题 快速排序

    去年的算法课挂了,本学期要重考,最近要在这方面下点功夫啦! 1.多边形游戏-动态规划 问题描述: 多边形游戏是一个单人玩的游戏,开始时有一个由n个顶点构成的多边形.每个顶点被赋予一个整数值, 每条边被 ...

  4. 在octave语言中K-means聚类算法求聚类中心的向量化计算

    使用octave编程的时候,一定要注意使用向量化编程的思想,下面我就说说我今天做题遇到的一个K-means聚类问题,如何使用octave中的函数向量计算聚类中心centroids. octave几个函 ...

  5. hdu1115 Lifting the Stone(几何,求多边形重心模板题)

    转载请注明出处:http://blog.csdn.net/u012860063 题目链接:pid=1115">http://acm.hdu.edu.cn/showproblem.php ...

  6. [几何]计算不规则多边形的面积、中心、重心(Android,转)

    转自:[几何]计算不规则多边形的面积.中心.重心 最近项目用到:在不规则多边形的中心点加一个图标.(e.g: xx地区发生暴雪,暴雪区域是多边形,给多边形中心加一个暴雪的图标) 之前的设计是,计算不规 ...

  7. html5游戏-包围盒检测算法

    矩形包围盒算法:检测2个矩形是否重叠,在这样情况下要判断2个矩形是否碰撞只需要比较两个矩形顶点的坐标即可.假设矩形A用(x1,y1)表示左上角,(x2,y2)表示右下角,矩形B用(x3,y3)表示左上 ...

  8. opengl实现直线扫描算法和区域填充算法

    总体介绍 1.   使用线性扫描算法画一条线,线性离散点 2.   利用区域填充算法画多边形区域,区域离散的点 开发环境VS2012+OpenGL 开发平台 Intel core i5,Intel H ...

  9. 多边形裁剪的Sutherland-Hodgman算法

    多边形裁剪是渲染管线中重要的一个子阶段,它将视截体外的多边形去除.一种简单的裁剪策略是一旦发现一个顶点在裁剪区域以外,就立刻丢弃该多边形.更加精细的做法则是,将原来的多边形拆为多个不跨越边界的多边形, ...

随机推荐

  1. oracle database 12c R1 安装文档

    INSTALLORACLE DATABASE 12C 完整的安装文档下载地址: http://download.csdn.net/detail/royjj/5665869 OS:ORALCE LINU ...

  2. SSH协议详解(转)

    转发的http://blog.csdn.net/macrossdzh/article/details/5691924 很透彻啊,学习了 一.什么是SSH SSH是英文Secure Shell的简写形式 ...

  3. Mac maven环境变量配置

    近期一直在学习使用Macbook,在这里记录一下全部遇到的问题 问题起源: 1.Macbook 安装了Eclipse,Eclipse装入插件maven & git , 可是在git中clone ...

  4. VS2010关于error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏

    前段时间自己的系统一直在安装更新.今天突然打开VS2010当运行的时候一直出现error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏这种错误.然后就百度 解决的方法: 1.项目\属 ...

  5. zoj Reactor Cooling

    Reactor Cooling 无源汇上下界最大流问题. 1.流量平衡. 2.满足上下界 模板题. #include <iostream> #include <queue> # ...

  6. C#遍历FTP文件夹/下载

    原文链接:http://blog.csdn.net/ou8811/article/details/5295780 整个程序大致可以分为2个部分,第一部分是实现单个文件下载的方法 [c-sharp] v ...

  7. 分享几个免费的开源邮件server软件

    因为企业的须要,我们非常可能须要架设一个邮件server,微软的Exchange太复杂?GOOGLE出来的又收费!头大了吧,OK,贾芸斐在这里给大家分享推荐几个免费的开源的邮件server软件.希望你 ...

  8. 谈论高并发(二十二)解决java.util.concurrent各种组件(四) 深入了解AQS(二)

    上一页介绍AQS其基本设计思路以及两个内部类Node和ConditionObject实现 聊聊高并发(二十一)解析java.util.concurrent各个组件(三) 深入理解AQS(一) 这篇说一 ...

  9. SPOJ PT07X Vertex Cover

    题目意思: 一棵树,找到最少的点能覆盖到所有的边,(也就是每条边俩端 至少有一个在你找到的集合): 解法:每条边只能被俩个点中的一个,或全部覆盖所以我们有树形DP来解: DP[num][flag]// ...

  10. Chrome 小工具: 启动本地应用 (Native messaging)

    最近遇到一个新的问题.需要使用Chrome 插件, 从我们对我们当地的一个网站之一启动C#应用,同时通过本申请值执行不同的操作. 在这里记录下解决的过程.以便以后查找 首先我们须要新建一个google ...