algorithmgeometrygeolocationpolygongravity

Center of gravity of a polygon


I am trying to write a PHP function that will calculate the center of gravity of a polygon.

I've looked at the other similar questions but I can't seem to find a solution to this.

My problem is that I need to be able to calculate the center of gravity for both regular and irregular polygons and even self intersecting polygons.

Is that possible?

I've also read that: http://paulbourke.net/geometry/polyarea/ But this is restricted to non self intersecting polygons.

How can I do this? Can you point me to the right direction?


Solution

  • The center of gravity (also known as "center of mass" or "centroid" can be calculated with the following formula:

    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
    

    Extracted from Wikipedia: 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
    X coordinate of the center
    Y coordinate of the center
    and where A is the polygon's signed area,
    Area formula

    Example using VBasic:

    ' 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 more info check this website or Wikipedia.

    Hope it helps.

    Regards!