HP Forums
Bresenham Circle VS others - Printable Version

+- HP Forums (https://www.hpmuseum.org/forum)
+-- Forum: HP Calculators (and very old HP Computers) (/forum-3.html)
+--- Forum: HP Prime (/forum-5.html)
+--- Thread: Bresenham Circle VS others (/thread-17205.html)



Bresenham Circle VS others - matalog - 07-04-2021 01:10 AM

On the thoughts of Bresenham circles drawn in BASIC languages, I have taken the opportunity to create a VS here, and there is not a lot of difference.

What led me to show this, was my post on FILLPOLY_P(). Although, I suspect that Bresenham's method can't even help the FILLPOLY algorithm, because that algorithm seems to be flawed in some ways, especially for shapes described in more than a rough description of their outline.

Fillpoly() seems to need a distance farther than 2 horizontal or vertical pixels, while still connected by pixels, or it does not work correctly.

Code:
EXPORT BRES2()
BEGIN
RECT_P(0,0,320,240,0);
    LOCAL COORD:={};
  LOCAL A,R,ST;
LOCAL XC,YC,X,Y,R,D;
R:=100;
XC:=160;
YC:=120;
X:=0;
Y:=R;
D:=3-2*R;
ARC_P(160,120,100,RGB(255,0,0));
WHILE Y>=X DO

IF D>0 THEN Y:=Y-1;D:=D+4*(X-Y)+10;ELSE D:=D+4*X+6;END;
PIXON_P(XC+X,YC+Y,RGB(0,255,0,0));
PIXON_P(XC-X,YC+Y,RGB(0,255,0,0));
PIXON_P(XC+X,YC-Y,RGB(0,255,0,0));
PIXON_P(XC-X,YC-Y,RGB(0,255,0,0));
PIXON_P(XC+Y,YC+X,RGB(0,255,0,0));
PIXON_P(XC-Y,YC+X,RGB(0,255,0,0));
PIXON_P(XC+Y,YC-X,RGB(0,255,0,0));
PIXON_P(XC-Y,YC-X,RGB(0,255,0,0));
X:=X+1;
WAIT(0.05);
END;
REPEAT 
WAIT (-1);
  IF ISKEYDOWN(4) THEN BREAK(3); END;
 
UNTIL 0;
END;

Obviously the Bresenham method has been slowed down here to show the beautiful way that it draws.


RE: Bresenham Circle VS others - C.Ret - 07-04-2021 06:41 AM

Hi,

Nice implementation indeed, you now have an efficient way of filling your circles without lost of detail or no fill gaps !

Code:
EXPORT FCIRCLE_P(XC,YC,R,Col)
BEGIN
  LOCAL D:=3-2*R,  X:=0,    Y:=R;
  RECT_P(#0);
  WHILE Y>=X DO
     IF D>0   THEN   Y:=Y-1; D:=D+4*(X-Y)+10   ELSE   D:=D+4* X   + 6   END;
     LINE_P(XC+X,YC+Y,XC+X,YC-Y,Col);   LINE_P(XC-X,YC+Y,XC-X,YC-Y,Col);
     LINE_P(XC+Y,YC+X,XC+Y,YC-X,Col);   LINE_P(XC-Y,YC+X,XC-Y,YC-X,Col);
     X:=X+1    END;
  FREEZE
END;

But, you may have explained a bit more the trick you are using with the indicator variable D. Are the definition correct for any value of radius R or is there any hidden beast in the eke ?

It also a bit of a shame, you don't have post this related subject in your previous thread, since it is closely related, this will have help readers and subscribers to easier follow your progress.


RE: Bresenham Circle VS others - Liamtoh Resu - 07-04-2021 12:17 PM

I find these graphics programs fascinating.

I had to grok m's code to figure out how to get an output from c's code.
(eg. 160,120,100,255) gave me a blue circle.

Explanations of bresenham's algorithm tend be very detailed.

Meanwhile I found this link for the bitmap/midpoint circle algorithm:

http://rosettacode.org/wiki/Bitmap/Midpoint_circle_algorithm

Thanks again.


RE: Bresenham Circle VS others - C.Ret - 07-04-2021 03:05 PM

(07-04-2021 12:17 PM)Liamtoh Resu Wrote:  [...]I had to grok m's code to figure out how to get an output from c's code.
(eg. 160,120,100,255) gave me a blue circle.[...]

Sorry, I don't have commented the code in my previous post. The Col variable is expecting regular color code for the HP Prime.

The best way is to use the RGB(r,b,g,α) function or a valid structured #rrggbbαα binary integer.

Beware that in this code, I produce the method used by matalog and I am not sure that the variable D is correctly set.


RE: Bresenham Circle VS others - Mark Power - 07-07-2021 09:13 PM

The true beauty of Bresenham’s algorithm is that the calculations are limited to integer addition, integer subtraction and integer x4 which can be implemented as shift left by 2 bits. All of which means the algorithm can be implemented in assembly language/machine code for stunning speed on the most basic of processors.

If you want to see an HP48 implementation in assembly language have a look at glib.