Xiaolin Wu's line algorithm: Difference between revisions
Content added Content deleted
(Added Julia language) |
m (→{{header|REXX}}: added/changed comments and whitespace.) |
||
Line 1,983: | Line 1,983: | ||
<br>Also, it takes in account (that can easily be overlooked) of the note after the description of the algorithm: |
<br>Also, it takes in account (that can easily be overlooked) of the note after the description of the algorithm: |
||
<br>'''Note''': If at the beginning of the routine abs(''dx'') < abs(''dy'') is true, then all plotting should be done with '''x''' and '''y''' reversed. |
<br>'''Note''': If at the beginning of the routine abs(''dx'') < abs(''dy'') is true, then all plotting should be done with '''x''' and '''y''' reversed. |
||
<lang rexx>/*REXX program plots/draws (ASCII) a line using the Xiaolin Wu line algorithm. |
<lang rexx>/*REXX program plots/draws (ASCII) a line using the Xiaolin Wu line algorithm. */ |
||
background= '·' /*background character: a middle-dot. */ |
background= '·' /*background character: a middle-dot. */ |
||
image.= background /*fill the array with middle-dots. */ |
image.= background /*fill the array with middle-dots. */ |
||
Line 2,002: | Line 2,002: | ||
call drawLine xi, yi, xf, yf /*invoke subroutine and graph the line.*/ |
call drawLine xi, yi, xf, yf /*invoke subroutine and graph the line.*/ |
||
border=2 /*allow additional space (plot border).*/ |
border=2 /*allow additional space (plot border).*/ |
||
minX=minX - border * 2; |
minX=minX - border * 2; maxX=maxX + border * 2 /*preserve screen's aspect ratio {*2}.*/ |
||
minY=minY - border ; |
minY=minY - border ; maxY=maxY + border |
||
do y=maxY to minY by -1; |
do y=maxY to minY by -1; $= /*construct a row.*/ |
||
do x=minX to maxX; |
do x=minX to maxX; $=$ || image.x.y; end /*x*/ |
||
say |
say $ /*display the constructed row to term. */ |
||
end /*y*/ /*graph is cropped by the MINs and MAXs*/ |
end /*y*/ /*graph is cropped by the MINs and MAXs*/ |
||
exit /*stick a fork in it, we're all done. */ |
exit /*stick a fork in it, we're all done. */ |
||
Line 2,027: | Line 2,027: | ||
call plotXY xpx12, ypx12+1, brite( fpart(yend*xgap)), switchXY |
call plotXY xpx12, ypx12+1, brite( fpart(yend*xgap)), switchXY |
||
do x=xpx11+1 to xpx12-1 /*◄═════════════════draw the line.═════════════*/ |
|||
!intery=floor(intery) |
|||
call plotXY x, !intery , brite(1 - fpart(intery)), switchXY |
|||
call plotXY x, !intery+1, brite( fpart(intery)), switchXY |
|||
intery=intery + gradient |
|||
end /*x*/ |
|||
return |
return |
||
/*──────────────────────────────────────────────────────────────────────────────────────*/ |
/*──────────────────────────────────────────────────────────────────────────────────────*/ |
||
brite: return substr(background || plotC, 1 + round( abs( arg(1) ) * length(plotC)), 1) |
brite: return substr(background || plotC, 1 + round( abs( arg(1) ) * length(plotC)), 1) |
||
floor: parse arg |
floor: parse arg #; _=trunc(#); return _ - (#<0) * (#\=_) |
||
fpart: parse arg |
fpart: parse arg #; return abs(# - trunc(#) ) |
||
round: return format(arg(1), , word(arg(2) 0, 1) ) |
round: return format(arg(1), , word(arg(2) 0, 1) ) |
||
/*──────────────────────────────────────────────────────────────────────────────────────*/ |
/*──────────────────────────────────────────────────────────────────────────────────────*/ |
||
plotXY: parse arg xx,yy,bc,switchYX; if switchYX then parse arg yy,xx |
plotXY: parse arg xx,yy,bc,switchYX; if switchYX then parse arg yy,xx |
||
image.xx.yy=bc; minX=min(minX, xx); |
image.xx.yy=bc; minX=min(minX, xx); maxX=max(maxX,xx) |
||
minY=min(minY, yy); |
minY=min(minY, yy); maxY=max(maxY,yy); return</lang> |
||
{{out|output|text= when using the default inputs:}} |
{{out|output|text= when using the default inputs:}} |
||
<pre> |
<pre> |