[Oberon] SystemV - Simple Graph
Tomas Kral
thomas.kral at email.cz
Tue Mar 5 15:24:03 CET 2019
Hi,
Currently pursuing the idea of `Ellipse Solid Fill'.
I borrow this algo, believe is Bresenham, and use two pairs
of horizontal lines.
PROCEDURE Ellipse*(col, x0, y0, a, b, mode: INTEGER);
VAR x, y, y1, aa, bb, d, g, h: INTEGER;
BEGIN aa := a*a; bb := b*b;
h := (aa DIV 4) - b*aa + bb; g := (9*aa DIV 4) - 3*b*aa + bb; x := 0; y := b;
WHILE g < 0 DO
(*Dots - Bresenham algo*)
(*D.Dot(col, x0+x, y0+y, mode);
D.Dot(col, x0-x, y0+y, mode);
D.Dot(col, x0-x, y0-y, mode);
D.Dot(col, x0+x, y0-y, mode);*)
(*Fills - TODO replace with ReplConst() and optimise*)
Line(col, x0-x, y0+y, x0+x, y0+y, mode);
Line(col, x0-x, y0-y, x0+x, y0-y, mode);
IF h < 0 THEN d := (2*x+3)*bb; INC(g, d)
ELSE d := (2*x+3)*bb - 2*(y-1)*aa; INC(g, d + 2*aa); DEC(y)
END ;
INC(h, d); INC(x)
END ;
y1 := y; h := (bb DIV 4) - a*bb + aa; x := a; y := 0;
WHILE y <= y1 DO
(*Dots - Bresenham algo*)
(*D.Dot(col, x0+x, y0+y, mode);
D.Dot(col, x0-x, y0+y, mode);
D.Dot(col, x0-x, y0-y, mode);
D.Dot(col, x0+x, y0-y, mode);*)
(*Fills - TODO replace with ReplConst() and optimise*)
Line(col, x0-x, y0+y, x0+x, y0+y, mode);
Line(col, x0-x, y0-y, x0+x, y0-y, mode);
IF h < 0 THEN INC(h, (2*y+3)*aa) ELSE INC(h, (2*y+3)*aa - 2*(x-1)*bb); DEC(x) END ;
INC(y)
END
END Ellipse;
I feel up to replacing `Line' with `ReplConst', but cannot optimise
further. I have got this nice algo for Circle from Joerg (gladly keeping similar algos from the list on file), looking for simplicity.
PROCEDURE CircleFill*(col, x0, y0, r, mode: INTEGER);
VAR x, y, r2, lim: INTEGER;
BEGIN r2 := r*r;
FOR y := 0 TO r DO
lim := r2 - y*y; x := 0; WHILE x*x <(*[=]*) lim DO INC(x) END;
D.ReplConst(col, x0-x, y0+y, 2*x, 1, mode);
D.ReplConst(col, x0-x, y0-y, 2*x, 1, mode)
END
END CircleFill;
Many thanks.
--
Tomas Kral <thomas.kral at email.cz>
More information about the Oberon
mailing list