Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Turbo Pascal / Методические указание / Графики и троектории.DOC
Скачиваний:
46
Добавлен:
15.06.2014
Размер:
225.79 Кб
Скачать

3 Методика построения набора графиков

Доработать методику для совместного построения нескольких графиков несложно. Необходимо для всех функций определить дискретные координаты X,Yи найти наибольшее и наименьшее значения для всех функций в заданных диапазонах изменения аргументов. Затем определить область для построения графика и наборы координат точек кривых. Кривые для разных функций желательно рисовать разным цветом с указанием вида функции.

Пример файла (g_mn.pas), содержащего процедуру вывода не более четырех графиков:

type arr=array[1..4,1..200] of real; { массивы координат }

ari=array[1..4,1..200] of integer; { для графиков }

{ процедура построения набора m графиков по массивам

X,Y[1..m, 1..n]декартовых координат ( поnточкам )

в области экрана left,right,up,downбез искажения форм кривых }

procedure G_MN( X,Y: arr;

m,n, left,up,right,down: integer);

var

Xg,Yg: ari; Xg0,Yg0, i,k : integer;

kX,kY, Ymin,Ymax,Xmin,Xmax: real;

{ при нахождении экстремумов вначале присваиваем им любые значения из рассматриваемых }

begin Xmin:=X[1,1]; Xmax:=X[1,1];

Ymin:=Y[1,1]; Ymax:=Y[1,1];

for k:=1 to m do { перебор графиков }

for i:=2 to n do begin

if Ymin>Y[k,i] then Ymin:=Y[k,i];

if Ymax<Y[k,i] then Ymax:=Y[k,i];

if Xmin>X[k,i] then Xmin:=X[k,i];

if Xmax<X[k,i] then Xmax:=X[k,i] end;

{ коэффициенты масштабирования по горизонтали и вертикали }

kX:=(right-left)/(Xmax-Xmin);

kY:=( down- up )/(Ymax-Ymin);

{ пересчет коэффициентов масштабирования правой или нижней

границы области вывода для получения неискаженной формы кривых }

if kX<kY then begin kY:=kX;

down:= up +round( (Ymax-Ymin)*kY) end

else begin kX:=kY;

right:=left+round( (Xmax-Xmin)*kX) end;

for k:=1 to m do { точки графиков в системе координат экрана }

for i:=1 to n do begin

Xg[k,i]:=left +round(kX*(X[k,i] -Xmin));

Yg[k,i]:=down -round(kY*(Y[k,i] -Ymin)) end;

setcolor( 7);

Rectangle(left,up,right,down); { выделение области графика }

setcolor(14);

{ выводим ось ординат, если она расположена в области графика }

if Xmin*Xmax<=0 then begin

Xg0:=left-round(Xmin*kX);

line( Xg0,up, Xg0,down);

OuttextXY( Xg0+3,up+5,'ось Y') end;

{ выводим ось абсцисс, если она расположена в области графика }

if Ymin*Ymax<=0 then begin

Yg0:=down+round(Ymin*kY);

line( left,Yg0, right,Yg0);

OuttextXY( right-40,Yg0+6,'ось X') end;

for k:=1 to m do begin

setcolor(8+k); { перебор графиков и назначение цветов }

moveto( Xg[k,1],Yg[k,1]); { вывод очередного графика }

for i:=2 to n do lineto( Xg[k,i],Yg[k,i]) end end;

Пример программы построения графиков двух функций в одной

области экрана:

uses Crt,Graph;

{$I g_mn.pas} { подключение файла с подпрограммой

вывода набора графиков }

{ определение функций, графики которых будут строиться }

function F1(x: real): real; begin F1:=ln(1+x) end;

function F2(x: real): real;

begin F2:=x-x*x/2+x*x*x/3-x*x*x*x/4 end;

var x,y: arr; { тип-массив определен в файлеg_mn.pas}

n,i, Gd,Gm: integer; a,b,dx: real;

begin n:=200; { число точек каждого графика }

a:=-0.8; b:=2; { диапазон изменения параметра }

dx:=(b-a)/(n-1); { шаг изменения параметра }

{ расчет массивов координат для функций }

for i:=1 to n do begin

x[1,i]:=a+(i-1)*dx; y[1,i]:=F1( x[1,i]);

x[2,i]:=x[1,i]; y[2,i]:=F2( x[2,i]) end;

Gd:=0; Initgraph(Gd,Gm,'c:\tp7\bgi');

{ вызов подпрограммы построения набора графиков }

G_MN( x,y, 2,n, 10,10,GetmaxX,GetmaxY);

ReadKey; CloseGraph end.