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

题意是给一个 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;

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

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

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

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

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cmath>
 4 #include <iomanip>
 5 using namespace std;
 6
 7 struct point
 8 {
 9     double x,y;
10 }pi[1000010];
11 double cp(point a,point b)
12 {
13     return (a.x*b.y)-(a.y*b.x);
14 }
15 point gravity(point *p, int n)
16 {
17     double area = 0;
18     point center;
19     center.x = center.y = 0;
20     for (int i = 0; i < n-1; i++)
21     {
22        area += cp(p[i],p[i+1]);
23        center.x += cp(p[i],p[i+1]) * (p[i].x + p[i+1].x);
24        center.y += cp(p[i],p[i+1]) * (p[i].y + p[i+1].y);
25        /*此处其实是:
26        area += cp(p[i],p[i+1]) / 2;
27        center.x += (cp(p[i],p[i+1]) / 2)* ((p[i].x + p[i+1].x + 0) / 3);
28        center.y += (cp(p[i],p[i+1]) / 2)* ((p[i].y + p[i+1].y + 0) / 3);
29        但一些计算过程中的常数在实际运算时被总写了。
30        */
31     }
32     area += cp(p[n-1],p[0]);//area += cp(p[n-1],p[0]) / 2;
33     center.x += cp(p[n-1],p[0]) * (p[n-1].x + p[0].x);//center.x += (cp(p[n-1],p[0]) / 2) * ((p[n-1].x + p[0].x + 0) / 3);
34     center.y += cp(p[n-1],p[0]) * (p[n-1].y + p[0].y);//center.y += (cp(p[n-1],p[0]) / 2) * ((p[n-1].y + p[0].y + 0) / 3);
35     center.x /= 3*area;//center.x /= area;
36     center.y /= 3*area;//center.y /= area;
37     return center;
38 }
39
40 int main()
41 {
42     int t;
43     scanf("%d",&t);
44     while(t--)
45     {
46         int n;
47         scanf("%d",&n);
48         for(int i = 0; i < n; i++)
49             scanf("%lf %lf",&pi[i].x,&pi[i].y);
50         point out = gravity(pi,n);
51         printf("%.2f %.2f\n",out.x,out.y);
52     }
53     return 0;
54 }

  

原文地址:https://www.cnblogs.com/Taskr212/p/9459412.html

时间: 2024-10-06 14:51:05

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

hdu 1115(计算多边形重心)

题意:已知一多边形没有边相交,质量分布均匀.顺序给出多边形的顶点坐标,求其重心. 分析: 求多边形重心的题目大致有这么几种: 1,质量集中在顶点上.n个顶点坐标为(xi,yi),质量为mi,则重心 X = ∑( xi×mi ) / ∑mi Y = ∑( yi×mi ) / ∑mi 特殊地,若每个点的质量相同,则 X = ∑xi / n Y = ∑yi / n 2,质量分布均匀.这个题就是这一类型,算法和上面的不同. 特殊地,质量均匀的三角形重心: X = ( x0 + x1 + x2 ) / 3

hdu 1115(多边形重心问题)

Lifting the Stone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 6971    Accepted Submission(s): 2919 Problem Description There are many secret openings in the floor which are covered by a big

Hdu 3685 Rotational Painting(多边形重心+凸包)

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=3685 思路:先求出多边形重心,放置的边一定为凸包边.判断重心是否落在边之间(求点到直线与点到线段的距离,判断). 4 0 0 4 0 8 4 4 4 注意这种情况,重心不能在凸包边端点的垂线上. #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using name

hdu 3685 多边形重心+凸包

Rotational Painting Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2498    Accepted Submission(s): 702 Problem Description Josh Lyman is a gifted painter. One of his great works is a glass pain

HDOJ 1115 Lifting the Stone 多边形重心

来自:http://blog.csdn.net/tiaotiaoyly/article/details/2087498 1,质量集中在顶点上.n个顶点坐标为(xi,yi),质量为mi,则重心 X = ∑( xi×mi ) / ∑mi Y = ∑( yi×mi ) / ∑mi 特殊地,若每个点的质量相同,则 X = ∑xi  / n Y = ∑yi  / n 2,质量分布均匀.这个题就是这一类型,算法和上面的不同. 特殊地,质量均匀的三角形重心: X = ( x0 + x1 + x2 ) / 3

hdu3685 Rotational Painting 求多边形重心和凸包

http://acm.hdu.edu.cn/showproblem.php?pid=3685 Rotational Painting Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2614    Accepted Submission(s): 737 Problem Description Josh Lyman is a gifted

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

题意:就是给你一个多边行的点的坐标,求此多边形的重心. 一道求多边形重心的模板题! #include<cstdio> #include<cmath> #include<cstring> using namespace std; struct point { double x,y; }PP[1000047]; point bcenter(point pnt[],int n){ point p,s; double tp,area = 0, tpx=0, tpy=0; p.x

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

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

hdu1115(多边形重心算法)

题目意思: 给出一个n边形的n个顶点,求出这个n边形的重心坐标. http://acm.hdu.edu.cn/showproblem.php?pid=1115 题目分析: /** *出处:http://blog.csdn.net/ysc504/article/details/8812339 *①质量集中在顶点上 *  n个顶点坐标为(xi,yi),质量为mi,则重心 * X = ∑( xi×mi ) / ∑mi * Y = ∑( yi×mi ) / ∑mi * 特殊地,若每个点的质量相同,则 *