标题的含义:

给定一个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. 存储管理(一):openfiler介绍及存储理解

    openfiler是一个免费的.开源的基于浏览器的网络存储产品,支持基于文件的的网络连接存储(NAS)和基于块的存储区域网(SAN).支持的协议有smb,cifs,nfs,http/dev和ftp. ...

  2. 如何实现MySQL随机查询数据与MySQL随机更新数据?

    以下的文章主要介绍的是MySQL随机选取数据,对实现MySQ随机查询数据与MySQ随机更新数据的实际操作步骤的描述,以及对其实际操作中所要用到的语句的描述,以下就是对其具体操作步骤的描述. MySQL ...

  3. javascript UniqueID属性

        在Web页中的每一个HTML元素都一个ID属性,ID作为其标示,在我们的普通理解中它应该是unique的.但是HTML元素的ID属性是可写的,这就造成了我们非常可能人为的使ID的反复.按么假设 ...

  4. windows phone 页面传值(7)

    原文:windows phone 页面传值(7) 在windows phone 中微软为我们提供了页面间传递参数的解决方案,下面就为大家介绍使用方法,页面传值的案例中我们建立两个页面,一个是MainP ...

  5. PageRank算法MapReduce实现

    如果你现在需要计算网页的排名只有4一:数据如下面的: baidu 10.00 google,sina,nefu google 10.00 baidu sina 10.00 google nefu 10 ...

  6. oracle 修改dbid和dbname

    一般这玩意没人修改,除非特殊情况,比如克隆数据库等等 步骤: 1.备份数据库 2.启动数据到mount状态 3.nid命令修改 (如果只是修改dbid,那么不需要dbname参数,需要更改dbname ...

  7. Foursquare 8.0 :聪明人给互联网公司上的流量转化课

    今年 5 月上线的 Swarm 虽然应用制作精良,但不免让人怀疑是 Foursquare一次失败的互联网公司服务越界和用户忠诚度试水.但非常快这群聪明人让我们发现事情并没有这么简单:他们给互联网公司们 ...

  8. Jetty安装学习并展示

    Jetty 的基本架构 Jetty 眼下的是一个比較被看好的 Servlet 引擎,它的架构比較简单,也是一个可扩展性和很灵活的应用server,它有一个基本数据模型,这个数据模型就是 Handler ...

  9. Unreal Engine 4 创建Destructible Mesh(可破坏网格)

    Unreal Engine 4的物理引擎用的是PhysX. 支持网格破坏.布料.物理粒子等,非常强大.曾经须要编码才干完毕的工作,在Unreal Engine 4 中仅仅须要拖拖拽拽就完毕了,非常方便 ...

  10. ffmpeg架构和解码流程分析

    转 一,ffmpeg架构 1. 简介 FFmpeg是一个集录制.转换.音/视频编码解码功能为一体的完整的开源解决方案.FFmpeg的 开发是基于Linux操作系统,但是可以在大多数操作系统中编译和使用 ...