11

I know how to find the centroid (center of mass) of a regular polygon. This assumes that every part of the polygon weighs the same. But how do I calculate the centroid of a weightless polygon (made from aerogel perhaps :), where each vertex has a weight?

Simplified illustration of what I mean using straight line:

5kg-----------------5kg
           ^center of gravity

10kg---------------5kg
        ^center of gravity offset du to weight of vertices

Of course, I know how to calculate the center of gravity on a straight line with weighted vertices, but how do I do it on a polygon with weighted vertices?

Thanks for your time!

skaffman
  • 398,947
  • 96
  • 818
  • 769
Calle Kabo
  • 113
  • 1
  • 4

3 Answers3

23

You want take a weighted average over all the vertices. So say your vertices are v1, v2, v3 .... vn with masses m1, m2 ...mn and have x and y coordinates v1x, v1y, v2x, v2y etc then to get the center of mass (cx, cy) you want:

cx = (v1x*m1 + v2x*m2 + ... vnx*mn) / (m1 + m2 .... mn) 
cy = (v1y*m1 + v2y*m2 + ... vny*mn) / (m1 + m2 .... mn)

It's essentially the same principle as when you do it for a line.

pheelicks
  • 7,461
  • 2
  • 45
  • 50
6

1) Generate a vector for each vertex

2) Multiply each vector for the weight of the vertex

3) Sum the vectors

4) Divide for total mass

5) There's your center of mass!

nico
  • 50,859
  • 17
  • 87
  • 112
1

The formula would be:

Mc = ( sum_from_0_to_max(vertices)( m_i * P_i ) / M )

where Mc is the center of the masses, m_i is the mass of vertex i, P_i the position and M the overall mass.

Try to google for "rigid bodies", I guess you will find a lot helpfull information.

Edit:

In code it would be something like this:

   Vector3D result; // initialized with 0, 0, 0  
   Vector3D temp; // sum  
   long sumMasses = 0;  
   for( Vertex v : vertices ) {  
      temp += (v.mass * v.position);  
      sumMasses+=v.mass;  
   }  
   result = temp / sumMasses;
api55
  • 11,070
  • 4
  • 41
  • 57
InsertNickHere
  • 3,616
  • 3
  • 26
  • 23