Jump to content

Bitmap/Bresenham's line algorithm: Difference between revisions

m
→‎version 1: changed indentation for subroutine, split do/end groups, added/changed whitespace and comments, used template for the output section.
m (correct potential edge case failure)
m (→‎version 1: changed indentation for subroutine, split do/end groups, added/changed whitespace and comments, used template for the output section.)
Line 3,320:
 
=={{header|REXX}}==
=== version 1 ===
This REXX version has automatic scaling (for displaying the plot),   includes a border,   accepts lines segments from the
<br>command line, &nbsp; displays a (background) plot field, &nbsp; and it also handles multiple line segments.
Line 3,326:
parse arg data /*obtain optional arguments from the CL*/
if data='' then data= "(1,8) (8,16) (16,8) (8,1) (1,8)" /* ◄──── a rhombus.*/
data= translate(data, , '()[]{}/,:;') /*elide chaff from the data points. */
@.= '·' /*fill the array with middle─dots chars*/
do points=1 while data\='' /*put the data points into an array (!)*/
parse var data x y data; !.points=x y /*extract the line segments. */
if points==1 then do; minX= x; maxX= x; minY= y; maxY= y; end /*1st case.*/
end
minX= min(minX,x); maxX= max(maxX,x); minY= min(minY,y); maxY= max(maxY,y)
end /*points*/ /* [↑] data points pairs in array !. */
border=2 end /*points*/ /* [↑] data /*border: points ispairs extrain spacearray around plot!. */
minX=minX-border*= 2; maxX=maxX+border*2 /*min and max X for the plot display /*border: is extra space around plot. */
minYminX=minY minX - border *2; maxYmaxX=maxY+border maxX + border*2 /*min " " " Y " " " and max X " for the plot display.*/
minY= minY - border ; maxY= domaxY x=minX+ border to maxX; @.x.0='─';/* " end " " Y " " /*draw a" dash from " left ───► right.*/
 
do y=minY to maxY; @.0.y='│'; end /*draw a pipe from lowest ───► highest*/
@.0.0='┼' do x=minX to maxX; @.x.0= '─'; end /*draw a dash from left ───► /*define the plot's origin axis pointright. */
do segy=2minY to points-1maxY; _@.0.y=seg-1 '│'; end /*obtain thedraw a Xpipe andfrom Y lowest line───► coördinateshighest*/
@.0.0= '┼' call draw_line !._, !.seg /*draw (plot) a line segment. /*define the plot's origin axis point. */
end do /*seg*/ =2 to points-1; _= seg - 1 /* [↑] drawingobtain the line segments.X and Y line coördinates*/
call drawLine !._, !.seg /*draw (plot) a line segment. */
end /*pointsseg*/ /* [↑] datadrawing pointsthe pairsline segments. in array !. */
/* [↓] display the plot to terminal. */
do y=maxY to minY by -1; _= /*display the plot one line at a time. */
do x=minX to maxX; _= _ || @.x.y /*construct/build a line of the plot. */
end /*x*/ /* (a line is a "row" of points.) */
say _ /*display a line of the plot──►terminal*/
end /*y*/ /* [↑] all done plotting the points. */
exit /*stick a fork in it, we're all done. */
/*──────────────────────────────────────────────────────────────────────────────────────*/
draw_linedrawLine: procedure expose @.; parse arg x y,xf yf; plotChar= 'Θ'
dx= abs(xf-x); if x<xf then sx= +1 /*obtain X range, determine the slope*/
else sx= -1 else sx= -1 /* negative slope. */
dy= abs(yf-y); if y<yf then sy= +1 /*obtain Y range, determine the slope*/
else sy= -1 else sy= -1 /* negative slope. */
err=dx-dy err= dx - dy /*calculate error between adjustments. */
 
do forever; @.x.y=plotChar /*plot the points until it's complete. */
if x=xf & y=yf then return do forever; @.x.y= plotChar /*areplot the plot points at the finish?until it's complete. */
err2=err+err if x=xf & y=yf then return /*additionare isthe fasterplot than:points at the err*2. finish? */
if err2= >err -dy+ err then do; err=err-dy; x=x+sx; end /*calculate double the error number. */
if err2 <> dx-dy then do; err= err+dx - dy; y x=y x +sy sx; end
if err2 < dx then do; err= err + dx; y= y + sy; end
end /*forever*/</lang>
'''{{out|output''' |text=&nbsp; when using the default input:}}
<pre>
···│····················
Cookies help us deliver our services. By using our services, you agree to our use of cookies.