Bitmap/Midpoint circle algorithm: Difference between revisions
Content added Content deleted
m (→{{header|REXX}}: added/changed comments and whitespace, used a template for the output section.) |
|||
Line 1,955: | Line 1,955: | ||
<br>a good aspect ratio. |
<br>a good aspect ratio. |
||
The program automatically shows all of the plot's points by finding the minimum and maximum X,Y coördinates. |
The program automatically shows all of the plot's points by finding the minimum and maximum '''X''','''Y''' coördinates. |
||
<lang rexx>/*REXX program plots three circles using midpoint/Bresenham's circle algorithm. */ |
<lang rexx>/*REXX program plots three circles using midpoint/Bresenham's circle algorithm. */ |
||
@.= '·' /*fill the array with middle─dots char.*/ |
@.= '·' /*fill the array with middle─dots char.*/ |
||
minX=0; |
minX= 0; maxX= 0; minY= 0; maxY= 0 /*initialize the minimums and maximums.*/ |
||
call drawCircle 0, 0, 8, '#' /*plot 1st circle with pound character.*/ |
call drawCircle 0, 0, 8, '#' /*plot 1st circle with pound character.*/ |
||
call drawCircle 0, 0, 11, '$' /* " 2nd " " dollar " */ |
call drawCircle 0, 0, 11, '$' /* " 2nd " " dollar " */ |
||
call drawCircle 0, 0, 19, '@' /* " 3rd " " commercial at. */ |
call drawCircle 0, 0, 19, '@' /* " 3rd " " commercial at. */ |
||
border= |
border= 2 /*BORDER: shows N extra grid points.*/ |
||
minX=minX-border*2; maxX=maxX+border*2 |
minX= minX - border*2; maxX= maxX + border*2 /*adjust min and max X to show border*/ |
||
minY=minY-border ; maxY=maxY+ |
minY= minY - border ; maxY= maxY + border /* " " " " Y " " " */ |
||
if @.0.0==@. then @.0.0='┼' |
if @.0.0==@. then @.0.0= '┼' /*maybe define the plot's axis origin. */ |
||
/*define the plot's horizontal grid──┐ */ |
/*define the plot's horizontal grid──┐ */ |
||
do h=minX to maxX; if @.h.0==@. then @.h.0='─'; end |
do h=minX to maxX; if @.h.0==@. then @.h.0= '─'; end /* ◄───────────┘ */ |
||
do v=minY to maxY; if @.0.v==@. then @.0.v='│'; end |
do v=minY to maxY; if @.0.v==@. then @.0.v= '│'; end /* ◄──────────┐ */ |
||
/*define the plot's vertical grid───┘ */ |
/*define the plot's vertical grid───┘ */ |
||
do y=maxY by -1 to minY; _= /* [↓] draw grid from top ──► bottom.*/ |
do y=maxY by -1 to minY; _= /* [↓] draw grid from top ──► bottom.*/ |
||
do x=minX to maxX; _=_ || @.x.y |
do x=minX to maxX; _= _ || @.x.y /* ◄─── " " " left ──► right. */ |
||
end /*x*/ /* [↑] a grid row should be finished. */ |
end /*x*/ /* [↑] a grid row should be finished. */ |
||
say _ /*display a single row of the grid. */ |
say _ /*display a single row of the grid. */ |
||
Line 1,978: | Line 1,978: | ||
/*──────────────────────────────────────────────────────────────────────────────────────*/ |
/*──────────────────────────────────────────────────────────────────────────────────────*/ |
||
drawCircle: procedure expose @. minX maxX minY maxY |
drawCircle: procedure expose @. minX maxX minY maxY |
||
parse arg xx,yy,r 1 y,plotChar; fx=1; |
parse arg xx,yy,r 1 y,plotChar; fx= 1; fy= -2*r /*get X,Y coördinates*/ |
||
f=1-r |
f= 1 - r |
||
do x=0 while x<y /* |
do x=0 while x<y /*▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒*/ |
||
if f>=0 then do; y=y-1; fy=fy+2; f=f+fy; |
if f>=0 then do; y= y - 1; fy= fy + 2; f= f + fy; end /*▒*/ |
||
fx= fx + 2; f= f + fx /*▒*/ |
|||
call plotPoint xx+x, yy+y |
call plotPoint xx+x, yy+y /*▒*/ |
||
call plotPoint xx+y, yy+x |
call plotPoint xx+y, yy+x /*▒*/ |
||
call plotPoint xx+y, yy-x |
call plotPoint xx+y, yy-x /*▒*/ |
||
call plotPoint xx+x, yy-y |
call plotPoint xx+x, yy-y /*▒*/ |
||
call plotPoint xx-y, yy+x |
call plotPoint xx-y, yy+x /*▒*/ |
||
call plotPoint xx-x, yy+y |
call plotPoint xx-x, yy+y /*▒*/ |
||
call plotPoint xx-x, yy-y |
call plotPoint xx-x, yy-y /*▒*/ |
||
call plotPoint xx-y, yy-x |
call plotPoint xx-y, yy-x /*▒*/ |
||
end /*x*/ /* [↑] place plot points ══► plot. |
end /*x*/ /* [↑] place plot points ══► plot.▒▒▒▒▒▒▒▒▒▒▒▒*/ |
||
return |
return |
||
/*──────────────────────────────────────────────────────────────────────────────────────*/ |
/*──────────────────────────────────────────────────────────────────────────────────────*/ |
||
plotPoint: |
plotPoint: parse arg c,r; @.c.r= plotChar /*assign a character to be plotted. */ |
||
minX= min(minX,c); maxX= max(maxX,c) /*determine the minimum and maximum X.*/ |
|||
minY= min(minY,r); maxY= max(maxY,r) /* " " " " " Y.*/ |
|||
return</lang> |
|||
{{out|output|text= when using the default inputs:}} |
|||
'''output''' |
|||
<pre> |
<pre> |
||
·······················│······················· |
·······················│······················· |