При выводе на экран графических изображений используется графическая система координат. Графические координаты задают положение каждого пиксела, отображаемого на экране. В отличие от обычной (декартовой) системы координат, графические координаты принимают только целочисленные значения. Диапазон изменения графических координат ограничен снизу нулём, а сверху разрешением экрана по горизонтали и вертикали. Максимальное значение x- и y -координат можно получить, используя функции GetMaxX и GetMaxY. Графическая координата y отсчитывается сверху вниз.
Геометрические декартовы координаты точки (x,y) для её изображения на экране необходимо пересчитать в графические (xg,yg) по формулам:
;
,
где x0, y0 – смещение изображения на экране от левого края и сверху; yG – разрешение экрана по вертикали; dx и dy – размер собственно изображения по горизонтали и вертикали соответственно; xmin, ymin, xmax, ymax– минимальные и максимальные значения аргумента x и значения функции y в диапазоне построения графика; ëaû – целая часть числа a.
Таким образом, для построения графика функции необходимо:
- получить таблицу значений функции y = f(x) в диапазоне изменения x от xнач до xкон;
- найти минимальные и максимальные значения аргумента x и значения функции y в диапазоне построения графика;
- пересчитать действительные значения x и y в графические xgи yg;
- нарисовать на экране область построения графика и оси координат;
- отправить графический указатель (перо) в начало координат;
- задать цвет и стиль линий;
- последовательно соединить линиями (или отметить маркерами) точки графика.
При построении нескольких графиков на одном координатном поле необходимо определить максимальные и минимальные значения x и y для всех графиков.
Рассмотрим пример использования графического режима для построения графика функции y = sin x. В примере используется 3 подпрограммы-функции f, xe и уe, причём xe и уe вызываются без параметров:
Program Prg_graf;
Uses Crt, Graph;
Var
xn, xk, x, y, Ymin, Ymax, dx:real;
MX, MY,i, n: word;
Gd, Gm: integer;
Function f(xf:real):real; { Расчет значений функции }
begin
f:=sin(xf); { Здесь приводим выражение для вычисления }
{или f:=exp(-0.5*xf*xf);} { значения Вашей функции }
end;
Function Xe:word; {Расчет позиции на экране для X}
begin
Xe:=10+Round((MX-20)*(x-xn)/(xk-xn));
end;
Function Ye:word; { Расчет позиции на экране для Y }
begin { На экране отсчет идет сверху-вниз, }
{ на обычном графике – наоборот }
Ye:=MY-10-Round((MY-20)*(f(x)-Ymin)/(Ymax-Ymin));
end;
Begin { Начало основной программы }
xn:=-5; xk:=5; n:=250; { Исходные данные } { Или при вводе исходных данных с клавиатуры:
Write(' x начальное = '); Readln(xn);
Write(' x конечное = '); Readln(xk);
Write(' количество точек графика = '); Readln(n);
}
dx:=(xk-xn)/(n-1); { Интервал между точками на оси Х }
{ Нахождение минимума и максимума функции }
x:=xn; Ymin:=f(xn); Ymax:=f(xn);
for i:=2 to n do
begin
x:=x+dx;
if f(x)<Ymin then Ymin:=f(x);
if f(x)>Ymax then Ymax:=f(x);
end;
Gd:=Detect;
InitGraph(Gd,Gm,''); { Не забудьте скопировать egavga.bgi }