PROGRAM achsen(input,output);

{$IA:MGRAFTST.LIB}

TYPE  teilung       = STRING [3];

CONST x_absolut_min = 0;
      x_absolut_max = 639;
      y_absolut_min = 0;
      y_absolut_max = 399;

VAR   x_aktuell         : real;
      y_aktuell         : real;
      x_null            : integer;
      y_null            : integer;
      x_teilungs_faktor : real;
      y_teilungs_faktor : real;
      x_teilungs_offset : real;
      y_teilungs_offset : real;

{---------------------------------------------------------------------}

PROCEDURE x_begrenzen (x_wert : integer) : boolean;

BEGIN   { x_begrenzen }
  IF x_wert IN [x_absolut_min .. x_absolut_max]
    THEN x_begrenzen := false
    ELSE IF x_wert < x_absolut_min
           THEN BEGIN x_begrenzen := true;
                      x_wert      := x_absolut_min
                END
           ELSE BEGIN x_begrenzen := true;
                      x_wert      := x_absolut_max
                END
END;    { x_begrenzen }

{---------------------------------------------------------------------}

PROCEDURE achsen (x_teilung, y_teilung : teilung;
          x_relativ_min, x_relativ_max, y_relativ_min, y_relativ_max : real);

BEGIN   { achsen }
  x_teilungs_faktor := (x_absolut_max - x_absolut_min) /
                       (x_relativ_max - x_relativ_min);
  x_teilungs_offset := x_relativ_min;
  y_teilungs_faktor := (y_absolut_max - y_absolut_min) /
                       (y_relativ_max - y_relativ_min);
  y_teilungs_offset := y_relativ_min;
  IF (x_teilung = 'LOG') OR (x_teilung = 'log')
    THEN x_null := 0
    ELSE IF (x_relativ_min < 0) AND (x_relativ_max > 0)
           THEN x_null := round((0-x_relativ_min)*x_teilungs_faktor)
           ELSE IF (x_relativ_min < 0) AND (x_relativ_max <= 0)
                  THEN x_null := round((x_relativ_max-x_relativ_min)*x_teilungs_faktor)
                  ELSE x_null := 0;
  IF (y_teilung = 'LOG') OR (y_teilung = 'log')
    THEN y_null := 0
    ELSE IF (y_relativ_min < 0) AND (y_relativ_max > 0)
           THEN y_null := round((0-y_relativ_min)*y_teilungs_faktor)
           ELSE IF (y_relativ_min < 0) AND (y_relativ_max <= 0)
                  THEN y_null := round((y_relativ_max-y_relativ_min)*y_teilungs_faktor)
                  ELSE y_null := 0;
  GPOINT (x_null,y_absolut_min);
  GLINE  (x_null,y_absolut_max);
  GPOINT (x_absolut_min,y_null);
  GLINE  (x_absolut_max,y_null);
END;

{---------------------------------------------------------------------}

BEGIN
  GINIT;
  achsen('lin','lin',-5,15,-5,15);
  delay (2000);
  achsen('lin','lin',-10,10,-10,10);
  delay (2000);
  achsen('lin','lin',-15,5,-15,5);
  delay (2000);
  achsen('log','log',-10,10,-10,10);
  delay (2000);
  achsen('log','log',10,100,10,100);
  delay (2000);
  GEXIT
END.

