[Oberon] FPGA - Simple Graph Fill

Magnus Karlsson magnus at saanlima.com
Fri Nov 9 18:49:49 CET 2018


Here is the code I used in a project to draw a filled circle using a 
routine to draw a horizontal line (adapted from Adafruit GFX arduino 
library):

void circle(int x0, int y0, int r) {
   int f = 1 - r;
   int ddF_x = 1;
   int ddF_y = -2 * r;
   int x = 0;
   int y = r;

   hline(x0 - r, x0 + r, y0);
   hline(x0, x0, y0 + r);
   hline(x0, x0, y0 - r);

   while (x < y) {
     if (f >= 0) {
       y--;
       ddF_y += 2;
       f += ddF_y;
     }
     x++;
     ddF_x += 2;
     f += ddF_x;
     hline(x0 - x, x0 + x, y0 + y);
     hline(x0 - x, x0 + x, y0 - y);
     hline(x0 - y, x0 + y, y0 + x);
     hline(x0 - y, x0 + y, y0 - x);
   }
}

Magnus


On 11/9/2018 7:16 AM, Wim Niemann wrote:
> Hi,
>
> bug solved.
> The trace says '0 303 201  north start'. Now the color must become the fill color 8 but a few lines further on the trace prints again '0 303 201'.
>
> Like Jörg says, the order of S, E, N, W is not relevant. I'm sorry for the confusion but the directions East and South-East stemmed from the outline algorithm and were not related to a flood fill.
>
> The recursion can be replaced by iteration but a quick internet search indicated you still push new candidate pixels on a stack. For larger images, this is really memory and cpu intensive. From memory, I believe it is possible to iterate top down and do two scans left and right to prevent a pixel stack but I don't have an example by hand.
>
> Here's another approach which draws a filled circle in a single color without flood-fill:
>
> The 'Bresenham circle' version in 'Foley and van Dam' differs slightly from the Oberon version and is presented in C:  (kudos for keeping it human readable)
>
> void MidpointCircle(int radius, int color)
> /* Assumes the center of circle is at origin. */
> {
> 	int	x = 0;
> 	int	y = radius;
> 	int	d = 1 - radius;
> 	CirclePoints(x, y, color);	/* draw eight-fold symmetric points */
> 	while (y > x) {
> 		if (d < 0) {	/* Select E */
> 			d += 2*x + 3;
> 		} else {	/* Select SE */
> 			d += 2*(x-y) + 5;
> 			y--;
> 		}
> 		x++;
> 		CirclePoints(x, y, color);
> 	}
> }
>
> This version either draws pixels at the same horizontal line or decreases y to a new scanline. Instead of drawing the eight pixels you can fill a horizontal line section when y is decreased to obtained a filled circle.
>
> A border color can then be achieved by drawing an outline in the border color.
>
> Wim
> --
> Oberon at lists.inf.ethz.ch mailing list for ETH Oberon and related systems
> https://lists.inf.ethz.ch/mailman/listinfo/oberon
>



More information about the Oberon mailing list