ПОБУДОВА ГРАФІКА ФУНКЦІЇ ТА РУХОМОГО ЗОБРАЖЕННЯ НА ЕКРАНІ КОМП’ЮТЕРА

Інформація про навчальний заклад

ВУЗ:
Національний університет Львівська політехніка
Інститут:
Не вказано
Факультет:
Не вказано
Кафедра:
Захист інформації

Інформація про роботу

Рік:
2010
Тип роботи:
Розрахункова робота
Предмет:
Комп'ютерна графіка
Група:
ІБ – 44

Частина тексту файла (без зображень, графіків і формул):

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА” ІКТА кафедра „Захист Інформації” ГРАФІЧНО-РОЗРАХУНКОВА РОБОТА ПОБУДОВА ГРАФІКА ФУНКЦІЇ ТА РУХОМОГО ЗОБРАЖЕННЯ НА ЕКРАНІ КОМП’ЮТЕРА з курсу "КОМП’ЮТЕРНА ГРАФІКА" Львів - 2010 ЗАВДАННЯ 1) Побудувати графік функції, заданої таблично. Масштаб розмітки осей координат графіка повинен відповідати реальним результатам розрахунків. Параметри для побудови графіка визначені в таблиці 2. Варіант завдання визначає викладач. Необхідно передбачити “плаваючий” центр координат – основну частину екрану мають займати ті чверті, в яких знаходиться графік функції. № варіанту Функція f(x) Діапазон зміни аргументу  17 y=ch(x) [0; 20]   Параметри графіку № варіанту Тип лінії для побудови кривої графіка Товщина лінії (пікселів) Колір лінії Шрифт розмітки осей графіка  17  2 Green Gothic   2) Створити на екрані комп’ютера графічне вікно і сформувати в ньому рухоме зображення. Вікно розмістити в верхньому правому куті екрану. Навести межі вікна. Параметри рухомого зображення визначені в таблиці 3. Параметри зображення задані в пікселах. Варіант завдання визначає викладач. Графік і вікно з рухомим зображенням повинні бути присутні на екрані одночасно, причому вікно не має перекривати графік (рис.1).  № варіанту Структура зображення Пояснення   17    Затухаючі перекочування кола зі спицями діаметру d з гіпотенузи одного прямокутного трикутника на гіпотенузу іншого. Катети трикутників рівні і становлять a і b. Параметри : a=150, b=90, d=25   СПИСОК ІДЕНТИФІКАТОРІВ ПРОГРАМИ Підпрограмми та процедури InitGrp – підпрограма для ініціалізації необхідного графічного режиму відео адаптера; GetMinMaxY – підпрограма для визначення максимального та мінімального значення функції на проміжку; GetY – підпрограма для обчислення значення функції в точці; ToX – підпрограма для приведення значень х до значень на дисплеї; ToY – підпрограма для приведення значень у до значень на дисплеї; PaintXY – підпрограма для побудови осей координат та їх підпису; Fon – підпрограма для виводу вікна та трикутників; PaintGraph – підпрограма яка будує графік функції; Solve – підпрограма яка моделює рух кола по поверхні трикутника; GoPlay – підпрограма яка виводить зображення кола, що рухається по поверхнях трикутників; Функції Setfillstyle – підпрограма яка задає тип заливки Bar – підпрограма яка виводить прямокутник; Setcolor – підпрограма для задання кольору фігур; InitGraph – підпрограма для ініціалізації графічного режиму адаптера; Writeln – підпрограма для виведення тексту на екран; Halt- підпрограма для завершення роботи програми з кодом виходу; Round – підпрограма заокруглення дійсного числа; Floodfill – підпрограма заливки області графічного зображення; Delay – підпрограма для вичікування затримки між операціями; Keypressed – підпрограма яка сигналізує про натиск клавіші на клавіатурі; Circle – підпрограма яка виводить на екран коло заданого радіусу; Div – функція ділення націло числа; Блок-схема алгоритму програми  Код програми Uses Graph, CRT; var xmax, ymax, px0, py0: integer; kx, ky, x0, y0:real; const delta:integer = 25; {vidstup vid kray ekrana} ws_delta:integer = 10; {vidstan u vikni} a:integer = 150; {razmir trucutnuka} b:integer = 90; d:integer = 25; cur_x:integer = 11; {razmir cursora} cur_y:integer = 5; cur_p:integer = 8; {rozmir podilku} np_x:integer = 10; {kilkist' tochok na graph} np_y:integer = 7; c_xa:integer = 0; {pochatok tabuluvanna} c_xb:integer = 20; {kinec' tabuluvanna} procedure InitGrp; {iniciluvann9 grafi4nogo regumu ta pobudiva bar. and pol9} var r,d:integer; begin d:=detect; InitGraph(d, r, 'bgi'); r:=GraphResult; if r<>grok then begin Writeln (GraphErrorMsg(r)); readln; Halt(1); end; setfillstyle(1,7); bar(0,0,GetMaxX,GetMaxY); end; function GetY(x:real) : real; {ob4uslue zna4enn9 y v dannoy to4ci} begin GetY:=(exp(x)+exp(-x))/2; end; procedure GetMinMaxY(var min:real; var max:real; ax:real; bx:real); var h,y,x:real; begin h:=(bx-ax)/(GetMaxX-2*delta); min:=1e23; max:=-1e23; x:=ax; while (x<=bx) do begin y:=GetY(x); if(y>max) then max:=y; if(y<min) then min:=y; x:=x+h; end; end; function ToX(x:real):integer; var ret:real; begin ret:=px0 + (x0+x)*kx; ToX:=round(ret); end; function ToY(y:real):integer; var ret:real; begin ret:=py0 + (y0-y)*ky; ToY:=round(ret); end; procedure PaintXY(ax:real; bx:real); var fmin, fmax, gx_min, gx_max, gy_min, gy_max, t:real; x,y,i:integer; s:string[50]; begin {graph x} gx_min:=ax; gx_max:=bx; if(bx<0) then begin gx_max:=0; end else if(ax>0) then gx_min:=0; {graph y} GetMinMaxY(gy_min, gy_max, ax, bx); if(gy_max<0) then begin gy_max:=0; end else if(gy_min>0) then gy_min:=0; {calc kx, ky} if((kx=0) or (ky=0)) then begin kx:=(GetMaxX-2*delta)/(gx_max-gx_min); ky:=(GetMaxY-2*delta)/(gy_max-gy_min); x0:=gx_min; y0:=gy_min; px0:=delta; py0:=GetMaxY-delta; end; {paint oX} SetColor(0); SetLineStyle(0,0,0); SetTextStyle(SmallFont,0,0); y:=ToY(0); Line(px0, y, GetMaxX-delta, y); MoveTo(GetMaxX-delta, y); LineRel(-cur_x,-cur_y); MoveRel(cur_x, cur_y); LineRel(-cur_x, cur_y); t:=(gx_max-gx_min)/np_x; for i:=1 to np_x-1 do begin x:=ToX(gx_min+t*i); MoveTo(x,round(y+cur_p/2)); LineRel(0,-cur_p); str(gx_min+t*i:0:0, s); OutTextXY(x-3, y+cur_p, s); end; OutTextXY(GetMaxX-delta, y+10, 'X'); {paint oY} x:=ToX(0); Line(x, py0, x, delta); MoveTo(x, delta); LineRel(cur_y,cur_x); MoveRel(-cur_y, -cur_x); LineRel(-cur_y, cur_x); t:=(gy_max-gy_min)/np_y; for i:=1 to np_y-1 do begin y:=ToY(gy_min+t*i); MoveTo(round(x-cur_p/2), y); LineRel(cur_p, 0); if(gy_max-gy_min>100) then begin str(gy_min+t*i:0, s); OutTextXY(round(x+cur_p/2), y-3, s); end else begin str(gy_min+t*i:3:1, s); OutTextXY(round(cur_p/2), y-3, s); end; end; OutTextXY(x+10, delta, 'Y'); end; procedure Fon(first:boolean); var cx, cy, ws_x, ws_y:integer; begin {window} setfillstyle(1,15); setcolor(8); SetLineStyle(0,0,0); ws_x:=2*(b+ws_delta); ws_y:=a+ws_delta+d; cx:=round(GetMaxX/2-ws_x/2); bar(cx,0,cx+ws_x,ws_y); MoveTo(cx, 0); LineRel(0, ws_y); LineRel(ws_x,0); LineRel(0,-ws_y); LineRel(-ws_x,0); {tr left} setfillstyle(1,2); MoveTo(cx+ws_delta, ws_y-ws_delta); LineRel(b,0); LineRel(-b,-a); LineRel(0,a); FloodFill(cx+ws_delta+1, ws_y-ws_delta-1, 8); {tria right} MoveTo(cx+ws_x-ws_delta, ws_y-ws_delta); LineRel(-b,0); LineRel(b, -a); LineRel(0, a); FloodFill(cx+ws_x-ws_delta-1, ws_y-ws_delta-1, 8); end; procedure PaintGraph(ax:real; bx:real); var h,x:real; px,py,nx,ny:integer; const dXY:integer = 4; begin PaintXY(ax, bx); SetColor(Green); SetLineStyle(2,0,3); h:=(bx-ax)/(GetMaxX-2*delta); x:=ax; px:=ToX(x); py:=ToY(GetY(x)); MoveTo(px,py); while (x<bx) do begin nx:=ToX(x); ny:=ToY(GetY(x)); if((abs(nx-px)>dXY) or (abs(ny-py)>dXY)) then begin LineTo(nx, ny); px:=nx; py:=ny; end; x:=x+h; end; end; procedure Solve(sx:integer; sy:integer; ymin:real; ymax:real; var x:real; var y:real; var s:real); var dx, dy, xx,yy, alpha:real; const maxd:integer = 5000; mind:integer = 500; begin dx:=b/200; dy:=a/200; while ( ((sy<0) and (y>ymin)) or ((sy>0) and (y<ymax))) do begin setcolor(0); setfillstyle(1,15); circle(round(x),round(y),round(d/2)); floodfill(round(x),round(y),0); setcolor(15); circle(round(x),round(y),round(d/2)); circle(round(x),round(y-1),round(d/2)); x:=x+sx*dx; y:=y+sy*dy; setcolor(8); circle(round(x),round(y),round(d/2)); if(sx>0) then s:=s+sqrt(dx*dx+dy*dy) else s:=s-sqrt(dx*dx+dy*dy); alpha:=8*3*s/d/d+pi/4; xx:=d/2*cos(alpha); yy:=d/2*sin(alpha); Line(round(x-xx),round(y-yy),round(x+xx),round(y+yy)); xx:=d/2*cos(alpha+pi/2); yy:=d/2*sin(alpha+pi/2); Line(round(x-xx),round(y-yy),round(x+xx),round(y+yy)); if(keypressed) then halt(0); delay(round((ymax-y)/(ymax-ymin)*maxd)+mind); end; end; procedure GoPlay; var x,y,ws_x, ws_y, beta, ymin, ymax, s,rr:real; r:integer; begin {Fon;} ws_x:=2*(b+ws_delta); r:=round(d/2); ws_y:=a+ws_delta+d; beta:=pi/2-Arctan(b/a); ymin:=ws_y-a-ws_delta; ymax:=147; x:=GetMaxX/2+ws_x/2-ws_delta-16; y:=ymin; s:=0; Fon(true); rr:=(ymax-ymin+1)/9; while (ymax-ymin>2) do begin Solve(-1,1,ymin, ymax, x,y,s); ymin:=ymin+rr; Solve(-1,-1,ymin, ymax, x,y,s); Solve(1,1,ymin,ymax,x,y,s); ymin:=ymin+rr;{(ymax-ymin)/5; } Solve(1,-1,ymin,ymax,x,y,s); end; end; begin InitGrp; PaintGraph(c_xa, c_xb); GoPlay; ReadLn; end. Висновок : Виконавши дану графічну-розрахункову роботу я покращив свої навики в розробці рухомих зображень в середовищі Турбо Паскаль.
Антиботан аватар за замовчуванням

01.01.1970 03:01-

Коментарі

Ви не можете залишити коментар. Для цього, будь ласка, увійдіть або зареєструйтесь.

Ділись своїми роботами та отримуй миттєві бонуси!

Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!
Нічого не вибрано
0%

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!