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