Jump to content

Bitmap/Bresenham's line algorithm: Difference between revisions

→‎version 1: simplified the program, eliminated the re-calculating of the min and max point values, removed the STYLE from the PRE html tag.
(→‎version 2: correct output)
(→‎version 1: simplified the program, eliminated the re-calculating of the min and max point values, removed the STYLE from the PRE html tag.)
Line 1,978:
=={{header|REXX}}==
===version 1===
This REXX version has automatic scaling (for displaying the plot).
<lang rexx>/*REXX program plots/draws a line using the Bresenham's line algorithm.*/
@.='·' = 'fa'x /*fill the array with middle─dots*/
plotC = 'fe'x parse arg x1 y1 x2 y2 . /*characterallow usedspecifying forline─end plottingpts. pts*/
parseif argx1=='' x0 y0| x1 y1 . ==',' then x1 = -1 /*allowif not specifyingspecified, line─enduse ptsdefault. */
if x0y1=='' | x0y1==',' then x0y1 = -13 /*if not" " " " " specified, use default. */
if y0x2=='' | y0x2==',' then y0x2 = -3 6 /* " " " " " */
if x1y2=='' | x1y2==',' then x1y2 = 610 /* " " " " " */
if y1=='' | y1==',' then y1 = 10 /* " " " " " */
minX=min(x0,x1); minY=min(y0,y1) /*find the min and max X value.*/
maxX=max(x0,x1); maxY=max(y0,y1) /* " " " " " Y " */
border=2 /*border=extra space around plot.*/
minX=minXmin(x1,x2)-border*2; maxX=maxXmax(x1,x2)+border*2 /*find the min and ,max X borders.display*/
minY=minYmin(y1,y2)-border ; maxY=maxYmax(y1,y2)+border /* " " " " " Y " */
do x=minX to maxX; @.x.0='─'; end /*draw dash from left──► right.*/
do y=minY to maxY; @.0.y='│'; end /*draw pipe from lowest──►highest*/
@.0.0='┼' /*"draw"define the plot's axis originpoint. */
call draw_line x0x1, y0y1, x1x2, y1y2 /*call subroutine and draw line. */
/* [↓] drawdisplay the plot. to term.*/
do y=maxY to minY by -1; _= /*display plot one line at a time*/
do x=minX to maxX /*traipse throught the X axis. */
_=_ || @.x.y /*construct a "line" of the plot.*/
end /*x*/ /*(a line is a "row" of points.) */
say _ /*display a "line" of the plot. */
end /*y*/ /* [↑] all done ploting the pts.*/
exit /*stick a fork in it, we're done.*/
/*────────────────────────────────DRAW_LINE subroutine──────────────────*/
draw_line: procedure expose @.; minX maxX minYparse maxYarg plotC x,y,xf,yf; plotChar='Θ'
parse arg x,y,xf,yf; dx=abs(xf-x); dy=abs(yf-y)
if x<xf then sx=+1
else sx=-1
Line 2,011 ⟶ 2,009:
else sy=-1
err=dx-dy
do forever; do@.x.y=plotChar forever/*plot the points until complete.*/
if x=xf & y=yf then leave /*are plot points at the finish? */
call plotXY x,y,plotC
if 2*err > -dy if x=xfthen &do; yerr=yferr-dy; thenx=x+sx; leaveend
if 2*err < e2dx then do; err=err+errdx; y=y+sy; end
end /*foreverwhile ··· */
if e2>-dy then do; err=err-dy; x=x+sx; end
if e2< dx then do; err=err+dx; y=y+sy; end
end /*forever*/
return
/*────────────────────────────────PLOTXY subroutine─────────────────────*/
plotXY: procedure expose @. minX maxX minY maxY; parse arg xx,yy,pp
@.xx.yy=pp; minX=min(minX,xx); maxX=max(maxX,xx)
minY=min(minY,yy); maxY=max(maxY,yy)
return</lang>
'''output''' when using the default input:
<pre>
<pre style="overflow:scroll">
·····│··········
·····│··········
·····│·····Θ····
·····│····Θ·····
·····│····Θ·····
·····│···Θ······
·····│···Θ······
·····│··Θ·······
·····│··Θ·······
·····│·Θ········
·····│·Θ········
·····│■│Θ·········
─────┼Θ─────────
─────┼■─────────
·····Θ··········
·····Θ··········
····■│Θ│··········
·····│··········
·····│··········
Cookies help us deliver our services. By using our services, you agree to our use of cookies.