Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Pascal.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
3.44 Mб
Скачать

3 Побудова і масштабування графіків

Візьмемо просту тригонометричну функцію, для прикладу, Y=SIN(X). Для побудови її графіка потрібно взяти діапазон Х (в даному випадку доцільно взяти [0; 2π], оскільки функція SIN періодична з періодом Т=2π). Далі в циклі перебираємо значення з заданого діапазону і підставляємо їх у формулу. Таким чином ми отримали пари значень Х та Y, що достатньо для побудови графіка (слід пам’ятати що на відміну від звичної математичної декартової системи координат на екрані монітора координату Y відраховують зверху вниз). Можна будувати графік, але в більшості випадків зображення всього графіка буде замале, або завелике порівняно з розмірами графічного екрану, для вирішення цього питання використовують різні методи масштабування графіків.

Наведеній нижче метод зручний у користуванні, легкий для розуміння і дуже ефективний, тому що дає можливість задати будь-які межі в яких буде зображено графік. Для використання цього методу потрібно знати максимальне та мінімальне значення Х та Y відповідно. Задаємо дві формули, які з існуючих значень Х та Y знайдуть значення потрібні для виводу на екран:

,

де X, Y – відомі координати, , – відмасштабовані координати, L та H – відповідно ширина та висота графічного екрану в пікселах.

При роботі з тригонометричними функціями слід пам’ятати, що у системі Turbo Pascal кути для тригонометричних функцій задаються в радіанах. При виникненні проблем зі степеневими функціями можна зробити заміну:

.

Приклад 1:

Програма, представлена для прикладу, є майже універсальним засобом для побудови графіків математичних функцій, заданих лінійно. В програмі можна задати будь-яку математичну формулу, діапазон значень Х для неї і вона побудує графік автоматично, виконавши для нього процедуру масштабування та центрування. Декартові осі та ще кілька допоміжних символів також будуються автоматично.

program grapher; {програма виводу графічної інформації}

uses

crt,graph; {завантаження робочих модулів}

var

nmenu:array[1..9] of string[80];{масив для створення панелей меню}

i,menubar,menupointer,gd,gm:integer;{робочі змінні, gm,gd – для

роботи з графікою}

y,x,ymax,ymin,xmax,xmin:real; {змінні для побудови графіків}

key:char;

dkey:string[2];{key,dkey - для зчитування з клавіатури}

procedure begining;

{процедура заповнення змінних на початку програми}

begin

nmenu[1]:='Графiк: Y=|X|-COS(2*X) на промiжку [-π; π]';

nmenu[2]:='Графiк: Y=X^3*(1-X^2)^2 на промiжку [-1,35;1,35]';

nmenu[3]:='Графiк: Y=SIN(1+SIN(X))^2 на промiжку [0;2π]';

nmenu[4]:='Графiк: Y=X*SIN(3*X) на промiжку [-π; π]';

nmenu[5]:='Графiк: Y=X*SIN(4*X)/4 на промiжку [0; π]';

nmenu[6]:='Графiк: Y=X^3/(1+X^4) на промiжку [-10;10]';

nmenu[7]:='Графiк: Y=SIN(X)+SIN(2*X)+SIN(3*X) на промiжку

[0;2 π]';

nmenu[8]:='Графiк: Y=LN(|X|) на проміжку [-7;7]; X<>0';

nmenu[9]:='Вихiд';

menubar:=9; {визначення кількості пунктів в меню}

menupointer:=1; {встановлення вказівника на перший рядок меню}

end;

function gety:real;

{функцiя - повертае значення Y, розраховане за заданою формулою}

begin

case menupointer of{формула обирається в залежності від }

1:gety:=abs(x)-cos(2*x);{положення вказівника меню,

menupointer}

2:gety:=x*x*x*(1-x*x)*(1-x*x);

3:gety:=sin(1-sin(x))*sin(1-sin(x));

4:gety:=x*sin(3*x);

5:gety:=x*sin(4*x)/4;

6:gety:=x*x*x/(1+x*x*x*x);

7:gety:=sin(x)+sin(2*x)+sin(3*x);

8:if x<>0 then gety:=ln(abs(x));

end;

end;

procedure graphik2x;

{процедура побудови графiка}

begin

gd:=detect;initgraph(gd,gm,'');{інiцiалiзацiя графіки}

setcolor(15);

case menupointer of {границі побудови обираються в залежностi вiд}

1:begin xmin:=-3.14;xmax:=3.14;end;{положення вказівника

меню-мenupointer}

2:begin xmin:=-1.35;xmax:=1.35;end;

3:begin xmin:=0;xmax:=6.28;end;

4:begin xmin:=-3.14;xmax:=3.14;end;

5:begin xmin:=0;xmax:=3.14;end;

6:begin xmin:=-10;xmax:=10;end;

7:begin xmin:=0;xmax:=6.28;end;

8:begin xmin:=-7;xmax:=7;end;

end;

ymax:=-1000;ymin:=1000;{визначення найбiльшого й найменшого

значень Y}

for i:=round(xmin*1000) to round(xmax*1000) do

begin

x:=0.001*i;y:=gety;

if y>ymax then ymax:=y;

if y<ymin then ymin:=y;

end;

{за допомогою ymin,ymax,xmin,xmax обирається потрiбний коефiцiєнт}

{маштабування, щоб графiк займав призначене йому на екранi мiсце}

{ширина - 600, висота - 440, згiдно з цим коефiцiєнтом будуються осi,}

{та деякi допоміжнi символи.}

line(20+round((-xmin)/(xmax-xmin)*600),0,20+round

((-xmin)/(xmax-xmin)*600),469);

line(0,460-round((-ymin)/(ymax-ymin)*440),639,460-round

((-ymin)/(ymax-ymin)*440));

settextstyle(defaultfont,horizdir,usercharsize);

outtextxy(0,472,nmenu[menupointer]);

outtextxy(20+round((-xmin)/(xmax-xmin)*600)-10,460-round

((-ymin)/(ymax-ymin)*440)+5,'0');

outtextxy(632,460-round((-ymin)/(ymax-ymin)*440)-3,'>');

outtextxy(632,460-round((-ymin)/(ymax-ymin)*440)-13,'X');

outtextxy(20+round((-xmin)/(xmax-xmin)*600)+6,0,'Y');

settextstyle(defaultfont,vertdir,usercharsize);

outtextxy(20+round((-xmin)/(xmax-xmin)*600)+5,0,'>');

for i:=-10 to 10 do

begin

if(-11<xmin)and(11>xmax)then

outtextxy(20+round((i-xmin)/(xmax-xmin)*600)

+5,460-round((-ymin)/(ymax-ymin)*440)-4,#4);

if(-11<ymin)and(11>ymax)then

outtextxy(20+round((-xmin)/(xmax-xmin)*600)

+5,460-round((i-ymin)/(ymax-ymin)*440)-4,#4);

end;

{Побудова графiка}

for i:=round(xmin*1000) to round(xmax*1000) do

begin

x:=0.001*i;y:=gety;

x:=(x-xmin)/(xmax-xmin)*600;

y:=(y-ymin)/(ymax-ymin)*440;

putpixel(20+round(x),460-round(y),12);

end;

repeat until keypressed; closegraph;{Затримка(очiкує вводу з

клавiатури)}

end;

procedure menu;

{Процедура створення світлового меню}

begin

repeat

textcolor(white);clrscr;

repeat

for i:=1 to menubar do

begin

if i=menupointer then textbackground(red)

else textbackground(black);

gotoxy(1,i);write(nmenu[i]);

end;

for i:=1 to 2 do {зчитування з клавіатури натисненням

на клавіші}

begin

key:=readkey;

dkey:=dkey+key;

{dkey - потрiбен для зчитування спец-символiв довжиною 2 байти}

if dkey<>#0 then i:=2;

end;

if(dkey=#0+'H')and(menupointer>1)then

menupointer:=menupointer-1;

if(dkey=#0+'P')and(menupointer<menubar)then

menupointer:=menupointer+1;

dkey:='';

until key=#13;{Закiнчення циклу в зв'язку з реакцiєю на

клавiшу "Enter"}

if menupointer=menubar then halt

else graphik2x;{halt - закiнчення програми}

until false;{За умовою нескiнченний цикл}

end;

{Основна програма}

begin

begining;

menu;

end.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]