Ray-casting algorithm: Difference between revisions
Content added Content deleted
(common lisp PIP) |
(J pointpoly code) |
||
Line 437: | Line 437: | ||
end program Pointpoly</lang> |
end program Pointpoly</lang> |
||
=={{header|J}}== |
|||
<lang j> |
|||
NB.*crossPnP v point in closed polygon, crossing number |
|||
NB. bool=. points crossPnP polygon |
|||
crossPnP=: 4 : 0"2 |
|||
'X Y'=. |:x |
|||
'x0 y0 x1 y1'=. |:2 ,/\^:(2={:@$@]) y |
|||
p1=. ((y0<:/Y)*. y1>/Y) +. (y0>/Y)*. y1<:/Y |
|||
p2=. (x0-/X) < (x0-x1) * (y0-/Y) % (y0 - y1) |
|||
2|+/ p1*.p2 |
|||
) |
|||
</lang> |
|||
Sample data: |
|||
<lang j> |
|||
SQUAREV=: 0 0 , 10 0 , 10 10 ,: 0 10 |
|||
SQUAREV=: SQUAREV, 2.5 2.5 , 7.5 0.1 , 7.5 7.5 ,: 2.5 7.5 |
|||
ESAV=: 3 0 , 7 0 , 10 5 , 7 10 , 3 10 ,: 0 5 |
|||
ESA=: (0 1,1 2,2 3,3 4,4 5,:5 0) , .{ ESAV |
|||
SQUARE=: (0 1,1 2,2 3,:3 0) , .{ SQUAREV |
|||
SQUAREHOLE=: (0 1,1 2,2 3,3 0,4 5,5 6,6 7,:7 4) , .{ SQUAREV |
|||
STRANGE=: (0 4,4 3,3 7,7 6,6 2,2 1,1 5,:5 0) , .{ SQUAREV |
|||
POINTS=: 5 5,5 8,2 2,0 0,10 10,2.5 2.5,0.01 5,2.2 7.4,0 5,10 5,:_4 10 |
|||
</lang> |
|||
Testing: |
|||
<lang j> |
|||
(<POINTS) crossPnP every ESA;SQUARE;SQUAREHOLE;STRANGE |
|||
1 1 1 0 0 1 1 1 0 1 0 |
|||
1 1 1 0 0 1 1 1 0 1 0 |
|||
0 1 1 0 0 1 1 1 0 1 0 |
|||
1 0 0 0 0 0 0 1 0 1 0 |
|||
</lang> |
|||
=={{header|Perl}}== |
=={{header|Perl}}== |