- проводити масштабування точок відносно початку координат;
- рухати точку у довільному напрямку.
Розглянемо більш детально даний модуль:
Перш за все, в ньому оголошено глобальні зміні, які відповідатимуть за координати точки в просторі, на екрані:
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 с.