多邊形重心問題
阿新 • • 發佈:2018-12-30
問題:http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=3
在看到問題時,需要運用數學思維,想出解決辦法,進一步思考該用哪種演算法,才會達到目標
思路:多邊形求面積公式:n邊多邊形中每兩個點(有順序)加上原點可構成n個三角形,
將這些三角形看做質點(質點的位置是三角形的重心x1,x2...,質量是面積(有正負)s1,s2,...),
那麼多邊形就由這些質點組成,質點座標以其質量為權的加權算術平均數即是多邊形重心座標x。
多邊形的面積s是這n個三角形面積(有正負)的代數和的絕對值。
C++核心程式碼:
int main(){ int t, n; double sumx, sumy, area, x[3], y[3]; cin >> t; while(t--){ sumx = sumy = area = 0; cin >> n; cin >> x[0] >> y[0] >> x[1] >> y[1]; n -= 2; while(n--){ cin >> x[2] >> y[2]; //從第三個頂點開始讀入並計算 //新三角形面積 double s = (x[1] - x[0]) * (y[2] - y[0]) - (x[2] - x[0]) * (y[1] - y[0]); s /= 2; sumx += s * (x[0] + x[1] + x[2]) / 3; //每個小三角形的重心座標乘以權重(面積) sumy += s * (y[0] + y[1] + y[2]) / 3; //總面積 area += s; x[1] = x[2], y[1] = y[2]; } double ans; if(area == 0) sumx = 0, sumy = 0, ans = 0; else ans = (sumx + sumy) / area; printf("%.3lf %.3lf\n", fabs(area), ans);