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)多边形重心的更多相关文章

  1. hdu 1115(多边形重心问题)

    Lifting the Stone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  2. hdu 1115(计算多边形重心)

    题意:已知一多边形没有边相交,质量分布均匀.顺序给出多边形的顶点坐标,求其重心. 分析: 求多边形重心的题目大致有这么几种: 1,质量集中在顶点上.n个顶点坐标为(xi,yi),质量为mi,则重心 X ...

  3. HDU 1115(求质量均匀分布的多边形重心 物理)

    题意是给一个 n 边形,给出沿逆时针方向分布的各顶点的坐标,求出 n 边形的重心. 求多边形重心的情况大致上有三种: 一.多边形的质量都分布在各顶点上,像是用轻杆连接成的多边形框,各顶点的坐标为Xi, ...

  4. hdu 1115:Lifting the Stone(计算几何,求多边形重心。 过年好!)

    Lifting the Stone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  5. hdu1115 Lifting the Stone(几何,求多边形重心模板题)

    转载请注明出处:http://blog.csdn.net/u012860063 题目链接:pid=1115">http://acm.hdu.edu.cn/showproblem.php ...

  6. UVALive 4426 Blast the Enemy! --求多边形重心

    题意:求一个不规则简单多边形的重心. 解法:多边形的重心就是所有三角形的重心对面积的加权平均数. 关于求多边形重心的文章: 求多边形重心 用叉积搞一搞就行了. 代码: #include <ios ...

  7. 谁能告诉我为什么sum_area输出总是0(多边形重心问题)

    多边形重心问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:5   描述 在某个多边形上,取n个点,这n个点顺序给出,按照给出顺序将相邻的点用直线连接, (第一个和最后一个连接 ...

  8. Hdoj 1115.Lifting the Stone 题解

    Problem Description There are many secret openings in the floor which are covered by a big heavy sto ...

  9. NYOJ3——多边形重心问题

    多边形重心问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:5  描述:在某个多边形上,取n个点,这n个点顺序给出,按照给出顺序将相邻的点用直线连接, (第一个和最后一个连接) ...

随机推荐

  1. Mac下Virtual Box Host-Only网络配置

    Mac下的虚拟机其实有很多,Parallels.VMware Fusion.Virtual Box都不错,Parallels是目前试过感觉最好的,Fusion装64位系统驱动支持似乎不完善,而且混合模 ...

  2. Visual studio 类视图和资源视图不显示的问题

    关于Visual studio 类视图和资源视图不显示的问题 解决方法: 1. 工具—选项—文本编辑器—C/C++—高级,浏览/导航下的禁用数据库选项置为False; 2. 输入命令:devenv / ...

  3. Java应用程序监控JavaMelody

    JavaMelody是运行在Java Web容器中,用来监控Java内存和J服务器CPU使用情况,用户Session数量,JDBC连接数,和http请求.sql请求等的执行数量,平均执行时间,错误百分 ...

  4. 线程Thread,有参数和参数

    一.不带参数的 using System; using System.Collections.Generic; using System.Text; using System.Threading; n ...

  5. Interview

    下面的题是供大家查漏补缺用的,真正的把这些题搞懂了,才能"以不变应万变". 回答问题的时候能联系做过项目的例子是最好的,有的问题后面我已经补充联系到项目中的对应的案例了. 1.简述 ...

  6. 作品-系统-[原生开发]新蓝景CRM管理系统

    基于ThinkPHP开发 项目网址:http://www.xljchina.com.cn:8839/Admin/Login/login.html 开发性质:原生开发 系统类型:CRM

  7. java.lang.NoClassDefFoundError 解决方案

    http://stackoverflow.com/questions/9870995/android-java-lang-noclassdeffounderror 像网络了上说的一般这种问题是 运行时 ...

  8. [ActionScript 3.0] 分页排版

    竖排版: 横排版: /*** 分页排版 ***/ var _column:int = 5;//列数 var _row:int = 3;//行数 var _vGap:Number = 20;//行间距 ...

  9. Centos6.4 aria2 webui-aria2

    wget http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm rpm -ivh ...

  10. List subList(startIndex, endIndex);

    1. subList(startIndex, endIndex);//startIndex开始,到endIndex结束,不包含endIndex! 2. 集合排序可以实现 java.util.Compa ...