

Title  Find a polygon's centroid (center of mass) in Visual Basic .NET 
Description  This example shows how to find a polygon's centroid (center of mass) in Visual Basic .NET. 
Keywords  polygon, centroid, center of mass, graphics, VB.NET 
Categories  Graphics, VB.NET 


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 of the adjacent pairs of points. The following code shows the Visual Basic implementation.


' Find the polygon's centroid.
Public Function FindCentroid(ByVal points() As PointF) As _
PointF
' Add the first point at the end of the array.
ReDim Preserve points(points.Length)
points(points.Length  1) = New PointF(points(0).X, _
points(0).Y)
' Find the centroid.
Dim X As Single = 0
Dim Y As Single = 0
Dim second_factor As Single
For i As Integer = 0 To points.Length  2
second_factor = _
points(i).X * points(i + 1).Y  _
points(i + 1).X * points(i).Y
X += (points(i).X + points(i + 1).X) * second_factor
Y += (points(i).Y + points(i + 1).Y) * second_factor
Next i
' Divide by 6 times the polygon's area.
Dim polygon_area As Single = PolygonArea(points)
X /= (6 * polygon_area)
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
Return New PointF(X, Y)
End Function


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





