Type Point As Single x,y End Type Function inpolygon(p1() As Point,p2 As Point) As Integer #Macro isleft2(L,p) -Sgn( (L(1).x-L(2).x)*(p.y-L(2).y) - (p.x-L(2).x)*(L(1).y-L(2).y)) #EndMacro Dim As Integer index,nextindex Dim k As Integer=UBound(p1)+1 Dim send (1 To 2) As Point Dim wn As Integer=0 For n As Integer=1 To UBound(p1) index=n Mod k:nextindex=(n+1) Mod k If nextindex=0 Then nextindex=1 send(1).x=p1(index).x:send(2).x=p1(nextindex).x send(1).y=p1(index).y:send(2).y=p1(nextindex).y If p1(index).y<=p2.y Then If p1(nextindex).y>p2.y Then If isleft2(send,p2)>=0 Then '= wn=wn+1 End If End If Else If p1(nextindex).y<=p2.y Then If isleft2(send,p2)<=0 Then'= wn=wn-1 End If End If End If Next n Return wn End Function Dim As Point square(1 To 4) ={(0,0),(10,0),(10,10),(0,10)} Dim As Point hole(1 To 4) ={(2.5,2.5),(7.5,2.5),(7.5,7.5),(2.5,7.5)} Dim As Point strange(1 To 8) ={(0,0),(2.5,2.5),(0,10),(2.5,7.5),_ (7.5,7.5),(10,10),(10,0),(2.5,2.5)} Dim As Point exagon(1 To 6) ={(3,0),(7,0),(10,5),(7,10),(3,10),(0,5)} 'printouts For z As Integer=1 To 4 Select Case z Case 1: Print "squared" Print "(5,5) " ;Tab(12); If inpolygon(square(),Type(5,5)) Then Print "in" Else Print "out" Print "(5,8) " ;Tab(12); If inpolygon(square(),Type(5,8)) Then Print "in" Else Print "out" Print "(-10,5) " ;Tab(12); If inpolygon(square(),Type(-10,5)) Then Print "in" Else Print "out" Print "(0,5) " ;Tab(12); If inpolygon(square(),Type(0,5)) Then Print "in" Else Print "out" Print "(10,5) " ;Tab(12); If inpolygon(square(),Type(10,5)) Then Print "in" Else Print "out" Print "(8,5) " ;Tab(12); If inpolygon(square(),Type(8,5)) Then Print "in" Else Print "out" Print "(10,10) " ;Tab(12); If inpolygon(square(),Type(10,10)) Then Print "in" Else Print "out" Print Case 2:Print "squared hole" Print "(5,5) " ;Tab(12); If Not inpolygon(hole(),Type(5,5)) And inpolygon(square(),Type(5,5)) Then Print "in" Else Print "out" Print "(5,8) " ;Tab(12); If Not inpolygon(hole(),Type(5,8)) And inpolygon(square(),Type(5,8))Then Print "in" Else Print "out" Print "(-10,5) " ;Tab(12); If Not inpolygon(hole(),Type(-10,5))And inpolygon(square(),Type(-10,5)) Then Print "in" Else Print "out" Print "(0,5) " ;Tab(12); If Not inpolygon(hole(),Type(0,5))And inpolygon(square(),Type(0,5)) Then Print "in" Else Print "out" Print "(10,5) " ;Tab(12); If Not inpolygon(hole(),Type(10,5))And inpolygon(square(),Type(10,5)) Then Print "in" Else Print "out" Print "(8,5) " ;Tab(12); If Not inpolygon(hole(),Type(8,5))And inpolygon(square(),Type(8,5)) Then Print "in" Else Print "out" Print "(10,10) " ;Tab(12); If Not inpolygon(hole(),Type(10,10))And inpolygon(square(),Type(10,10)) Then Print "in" Else Print "out" Print Case 3:Print "strange" Print "(5,5) " ;Tab(12); If inpolygon(strange(),Type(5,5)) Then Print "in" Else Print "out" Print "(5,8) " ;Tab(12); If inpolygon(strange(),Type(5,8)) Then Print "in" Else Print "out" Print "(-10,5) " ;Tab(12); If inpolygon(strange(),Type(-10,5)) Then Print "in" Else Print "out" Print "(0,5) " ;Tab(12); If inpolygon(strange(),Type(0,5)) Then Print "in" Else Print "out" Print "(10,5) " ;Tab(12); If inpolygon(strange(),Type(10,5)) Then Print "in" Else Print "out" Print "(8,5) " ;Tab(12); If inpolygon(strange(),Type(8,5)) Then Print "in" Else Print "out" Print "(10,10) " ;Tab(12); If inpolygon(strange(),Type(10,10)) Then Print "in" Else Print "out" Print Case 4:Print "exagon" Print "(5,5) " ;Tab(12); If inpolygon(exagon(),Type(5,5)) Then Print "in" Else Print "out" Print "(5,8) " ;Tab(12); If inpolygon(exagon(),Type(5,8)) Then Print "in" Else Print "out" Print "(-10,5) " ;Tab(12); If inpolygon(exagon(),Type(-10,5)) Then Print "in" Else Print "out" Print "(0,5) " ;Tab(12); If inpolygon(exagon(),Type(0,5)) Then Print "in" Else Print "out" Print "(10,5) " ;Tab(12); If inpolygon(exagon(),Type(10,5)) Then Print "in" Else Print "out" Print "(8,5) " ;Tab(12); If inpolygon(exagon(),Type(8,5)) Then Print "in" Else Print "out" Print "(10,10) " ;Tab(12); If inpolygon(exagon(),Type(10,10)) Then Print "in" Else Print "out" Print End Select Next z Sleep