标题的含义:

给定一个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. cocos2d-html5 碰撞检測的几种方法

    游戏中的碰撞还是比較多的,比方角色与角色的碰撞,角色与墙壁的碰撞,角色与怪物的碰撞等,都须要 进行碰撞的检測,来触发一定的事件 近期在尝试制作一个小游戏的时候须要用到碰撞检測,然后就查了下资料,并在论 ...

  2. 教你怎么去一个APP的JSON数据,你懂的

    今天闲着没事.谁让我今天是光棍节呢,算给大家一个福利.没事逛着应用市场.想找个应用高仿下,突然发现一个应用竟然跟我一个名字尼玛,尼玛应用界面做的非常easy.我认为应该不难. 惯性操作想去破解APK. ...

  3. ExtJs自学教程(1):从一切API开始

    称号 记得 本系列文章是不是引进全套焦点ExtJs使用,您只需专注于解决ExtJs思考问题.人们不写长篇大论.别人能学会自立.l  有些人只要学会CSS的javascript对于英文不至于很蹩脚(以辅 ...

  4. poj 2369 Permutations 更换水称号

    寻找循环节求lcm够了,如果答案是12345应该输出1.这是下一个洞. #include<iostream> #include<cstdio> #include<cstr ...

  5. 使用.netFx4.0提供的方法解决32位程序访问64位系统的64位注册表

    原文:使用.netFx4.0提供的方法解决32位程序访问64位系统的64位注册表 我们知道目标平台是32位的程序运行在64位的系统上,去访问部分注册表的时候系统自动重定向到win32node节点对应的 ...

  6. Steps UVA 846

    说说:此题要求求出从整数x到达整数y所要经过的最短步数,且第一步和最后一步必须为一,同一时候每一步都比前一步多一步,少一步或一样.如果想搞清楚每一步详细是如何走的,那么这道题是相当麻烦的.考虑到前后两 ...

  7. 【SICP读书笔记(三)】练习2.18 --- 表序列的reverse方法

    来自练习2.18 请定义出过程reverse,它以一个表为参数,返回的表中所包含的元素与参数表相同,但排列顺序与参数表相反: (reverse (list 1 4 9 16 25)) (25 16 9 ...

  8. 【Spring】Spring学习笔记-01-入门级实例

    听说当前Spring框架很流行,我也准备好好学学Spring开发,并将学习的过程和大家分享,希望能对志同道合的同学有所帮助. 以下是我学习Spring的第一个样例. 1.Spring开发环境的搭建 我 ...

  9. Linux常见命令整理(一)

    整理一下,以备后用 cd /home 进入/home文件夹 cd .. 返回上一级文件夹  cd ../.. 返回上两级文件夹  cd 进入个人的主文件夹  cd - 返回上次所在的文件夹 pwd 显 ...

  10. 《Java程序猿面试笔试宝典》之Java与C/C++有什么异同

    Java与C++都是面向对象语言,都使用了面向对象思想(比如封装.继承.多态等),因为面向对象有很多非常好的特性(继承.组合等),使得二者都有非常好的可重用性. 须要注意的是,二者并不是全然一样,以下 ...