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=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)多边形重心相关推荐
- hdu 1115(多边形重心)
求多边形重心的题目大致有这么几种: 1.质量集中在顶点上 n个顶点坐标为(xi,yi),质量为mi,则重心 X = ∑( xi×mi ) / ∑mi Y = ∑( yi×mi ) / ...
- HDU 1115 Lifting the Stone(求多边形重心)
HDU 1115 大意:给你个n,有n个点,然后给你n个点的坐标,求这n个点形成的多边形的重心的坐标. 1 struct point 2 { 3 double x, y; 4 } P[1000010] ...
- 南阳 3 多边形重心问题(数学几何)
多边形重心问题 时间限制:3000 ms | 内存限制:65535 KB 难度:5 描述 在某个多边形上,取n个点,这n个点顺序给出,按照给出顺序将相邻的点用直线连接, (第一个和最后一个连接), ...
- POJ 3855 计算几何·多边形重心
思路: 多边形面积->任选一个点,把多边形拆成三角,叉积一下 三角形重心->(x1+x2+x3)/3,(y1+y2+y3)/3 多边形重心公式题目中有,套一下就好了 计算多边形重心方法: ...
- NYOJ 3:多边形重心问题
多边形重心问题 时间限制:3000 ms | 内存限制:65535 KB 难度:5 描述 在某个多边形上,取n个点,这n个点顺序给出,按照给出顺序将相邻的点用直线连接, (第一个和最后一个连接), ...
- 不规则多边形重心求解
文章目录 一.不规则多边形重心求解 1.1 三角形重心计算方法 1.2 三角形面积计算方法 1.3 多边形面积的计算方法 1.4 不规则多边形的重心计算方法 一.不规则多边形重心求解 1.1 三角形重 ...
- java计算一个多边形的重心_多边形重心问题 java
多边形重心问题 java 看题目 点这里 题目描述: 描述 在某个多边形上,取n个点,这n个点顺序给出,按照给出顺序将相邻的点用直线连接, (第一个和最后一个连接),所有线段不和其他线段相交,但是可以 ...
- java计算一个多边形的重心_Java多边形重心计算
多边形重心计算 三角形重心 顶点为a,b,c的三角形重心为x = (xa + xb + xc) / 3,y = (ya + yb + yc) / 3 多边形重心 x = (x1w1 + x2w2 + ...
- 【JAVA】多边形重心计算
多边形重心计算 三角形重心 顶点为a,b,c的三角形重心为x = (xa + xb + xc) / 3,y = (ya + yb + yc) / 3 多边形重心 x = (x1w1 + x2w2 + ...
最新文章
- oracle数据库查询如何导出大字段,Oracle数据库导出大字段(CLOB)数据-Oracle
- 不同虚拟局域网Vlan配置DHCP服务器
- python开发信息系统权限设置_[Python学习] Django 权限控制
- 想精通正则表达式 这几个正则表达式学习资料及工具你必须有!
- TensorFlow2.0(三)--Keras构建神经网络回归模型
- Android AsyncTasks并行执行
- sas+eg连接mysql_SAS EG 连接 SQL Server 2017数据库
- WordPress 安装主题时 提示 “无法创建目录”
- idea破解码生成地址
- 2017年技术分享会 - 大数据前沿技术分析与应用
- 计算机管理打不开路径不存在,电脑打不开软件提示路径不正确如何解决
- Vue warn 屏蔽
- 蓝桥杯(java)个人赛真题:书号验证
- LILO配置指南(整理版)
- 【Windows 11】终端美化配置(优化)
- Tk应用程序:密码输入框
- Java转Go语言 -4
- OSPF不规则区域的解决方案
- 诺基亚 java_诺基亚开放Symbian Javaapps了
- 计算机动漫与游戏制作与影视,中职中专计算机动漫与游戏制作专业系列教材·动画与影视后期制作:After Effects CS4技能应用教程...
热门文章
- python三引号 内部变量_python在三引号中使用变量
- JZOJ 5639. 【NOI2018模拟4.8】秘密袭击
- linux ant脚本,linux下ant jmeter自动化测试
- python怎么安装turtle_Python3.6安装turtle模块
- docker 容器安装conposer_docker学习笔记(二)docker-composer
- hdu5443(2015长春网络赛G题)
- 珠心算测试(c++版)
- 组合的输出pascal程序
- c# 收取邮件 解析,C#电子邮件主题解析
- python映射类型list_python中标准数据类型:数字 string(字符串) list(列表) tuple(元组) dict(字典) sets(集合)共同点和区别:...