hdu1115(重力算法的多边形中心)
标题的含义:
给定一个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(重力算法的多边形中心)的更多相关文章
- Java实现 蓝桥杯VIP 算法训练 会议中心
算法训练 会议中心 时间限制:2.0s 内存限制:512.0MB 会议中心 Siruseri政府建造了一座新的会议中心.许多公司对租借会议中心的会堂很感兴趣,他们希望能够在里面举行会议. 对于一个客户 ...
- 【计算几何初步:多边形中心】【HDU1115】Lifting the Stone
一.质点系重心公式 x=(x1*m1+x2*m2+x3*m3.....xn*mn)/M (M=m1+m2+m3+m4...+mn) 二.三角形重心 可直接求得,但在多边形剖分中 各三角形的质点的质量 ...
- python实现算法: 多边形游戏 数塔问题 0-1背包问题 快速排序
去年的算法课挂了,本学期要重考,最近要在这方面下点功夫啦! 1.多边形游戏-动态规划 问题描述: 多边形游戏是一个单人玩的游戏,开始时有一个由n个顶点构成的多边形.每个顶点被赋予一个整数值, 每条边被 ...
- 在octave语言中K-means聚类算法求聚类中心的向量化计算
使用octave编程的时候,一定要注意使用向量化编程的思想,下面我就说说我今天做题遇到的一个K-means聚类问题,如何使用octave中的函数向量计算聚类中心centroids. octave几个函 ...
- hdu1115 Lifting the Stone(几何,求多边形重心模板题)
转载请注明出处:http://blog.csdn.net/u012860063 题目链接:pid=1115">http://acm.hdu.edu.cn/showproblem.php ...
- [几何]计算不规则多边形的面积、中心、重心(Android,转)
转自:[几何]计算不规则多边形的面积.中心.重心 最近项目用到:在不规则多边形的中心点加一个图标.(e.g: xx地区发生暴雪,暴雪区域是多边形,给多边形中心加一个暴雪的图标) 之前的设计是,计算不规 ...
- html5游戏-包围盒检测算法
矩形包围盒算法:检测2个矩形是否重叠,在这样情况下要判断2个矩形是否碰撞只需要比较两个矩形顶点的坐标即可.假设矩形A用(x1,y1)表示左上角,(x2,y2)表示右下角,矩形B用(x3,y3)表示左上 ...
- opengl实现直线扫描算法和区域填充算法
总体介绍 1. 使用线性扫描算法画一条线,线性离散点 2. 利用区域填充算法画多边形区域,区域离散的点 开发环境VS2012+OpenGL 开发平台 Intel core i5,Intel H ...
- 多边形裁剪的Sutherland-Hodgman算法
多边形裁剪是渲染管线中重要的一个子阶段,它将视截体外的多边形去除.一种简单的裁剪策略是一旦发现一个顶点在裁剪区域以外,就立刻丢弃该多边形.更加精细的做法则是,将原来的多边形拆为多个不跨越边界的多边形, ...
随机推荐
- 异常学习笔记+打包+doc该软件包编译
jvm调用默认的异常处理机制printStackTrace办法 欲了解更多异常处理.问题 捕获异常代码块出现继承关系 应该把被继承的异常放在子类异常块的后面 watermark/2 ...
- C的xml编程文章链接
官方地址:http://www.xmlsoft.org/ http://hi.baidu.com/singyea/item/ed4d1c335a9527b8633aff82 http://os.chi ...
- 关于使用X-UA-Compatible来设置IE浏览器兼容模式
原文地址:http://www.cnblogs.com/nidilzhang/archive/2010/01/09/1642887.html 前言 为了帮助确保你的网页在所有未来的IE版本都有一致的外 ...
- pygame系列_游戏窗口显示策略
在这篇blog中,我将给出一个demo演示: 当我们按下键盘的‘f’键的时候,演示的窗口会切换到全屏显示和默认显示两种显示模式 并且在后台我们可以看到相关的信息输出: 上面给出了一个简单的例子,当然在 ...
- 两个实验操作系统-ubuntu在安装配置pintos
安前两次莫名其妙, 蛋疼的实验操作系统.. 首先下错了总结第一次. 使用最后gdb调试pintos什么时候, 这个错误将被报告: bochsrc.txt:8: Bochs is not compile ...
- 基于Android 下载文件时,更新UI简单帮助类
因为在项目开发时.有这种简单需求,问谷歌,网络上也有好多Utils工具类,可是比較冗余.自己就简单的写了一个简单帮助类. /** * 下载文件,更新UI简单帮助类 * * @author jarlen ...
- 样品GA的良好理解
遗传算法演示样本手册模拟 为了更好地理解遗传算法的计算过程,法的各 个主要运行步骤. 例:求下述二元函数的最大值: (1) 个体编码 遗传算法的运算对象是表示个体 ...
- 潜水 java类加载器ClassLoader
类加载器(class loader)用于装载 Java 类到 Java 虚拟机中.一般来说.Java 虚拟机使用 Java 类的方式例如以下:Java 源程序(.java 文件)在经过 Java 编译 ...
- 怎样在Android开发中FPS游戏实现的两种方式比较
怎样在Android开发中FPS游戏实现的两种方式比较 如何用Android平台开发FPS游戏,其实现过程有哪些方法,这些方法又有哪些不同的地方呢?首先让我们先了解下什么是FPS 英文名:FPS (F ...
- Java 并发专题 : Semaphore 实现 互斥 与 连接池
继续并发方面的知识.今天介绍Semaphore,同样在java.util.concurrent包下. 本来准备通过例子,从自己实现到最后使用并发工具实现,但是貌似效果并不是很好,有点太啰嗦的感觉,所有 ...