Кодинг
★ Рубрика: Кодинг
★ Тема: Pascal

Построение графика

Задача. Написать программу построения графика заданной функции 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 }
Максимальное и минимальное значения функции (хотя бы приблизительные, лучше с запасом в большую сторону) должны быть заданы пользователем. Для перехода к графическим координатам получим следующие соотношения:
xG:=Round(xGn+(x-xn)*mx);
yG:=Round(yGn+(ymax-y)*my);
Для построения графика воспользуемся процедурой 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.
 Похожие публикации: Pascal

Войти и комментировать [ Вход | Регистрация ]