Автор: Пользователь скрыл имя, 27 Мая 2013 в 13:46, лабораторная работа
Мета: Навчитися реалізовувати методи перетворень та проекції зображень з використанням графічних можливостей програмного середовища Turbo C++ 3.0.
Завдання: На мові Turbo Pascal 7.0 скласти програму, що реалізує певні елементарні графічні перетворення та проекції зображень.
Висновок: В результаті виконання лабораторної роботи ми опанували основи роботи в середовищі Turbo C++ 3.0, навчилися масштабу вати графічні об’єкти з допомого теорії афінних перетворень.
Міністерство освіти і науки України
Вінницький національний технічний університет
Інститут автоматики, електроніки та комп’ютерних систем управління
Факультет комп’ютерних систем управління
Кафедра КСУ
Лабораторна робота №4
Виконали: ст.гр. 4СІ-07
.
Перевірив: викладач
Вінниця ВНТУ 2010
Мета: Навчитися реалізовувати методи перетворень та проекції зображень з використанням графічних можливостей програмного середовища Turbo C++ 3.0.
Завдання: На мові Turbo Pascal 7.0 скласти програму, що реалізує певні елементарні графічні перетворення та проекції зображень.
Програма має відповідати вказаним нижче вимогам:
Варіант |
Завдання |
1 |
Реалізувати масштабування розмірів фігури у вертикальному та горизонтальному напрямках. В якості фігури задано паралелепіпед. Масштабування має здійснюватись на певну величину (яка задається викладачем) при натисканні відповідних клавіш із стрілками. |
2 |
Реалізувати масштабування розмірів фігури у вертикальному та горизонтальному напрямках. В якості фігури задано піраміду. Масштабування має здійснюватись на певну величину (яка задаєтся викладачем) при натисканні відповідних клавіш із стрілками. |
3 |
Реалізувати обертання фігури у горизонтальній площині. В якості фігури задано паралелепіпед. Обертання здійснювати відносно осі, яка лежить в площині, що паралельна граням і проходить через центр фігури. |
4 |
Реалізувати обертання фігури у вертикальній площині. В якості фігури задано паралелепіпед. Обертання здійснювати навколо осі, яка проходить через одне з ребер. |
5 |
Реалізувати обертання правильної піраміди навколо осі, яка проходить через одне з її бокових ребер. Кількість бокових граней дорівнює трьом. |
6 |
Задано зображення кубу у центральній проекції з фіксованим центром проекції. Реалізувати відображення фігури з використанням цієї ж проекції в різних позиціях. Перехід між позиціями має здійснюватись при натисканні відповідних клавіш із стрілками. |
7 |
Реалізувати перехід між зображенням кубу у ортогональній проекції та зображенням кубу у центральній проекції. Центр проектування має задаватися точкою з довільними координатами за допомогою вказівника миші. |
Лістинг програми:
#include <conio.h>
#include <stdio.h>
#include <graphics.h>
#include <stdlib.h>
#include <math.h>
struct C3D
{
int x;
int y;
int z;
};
void figura(C3D, C3D, C3D, float, float);
void main()
{
int gdriver = DETECT, gmode, errorcode;
initgraph(&gdriver, &gmode, "");
errorcode = graphresult();
if (errorcode != grOk)
{
printf("Graphics error: %s\n", grapherrormsg(errorcode));
printf("Press any key to halt:");
getch();
exit(1);
}
setbkcolor(15);
C3D a, b, c;
a.x = 50; a.y = 100; a.z = 50;
b.x = 0; b.y = a.y; b.z = 0;
c.x = a.x; c.y = 0; c.z = a.z;
int press = 0;
float kH = 1, kV = 1;
while(press != 27)
{
cleardevice();
figura(a,b,c,kH,kV);
press = getch();
switch(press)
{
case 77: kH = kH + 0.1;
break;
case 75: kH = kH - 0.1;
break;
case 72: kV = kV + 0.1;
break;
case 80: kV = kV - 0.1;
break;
}
}
cleardevice();
outtextxy(getmaxx()/2 - 75, 100, "Laboratoena robota #5");
outtextxy(getmaxx()/2 - 75, 120, "Vykonaly:");
outtextxy(getmaxx()/2 - 75, 140, "Ra");
outtextxy(getmaxx()/2 - 75, 160, "Sk");
outtextxy(getmaxx()/2 - 75, 180, "Bi");
getch();
closegraph();
}
void figura(C3D a, C3D b, C3D c, float kH, float kV)
{
int w = (a.y - c.y) * kH;
int h = (b.z - a.z) * kV;
int k = (a.x - b.x) * kH;
a.y = b.y = c.y + w;
a.z = c.z = b.z + h;
a.x = c.x = b.x + k;
C3D d, f, g;
d.x = a.x; d.y = a.y; d.z = b.z;
f.x = b.x; f.y = b.y; f.z = a.z;
g.x = b.x; g.y = c.y; g.z = c.z;
int Al = -1; //-
int Bt = 1;
int xc = getmaxx() / 2;
int yc = getmaxy() / 2;
int x0 = xc - w/2, y0 = yc + h/2;
C3D A, B, C, D;
A.x = x0 + g.x * cos(Al) - g.y * sin(Al);
A.y = y0 + g.x * sin(Al) * cos(Bt) + g.y * cos(Al) * cos(Bt) - g.z * sin(Bt);
B.x = x0 + c.x * cos(Al) - c.y * sin(Al);
B.y = y0 + c.x * sin(Al) * cos(Bt) + c.y * cos(Al) * cos(Bt) - c.z * sin(Bt);
C.x = x0 + f.x * cos(Al) - f.y * sin(Al);
C.y = y0 + f.x * sin(Al) * cos(Bt) + f.y * cos(Al) * cos(Bt) - f.z * sin(Bt);
D.x = x0 + d.x * cos(Al) - d.y * sin(Al);
D.y = y0 + d.x * sin(Al) * cos(Bt) + d.y * cos(Al) * cos(Bt) - d.z * sin(Bt);
setcolor(1);
line(A.x,A.y,B.x,B.y);
line(A.x,A.y,C.x,C.y);
line(C.x,C.y,B.x,B.y);
line(D.x,D.y,B.x,B.y);
line(D.x,D.y,A.x,A.y);
line(D.x,D.y,C.x,C.y);
}
Алгоритм головної програми:
Висновок: В результаті виконання лабораторної роботи ми опанували основи роботи в середовищі Turbo C++ 3.0, навчилися масштабу вати графічні об’єкти з допомого теорії афінних перетворень.