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

题意:求一个不规则简单多边形的重心。

解法:多边形的重心就是所有三角形的重心对面积的加权平均数.

关于求多边形重心的文章: 求多边形重心

用叉积搞一搞就行了。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#define Mod 1000000007
#define eps 1e-8
using namespace std;

struct Point{
    double x,y;
    Point(double x=0, double y=0):x(x),y(y) {}
    void input() { scanf("%lf%lf",&x,&y); }
};
typedef Point Vector;
int dcmp(double x) {
    if(x < -eps) return -1;
    if(x > eps) return 1;
    return 0;
}
Vector operator + (Vector A, Vector B) { return Vector(A.x + B.x, A.y + B.y); }
Vector operator - (Vector A, Vector B) { return Vector(A.x - B.x, A.y - B.y); }
Vector operator * (Vector A, double p) { return Vector(A.x*p, A.y*p); }
Vector operator / (Vector A, double p) { return Vector(A.x/p, A.y/p); }
double Cross(Vector A, Vector B) { return A.x*B.y - A.y*B.x; }

double CalcConvexArea(Point* p,int n) {        //凸包面积
    double area = 0.0;
    for(int i=1;i<n-1;i++)
        area += Cross(p[i]-p[0],p[i+1]-p[0]);
    return area*0.5;
}
Point p[106],ch[106];

int main()
{
    int n,i,j,cs = 1;
    while(scanf("%d",&n)!=EOF && n)
    {
        for(i=0;i<n;i++) p[i].input();
        double S = CalcConvexArea(p,n);
        double X = 0.0, Y = 0.0;
        for(i=2;i<n;i++) {
            double area = 0.5*Cross(p[i-1]-p[0],p[i]-p[0]);
            X += area*(p[0].x+p[i-1].x+p[i].x)/3.0;
            Y += area*(p[0].y+p[i-1].y+p[i].y)/3.0;
        }
        printf("Stage #%d: %.6f %.6f\n",cs++,X/S,Y/S);
    }
    return 0;
}

时间: 2024-10-24 01:03:12

UVALive 4426 Blast the Enemy! --求多边形重心的相关文章

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

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

poj3855Blast the Enemy!(多边形重心)

链接 1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<stdlib.h> 6 #include<vector> 7 #include<cmath> 8 #include<queue> 9 #include<set> 10 using namespace std;

hdoj-1115-Lifting the Stone 求多边形重心问题

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

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

题意是给一个 n 边形,给出沿逆时针方向分布的各顶点的坐标,求出 n 边形的重心. 求多边形重心的情况大致上有三种: 一.多边形的质量都分布在各顶点上,像是用轻杆连接成的多边形框,各顶点的坐标为Xi,Yi,质量为mi,则重心坐标为: X = ∑( xi * mi ) /  ∑ mi ; Y = ∑( yi * mi)  / ∑ mi; 若每个顶点的质量相等,则重心坐标为: X = ∑ xi / n; Y = ∑ yi / n; 二.多边形的质量分布均匀,像是用密度相同的材料制成的多边形板子,多采

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 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

谁能告诉我为什么sum_area输出总是0(多边形重心问题)

多边形重心问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:5 描述 在某个多边形上,取n个点,这n个点顺序给出,按照给出顺序将相邻的点用直线连接, (第一个和最后一个连接),所有线段不和其他线段相交,但是可以重合,可得到一个多边形或一条线段或一个多边形和一个线段的连接后的图形: 如果是一条线段,我们定义面积为0,重心坐标为(0,0).现在求给出的点集组成的图形的面积和重心横纵坐标的和: 输入 第一行有一个整数0<n<11,表示有n组数据:每组数据第一行有一个整数m&l