HDOJ(1115)多边形重心
Lifting the Stone
http://acm.hdu.edu.cn/showproblem.php?pid=1115
题目描述:输入n个顶点(整数),求它们围成的多边形的重心。
算法:以一个点出发,与其他非邻点相连,将n边形划分成n-2个三角形。求每个三角形的质点系重心(如:((x1+x2+x3)/3,(y1+y2+y3)/3)),再求出每个三角形的面积。相乘求和后除以多边形面积)。
注意:we connect the points in the given order。输入的顺序,要么是顺时针,要么是逆时针。
#include <iostream>
#include <iomanip>
#include <vector>
using namespace std;
struct Node //顶点或向量结构
{
int x;
int y;
};
vector<Node> node;
int main()
{
int t,n;
double cross_sum,x_sum,y_sum;
cin>>t;
while(t--)
{
node.clear();
cross_sum=;
x_sum=y_sum=;
cin>>n;
for(int i=;i<=n;i++)
{
Node temp; //顶点
cin>>temp.x>>temp.y;
node.push_back(temp);
}
Node vec1,vec2; //向量
vec1.x=node[].x-node[].x;
vec1.y=node[].y-node[].y;
for(int i=;i<=n-;i++)
{
vec2.x=node[i].x-node[].x;
vec2.y=node[i].y-node[].y;
int cross=vec1.x*vec2.y-vec2.x*vec1.y;
x_sum+=(double)(node[].x+node[i-].x+node[i].x)*cross;
y_sum+=(double)(node[].y+node[i-].y+node[i].y)*cross;
cross_sum+=cross;
vec1=vec2;
}
double res_x=x_sum/(*cross_sum);
double res_y=y_sum/(*cross_sum); //最后用除法,且少用除法,减少精度丢失
cout<<fixed<<setprecision()<<res_x<<" "<<res_y<<endl;
}
return ;
}
做了几道计算几何的题目,不得不说向量是个好东西!!!是哪位神人发明的向量,膜拜。
下面是别人写的的求多边形重心的方法:
线垂法:
具体方法是:用细线提起该物体,在该物体上画细线的延长线,再移位用细线提起该物体,在该物体上画细线的延长线,两线的交叉点就是这一物体在这平面上的重心, 其它面同理.适用于实际测量中。
定理法:(本人自己命名)
定理1: 由两个图形A,B合并而成的一个图形C,则C的重心必在A的重心与B的重心连接的线段上。(注意,也适用于A B彼此分开,没有公共点的情形)
定理2: 由两个A,B合并而成的一个图形C,A的重心为点a, B的重心为点b, C的重心为点c, A的面积为Sa, B的面积为Sb,则下面条件成立:
(1)点c 必在线段 ab 上
(2) ac * Sa = bc * Sb
计算几何中:
三角形的重心: x = (xa+xb+xc)/3, y = (ya+yb+yc)/3;
四边形的重心:作一对角线,将它分成两个三角形分别求出重心与面积 (x1,y1) ,s1 ; (x2, y2), s2 则该四边形的重心为: x = (x1*s1+x2*s2)/(s1+s2), y = (y1*s1+y2*s2)/(s1+s2);
五边形则分为一个三角形与一个四边形……
任意多边形中直接取任一点(一般为原点)把多边形分为n-2个三角形 分别求重心
x=∑ si * xi / ∑si
y=∑ si * yi / ∑si
si 为每块三角形的有向面积 (就是向量叉积/2)
HDOJ(1115)多边形重心的更多相关文章
- hdu 1115(多边形重心问题)
Lifting the Stone Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- hdu 1115(计算多边形重心)
题意:已知一多边形没有边相交,质量分布均匀.顺序给出多边形的顶点坐标,求其重心. 分析: 求多边形重心的题目大致有这么几种: 1,质量集中在顶点上.n个顶点坐标为(xi,yi),质量为mi,则重心 X ...
- HDU 1115(求质量均匀分布的多边形重心 物理)
题意是给一个 n 边形,给出沿逆时针方向分布的各顶点的坐标,求出 n 边形的重心. 求多边形重心的情况大致上有三种: 一.多边形的质量都分布在各顶点上,像是用轻杆连接成的多边形框,各顶点的坐标为Xi, ...
- hdu 1115:Lifting the Stone(计算几何,求多边形重心。 过年好!)
Lifting the Stone Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- hdu1115 Lifting the Stone(几何,求多边形重心模板题)
转载请注明出处:http://blog.csdn.net/u012860063 题目链接:pid=1115">http://acm.hdu.edu.cn/showproblem.php ...
- UVALive 4426 Blast the Enemy! --求多边形重心
题意:求一个不规则简单多边形的重心. 解法:多边形的重心就是所有三角形的重心对面积的加权平均数. 关于求多边形重心的文章: 求多边形重心 用叉积搞一搞就行了. 代码: #include <ios ...
- 谁能告诉我为什么sum_area输出总是0(多边形重心问题)
多边形重心问题 时间限制:3000 ms | 内存限制:65535 KB 难度:5 描述 在某个多边形上,取n个点,这n个点顺序给出,按照给出顺序将相邻的点用直线连接, (第一个和最后一个连接 ...
- Hdoj 1115.Lifting the Stone 题解
Problem Description There are many secret openings in the floor which are covered by a big heavy sto ...
- NYOJ3——多边形重心问题
多边形重心问题 时间限制:3000 ms | 内存限制:65535 KB 难度:5 描述:在某个多边形上,取n个点,这n个点顺序给出,按照给出顺序将相邻的点用直线连接, (第一个和最后一个连接) ...
随机推荐
- RabbitMQ、Rdis
RabbitMQ RabbitMQ:官方网址:http://www.rabbitmq.com/ Install Erlang # rpm -ivh erlang-18.3-1.el6.x86_64.r ...
- ASP.Net上传大文件解决方案之IIS7.0下的配置
开源的Brettle.Web.NeatUpload.在公司IIS6.0使用正常,但是在Windows 2008 server IIS7上使用不正常.在网上看到一个解决办法但是没有效果 IIS 7 默认 ...
- NC57银行档案和客商银行账号为建行04 UPDATE
第二步 银行档案 update bd_bankdoc set bankdoccode='04N'|| bankdoccode , pk_banktype='0001ZZ1000000001OCUD' ...
- Hibernate5.2关联关系之单向多对一(二)
Hibernate5.2之单向一对多(二) 一. 简介 在本篇博文中笔者会在上一篇博客的代码基础上进行修改,本篇文章将介绍单向的一对多. 二. hbm文件的方式 Customer.hbm.xml &l ...
- BigInger isProbablePrime
JAVA BigInteger 成员函数: isProbablePrime public boolean isProbablePrime(int certainty) 如果此 BigInteger 可 ...
- Linux上分析java程序的问题
通过日志看不出来的问题,可以通过看java的堆栈信息(dump文件)来看出一些端倪. 1. 找java的进程id.jdk/bin的目录 ps -ef | grep java 2. cd 到bin的目录 ...
- java 内存回收(GC)的方式
java内存的管理其实就是对象内存的管理,其中包括对象的分配和释放 对应程序员来说分配对象使用new关键字,而释放一个对象只需要让它等于null,让程序不能再访问这个对象,这时对象是不可达的,GC负责 ...
- UNIX网络编程-非阻塞connect和非阻塞accept
1.非阻塞connect 在看了很多资料之后,我自己的理解是:在socket发起一次连接的时候,这个过程需要一段时间来将三次握手的过程走完,如果在网络状况不好或者是其他的一些情况下,这个过程需要比较长 ...
- Esfog_UnityShader教程_溶解效果Dissolve
溶解效果在游戏中是很常见的,比如在一些神话或者魔法世界中,一些NPC角色在剧情需要时候会身体会渐渐的消失掉.甚至有一些更炫的,比如用火焰喷射器把目标燃尽.这些都可以用到溶解效果.这篇文章主要是讲解一下 ...
- sencha touch打包成安装程序
为了更好地向大家演示如何打包一个sencha touch的项目,我们用sencha cmd创建一个演示项目,如果你的sencha cmd环境还没有配置,请参照 sencha touch 入门系列 (二 ...