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