p align="left">Розглянемо більш детально даний модуль: Перш за все, в ньому оголошено глобальні зміні, які відповідатимуть за координати точки в просторі, на екрані: type vector=array[1..3] of Real; projection=array[1..2] of vector; type Toch2d=record x,y:integer; end; type Toch3d=record x,y,z:real; end; var abs_x_center, abs_y_center: Integer; DriverP: Pointer; Даний модуль містить ряд функцій, а саме, функції Procedure open_graph та Procedure close_graph відповідають за ініціалізацію та вихід із графічного режиму. Процедура Procedure out_text_XY(ss: String; x,y:integer; color: Word) відповідає за відображення текстового рядка заданим кольором за відповідними координатами. Процедура Procedure put_picxel(d2:Toch2d; color: Word) за координатами точки у двохвимірному просторі за заданим кольором відображає її на екран. Процедура Procedure norm_line(d2_0,d2_1:Toch2d; color:word) за координатами 2 точок у двохвимірному просторі за заданим кольором будує на екран лінію. Дані процедури побудовані на основі стандартних функцій. Відповідно до формул 1.33 та 1.34 вибору проекцій відображення побудовані матриці перетворення в ізометричній, диметричній та ортогональній проекції. Дані матриці необхідні для переходу від 3d до 2d координат: Procedure computer_isometric_matrix(var P:projection); Begin P[1,1]:=-1.0/Sqrt(2.0); P[1,2]:=-P[1,1]; P[1,3]:=0.0; P[2,1]:=-1.0/Sqrt(6.0); P[2,2]:=P[2,1]; P[2,3]:=-2.0*P[2,1]; End; Procedure computer_dimetric_matrix(alpha: Real; var P: projection); Var t: Real; Begin alpha:=pi*alpha/180.0; P[1,1]:=-1.0/Sqrt(2.0); P[1,2]:=-P[1,1]; P[1,3]:=0.0; t:=Sin(alpha)/cos(alpha); P[2,1]:=t*P[1,1]; P[2,2]:=P[2,1]; P[2,3]:=Sqrt(1.0-Sqr(t)); End; Procedure computer_oblique_matrix(alpha: Real; var P: projection); Begin alpha:=pi*alpha/180.0; P[1,1]:=-Sin(alpha); P[1,2]:=1.0; P[1,3]:=0.0; P[2,1]:=-Cos(alpha); P[2,2]:=0.0; P[2,3]:=1.0; End; Процедура повороту точки відносно початку координат побудована у відповідності до формул 1.12 - 1.22 і має вигляд: Procedure povorot(var mas:Toch3d; kx,ky,kz:real); var tx,ty,tz,y,x,z:real; Begin tx:=mas.x; ty:=mas.y*cos(kx*pi/180)+mas.z*sin(kx*pi/180); tz:=mas.y*(-sin(kx*pi/180))+mas.z*cos(kx*pi/180); y:=ty; x:=tx*cos(ky*pi/180)+tz*(-sin(ky*pi/180)); z:=tx*sin(ky*pi/180)+tz*cos(ky*pi/180); mas.z:=z; mas.x:=x*cos(kz*pi/180)+y*sin(kz*pi/180); mas.y:=-x*sin(kz*pi/180)+y*cos(kz*pi/180); End; У відповідності до формули 1.25 побудована процедура руху точки: Procedure rux(var mas:Toch3d; dx,dy,dz:real); Begin mas.x:=mas.x+dx; mas.y:=mas.y+dy; mas.z:=mas.z+dz; End; У відповідності до формули 1.27 побудована процедура масштабування: Procedure mach(var mas:Toch3d; mx,my,mz:real); Begin mas.x:=mas.x*mx; mas.y:=mas.y*my; mas.z:=mas.z*mz; End; Для переходу з трьохмірої моделі до двомірної використовується процедура project(const P:projection; const d3:Toch3d; const c:Toch2d; var d2:Toch2d), що за заданими координатами 3d точки та вибраною матрицею проекції проводить перевід у двовимірні координати монітору: Procedure project(const P:projection; const d3:Toch3d; const c:Toch2d; var d2:Toch2d); Begin d2.x:=c.x+Round(P[1,1]*d3.x+P[1,2]*d3.y+P[1,3]*d3.z); d2.y:=c.y+Round(P[2,1]*d3.x+P[2,2]*d3.y+P[2,3]*d3.z); End; Даного модуля в принципі достатньо для реалізації побудови 3d об'єктів, анімації. Адже більшість операцій відбувається саме із вершинами об'єкта, а даний модуль саме їх і описує. 2.2 Відображення об'ємних фігур в різних проекціях Для розуміння вигляду фігур у різних проекціях побудовано каркас тетраедра із виведенням його у диметричній, ізометричній та ортогональній проекціях. Тетраедр задається чотирма своїми вершинами і почергово виводиться на екран. Всі вершини зображення тетраедра з'єднуються лініями. Щоб вивести зображення тетраедра в заданій проекції, необхідно обрахувати значення екранних координат і провести відрізки прямих. Зображення тетраедра виводиться в ізометричній, косокутній і диметричній проекціях, причому спочатку виводиться статичне зображення, а вже потім воно перемальовується в циклі по куту проектування: d3:array[1..4] of Toch3d; c:Toch2d; d2:array[1..4] of Toch2d; xstep,ystep,theta: Real; i,j,xold,yold,xnew,ynew: Integer; p:projection; … abs_x_center:= 0; abs_y_center:= 0; d3[1].x:=0;d3[1].y:=0;d3[1].z:=0; d3[2].x:=0;d3[2].y:=0;d3[2].z:=50; d3[3].x:=0;d3[3].y:=50;d3[3].z:=0; d3[4].x:=50;d3[4].y:=0;d3[4].z:=0; …. out_text_XY('Oblique Projection', -150, 150, Yellow); draw_tetra; Readln; theta:=45; repeat computer_oblique_matrix(theta, P); ClearViewPort; draw_tetra; theta:=theta+1; until KeyPressed; Дана програма дає можливість візуально побачити різницю між різними проекціями і вибрати оптимальну для користувача. 2.3 Побудова поверхонь Для побудови поверхні була використана формула 1.38 і показана можливість її виведення 2 способами, стандартними засобами та із використанням сторінки відеопам'яті. function f(x,y: Real): Real; begin f:=20*Sin(t*Sqrt(x*x+y*y)); end; procedure anim(tt: Byte); begin ux:=Abs(b-a)/(nx-1); uy:=Abs(d-c)/(ny-1); d3.x:=a; d3.y:=c; d3.z:=f(d3.x,d3.y); project(P,d3,cc,d2[1,1]); d2[1,1].x:=d2[1,1].x+GetMaxX div 2; d2[1,1].y:=GetMaxy div 2 - d2[1,1].y; xmin:=d2[1,1].x; xmax:=xmin; ymin:=d2[1,1].y; ymax:=ymin; for i:=1 to nx do begin d3.y:=c; for j:=1 to ny do begin d3.z:=f(d3.x,d3.y); project(P,d3,cc,d2[i,j]); d2[i,j].x:=d2[i,j].x+GetMaxX div 2; d2[i,j].y:=GetMaxY div 2 - d2[i,j].y; if xmin>d2[i,j].x then xmin:=d2[i,j].x else if xmax<d2[i,j].x then xmax:=d2[i,j].y; if ymin>d2[i,j].y then ymin:=d2[i,j].y else if ymax<d2[i,j].y then ymax:=d2[i,j].y; d3.y:=d3.y+uy; end; d3.x:=d3.x+ux; end; SetColor(tt); for i:=1 to nx do begin MoveTo(d2[i,1].x,d2[i,1].y); for j:=2 to ny do LineTo(d2[i,j].x,d2[i,j].y); end; for j:=1 to ny do begin MoveTo(d2[1,j].x,d2[1,j].y); for j:=1 to nx do LineTo(d2[i,j].y,d2[i,j].x); end; end; Begin open_graph; t:= 0; theta:= 20; repeat computer_dimetric_matrix(theta, P); anim(12); anim(0); t:=t+0.0001; delay(10000); until KeyPressed; Відмінність у побудові поверхні із використанням відеопам'яті полягає в тому, що немає необхідності перемальовувати зображення щоразу, а просто зміннюючи відеосторінку, очищаємо її на активній малюємо малюнок і робимо її видимою: SetGraphMode(VGAMed); k:=1; t:= 0; theta:= 20; repeat computer_dimetric_matrix(theta, P); k:=1-k; SetActivePage(k); ClearDevice; anim(12); SetActivePage(k); t:=t+0.001; until Keypressed; 2.4 Відсікання невидимих ліній, використання модуля Graph3d Нижче, у відповідності до формул 1.35 - 1.37 реалізовано алгоритм відсікання невидимих частин алгоритмом сортування граней. Для цього використали побудову тетраедра. Перш ніж вивести на екран грань проводимо обрахунок чи є вона видима чи ні, і в залежності від результату проводимо прорисовку. procedure draw_poly(j, color: Word); var vertex: array[1..3] of PointType; i,k:Word; begin i:=1; k:=1; repeat if i<>j then begin project(P,d3[i], c, d2[k]); inc(k); end; Inc(i); until k=4; SetFillStyle(SolidFill, color); FillPoly(3, d2); end; Для повного відображення можливостей модуля Graph3d було реалізовано ряд програм, зокрема: Surf3.pas - відображення рухомої поверхні подібної до розходження хвиль від джерела удару; Solar.pas - імітація руху планет навколо сонця, використовує диметричну проекцію та працює з використанням відеосторінок; MY_3D.pas - забезпечує реалізацію основних елементів перетворення у просторі а саме, клавіші відповідають: - PgUp - поворот точок за годинниковою стрілкою навколо осі Z; - PgDn - поворот точок проти годинникової стрілки навколо осі Z; - Home- поворот точок за годинниковою стрілкою навколо осі X; - End - поворот точок проти годинникової стрілки навколо осі X; - Insert- поворот точок за годинниковою стрілкою навколо осі Y; - Delete - поворот точок проти годинникової стрілки навколо осі Y; - "Q" - рух по осі Z в додатному напрямку; - "E" - рух по осі Z в протилежному напрямку; - "W" - рух по осі Y в додатному напрямку; - "S" - рух по осі Y в протилежному напрямку; - "A" - рух по осі X в додатному напрямку; - "D" - рух по осі X в протилежному напрямку; - "+" - збільшити масштаб; - "-" - зменшити масштаб. Дана програма використовує диметричну проекцію побудови зображень та не використовує роботи з відеопам'яттю. ВИСНОВКИ Проаналізувавши проблему використання комп'ютерної графіки, зокрема об'ємних фігур, ролі анімації та методів її відображення і у відповідності до мети курсової роботи було виконано наступне: 1. проведено детальний аналіз літератури та Інтернет-джерел за темою "Тривимірна графіка. Анімація"; 2. виокремлення основних понять, формул і методів роботи із об'єктами у тривимірному просторі;3. проведено детальний аналіз розділу математики "Вектори, матриці", де було виокремлено основні поняття по роботі з векторами, матрицями, які спрощують розуміння учнями основних подій в 3d просторі; 4. практично реалізовано основні алгоритми роботи по діям над точкою в просторі: - рух; - поворот; - масштабування; 5. сформовано лекційний теоретичний матеріали. Результатом роботи є лекційний курс по програмування тримірної графіки та методика відображення анімаційних проектів з допомогою стандартних засобів мови програмування Pascal, без використання сторонніх бібліотек. Даний лекційний курс побудований лише на математичних функціях і їх використанні на мові програмування. Він охоплює такі області як векторна, матрична математика. Даний курс доповнений реалізованими прикладами, що дають практичне уявлення про застосування математичних моделей у програмуванні, вчать аналітично реалізовувати поставленні завдання, покладаючись на різноманітні алгоритми та методи. Кінцевий продукт має практичну цінність у застосуванні при роботі із поєднання програмування із математикою, даючи наглядне розуміння взаємодії і використання математичних методів та фунцій, їх застосування на практиці. СПИСОК ВИКОРИСТАНИХ ДЖЕРЕЛ 1. Turbo Pascal - Издательская група К.: ВНV, 2000. - 320 с. 2. Абрамов В. Г. Введение в язык Pascal: Учебное пособие для студентов вузов по специальности Прикладная математика. - М.: Наука, 1988. - 158 с. 3. Абрамов С. А. Начала программирования на языке Pascal. - М.: Наука, 1987. - 126 с. 4. Аммерал А. Машинная графика на языке С, в 4-х томах, изд-во Сол. Систем, - 1992. - 230 с. 5. Власик А.П. Практикум з програмування в середовищі Turbo Pascal. - Рівне. - НУВГ,- 53 с. 6. Вэн-Дэм. А. Основы интерактивной машинной графики, т.1-2, М. Мир, 1985. - 257 с. 7. Гилой. Интерактивная машинная графика. - М., Мир, -1981. - 210 с. 8. Грайс. Графические средства персональных компьютеров. - М., - Мир, 1980. - 142 с. 9. Грис Д. Наука программирования. M.: Мир, 1984. - 230 с. 10. Джонс Ж., Харроу К. Решение задач в системе Турбо Паскаль. М, 1991. - 709 с. 11. Жикин А.Е. Компьютерная графика. Динамика, реалистические ихображения, М., Диалог-МИФИ, - 1995 - 324 с. 12. Зуев Е. А. Язык программирования Турбо Паскаль 6.0, 7.0. - М.: Радио и связь, 1993. - 150 с. 13. Ковалюк Т.В. Основи програмування. Київ: Видавнича група ВНV, 2005. - 385 с. 14. Культин Н. Б. Программирование в TurboPascal 7.0 и Delphi. - Санкт- петербург,1999. - 120 с. 15. Майкл Ласло. Вычислительная геометрия и компьютерная графика на С++. Москва - Бином, 1997. - 440 с. 16. Марченко А.И., Марченко Л.А. Программирование в среде Turbo Pascal 7.0. К.: ВЕК, - 2000. - 441 с. 17. Немнюгин С.А. Turbo Pascal Практикум. 2-е издание. - С-Пб., - Питер- 2003, - 267 с. 18. Перминов О. Н. Программирование на языке Паскаль. - М.: Радио и связь, - 1988. - 97 с. 19. Перминов О. Н. Язык программирования Pascal. - М.: Радио и связь,- 1989. - 205 с. 20. Препарата Ф. Вычислительная геометрия: Введение, М. Мир, 1989. ч.1.- Рівне: НУВГП, 2005. - 179 с. 21. Роджерс, Адамс, Математические основы машинной графики, - М.? Машиностроение, - 1985.- 102 c. 22. Роджерс С.А. алгоритмические основы машинной графики. М. Мир, 1989. - 235 с. 23. Тихомиров Ю. Программирование трехмерной графики, С.-Пб.: БХВ_Санкт-Петербург,1999. - 350 с. 24. Томпсон Н. Секреты программирования трехмерной графики для Windows 95. Перев с англ. - СПб: Питер, - 1997. - 352 с. 25. Фокс А. Вычислительная геометрия, М., Мир, - 1982. - 421 с. 26. Хонич А. Как самому создать трехмерную игру. М.:МИКРОАРТ, 1996. - 220 с.
Страницы: 1, 2, 3
|