115 lines
4.8 KiB
Plaintext
115 lines
4.8 KiB
Plaintext
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<Point>(5,5)) Then Print "in" Else Print "out"
|
|
Print "(5,8) " ;Tab(12);
|
|
If inpolygon(square(),Type<Point>(5,8)) Then Print "in" Else Print "out"
|
|
Print "(-10,5) " ;Tab(12);
|
|
If inpolygon(square(),Type<Point>(-10,5)) Then Print "in" Else Print "out"
|
|
Print "(0,5) " ;Tab(12);
|
|
If inpolygon(square(),Type<Point>(0,5)) Then Print "in" Else Print "out"
|
|
Print "(10,5) " ;Tab(12);
|
|
If inpolygon(square(),Type<Point>(10,5)) Then Print "in" Else Print "out"
|
|
Print "(8,5) " ;Tab(12);
|
|
If inpolygon(square(),Type<Point>(8,5)) Then Print "in" Else Print "out"
|
|
Print "(10,10) " ;Tab(12);
|
|
If inpolygon(square(),Type<Point>(10,10)) Then Print "in" Else Print "out"
|
|
Print
|
|
Case 2:Print "squared hole"
|
|
Print "(5,5) " ;Tab(12);
|
|
If Not inpolygon(hole(),Type<Point>(5,5)) And inpolygon(square(),Type<Point>(5,5)) Then Print "in" Else Print "out"
|
|
Print "(5,8) " ;Tab(12);
|
|
If Not inpolygon(hole(),Type<Point>(5,8)) And inpolygon(square(),Type<Point>(5,8))Then Print "in" Else Print "out"
|
|
Print "(-10,5) " ;Tab(12);
|
|
If Not inpolygon(hole(),Type<Point>(-10,5))And inpolygon(square(),Type<Point>(-10,5)) Then Print "in" Else Print "out"
|
|
Print "(0,5) " ;Tab(12);
|
|
If Not inpolygon(hole(),Type<Point>(0,5))And inpolygon(square(),Type<Point>(0,5)) Then Print "in" Else Print "out"
|
|
Print "(10,5) " ;Tab(12);
|
|
If Not inpolygon(hole(),Type<Point>(10,5))And inpolygon(square(),Type<Point>(10,5)) Then Print "in" Else Print "out"
|
|
Print "(8,5) " ;Tab(12);
|
|
If Not inpolygon(hole(),Type<Point>(8,5))And inpolygon(square(),Type<Point>(8,5)) Then Print "in" Else Print "out"
|
|
Print "(10,10) " ;Tab(12);
|
|
If Not inpolygon(hole(),Type<Point>(10,10))And inpolygon(square(),Type<Point>(10,10)) Then Print "in" Else Print "out"
|
|
Print
|
|
Case 3:Print "strange"
|
|
Print "(5,5) " ;Tab(12);
|
|
If inpolygon(strange(),Type<Point>(5,5)) Then Print "in" Else Print "out"
|
|
Print "(5,8) " ;Tab(12);
|
|
If inpolygon(strange(),Type<Point>(5,8)) Then Print "in" Else Print "out"
|
|
Print "(-10,5) " ;Tab(12);
|
|
If inpolygon(strange(),Type<Point>(-10,5)) Then Print "in" Else Print "out"
|
|
Print "(0,5) " ;Tab(12);
|
|
If inpolygon(strange(),Type<Point>(0,5)) Then Print "in" Else Print "out"
|
|
Print "(10,5) " ;Tab(12);
|
|
If inpolygon(strange(),Type<Point>(10,5)) Then Print "in" Else Print "out"
|
|
Print "(8,5) " ;Tab(12);
|
|
If inpolygon(strange(),Type<Point>(8,5)) Then Print "in" Else Print "out"
|
|
Print "(10,10) " ;Tab(12);
|
|
If inpolygon(strange(),Type<Point>(10,10)) Then Print "in" Else Print "out"
|
|
Print
|
|
Case 4:Print "exagon"
|
|
Print "(5,5) " ;Tab(12);
|
|
If inpolygon(exagon(),Type<Point>(5,5)) Then Print "in" Else Print "out"
|
|
Print "(5,8) " ;Tab(12);
|
|
If inpolygon(exagon(),Type<Point>(5,8)) Then Print "in" Else Print "out"
|
|
Print "(-10,5) " ;Tab(12);
|
|
If inpolygon(exagon(),Type<Point>(-10,5)) Then Print "in" Else Print "out"
|
|
Print "(0,5) " ;Tab(12);
|
|
If inpolygon(exagon(),Type<Point>(0,5)) Then Print "in" Else Print "out"
|
|
Print "(10,5) " ;Tab(12);
|
|
If inpolygon(exagon(),Type<Point>(10,5)) Then Print "in" Else Print "out"
|
|
Print "(8,5) " ;Tab(12);
|
|
If inpolygon(exagon(),Type<Point>(8,5)) Then Print "in" Else Print "out"
|
|
Print "(10,10) " ;Tab(12);
|
|
If inpolygon(exagon(),Type<Point>(10,10)) Then Print "in" Else Print "out"
|
|
Print
|
|
End Select
|
|
Next z
|
|
Sleep
|