题意是给一个 n 边形,给出沿逆时针方向分布的各顶点的坐标,求出 n 边形的重心。

求多边形重心的情况大致上有三种:

一、多边形的质量都分布在各顶点上,像是用轻杆连接成的多边形框,各顶点的坐标为Xi,Yi,质量为mi,则重心坐标为:

  X = ∑( xi * mi ) /  ∑ mi ;

  Y = ∑( yi * mi)  / ∑ mi;

  若每个顶点的质量相等,则重心坐标为:

  X = ∑ xi / n;

  Y = ∑ yi / n;

二、多边形的质量分布均匀,像是用密度相同的材料制成的多边形板子,多采用将多边形分割成 n - 2 个三角形,(个人喜欢以原点和多边形逆时针方向上连续两点作为每个三角形的三顶点,因为算面积使用的是向量叉乘,用原点可以减少对三角形两边向量的求解(直接用坐标即可),而叉乘得到的是有向面积,对结果并无影响)再求出每个三角形的重心:

  X = (x0 + x1 + x2) / 3;

  Y = (y0 + y1 + y2) / 3;

  再将各重心视作情况一处理即可

  要注意的是这种情况下并不是求三角形重心的简单推广,也就是说不能简单的用不断分割三角形求重心的方法去做

三、多边形的质量分布不均匀,此时要用到积分的方法。

本题属于第二种情况,所以按照第二种情况的处理方式处理即可。

 #include <iostream>
#include <cstdio>
#include <cmath>
#include <iomanip>
using namespace std; struct point
{
double x,y;
}pi[];
double cp(point a,point b)
{
return (a.x*b.y)-(a.y*b.x);
}
point gravity(point *p, int n)
{
double area = ;
point center;
center.x = center.y = ;
for (int i = ; i < n-; i++)
{
area += cp(p[i],p[i+]);
center.x += cp(p[i],p[i+]) * (p[i].x + p[i+].x);
center.y += cp(p[i],p[i+]) * (p[i].y + p[i+].y);
/*此处其实是:
area += cp(p[i],p[i+1]) / 2;
center.x += (cp(p[i],p[i+1]) / 2)* ((p[i].x + p[i+1].x + 0) / 3);
center.y += (cp(p[i],p[i+1]) / 2)* ((p[i].y + p[i+1].y + 0) / 3);
但一些计算过程中的常数在实际运算时被总写了。
*/
}
area += cp(p[n-],p[]);//area += cp(p[n-1],p[0]) / 2;
center.x += cp(p[n-],p[]) * (p[n-].x + p[].x);//center.x += (cp(p[n-1],p[0]) / 2) * ((p[n-1].x + p[0].x + 0) / 3);
center.y += cp(p[n-],p[]) * (p[n-].y + p[].y);//center.y += (cp(p[n-1],p[0]) / 2) * ((p[n-1].y + p[0].y + 0) / 3);
center.x /= *area;//center.x /= area;
center.y /= *area;//center.y /= area;
return center;
} int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
for(int i = ; i < n; i++)
scanf("%lf %lf",&pi[i].x,&pi[i].y);
point out = gravity(pi,n);
printf("%.2f %.2f\n",out.x,out.y);
}
return ;
}

  

HDU 1115(求质量均匀分布的多边形重心 物理)的更多相关文章

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

    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(多边形重心问题)

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

  4. HDOJ(1115)多边形重心

    Lifting the Stone http://acm.hdu.edu.cn/showproblem.php?pid=1115 题目描述:输入n个顶点(整数),求它们围成的多边形的重心. 算法:以一 ...

  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. Lifting the Stone(多边形重心)

    Lifting the Stone Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u S ...

  8. poj 1115 Lifting the Stone 计算多边形的中心

    Lifting the Stone Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u S ...

  9. hdu 1115 Lifting the Stone

    题目链接:hdu 1115 计算几何求多边形的重心,弄清算法后就是裸题了,这儿有篇博客写得很不错的: 计算几何-多边形的重心 代码如下: #include<cstdio> #include ...

随机推荐

  1. 【XSY2718】gift 分数规划 网络流

    题目描述 有\(n\)个物品,买第\(i\)个物品要花费\(a_i\)元.还有\(m\)对关系:同时买\(p_i,q_i\)两个物品会获得\(b_i\)点收益. 设收益为\(B\),花费为\(A\), ...

  2. Gym - 101848C Object-Oriented Programming (树链剖分+线段树+动态开点)

    C. Object-Oriented Programming time limit per test 3.0 s memory limit per test 1024 MB input standar ...

  3. 数字平滑 前端插件JS&CSS库

    CDN DEMO 拷贝可用: <!DOCTYPE html> <link rel="stylesheet" href="https://cdn.boot ...

  4. MySQL免安装版,遇到MSVCR120.dll文件丢失错误的解决方案

    下载 VC redist packages for x64,下载完成,点击运行即可.

  5. 洛谷P3953 逛公园(NOIP2017)(最短/长路,拓扑排序,动态规划)

    洛谷题目传送门 又是一年联赛季.NOIP2017至此收官了. 这个其实是比较套路的图论DP了,但是细节有点恶心. 先求出\(1\)到所有点的最短路\(d1\),和所有点到\(n\)的最短路\(dn\) ...

  6. 【BZOJ2242】计算器(BSGS,快速幂)

    [BZOJ2242]计算器(BSGS,快速幂) 题面 BZOJ 洛谷 1.给定y.z.p,计算y^z mod p 的值: 2.给定y.z.p,计算满足xy ≡z(mod p)的最小非负整数x: 3.给 ...

  7. pycharm 中的 全局搜索(ctrl+shift+f) 功能无法使用的原因

    全局搜索的时候Ctrl+Shift+F按键失灵,有的时候可以,有时又不行了,百思不得其解. 在網上搜索很多人說是搜狗输入法的快捷键冲突了,但是我的电脑用的是微软自带的输入法 后来打开微软的输入法设置发 ...

  8. canvas的api小结

    HTML <canvas id="canvas"></canvas> Javascript var canvas=document.getElementBy ...

  9. 计算机基础:计算机网络-chapter5 运输层

    一.运输层做什么事情,通过什么协议实现, 运输层做什么 为相互通信的应用提供逻辑通信 通过端口号来确定应用,提供端到端的服务: 为什么需要运输层,IP层不是就实现了传输数据吗 从IP层来说,是两台主机 ...

  10. appium 切换native/ webview,findby,还有页面元素定位一直小于0的问题的解决

    之前一直有个bug没有解决. 今天,终于解决了. 疑问过程: app是混合应用,项目做了H5优化之后,以前的用例执行总会失败,体现在原来的一个元素点击无反馈 排查原因:1.项目做了H5优化,2.测试的 ...