Задача. Написать программу построения графика заданной функции Y=f(X) для аргумента X, изменяющегося от xn до xk. Для определенности будем считать, что Y=sin(x), xn=–2π, xk = 2π. Решение. При построении графика должны быть определены масштабы – коэффициенты, с помощью которых натурные величины (X, Y) будут переводиться в графические координаты (xG, yG). В общем случае пределы изменения натурных величин: аргумента (xn, xk) и функции (Ymin, Ymax) должны быть отображены на выбранные пределы изменения графических координат:
xGn – x графическое начальное,
xGk – x графическое конечное,
yGn – y графическое начальное,
yGk – y графическое конечное.
С учетом сказанного, масштабы можно определить по формулам:
mx:=(xGk-xGn)/(xk-xn); { Масштаб по X }
my:=(yGk-yGn)/(ymax-ymin); { Масштаб по Y }
Максимальное и минимальное значения функции (хотя бы приблизительные, лучше с запасом в большую сторону) должны быть заданы пользователем. Для перехода к графическим координатам получим следующие соотношения:
Для построения графика воспользуемся процедурой LineTo, которая будет проводить линию от точки к точке.
Program PlotGrafik;
uses
Crt, Graph;
const
xGn=20; { Константы, определяющие }
yGn=50; { область экрана, }
xGk=600; { в которую будет }
yGk=470; { выводиться график }
xn=-2*pi/2; { Начальное и }
xk=2*pi/2; { конечное значение аргумента }
ymin=-1; { Предполагаемые минимальное и }
ymax=1; { максимальное значения функции }
kT=150; { Количество точек графика }
var
grDr, grMd, grEr : integer;
x, y, Dx : real;
xG, yG : integer;
mx, my : real; { Масштабы по X и Y }
Function f(x:real):Real;
begin
f:=sin(x); {Функция, для которой строится график}
end;
begin
grDr:=Detect;
InitGraph(GrDr, GrMd, ’D:\bp\BGI’);
GrEr:=GraphResult;
if GrEr=GrOk then { Графический режим удачно открыт}
begin
SetBkColor(Blue);
ClearDevice; {Очистим экран, сделаем фон голубым}
Dx:=(xk -xn)/(kT-1); { Шаг изменения аргумента }
mx:=(xGk-xGn)/(xk-xn); { Масштаб по X }
my:=(yGk-yGn)/(ymax-ymin); { Масштаб по Y }
SetLineStyle(0,0,1); { Одинарная линия }
SetColor(Red); { Оси нарисуем красным }
Line(Round(xgn+(0-xn)*mx),ygn-20,
Round(xgn+(0-xn)*mx),ygk); {Ось Y, на ней X=0}
Line(xgn,Round(ygn+(ymax-0)*my),
xgk+20,Round(ygn+(ymax-y)*my));{Ось X, на ней Y=0}
{Изображение стрелки на конце оси X и надписи X}
MoveTo(xgk+20,Round(ygn+(ymax-y)*my));
LineRel(-8,4);
MoveTo(xgk+20,Round(ygn+(ymax-y)*my));
LineRel(-8,-4);
MoveRel(0,-25);
SetTextStyle(1,0,1); {Шрифт для обозначения осей}
OutText(’X’);
{Рисование стрелки на конце оси Y и надписи Y}
MoveTo(Round(xgn+(0-xn)*mx),ygn-20);
LineRel(-4,8);
MoveTo(Round(xgn+(0-xn)*mx),ygn-20);
LineRel(4,8);
MoveRel(0,-15);
OutText(’Y’);
SetColor(white); { Белый цвет для линии графика }
x:=xn; { Текущее значение для X }
y:=F(x); { Значение функции для этого X }
xG:=Round(xgn+(x-xn)*mx); {Графическая коорд. по X}
yG:=Round(ygn+(ymax-y)*my);{Графическая коорд. по Y}
MoveTo(xg,yg); { Курсор в эту точку экрана }
While x<=xk do {Цикл для всех значений аргумента}
begin
x:=x+dx;
y:=f(x);
xG:=Round(xgn+(x-xn)*mx);
yG:=Round(ygn+(ymax-y)*my);
LineTo(xG,yG);
end;
SetTextStyle(0,0,1); { Шрифт для вывода текста }
OutTextXY(5,5,’График функции Y=Sin(X)’);
OutTextXY(5,20,’Нажмите любую клавишу...’);
Repeat Until KeyPressed
CloseGraph; { Закрываем графический режим }
end
else
begin
WriteLn(’Ошибка графики ’,GrEr,’ ’,GraphErrorMsg(GrEr));
WriteLn(’Нажмите Enter...’);
ReadLn;
end;
End.