На случай, если кому нужен пример с подсистемой Lib.
Код:
MODULE TestPlot;
IMPORT LibPlotters, Ports, Log := StdLog;
(* y = a*x^2 + b*x + c *)
TYPE
Plot = LibPlotters.Plotter;
CONST
SHIFT = 0.1; (*шаг смещения переменной X*)
PROCEDURE DrawPlot (a, b, c, minX, maxX: INTEGER);
VAR
plot: Plot;
minY, maxY, X, Y, shiftX, shiftY: REAL;
n: INTEGER;
BEGIN
(*создаем новый график и открываем окно с ним*)
plot := LibPlotters.dir.NewPlotter('');
LibPlotters.OpenAux(plot, 150, 100, TRUE, 'График функции y = a*x^2 + b*x + c ');
(*вычисляем максимальное и минимальное значения шкалы Y*)
IF a > 0 THEN
minY := - b / (2 * a);
maxY := a * maxX * maxX + b * maxX + c;
ELSE
maxY := - b / (2 * a);
minY := a * maxX * maxX + b * maxX + c
END;
plot.Scale(minX - 1, maxX + 1, minY - 1, maxY + 1);
(*определяем размеры ячейки сетки координат*)
shiftX := ENTIER((maxX - minX) / 10);
shiftY := ENTIER((maxY - minY) / 10);
(*рисуем сетку координат*)
plot.Grid(minX - shiftX, maxX + shiftX, shiftX, minY - shiftY, maxY + shiftY, shiftY, - 2, Ports.grey12, FALSE);
(*рисуем шкалу X*)
plot.Xaxis(minX, maxX, 1, 5, 2, 0, {});
(*рисуем шкалу Y*)
plot.Yaxis(minY, maxY, 1, 5, 0, 0, TRUE, {});
(*добавляем точки на график и их координаты значения в StdLog*)
X := minX;
Y := a * X * X + b * X + c;
Log.Clear;
WHILE X <= maxX DO
Log.Ln;
Log.RealForm(X, 5, 2, 0, 8FX); Log.String(" "); Log.RealForm(Y, 5, 2, 0, 8FX);
plot.Point(X, Y, 0, 0, 1, 0, 1, Ports.blue);
X := X + SHIFT;
Y := a * (X * X) + b * X + c
END;
(*обнавляем график*)
plot.Update
END DrawPlot;
PROCEDURE Do*;
BEGIN
(*Нарисуем несколько графиков*)
DrawPlot(1, 2, 0, - 14, 10);
DrawPlot(-2, 3, 1, - 14, 10);
DrawPlot(4, 5, 2, -5, 5);
END Do;
END TestPlot.
TestPlot.Do
Графики хорошо масштабируются при изменении размеров окна.
Ссылка на подсистему Lib:
http://www.zinnamturm.eu/downloadsIN.htm#Lib