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个点顺序给出,按照给出顺序将相邻的点用直线连接, (第一个和最后一个连接) ...
随机推荐
- Python 面向对象2
静态方法 静态方法相当于函数,可以不创建对象直接引用 如果在类里面用静态方法,相当于函数,可以不创建对象,直接是用类里面的方法,你就当它是函数. 静态方法名义上归类管理,实际上静态方法访问不了类或实例 ...
- Python不完全入门指南
适用范围: 有一定编程基础,想快速入门python的人群 说明: 使用jupyter notebook编写,可以使用nbviewer网站进行查看. Python不完全入门指南 项目放在github上, ...
- user.sh
#!/bin/bash n=1 while [ $n -le 5 ] do n=$(( $n + 1 )) user=user$n userdel -r $user echo "$user ...
- JMeter压测Rest请求
下载及安装 官网下载JMeter3.0: 找到bin目录下的jmeter.bat启动: 压测Rest请求 1.添加线程组 路径:右键“测试计划”->添加“Threads(Users)”-> ...
- pythonbrew, pythonz, virtualenv
Python 的虛擬環境及多版本開發利器─Virtualenv 與 Pythonbrewhttp://www.openfoundry.org/tw/tech-column/8516-pythons-v ...
- ios7 tableview scrollsToTop 不执行处理方法
ios7中调用[self.tableview scrollsToTop] 没有效果(ios8中也没有效果) stackflow 处理方法: [self.tableviewscrollRectToVis ...
- 消息摘要算法-MAC算法系列
一.简述 mac(Message Authentication Code,消息认证码算法)是含有密钥散列函数算法,兼容了MD和SHA算法的特性,并在此基础上加上了密钥.因此MAC算法也经常被称作HMA ...
- JVM GC算法 CMS 详解(转)
前言 CMS,全称Concurrent Low Pause Collector,是jdk1.4后期版本开始引入的新gc算法,在jdk5和jdk6中得到了进一步改进,它的主要适合场景是对响应时间的重要性 ...
- HDFS snapshot操作实战
Hadoop从2.1.0版开始提供了HDFS SnapShot的功能.一个snapshot(快照)是一个全部文件系统.或者某个目录在某一时刻的镜像.快照在下面场景下是非常有用:防止用户的错误操作:管理 ...
- retrieve jenkins console output
@Api(value = "console", description = "Retrieve the Console Outputs",produces=Me ...