# 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}


## Recommended: Please try your approach on {IDE} first, before moving on to the solution.

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:

$C_{y}=&space;\frac{1}{6A}&space;\sum_{i=0}^{n-1}(y_{i}+y_{i+1})(x_{i}*&space;y_{i+1}-x_{i+1}*y_{i})$

Below is the implementation of the above approach:

## C++

 // C++ program to implement the   // above apporach     #include  using namespace std;     pair<double, double> find_Centroid(vector >& 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 > 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

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

Output:

3.33333333333 -3


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.