📜  查找非自相交的闭合多边形的质心

📅  最后修改于: 2021-04-22 01:56:01             🧑  作者: Mango

给定多边形的N个顶点,任务是找到多边形的质心

例子:

Input: ar = {{0, 0}, {0, 8}, {8, 8}, {8, 0}}
Output: {Cx, Cy} = {4, 4}

Input: ar = {{1, 2}, {3, -4}, {6, -7}}
Output: {Cx, Cy} = {3.33, -3}

方法:
由n个顶点(x0,y0),(x1,y1),…,(xn-1,yn-1)定义的非自相交闭合多边形的质心是点(Cx,Cy),其中:

下面是上述方法的实现:

C++
// C++ program to implement the 
// above approach
  
#include 
using namespace std;
  
pair find_Centroid(vector >& v)
{
    pair ans = { 0, 0 };
      
    int n = v.size();
    double signedArea = 0;
      
    // For all vertices
    for (int i = 0; i < v.size(); i++) {
          
        double x0 = v[i].first, y0 = v[i].second;
        double x1 = v[(i + 1) % n].first, y1 = 
                            v[(i + 1) % n].second;
                              
        // Calculate value of A
        // using shoelace formula
        double A = (x0 * y1) - (x1 * y0);
        signedArea += A;
          
        // Calculating coordinates of
        // centroid of polygon
        ans.first += (x0 + x1) * A;
        ans.second += (y0 + y1) * A;
    }
  
    signedArea *= 0.5;
    ans.first = (ans.first) / (6 * signedArea);
    ans.second = (ans.second) / (6 * signedArea);
  
    return ans;
}
  
// Driver code
int main()
{
    // Coordinate of the vertices
    vector > vp = { { 1, 2 }, 
                                         { 3, -4 }, 
                                         { 6, -7 } };
                                           
    pair ans = find_Centroid(vp);
      
    cout << setprecision(12) << ans.first << " " 
        << ans.second << '\n';
  
    return 0;
}


Java
// Java implementation of the approach 
class GFG 
{
      
    static double[] find_Centroid(double v[][]) 
    { 
        double []ans = new double[2]; 
          
        int n = v.length; 
        double signedArea = 0; 
          
        // For all vertices 
        for (int i = 0; i < n; i++)
        { 
              
            double x0 = v[i][0], y0 = v[i][1]; 
            double x1 = v[(i + 1) % n][0], y1 = v[(i + 1) % n][1]; 
                                  
            // Calculate value of A 
            // using shoelace formula 
            double A = (x0 * y1) - (x1 * y0); 
            signedArea += A; 
              
            // Calculating coordinates of 
            // centroid of polygon 
            ans[0] += (x0 + x1) * A; 
            ans[1] += (y0 + y1) * A; 
        } 
      
        signedArea *= 0.5; 
        ans[0] = (ans[0]) / (6 * signedArea); 
        ans[1]= (ans[1]) / (6 * signedArea); 
      
        return ans; 
    } 
      
    // Driver code 
    public static void main (String[] args)
    { 
        // Coordinate of the vertices 
        double vp[][] = { { 1, 2 }, 
                            { 3, -4 }, 
                            { 6, -7 } }; 
                                              
        double []ans = find_Centroid(vp); 
          
        System.out.println(ans[0] + " " + ans[1]); 
    } 
}
  
// This code is contributed by AnkitRai01


Python3
# Python3 program to implement the
# above approach
def find_Centroid(v):
    ans = [0, 0]
  
    n = len(v)
    signedArea = 0
  
    # For all vertices
    for i in range(len(v)):
  
        x0 = v[i][0]
        y0 = v[i][1]
        x1 = v[(i + 1) % n][0]
        y1 =v[(i + 1) % n][1]
  
        # Calculate value of A
        # using shoelace formula
        A = (x0 * y1) - (x1 * y0)
        signedArea += A
  
        # Calculating coordinates of
        # centroid of polygon
        ans[0] += (x0 + x1) * A
        ans[1] += (y0 + y1) * A
  
    signedArea *= 0.5
    ans[0] = (ans[0]) / (6 * signedArea)
    ans[1] = (ans[1]) / (6 * signedArea)
  
    return ans
  
# Driver code
  
# Coordinate of the vertices
vp = [ [ 1, 2 ],
       [ 3, -4 ],
       [ 6, -7 ] ]
  
ans = find_Centroid(vp)
  
print(round(ans[0], 12), ans[1])
  
# This code is contributed by Mohit Kumar


C#
// C# implementation of the approach 
using System;
  
class GFG 
{
    static double[] find_Centroid(double [,]v) 
    { 
        double []ans = new double[2]; 
          
        int n = v.GetLength(0); 
        double signedArea = 0; 
          
        // For all vertices 
        for (int i = 0; i < n; i++)
        { 
            double x0 = v[i, 0], y0 = v[i, 1]; 
            double x1 = v[(i + 1) % n, 0], 
                    y1 = v[(i + 1) % n, 1]; 
                                  
            // Calculate value of A 
            // using shoelace formula 
            double A = (x0 * y1) - (x1 * y0); 
            signedArea += A; 
              
            // Calculating coordinates of 
            // centroid of polygon 
            ans[0] += (x0 + x1) * A; 
            ans[1] += (y0 + y1) * A; 
        } 
        signedArea *= 0.5; 
        ans[0] = (ans[0]) / (6 * signedArea); 
        ans[1]= (ans[1]) / (6 * signedArea); 
      
        return ans; 
    } 
      
    // Driver code 
    public static void Main (String[] args)
    { 
        // Coordinate of the vertices 
        double [,]vp = { { 1, 2 }, 
                         { 3, -4 }, 
                         { 6, -7 } }; 
                                              
        double []ans = find_Centroid(vp); 
          
        Console.WriteLine(ans[0] + " " + ans[1]); 
    } 
}
  
// This code is contributed by PrinciRaj1992


输出:
3.33333333333 -3