多边形重心问题

问题: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);

猜你喜欢

转载自blog.csdn.net/weixin_42565135/article/details/82934991