QB64 Phoenix Edition
Point-in-Polygon Detection - Printable Version

+- QB64 Phoenix Edition (https://qb64phoenix.com/forum)
+-- Forum: QB64 Rising (https://qb64phoenix.com/forum/forumdisplay.php?fid=1)
+--- Forum: Prolific Programmers (https://qb64phoenix.com/forum/forumdisplay.php?fid=26)
+---- Forum: Petr (https://qb64phoenix.com/forum/forumdisplay.php?fid=52)
+---- Thread: Point-in-Polygon Detection (/showthread.php?tid=4120)



Point-in-Polygon Detection - Petr - 11-17-2025

Code: (Select All)

_Title "Polygon collision detection"
Type Vertex2D
    As Integer x, y
End Type
Const PolyVertexes = 8

Dim Polygon(1 To PolyVertexes) As Vertex2D

Screen _NewImage(1000, 1000, 256)

NextPoly:
Polly_MidX = 100 + 890 * Rnd
Polly_MidY = 100 + 890 * Rnd
StepAngle = _Pi(2) / PolyVertexes
StartAngle = StepAngle * (Rnd * PolyVertexes)

For fillP = 1 To PolyVertexes
    If Rnd * 10 > 4 Then Sign = -1 Else Sign = 1
    Radius = 70 + Sign * Rnd * 50
    Angle = StartAngle + StepAngle * fillP
    Polygon(fillP).x = Polly_MidX + Cos(Angle) * Radius
    Polygon(fillP).y = Polly_MidY + Sin(Angle) * Radius
Next

Dim As Long K
Draw_Polygon Polygon()
Do Until K = 32
    K = _KeyHit
    While _MouseInput: Wend
    mx = _MouseX: my = _MouseY
    Locate 1
    Print "Press space for next polygon, ore esc for end"
    Print "Colission detection - Polygon / mouse: "; DetectPolygon(Polygon(), mx, my)
    If K = 27 Then End
Loop
K = 0
Cls
GoTo NextPoly







Sub Draw_Polygon (polygon() As Vertex2D)
    PSet (polygon(1).x, polygon(1).y)
    For DP = 1 To PolyVertexes
        Line -(polygon(DP).x, polygon(DP).y)
        MiddleX = MiddleX + polygon(DP).x
        MiddleY = MiddleY + polygon(DP).y
    Next DP
    Line (polygon(DP - 1).x, polygon(DP - 1).y)-(polygon(1).x, polygon(1).y)
    MiddleX = MiddleX \ PolyVertexes
    MiddleY = MiddleY \ PolyVertexes
    Paint (MiddleX, MiddleY), Rnd * 254 + 1, 15
End Sub

Function DetectPolygon (polygon() As Vertex2D, mx, my)
    inside = 0

    For i = 1 To PolyVertexes
        j = i + 1
        If j > PolyVertexes Then j = 1 ' if connects the last point to the first

        yi = polygon(i).y
        yj = polygon(j).y
        xi = polygon(i).x
        xj = polygon(j).x

        'Test if horizontal ray intersects edge (i -> j)
        If (yi > my) <> (yj > my) Then
            crossX = xi + (my - yi) * (xj - xi) / (yj - yi)
            If mx < crossX Then inside = Not inside
        End If
    Next i
    DetectPolygon = inside
End Function