标题的含义:

给定一个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. Windows phone 8 学习笔记(8) 定位地图导航

    原文:Windows phone 8 学习笔记(8) 定位地图导航 Windows phone 8 已经不使用自家的bing地图,新地图控件可以指定制图模式.视图等.bing地图的定位误差比较大,在模 ...

  2. 源代码编译安装 PHP5.5.0,解决curl_exec訪问HTTPS返回502错误的问题

    近期碰到一个奇怪的问题. PHP使用 curl_exec 訪问 HTTPS 网页时, 返回502错误, 訪问HTTP网页时没有问题,  用   echo   phpinfo() ;  查看. 支持op ...

  3. 划分树 静态第k大

    划分树是保存了快速排序的过程的树,可以用来求静态第k小的数 如果,划分树可以看做是线段树,它的左孩子保存了mid-L+1 个 小于等于 a[mid] 的数字,  右孩子保存了 R-mid个大于等于a[ ...

  4. android EditText的美化

    今天要做一个页面,有EditText,于是就搞起了它的美化. EditText的美化,我的第一反应是,在EditText的左边设置显示一张图片,这样会比較好看. 设置左边显示图片的属性为:androi ...

  5. 【设计优化】-使用缓冲(Buffer)提高程序性能

    缓冲区是一块特定的内存区域.开辟缓冲区的目的是通过缓解应用程序上下层之间的性能差异,提高系统性能. 缓冲能够协调上层组件和下层组件的性能差异.当上层组件性能因为下层组件时,能够有效地降低上层组件对下层 ...

  6. 高仿快车100--实战RadioGroup和RadioButton应用

    1.RadioButtonCheckBox的差别: a.单个RadioButton在选中后,通过点击无法变为未选中 单个CheckBox在选中后.通过点击能够变为未选中 b.一组RadioButton ...

  7. Java多线程的wait(),notify(),notifyAll()

    在多线程的情况下.因为多个线程与存储空间共享相同的过程,同时带来的便利.它也带来了访问冲突这个严重的问题. Java语言提供了一种特殊的机制来解决这类冲突,避免同一数据对象由多个线程在同一时间访问. ...

  8. Perl中的单行凝视和多行凝视

    同其它大多数编程语言一样.Perl中的单行凝视也是#开头.比如: #print "Hello,World!"; 但多行凝视.不同的语言有不同的凝视方式,比方说: Java,C/C+ ...

  9. python 调用图灵机器人api实现简单的人机交互

    接入流程例如以下,须要先注冊开发人员帐号,之后会得到一个32位的key,保存下来,用于以后发送数据.http://www.tuling123.com/ 请求方式 演示样例: # -*- coding: ...

  10. HDU 4777 Rabbit Kingdom(树状数组)

    HDU 4777 Rabbit Kingdom 题目链接 题意:给定一些序列.每次询问一个区间,求出这个区间和其它数字都互质的数的个数 #include <cstdio> #include ...