|
|
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.
|
|
|
|
|
|