What's New
Q & A
Tip Jar
C# Helper...
Follow VBHelper on Twitter
MSDN Visual Basic Community
TitleDetermine whether a polygon is convex in Visual Basic .NET
DescriptionThis example shows how to determine whether a polygon is convex in Visual Basic .NET.
Keywordspolygon, convex, concave, graphics, VB.NET
CategoriesGraphics, VB.NET

Calculate the angles at each of the polygon's corners. If all of the angles have the same sign (either positive or negative depending on the orientation), then the polygon is convex. In the figure, for example, the angles have opposite signs (one is drawn clockwise and the other counterclockwise) so this polygon is not convex.

' Return True if the polygon is convex.
Public Function PolygonIsConvex(ByVal points() As PointF) _
    As Boolean
    ' For each set of three adjacent points A, B, C,
    ' find the dot product AB dot BC. If the sign of
    ' all the dot products is the same, the angles
    ' are all positive or negative (depending on the
    ' order in which we visit them) so the polygon
    ' is convex.

    Dim got_negative As Boolean = False
    Dim got_positive As Boolean = False
    Dim max_point As Integer = points.Length - 1
    Dim B, C As Integer
    For A As Integer = 0 To max_point
        B = A + 1
        If B > max_point Then B = 0
        C = B + 1
        If C > max_point Then C = 0

        Dim cross_product As Single = _
            CrossProductLength( _
                points(A).X, points(A).Y, _
                points(B).X, points(B).Y, _
                points(C).X, points(C).Y)
        If cross_product < 0 Then
            got_negative = True
        ElseIf cross_product > 0 Then
            got_positive = True
        End If
        If got_negative And got_positive Then Return False
    Next A

    ' If we got this far, the polygon is convex.
    Return True
End Function
For more information on graphics programming in Visual Basic, see my book Visual Basic Graphics Programming.
Copyright © 1997-2006 Rocky Mountain Computer Consulting, Inc.   All rights reserved.