added two more examples Tron and Vier

Former-commit-id: 5356b94f89
This commit is contained in:
Norayr Chilingarian 2014-02-03 18:12:15 +04:00
parent 35d58d04c4
commit 6939e38e29
7 changed files with 1741 additions and 0 deletions

View file

@ -0,0 +1,217 @@
MODULE Ausgabe;
IMPORT Out := Console, XYplane := oocXYplane;
PROCEDURE RealFix*(x: REAL; n, m: INTEGER);
VAR mul: LONGINT;
BEGIN
IF x < 0 THEN Out.Char("-"); x := -x END;
IF m > 0 THEN
mul := 1;
REPEAT mul := mul*10; DEC(m) UNTIL m = 0;
Out.Int(ENTIER(x+(0.5/mul)), n);
Out.Char(".");
IF ENTIER(mul*x+0.5) MOD mul = 0 THEN
REPEAT mul := mul DIV 10; Out.Char("0") UNTIL mul = 1
ELSE Out.Int(ENTIER(mul*x+0.5) MOD mul, 0)
END
ELSE Out.Int(ENTIER(x+0.5), n)
END
END RealFix;
PROCEDURE Line*(X0, Y0, X1, Y1, mode: INTEGER);
(* Draws a line from (X0, Y0) to (X1, Y1) inclusive. For all line points (x, y) the following holds
always: (min(X0, X1) <= x) & (x <= max(X0, X1) & (min(Y0, Y0) <= y) & (y <= max(Y0, Y1). *)
VAR x, y, dx, dy, d, inc, L, B, R, T, Xmin, Xmax, Ymin, Ymax: INTEGER;
BEGIN
L := XYplane.X; B := XYplane.Y; R := XYplane.X + XYplane.W; T := XYplane.Y + XYplane.H;
IF X0 < X1 THEN Xmin := X0; Xmax := X1 ELSE Xmin := X1; Xmax := X0 END;
IF Y0 < Y1 THEN Ymin := Y0; Ymax := Y1 ELSE Ymin := Y1; Ymax := Y0 END;
IF (L <= Xmax) & (Xmin < R) & (B <= Ymax) & (Ymin < T) THEN (* line may be visible *)
IF Xmin = Xmax THEN FOR y := Ymin TO Ymax DO XYplane.Dot(Xmin, y, mode) END
ELSIF Ymin = Ymax THEN FOR x := Xmin TO Xmax DO XYplane.Dot(x, Ymin, mode) END
ELSE
IF (Y1-Y0) < (X0-X1) THEN x := X0; X0 := X1; X1 := x; y := Y0; Y0 := Y1; Y1 := y END;
dx := 2*(X1-X0); dy := 2*(Y1-Y0); x := X0; y := Y0; inc := 1;
IF (L <= Xmin) & (Xmax < R) & (B <= Ymin) & (Ymax < T) THEN (* no clipping *)
IF dy > dx THEN d := dy DIV 2;
IF dx < 0 THEN inc := -1; dx := -dx END;
WHILE y <= Y1 DO
XYplane.Dot(x, y, mode);
INC(y); DEC(d, dx);
IF d < 0 THEN INC(d, dy); INC(x, inc) END
END
ELSE d := dx DIV 2;
IF dy < 0 THEN inc := -1; dy := -dy END;
WHILE x <= X1 DO
XYplane.Dot(x, y, mode);
INC(x); DEC(d, dy);
IF d < 0 THEN INC(d, dx); INC(y, inc) END
END
END
ELSE (* dot-wise clipping *)
IF dy > dx THEN d := dy DIV 2;
IF dx < 0 THEN inc := -1; dx := -dx END;
WHILE y <= Y1 DO
IF (L <= x) & (x < R) & (B <= y) & (y < T) THEN XYplane.Dot(x, y, mode) END;
INC(y); DEC(d, dx);
IF d < 0 THEN INC(d, dy); INC(x, inc) END
END
ELSE d := dx DIV 2;
IF dy < 0 THEN inc := -1; dy := -dy END;
WHILE x <= X1 DO
IF (L <= x) & (x < R) & (B <= y) & (y < T) THEN XYplane.Dot(x, y, mode) END;
INC(x); DEC(d, dy);
IF d < 0 THEN INC(d, dx); INC(y, inc) END
END
END
END
END
END
END Line;
END Ausgabe.