PKU 3855 Blast the Enemy!

PKU 3855 Blast the Enemy!

注意!求解多边形的质心一般将其进行分解,然后用质心*面积和/总面积求得总质心
Summary

给出一个有n(n<=100)个点的简单多边形,求该多边形的重心。

Solution

根据多边形重心的定义,可以对其进行三角剖分,计算每个三角形的面积以及重心。多边形的重心就是所有三角形的重心对面积的加权平均数,也就是说:

center.x = (cen[0].x * area[0] + cen[1].x * area[1] ..... + cen[n].x * area[n]) / totalarea

center.y = (cen[0].y * area[0] + cen[1].y * area[1] ..... + cen[n].y * area[n]) / totalarea

cen[i]代表第i个三角形的重心,三角形的重心就是:

center_of_tri.x=(p1.x+p2.x+p3.x)/3.0

center_of_tri.y=(p1.y+p2.y+p3.y)/3.0

area[i]就是第i个三角形的面积。totalarea就是多边形的总面积。

 1 #include  < cstdio >
 2 #include  < cmath >
 3 #define  EPS 1e-8
 4 #define  N 105
 5 struct  POINT  {
 6    double x, y;
 7    POINT() {
 8        x = y = 0;
 9    }

10    POINT(double x, double y) :
11        x(x), y(y) {
12    }

13    void get() {
14        scanf("%lf%lf"&x, &y);
15    }

16    void print() {
17        printf("%.6lf %.6lf\n", x, y);
18    }

19    POINT operator+(const POINT &p) {
20        return POINT(x + p.x, y + p.y);
21    }

22}
;
23 POINT pl[N];
24 int  n;
25 double  cross(POINT o, POINT  & a, POINT  & b)  {
26    return (a.x - o.x) * (b.y - o.y) - (a.y - o.y) * (b.x - o.x);
27}

28 int  sgn( double  x)  {
29    return x < -EPS ? -1 : x > EPS;
30}

31 void  solve()  {
32    int i;
33    double area = 0;
34    POINT ct;
35    for (i = 0; i < n; i++)
36        pl[i].get();
37    pl[i] = pl[0];
38    for (i = 0; i < n; i++{
39        double s = cross(POINT(), pl[i], pl[i + 1]);
40        POINT t;
41        area += s;
42        t = pl[i] + pl[i + 1];
43        ct.x += s * t.x, ct.y += s * t.y;
44    }

45    ct.x = ct.x / area / 3.0, ct.y = ct.y / area / 3.0;
46    ct.print();
47}

48 int  main()  {
49    int T = 1;
50    while (scanf("%d"&n) && n) {
51        printf("Stage #%d: ", T++);
52        solve();
53    }

54    return 0;
55}

56

你可能感兴趣的:(PKU 3855 Blast the Enemy!)