1058. Lifting the Stone
线垂法,具体方法是:用细线提起该物体,在该物体上画细线的延长线,再移位用细线提起该物体,在该物体上画细线的延长线,两线的交叉点就是这一物体在这平面上的重心,其它面同理.
1:由两个图形A,B合并而成的一个图形C,则C的重心必在A的重心与B的重心连接的线段上。(注意,也适用于A B彼此分开,没有公共点的情形)
2:由两个A,B合并而成的一个图形C,A的重心为点a, B的重心为点b, C的重心为点c, A的面积为Sa, B的面积为Sb,则下面条件成立:
(1)点c 必在线段 ab 上
(2) ac * Sa = bc * Sb
计算几何中:
三角形的重心: x = (xa+xb+xc)/3, y = (ya+yb+yc)/3;
四边形的重心:作一对角线,将它分成两个三角形分别求出重心与面积 (x1,y1) ,s1 ; (x2, y2), s2 则该四边形的重心为: x = (x1*s1+x2*s2)/(s1+s2), y = (y1*s1+y2*s2)/(s1+s2);
五边形则分为一个三角形与一个四边形……
任意多边形中直接取任一点(一般为原点)把多边形分为n-2个三角形 分别求重心
x=∑si*xi/∑si
y=∑si*yi/∑si
si为每块三角形的有向面积
2009-03-03 11:56
任意多边形求重心
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
struct point{
int x, y;
};
point p[1000001];
double cal(int i, int j)
{
double res;
res = p[i].x*p[j].y - p[j].x*p[i].y;
return res;
}
int main()
{
int T, N;
double cx, cy;
scanf("%d", &T);
for (int t = 0; t < T; t++)
{
scanf("%d", &N);
for (int i = 0; i < N; i++)
scanf("%d %d", &p[i].x, &p[i].y);
p[N].x = p[0].x;
p[N].y = p[0].y;
double A = 0;
for (i = 0; i < N; i++)
{
A += cal(i, i+1);
}
A /= 2;
cx = cy = 0;
for (i = 0; i < N; i++)
{
cx += (p[i].x + p[i+1].x)*cal(i, i+1);
cy += (p[i].y + p[i+1].y)*cal(i, i+1);
}
cx /= 6*A;
cy /= 6*A;
printf("%.2lf %.2lf/n", cx, cy);
}
return 0;
}