[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