PACKET fuplot DEFINES axis, (*Autor : H.Indenbirken *)
plot, (*Stand : 23.02.85 *)
cube:
PICTURE VAR pic;
TEXT VAR value text;
PICTURE PROC cube (REAL CONST x min, x max, INT CONST no x,
REAL CONST y min, y max, INT CONST no y,
REAL CONST z min, z max, INT CONST no z):
cube (x min, x max, (x max-x min)/real (no x),
y min, y max, (y max-y min)/real (no y),
z min, z max, (z min-z max)/real (no z))
END PROC cube;
PICTURE PROC cube (REAL CONST x min, x max, dx, y min, y max, dy, z min, z max, dz):
pic := cube (x min, x max, y min, y max, z min, z max);
move (pic, x max, y min, z min); draw (pic, text (x max));
move (pic, x min, y max, z min); draw (pic, text (y max));
move (pic, x min, y min, z max); draw (pic, text (z max));
draw tabs (pic, x min, y min, z min, x max, y min, z min, dx, 0.0, 0.0);
draw tabs (pic, x min, y min, z min, x min, y max, z min, 0.0, dy, 0.0);
draw tabs (pic, x min, y min, z min, x min, y min, z max, 0.0, 0.0, dx);
pic
END PROC cube;
PICTURE PROC cube (REAL CONST x min, x max, y min, y max, z min, z max):
pic := nilpicture;
move (pic, x min, y min, z min);
draw (pic, x max, y min, z min);
draw (pic, x max, y max, z min);
draw (pic, x min, y max, z min);
draw (pic, x min, y min, z min);
move (pic, x min, y min, z max);
draw (pic, x max, y min, z max);
draw (pic, x max, y max, z max);
draw (pic, x min, y max, z max);
draw (pic, x min, y min, z max);
move (pic, x min, y min, z min);
draw (pic, x min, y min, z max);
move (pic, x max, y min, z min);
draw (pic, x max, y min, z max);
move (pic, x max, y max, z min);
draw (pic, x max, y max, z max);
move (pic, x min, y max, z min);
draw (pic, x min, y max, z max);
pic
END PROC cube;
PICTURE PROC axis (REAL CONST x min, x max, INT CONST no x,
REAL CONST y min, y max, INT CONST no y) :
axis (x min, x max, (x max-x min) / real (no x - 1),
y min, y max, (y max-y min) / real (no y - 1))
END PROC axis;
PICTURE PROC axis (REAL CONST x min, x max, dx, y min, y max, dy) :
REAL CONST x diff :: x max - x min,
y diff :: y max - y min;
pic := nilpicture;
calc axis pos;
IF dx > 0.0
THEN x axis FI;
IF dy > 0.0
THEN y axis FI;
pic .
calc axis pos :
REAL VAR x0, y0;
IF x min < 0.0 AND x max < 0.0
THEN y0 := y max
ELIF x min > 0.0 AND x max > 0.0
THEN y0 := y max
ELSE y0 := 0.0 FI;
IF y min < 0.0 AND y max < 0.0
THEN x0 := x max
ELIF y min > 0.0 AND y max > 0.0
THEN x0 := x max
ELSE x0 := 0.0 FI .
x axis :
move (pic, x max, y0);
move cm r (pic, 0.1, -0.3);
draw (pic, "X");
draw tabs (pic, x0,y0, x max,y0, dx,0.0);
value text := text (x max);
draw (pic, (length (value text) DIV 2) * ""8"" + ""10"" + value text);
draw tabs (pic, x0,y0, x min,y0,-dx,0.0);
value text := text (x min);
draw (pic, (length (value text) DIV 2) * ""8"" + ""10"" + value text) .
y axis :
move (pic, x0, y max);
move cm r (pic, -0.18, 0.1);
draw (pic, "Y");
draw tabs (pic, x0,y0, x0,y max, 0.0, dy);
value text := text (y max);
draw (pic, length (value text) * ""8"" + value text);
draw tabs (pic, x0,y0, x0,y min, 0.0,-dy);
value text := text (y min);
draw (pic, length (value text) * ""8"" + value text) .
END PROC axis;
PROC draw tabs (PICTURE VAR pic, REAL CONST x0,y0, x1,y1, dx,dy) :
move (pic, x0, y0);
draw (pic, x1, y1);
REAL VAR x :: x0, y :: y0;
INT VAR i :: 0;
WHILE abs (x) <= abs (x1) AND abs (y) <= abs (y1)
REP move (pic, x, y);
IF dx <> 0.0
THEN draw cm r (pic, 0.0, size)
ELIF dy <> 0.0
THEN draw cm r (pic, size, 0.0) FI;
i INCR 1;
x INCR dx; y INCR dy
PER .
size:
IF i MOD 10 = 0
THEN -0.75
ELIF i MOD 5 = 0
THEN -0.5
ELSE -0.3 FI .
END PROC draw tabs;
PICTURE PROC axis (REAL CONST x min, x max, INT CONST no x,
REAL CONST y min, y max, INT CONST no y,
REAL CONST z min, z max, INT CONST no z) :
axis (x min, x max, (x max-x min) / real (no x - 1),
y min, y max, (y max-y min) / real (no y - 1),
z min, z max, (z max-z min) / real (no z - 1))
END PROC axis;
PICTURE PROC axis (REAL CONST x min, x max, dx,
y min, y max, dy,
z min, z max, dz) :
REAL CONST x diff :: x max - x min,
y diff :: y max - y min,
z diff :: z max - z min;
pic := nilpicture;
calc axis pos;
IF dx > 0.0
THEN x axis FI;
IF dy > 0.0
THEN y axis FI;
IF dz > 0.0
THEN z axis FI;
pic .
calc axis pos :
REAL VAR x0, y0, z0;
IF x min < 0.0 AND x max < 0.0
THEN y0 := y max
ELIF x min > 0.0 AND x max > 0.0
THEN y0 := y max
ELSE y0 := 0.0 FI;
IF y min < 0.0 AND y max < 0.0
THEN x0 := x max
ELIF y min > 0.0 AND y max > 0.0
THEN x0 := x max
ELSE x0 := 0.0 FI;
IF z min < 0.0 AND z max < 0.0
THEN z0 := z max
ELIF z min > 0.0 AND z max > 0.0
THEN z0 := z max
ELSE z0 := 0.0 FI .
x axis :
move (pic, x max, y0, z0);
move cm r (pic, 0.1, -0.3);
draw (pic, "X");
draw tabs (pic, x0,y0,z0, x max,y0,z0, dx,0.0,0.0);
value text := text (x max);
draw (pic, (length (value text) DIV 2) * ""8"" + ""10"" + value text);
draw tabs (pic, x0,y0,z0, x min,y0,z0,-dx,0.0,0.0);
value text := text (x min);
draw (pic, (length (value text) DIV 2) * ""8"" + ""10"" + value text) .
y axis :
move (pic, x0, y max, z0);
move cm r (pic, -0.18, -0.1);
draw (pic, "Y");
draw tabs (pic, x0,y0,z0, x0,y max,z0, 0.0, dy,0.0);
value text := text (y max);
draw (pic, length (value text) * ""8"" + value text);
draw tabs (pic, x0,y0,z0, x0,y min,z0, 0.0,-dy,0.0);
value text := text (y min);
draw (pic, length (value text) * ""8"" + value text) .
z axis :
move (pic, x0, y0, z max);
move cm r (pic, 0.1, -0.3);
draw (pic, "Z");
draw tabs (pic, x0,y0,z0, x0,y0,z max, 0.0,0.0, dz);
value text := text (z max);
draw (pic, (length (value text) DIV 2) * ""8"" + ""10"" + value text);
draw tabs (pic, x0,y0,z0, x0,y0,z min, 0.0,0.0,-dz);
value text := text (z min);
draw (pic, (length (value text) DIV 2) * ""8"" + ""10"" + value text) .
END PROC axis;
PROC draw tabs (PICTURE VAR pic, REAL CONST x0,y0,z0, x1,y1,z1, dx,dy,dz) :
move (pic, x0, y0, z0);
draw (pic, x1, y1, z1);
REAL VAR x :: x0, y :: y0, z :: z0;
INT VAR i :: 0;
WHILE abs (x) <= abs (x1) AND abs (y) <= abs (y1) AND abs (z) <= abs (z1)
REP move (pic, x, y, z);
IF dx <> 0.0
THEN draw cm r (pic, 0.0, size);
ELIF dy <> 0.0
THEN draw cm r (pic, size, 0.0);
ELIF dz <> 0.0
THEN draw cm r (pic, 0.0, size) FI;
i INCR 1;
x INCR dx; y INCR dy; z INCR dz
PER .
size:
IF i MOD 10 = 0
THEN -0.75
ELIF i MOD 5 = 0
THEN -0.5
ELSE -0.3 FI .
END PROC draw tabs;
PROC plot (PICFILE VAR p, REAL PROC (REAL CONST, REAL CONST) f,
REAL CONST x min, x max, INT CONST pixel x,
REAL CONST z min, z max, INT CONST pixel z) :
plot (p, PROC f, 1, x min, x max, (x max-x min) / real (pixel x),
z min, z max, (z max-z min) / real (pixel z))
END PROC plot;
PROC plot (PICFILE VAR p, REAL PROC (REAL CONST, REAL CONST) f, INT CONST pen,
REAL CONST x min, x max, INT CONST pixel x,
REAL CONST z min, z max, INT CONST pixel z) :
plot (p, PROC f, pen, x min, x max, (x max-x min) / real (pixel x),
z min, z max, (z max-z min) / real (pixel z))
END PROC plot;
PROC plot (PICFILE VAR p, REAL PROC (REAL CONST, REAL CONST) f,
REAL CONST x min, x max, dx,
REAL CONST z min, z max, dz) :
plot (p, PROC f, 1, x min, x max, dx, z min, z max, dz)
END PROC plot;
PROC plot (PICFILE VAR p, REAL PROC (REAL CONST, REAL CONST) f, INT CONST n,
REAL CONST x min, x max, dx,
REAL CONST z min, z max, dz) :
REAL VAR z := z min;
line;
WHILE z <= z max
REP out (""13""5"Ebene: " + text (z));
pic := plot (PROC f, x min, x max, dx, z);
pen (pic, n);
put picture (p, pic);
z INCR dz
PER .
END PROC plot;
PICTURE PROC plot (REAL PROC (REAL CONST, REAL CONST) f,
REAL CONST x min, x max, dx, z):
pic := nilpicture;
REAL VAR x := x min;
move (pic, x, f (x, z), z);
WHILE x < x max
REP x INCR dx;
draw (pic, x, f (x, z), z);
PER;
draw (pic, x, f (x, z), z);
pic .
END PROC plot;
PICTURE PROC plot (REAL PROC (REAL CONST) f,
REAL CONST x min, x max, INT CONST pixel) :
plot (PROC f, x min, x max, (x max-x min) / real (pixel))
END PROC plot;
PICTURE PROC plot (REAL PROC (REAL CONST) f, REAL CONST x min, x max, dx) :
PICTURE VAR pic :: nilpicture;
REAL VAR x := x min;
move (pic, x, f (x));
WHILE x < x max
REP x INCR dx;
draw (pic, x, f (x));
PER;
draw (pic, x, f (x));
pic
END PROC plot;
END PACKET fuplot