

Title  Find a polygon's centroid (center of mass) 
Keywords  polygon, centroid, center of mass 
Categories  Graphics 


If you were to cut the polygon out of cardboard, the centroid would be the point where you could balance the polygon on a pin.
Note that the centroid does not necessarily lie on the polygon (imagine a donut shape with the centroid in the central hole) so you might need to glue the polygon to a piece of transparent plastic and place the pin on the plastic.
The formula for the centroid (X, Y) is given by:
X = SUM[(Xi + Xi+1) * (Xi * Yi+1  Xi+1 * Yi)] / 6 / A
Y = SUM[(Yi + Yi+1) * (Xi * Yi+1  Xi+1 * Yi)] / 6 / A
Here A is the area of the polygon and the sum is taken over all points 1 to NumPoints. The following code shows the Visual Basic implementation.


' Find the polygon's centroid.
Public Sub FindCentroid(ByRef X As Single, ByRef Y As _
Single)
Dim pt As Integer
Dim second_factor As Single
Dim polygon_area As Single
' Add the first point at the end of the array.
ReDim Preserve m_Points(1 To m_NumPoints + 1)
m_Points(m_NumPoints + 1) = m_Points(1)
' Find the centroid.
X = 0
Y = 0
For pt = 1 To m_NumPoints
second_factor = _
m_Points(pt).X * m_Points(pt + 1).Y  _
m_Points(pt + 1).X * m_Points(pt).Y
X = X + (m_Points(pt).X + m_Points(pt + 1).X) * _
second_factor
Y = Y + (m_Points(pt).Y + m_Points(pt + 1).Y) * _
second_factor
Next pt
' Divide by 6 times the polygon's area.
polygon_area = PolygonArea
X = X / 6 / polygon_area
Y = Y / 6 / polygon_area
' If the values are negative, the polygon is
' oriented counterclockwise. Reverse the signs.
If X < 0 Then
X = X
Y = Y
End If
End Sub


For information on calculating the polygon's area, see the HowTo Calculate a polygon's area.
For more information on graphics programming in Visual Basic, see my book Visual Basic Graphics Programming.





