home *** CD-ROM | disk | FTP | other *** search
Modula Implementation | 1990-08-09 | 4.3 KB | 143 lines |
- (* ------------------------------------------------------ *)
- (* GRAFLIB0.MOD *)
- (* Grafikbibliothek für Fitted Modula *)
- (* (c) 1990 H.Zinner, W.Fabian & TOOLBOX *)
- (* ------------------------------------------------------ *)
- IMPLEMENTATION MODULE GrafLib0;
-
- FROM (* Graf0Hrc *)
- Graf0CGA
- (* Graf0EGA *)
- IMPORT Punkt, HorLinie, VertLinie, AspectRatio;
-
-
- PROCEDURE Linie(x1, y1, x2, y2, Farbe : CARDINAL);
- VAR
- deltax, deltay, DX, DY,
- Zaehler, Abweichung : INTEGER;
- x, y : CARDINAL;
- BEGIN
- Punkt(x1, y1, Farbe); (* Anfangspunkt *)
- Punkt(x2, y2, Farbe); (* Endpunkt *)
- IF y2 < y1 THEN (* Punkte vertauschen *)
- x := x1; x1 := x2; x2 := x;
- y := y1; y1 := y2; y2 := y;
- END;
- deltax := INTEGER(x2 - x1); DX := ABS(2 * deltax);
- deltay := y2 - y1; DY := 2 * deltay;
- x := x1;
- y := y1;
- IF deltax >= 0 THEN
- IF deltax < deltay THEN
- Abweichung := deltay - DX;
- FOR Zaehler := 1 TO deltay - 1 DO
- IF Abweichung < 0 THEN
- INC(x);
- INC(Abweichung, DY);
- END;
- DEC(Abweichung, DX);
- INC(y);
- Punkt(x, y, Farbe);
- END;
- ELSE
- Abweichung := DY - deltax;
- FOR Zaehler := 1 TO deltax - 1 DO
- IF Abweichung >= 0 THEN
- INC(y);
- DEC(Abweichung, DX);
- END;
- INC(Abweichung, DY);
- INC(x);
- Punkt(x, y, Farbe);
- END;
- END;
- ELSE
- IF ABS(deltax) >= deltay THEN
- Abweichung := DY - ABS(deltax);
- FOR Zaehler := 1 TO ABS(deltax) - 1 DO
- IF Abweichung >= 0 THEN
- INC(y);
- DEC(Abweichung, DX);
- END;
- INC(Abweichung, DY);
- DEC(x);
- Punkt(x, y, Farbe);
- END;
- ELSE
- Abweichung := deltay - DX;
- FOR Zaehler := 1 TO deltay - 1 DO
- IF Abweichung < 0 THEN
- DEC(x);
- INC(Abweichung, DY);
- END;
- DEC(Abweichung, DX);
- INC(y);
- Punkt(x, y, Farbe);
- END;
- END;
- END;
- END Linie;
-
- PROCEDURE Rahmen(x1, y1, x2, y2, Farbe : CARDINAL);
- BEGIN
- VertLinie(x1, y1, y2, Farbe);
- VertLinie(x2, y1, y2, Farbe);
- HorLinie(x1, x2, y1, Farbe);
- HorLinie(x1, x2, y2, Farbe);
- END Rahmen;
-
- PROCEDURE circle(xm, ym, r : CARDINAL;
- FactorHor, FactorVert : REAL;
- Farbe : CARDINAL);
- CONST
- CosPiViertel = 0.7071067;
- VAR
- ZweiRQuadrat, XEnde, x, y,
- DxVertCorr, DyVertCorr, DxHorCorr, DyHorCorr : CARDINAL;
- BEGIN
- x := 0;
- y := r;
- XEnde := TRUNC(FLOAT(r) * CosPiViertel + 0.5);
- ZweiRQuadrat := 2 * r * r;
- REPEAT
- DxHorCorr := TRUNC(FactorHor * FLOAT(x) + 0.5);
- DyHorCorr := TRUNC(FactorHor * FLOAT(y) + 0.5);
- DxVertCorr := TRUNC(FactorVert * FLOAT(x) + 0.5);
- DyVertCorr := TRUNC(FactorVert * FLOAT(y) + 0.5);
-
- Punkt(xm + DxHorCorr, ym + DyVertCorr, Farbe);
- Punkt(xm - DxHorCorr, ym + DyVertCorr, Farbe);
- Punkt(xm + DxHorCorr, ym - DyVertCorr, Farbe);
- Punkt(xm - DxHorCorr, ym - DyVertCorr, Farbe);
- Punkt(xm + DyHorCorr, ym + DxVertCorr, Farbe);
- Punkt(xm - DyHorCorr, ym + DxVertCorr, Farbe);
- Punkt(xm + DyHorCorr, ym - DxVertCorr, Farbe);
- Punkt(xm - DyHorCorr, ym - DxVertCorr, Farbe);
- IF (INTEGER(2*(x+1)*(x+1) + y*y + (y-1)*(y-1))
- - INTEGER(ZweiRQuadrat)) > 0 THEN
- DEC(y);
- END;
- INC(x);
- UNTIL x > XEnde;
- END circle;
-
- PROCEDURE Kreis(xm, ym, r, Farbe : CARDINAL);
- BEGIN
- circle(xm, ym, r, 1.0, AspectRatio, Farbe);
- END Kreis;
-
- PROCEDURE Ellipse(xm, ym, a, b, Farbe : CARDINAL);
- BEGIN
- IF a > b THEN
- circle(xm, ym, a, 1.0,
- AspectRatio * FLOAT(b) / FLOAT(a), Farbe)
- ELSE
- circle(xm, ym, b, FLOAT(a) / FLOAT(b),
- AspectRatio, Farbe)
- END;
- END Ellipse;
-
- END GrafLib0.
- (* ------------------------------------------------------ *)
- (* Ende von GRAFLIB0.MOD *)
-