hdu1115(计算多边形几何重心)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1115

题意:给出一些点,求这些点围成的多边形的重心;

思路:

方法1:直接分别求所有点的x坐标的平均值和y坐标的平均值,即答案;不过这个方法的计算精度不是很高,要求高精度时用另一个方法;

方法2:

用公式:x = (xi*si*+...xn*sn)/(si+...+sn); y = (yi*si*+...yn*sn)/(si+...+sn);

方法2的代码:

 1 #include <iostream>
 2 #include <stdio.h>
 3 using namespace std;
 4
 5 struct gg{
 6     double x, y;
 7 };
 8
 9 double get_area(gg a, gg b, gg c){ //***用行列式计算三角形面积
10     double area = a.x*b.y + a.y*c.x + b.x*c.y - c.x*b.y - b.x*a.y - a.x*c.y;
11     return area;
12 }
13
14 int main(void){
15     int t;
16     scanf("%d", &t);
17     while(t--){
18         int n;
19         scanf("%d", &n);
20         gg p0, p1, p2;
21         double sumx=0, sumy=0, sumarea=0;
22         scanf("%lf%lf", &p0.x, &p0.y);
23         scanf("%lf%lf", &p1.x, &p1.y);
24         for(int i=2; i<n; i++){
25             scanf("%lf%lf", &p2.x, &p2.y);
26             double area = get_area(p0, p1, p2);
27             sumarea += area;
28             sumx += (p0.x+p1.x+p2.x)*area;
29             sumy += (p0.y+p1.y+p2.y)*area;
30             p1 = p2;
31         }
32         // cout << sumx << " " << sumy << " " << sumarea << endl;
33         printf("%.2lf %.2lf\n", sumx/sumarea/3, sumy/sumarea/3);
34     }
35     return 0;
36 }
时间: 2024-10-05 13:33:24

hdu1115(计算多边形几何重心)的相关文章

hdu1115【多边形求重心模板】

1.质量集中在顶点上.n个顶点坐标为(xi,yi),质量为mi,则重心(∑( xi×mi ) / ∑mi, ∑( yi×mi ) / ∑mi) 2.质量分布均匀.这个题就是这一类型,算法和上面的不同. 特殊地,质量均匀的三角形重心:(( x0 + x1 + x2 ) / 3,Y = ( y0 + y1 + y2 ) / 3) 以(0,0)为顶点三角剖分之后求三角形重心,把重心连起来转换成质量集中在顶点上的情况求解即可 #include<iostream> #include<cstdio&

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

Lifting the Stone(hdu1115)多边形的重心

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

HDU1115&&POJ1385Lifting the Stone(求多边形的重心)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1115# 大意:给你个n,有n个点,然后给你n个点的坐标,求这n个点形成的多边形的重心的坐标. 直接套模板,我也不知道什么意思.注意在POJ上面定义double时,输出f,如果输出lf则WA,HDU上面输出lf能A. #include <iostream> #include <string.h> #include <stdio.h> #include <algorith

Lifting the Stone(求任意多边形的重心)

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

多边形的重心

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 Y = ( y0 + y1 + y2 ) / 3 3.质量分布不均匀     只能用函数多重积分来算. 多边形的重心,布布扣,bubuko.com

HDU2036 计算多边形的面积

计算多边形面积就是通过拆分三角形的方法,即为选取任意一个点,从该点出发,连接多边形的每一个顶点,这样就将多边形分为了许多个三角形.计算每一个三角形的面积即可,用叉积计算的每一个三角形的面积为"有向面积",直接将所有三角形的有向面积相加,结果的绝对值就是多边形的面积. #define _CRT_SECURE_NO_DEPRECATE #include<iostream> #include<cmath> const double EPS = 1e-8; const

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

题目链接:传送门 分析: 求多边形的重心的方法:传送门 代码如下: #include <iostream> #include <cstring> #include <cstdio> #include <cmath> #include <algorithm> using namespace std; const double eps = 1e-10; struct Point{ double x,y; Point():x(0),y(0){} Poi

【改革春风吹满地 HDU - 2036 】【计算几何-----利用叉积计算多边形的面积】

利用叉积计算多边形的面积 我们都知道计算三角形的面积时可以用两个邻边对应向量积(叉积)的绝对值的一半表示,那么同样,对于多边形,我们可以以多边形上的一个点为源点,作过该点并且过多边形其他点中的某一个的多条射线,这样就可以把该多边形变为多个三角形,然后利用叉积求面积即可. 不过要注意,对于三角形可以简单的用叉积的绝对值的一半表示,但对于多边形不可随意将它分割成的几个三角形对应的叉积的绝对值相加,要有一定顺序才可. 对于三角形,有 [该图片来源:https://www.cnblogs.com/xie