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

01 Mar, 2022
Given N vertices of the polygon, the task is to find the centroid of the polygonExamples:  
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++
Java
Python3
C#
Javascript
// 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 codeint 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;}
// Java implementation of the approachclass 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 program to implement the# above approachdef 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 verticesvp = [ [ 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# implementation of the approachusing 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
<script>    // Javascript implementation of the approach         function find_Centroid(v)    {        let ans = new Array(2);        ans.fill(0);                   let n = v.length;        let signedArea = 0;                   // For all vertices        for (let i = 0; i < n; i++)        {                           let x0 = v[i][0], y0 = v[i][1];            let x1 = v[(i + 1) % n][0], y1 = v[(i + 1) % n][1];                                               // Calculate value of A            // using shoelace formula            let 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;    }         // Coordinate of the vertices    let vp = [ [ 1, 2 ],                [ 3, -4 ],                [ 6, -7 ] ];     let ans = find_Centroid(vp);     document.write(ans[0].toFixed(11) + " " + ans[1]);   // This code is contributed by divyeshrabadiya07.</script>
  
3.33333333333 -3
 
Time Complexity: O(n)
Auxiliary Space: O(1)
 
mohit kumar 29
ankthon
princiraj1992
Akanksha_Rai
divyeshrabadiya07
subham348
Competitive Programming
Geometric
Mathematical
Mathematical
Geometric
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Multistage Graph (Shortest Path)
Breadth First Traversal ( BFS ) on a 2D array
Shortest path in a directed graph by Dijkstra’s algorithm
5 Best Books for Competitive Programming
5 Best Languages for Competitive Programming
Closest Pair of Points using Divide and Conquer algorithm
How to check if a given point lies inside or outside a polygon?
Program for distance between two points on earth
How to check if two given line segments intersect?
Find if two rectangles overlap