Anonymous user
Ray-casting algorithm: Difference between revisions
m
→{{header|REXX}}: added/changed whitespace and comments, aligned the numbers in the output better, simplified a subroutine name.
m (→{{header|REXX}}: fixed a cut 'n paste mishap (trailing apostrophe).) |
m (→{{header|REXX}}: added/changed whitespace and comments, aligned the numbers in the output better, simplified a subroutine name.) |
||
Line 2,613:
=={{header|REXX}}==
Over half of the REXX program is devoted to specifying/defining/assigning the points for the test cases and for the various --[[User:Gerard Schildberger|Gerard Schildberger]] ([[User talk:Gerard Schildberger|talk]]) 00:47, 19 November 2015 (UTC)polygons.
Code was added to facilitate easier specification of polygon sides by just specifying their vertices instead of specifying line segments.
Line 2,619:
Points on a vertex (or side) don't obtain ''coherent'' results, but casual observation
seems to indicate that this code considers those points as outside the polygon.
<lang rexx>/*REXX
call points
A=2.5; B=7.5 /* ◄─── used
call poly 0 0, 10 0, 10 10, 0 10 ; call test 'square'
call poly 0 0, 10 0, 10 10, 0 10, A A, B A, B B, A B ; call test 'square hole'
Line 2,628:
exit /*stick a fork in it, we're all done. */
/*────────────────────────────────────────────────────────────────────────────*/
do side=1 to poly.0 by 2; #=#+
end /*side*/
return #//2 /*ODD is inside. EVEN is outside.
/*────────────────────────────────────────────────────────────────────────────*/
epsilon='1e' || (digits()%2); infinity='1e'
Px=point.?.x; Ax=poly.s.x;
Py=point.?.y; Bx=poly.sp.x; By=poly.sp.y /* [↓]
return▼
/*────────────────────────────────────────────────────────────────────────────*/
points: wx=0
poly: n=0; v='POLY.'; parse arg Fx Fy /* [↓] process the X,Y points*/▼
end /*j*/
call value POINT.0,j-1 /*define the number of points. */
▲ return
/*────────────────────────────────────────────────────────────────────────────*/▼
n=0
do j=1 for arg(); n=n+1; parse value arg(j) with xx yy
call value @||n'.X', xx ; call value @||n'.Y', yy
if n//2 then iterate
n=n+1
call value
end /*j*/
n=n+1
call value
return /*POLY.0
▲/*────────────────────────────────────────────────────────────────────────────*/
▲ if Ay>By then parse value Ax Ay Bx By with Bx By Ax Ay
▲ if Py=Ay | Py=By then Py=Py+epsilon
▲ if Py<Ay | Py>By | Px>max(Ax,Bx) then return 0
▲ if Px<min(Ax,Bx) then return 1
▲ if Ax\=Bx then m_red =(By-Ay)/(Bx-Ax)
▲ else m_red =infinity
▲ if Ax\=Px then m_blue=(Py-Ay)/(Px-Ax)
▲ else return 1
▲ return m_blue>=m_red
/*────────────────────────────────────────────────────────────────────────────*/
test: say; do k=1 for point.0;
right( right(point.k.x,wx)','right(point.k.y,wy),w) " is
right( word('outside inside', in$out(k)+1), 7)
end /*k*/
return</lang>
'''output'''
<pre>
[square] point:
[square] point:
[square] point:
[square] point:
[square] point:
[square] point:
[square] point:
[square hole] point:
[square hole] point:
[square hole] point:
[square hole] point:
[square hole] point:
[square hole] point:
[square hole] point:
[irregular] point:
[irregular] point:
[irregular] point:
[irregular] point:
[irregular] point:
[irregular] point:
[irregular] point:
[hexagon] point:
[hexagon] point:
[hexagon] point:
[hexagon] point:
[hexagon] point:
[hexagon] point:
[hexagon] point:
</pre>
|