Center of gravity of a polygon

后端 未结 7 932
遥遥无期
遥遥无期 2020-12-02 16:13

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 s

7条回答
  •  情话喂你
    2020-12-02 16:27

    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!

提交回复
热议问题