#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
struct point
{
double x;
double y;
};
//求多邊形的重心算法
//說明:
//求多邊形重心并不是簡單的把求三角形的重心公式推廣就行了
//我的算法是在平面上取一點(一般取原點, 這樣可以減少很多計算, 而且使思路更清晰^_^)
//這樣就得到了N個三角形OP[i]P[i+1](其中點的順序要為逆時針的),
//分別求出這N個三角形的重心Ci和面積Ai(注意此處面積是又向面積, 就是用叉乘求面積時保留其正負號)
//在求出A = A1+A2+...+AN(同樣保留正負號的代數相加)
//最終重心C = sigma(Ai+Ci)/A;
point gravity(point *p, int n)
{
double area = 0;
point center;
center.x = 0;
center.y = 0;
for (int i = 0; i < n-1; i++)
{
area += (p[i].x*p[i+1].y - p[i+1].x*p[i].y)/2;
center.x += (p[i].x*p[i+1].y - p[i+1].x*p[i].y) * (p[i].x + p[i+1].x);
center.y += (p[i].x*p[i+1].y - p[i+1].x*p[i].y) * (p[i].y + p[i+1].y);
}
area += (p[n-1].x*p[0].y - p[0].x*p[n-1].y)/2;
center.x += (p[n-1].x*p[0].y - p[0].x*p[n-1].y) * (p[n-1].x + p[0].x);
center.y += (p[n-1].x*p[0].y - p[0].x*p[n-1].y) * (p[n-1].y + p[0].y);
center.x /= 6*area;
center.y /= 6*area;
return center;
}
Ai*Ci 吧、、、
再多貼點數學證明?
設各個頂點P1,P2...Pn,重心Pc
Xpc=(X1+X2+...+Xn)/N
Ypc=(Y1+Y2+...+Yn)/N
則重心Pc為(Xpc,Ypc)
中n的含義是什么?
我們知道一條線段的重心是重點 可以假設兩個端點的重力都是G,那么中點是中心
那么對于三角形呢?由上可以 其中一條邊的重心為其中點,并且可以認為在此中點的重力為2G,第三點的重力為G,所以三角形的重心為這兩點的三等分線
如此 如果變成四邊形那么 那個三角形的重心上的重力為3G,然后與第四點 進行四等分切割。
所以可以有N邊形重心 推出加了一個點的 N+1個點的 重心
但是 題中的 connect in the given order 我不確定 連接順序不同是否有影響
一個簡單的反例:兩個面積不一樣的三角形拼成的四邊形。
代碼完全正確的 可以直接調用 !!!!!!!!!!!!!
http://www.cnblogs.com/jbelial/archive/2011/08/08/2131165.html
@nigel0913 除以6是因為
center.x += (p[i].x*p[i+1].y - p[i+1].x*p[i].y) * (p[i].x + p[i+1].x);
這里求三角形面積時沒除以2,求三角形重心時沒除以3,所以最后一塊除以了個6。