Find the centroid of a non-self-intersecting closed Polygon

Given N vertices of the polygon, the task is to find the centroid of the polygon

Examples:

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}

Approach:
The centroid of a non-self-intersecting closed polygon defined by n vertices (x0, y0), (x1, y1), …, (xn-1, yn-1) is the point (Cx, Cy), where:



Below is the implementation of the above approach:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program to implement the 
// above approach
  
#include <bits/stdc++.h>
using namespace std;
  
pair<double, double> find_Centroid(vector<pair<double, double> >& v)
{
    pair<double, double> 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<pair<double, double> > vp = { { 1, 2 }, 
                                         { 3, -4 }, 
                                         { 6, -7 } };
                                           
    pair<double, double> ans = find_Centroid(vp);
      
    cout << setprecision(12) << ans.first << " " 
        << ans.second << '\n';
  
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# 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

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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

chevron_right


Output:

3.33333333333 -3

competitive-programming-img




My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.