Jump to content

Ray-casting algorithm: Difference between revisions

m
→‎{{header|REXX}}: changed/added comments and whitespace, changed indentations.
m (added whitespace to the task's preamble, enlarged a Greek glyph.)
m (→‎{{header|REXX}}: changed/added comments and whitespace, changed indentations.)
Line 2,859:
exit /*stick a fork in it, we're all done. */
/*──────────────────────────────────────────────────────────────────────────────────────*/
in$out: procedure expose point. poly.; parse arg p; parse arg p; #=0
do side=1 to poly.0 by 2; #=#+intersect(p,side); end /*side*/
return # //2 2 /*ODD is inside. EVEN is outside.*/
/*──────────────────────────────────────────────────────────────────────────────────────*/
intersect: procedure expose point. poly.; parse arg ?,s; sp=s+1
epsilon='1e' || (-digits()%2); infinity="1e" || (digits() *2)
Px=point.?.x; Ax=poly.s.x; Ay=poly.s.y
Py=point.?.y; Bx=poly.sp.x; By=poly.sp.y /* [↓] do a swap.*/
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
Line 2,875:
if Ax\=Px then m_blue=(Py-Ay) / (Px-Ax)
else return 1
return m_blue >= m_red
/*──────────────────────────────────────────────────────────────────────────────────────*/
points: wx=0; wy=0; do j=1 for arg(); parse value arg(j) with xx yy
points: wx=0
wy=0; do j=1 for arg(); wx=max(wx, length(xx) ); call parse value arg('POINT.'j) with".X", xx yy
wx=max(wx,length(xx)); wy=max(wy, length(yy) ); call value 'POINT.'j".XY", xxyy
wy=max(wy,length(yy)); end call value 'POINT.'/*j".Y", yy*/
call value point.0, j-1 end /*jdefine the number of points. */
call value POINT.0, j-1 /*define the number of points. */
return
/*──────────────────────────────────────────────────────────────────────────────────────*/
poly: @='POLY.'; parse arg Fx Fy /* [↓] process the X,Y points.*/
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 @ || n'.X', xx ; call value @ || n=n+1".Y", yy
call value @end || n'.X', xx ; call value @ || n".Y", yy/*j*/
end /*j*/
n=n+1
call value @ || n'.X', Fx; call value @ || n".Y", Fy; call value @'0',n
return /*POLY.0 is numberis of# segments(sides).*/
/*──────────────────────────────────────────────────────────────────────────────────────*/
test: say; do k=1 for point.0; w=wx+wy+2
say right(' ['arg(1)"] point:", 30),
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>
Cookies help us deliver our services. By using our services, you agree to our use of cookies.