Ray-casting algorithm: Difference between revisions
Content added Content deleted
m (→omissions) |
No edit summary |
||
Line 962: | Line 962: | ||
end program Pointpoly</lang> |
end program Pointpoly</lang> |
||
=={{header|freebasic}}== |
|||
Inpolygon by Winding number method |
|||
<lang freebasic> |
|||
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 |
|||
</lang> |
|||
Output: |
|||
<pre> |
|||
squared |
|||
(5,5) in |
|||
(5,8) in |
|||
(-10,5) out |
|||
(0,5) out |
|||
(10,5) in |
|||
(8,5) in |
|||
(10,10) out |
|||
squared hole |
|||
(5,5) out |
|||
(5,8) in |
|||
(-10,5) out |
|||
(0,5) out |
|||
(10,5) in |
|||
(8,5) in |
|||
(10,10) out |
|||
strange |
|||
(5,5) in |
|||
(5,8) out |
|||
(-10,5) out |
|||
(0,5) out |
|||
(10,5) in |
|||
(8,5) in |
|||
(10,10) out |
|||
exagon |
|||
(5,5) in |
|||
(5,8) in |
|||
(-10,5) out |
|||
(0,5) out |
|||
(10,5) in |
|||
(8,5) in |
|||
(10,10) out |
|||
</pre> |
|||
=={{header|Go}}== |
=={{header|Go}}== |