1. 程式人生 > >多邊形重心問題

多邊形重心問題

問題: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);