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=0;x_sum=y_sum=0;cin>>n;for(int i=1;i<=n;i++){Node temp;  //顶点cin>>temp.x>>temp.y;node.push_back(temp);}Node vec1,vec2; //向量vec1.x=node[1].x-node[0].x;vec1.y=node[1].y-node[0].y;for(int i=2;i<=n-1;i++){vec2.x=node[i].x-node[0].x;vec2.y=node[i].y-node[0].y;int cross=vec1.x*vec2.y-vec2.x*vec1.y;x_sum+=(double)(node[0].x+node[i-1].x+node[i].x)*cross;y_sum+=(double)(node[0].y+node[i-1].y+node[i].y)*cross;cross_sum+=cross;vec1=vec2;}double res_x=x_sum/(3*cross_sum);double res_y=y_sum/(3*cross_sum);  //最后用除法,且少用除法,减少精度丢失cout<<fixed<<setprecision(2)<<res_x<<" "<<res_y<<endl;}return 0;
}

View Code

做了几道计算几何的题目,不得不说向量是个好东西!!!是哪位神人发明的向量,膜拜。

下面是别人写的的求多边形重心的方法:

线垂法:

  具体方法是:用细线提起该物体,在该物体上画细线的延长线,再移位用细线提起该物体,在该物体上画细线的延长线,两线的交叉点就是这一物体在这平面上的重心,        其它面同理.适用于实际测量中。

定理法:(本人自己命名)
  定理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)

转载于:https://www.cnblogs.com/chiry/p/3505949.html

HDOJ(1115)多边形重心相关推荐

  1. hdu 1115(多边形重心)

    求多边形重心的题目大致有这么几种:  1.质量集中在顶点上      n个顶点坐标为(xi,yi),质量为mi,则重心  X = ∑( xi×mi ) / ∑mi  Y = ∑( yi×mi ) / ...

  2. HDU 1115 Lifting the Stone(求多边形重心)

    HDU 1115 大意:给你个n,有n个点,然后给你n个点的坐标,求这n个点形成的多边形的重心的坐标. 1 struct point 2 { 3 double x, y; 4 } P[1000010] ...

  3. 南阳 3 多边形重心问题(数学几何)

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

  4. POJ 3855 计算几何·多边形重心

    思路: 多边形面积->任选一个点,把多边形拆成三角,叉积一下 三角形重心->(x1+x2+x3)/3,(y1+y2+y3)/3 多边形重心公式题目中有,套一下就好了 计算多边形重心方法: ...

  5. NYOJ 3:多边形重心问题

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

  6. 不规则多边形重心求解

    文章目录 一.不规则多边形重心求解 1.1 三角形重心计算方法 1.2 三角形面积计算方法 1.3 多边形面积的计算方法 1.4 不规则多边形的重心计算方法 一.不规则多边形重心求解 1.1 三角形重 ...

  7. java计算一个多边形的重心_多边形重心问题 java

    多边形重心问题 java 看题目 点这里 题目描述: 描述 在某个多边形上,取n个点,这n个点顺序给出,按照给出顺序将相邻的点用直线连接, (第一个和最后一个连接),所有线段不和其他线段相交,但是可以 ...

  8. java计算一个多边形的重心_Java多边形重心计算

    多边形重心计算 三角形重心 顶点为a,b,c的三角形重心为x = (xa + xb + xc) / 3,y = (ya + yb + yc) / 3 多边形重心 x = (x1w1 + x2w2 + ...

  9. 【JAVA】多边形重心计算

    多边形重心计算 三角形重心 顶点为a,b,c的三角形重心为x = (xa + xb + xc) / 3,y = (ya + yb + yc) / 3 多边形重心 x = (x1w1 + x2w2 + ...

最新文章

  1. oracle数据库查询如何导出大字段,Oracle数据库导出大字段(CLOB)数据-Oracle
  2. 不同虚拟局域网Vlan配置DHCP服务器
  3. python开发信息系统权限设置_[Python学习] Django 权限控制
  4. 想精通正则表达式 这几个正则表达式学习资料及工具你必须有!
  5. TensorFlow2.0(三)--Keras构建神经网络回归模型
  6. Android AsyncTasks并行执行
  7. sas+eg连接mysql_SAS EG 连接 SQL Server 2017数据库
  8. WordPress 安装主题时 提示 “无法创建目录”
  9. idea破解码生成地址
  10. 2017年技术分享会 - 大数据前沿技术分析与应用
  11. 计算机管理打不开路径不存在,电脑打不开软件提示路径不正确如何解决
  12. Vue warn 屏蔽
  13. 蓝桥杯(java)个人赛真题:书号验证
  14. LILO配置指南(整理版)
  15. 【Windows 11】终端美化配置(优化)
  16. Tk应用程序:密码输入框
  17. Java转Go语言 -4
  18. OSPF不规则区域的解决方案
  19. 诺基亚 java_诺基亚开放Symbian Javaapps了
  20. 计算机动漫与游戏制作与影视,中职中专计算机动漫与游戏制作专业系列教材·动画与影视后期制作:After Effects CS4技能应用教程...

热门文章

  1. python三引号 内部变量_python在三引号中使用变量
  2. JZOJ 5639. 【NOI2018模拟4.8】秘密袭击
  3. linux ant脚本,linux下ant jmeter自动化测试
  4. python怎么安装turtle_Python3.6安装turtle模块
  5. docker 容器安装conposer_docker学习笔记(二)docker-composer
  6. hdu5443(2015长春网络赛G题)
  7. 珠心算测试(c++版)
  8. 组合的输出pascal程序
  9. c# 收取邮件 解析,C#电子邮件主题解析
  10. python映射类型list_python中标准数据类型:数字 string(字符串) list(列表) tuple(元组) dict(字典) sets(集合)共同点和区别:...