Лабораторна робота № 5
Тема. Динамічне
перетворення двовимірних координат
Вступ
Даний вид зображень знаходить широке застосування в комп'ютерній
графіці для синтезу мнемосхем, моделювання технологічних процесів і переміщень
роботів, розширення образотворчих можливостей людиномашинного інтерфейсу. Сам
процес побудови базується на алгоритмах, розглянутих раніше, в попередніх
лабораторних роботах, а методи перетворення координат детально представлені в
попередній роботі.
Опис середовища програмування
Дані перетворення, як і в попередніх лабораторних роботах,
реалізуються в середовищі мови програмування TurboPascal. Всі
необхідні засоби мови розглянуті раніше. Реалізувати завдання на основі
алгоритму із зміною графічних сторінок, що створює більш якісне зображення.
Використання для регенерації рухомої частини зображення вікон або виділених
прямокутних фрагментів не рекомендується, оскільки поворот зображення під час
руху чи його масштабуванні ускладнюють визначення координат кутів ділянки
екрану, що використовується.
Приклад
програми. Створити програму, яка реалізує засобами
графіки мови програмування Turbo Pascal динамічне
зображення попередньої роботи, початкове зображення будується на початку
першого квадранта, ліва нижня точка зображення має координати (20,10) і
здійснюється її зсув до точки (-100, -110) зі збільшенням до кінця руху фігури
в 2 рази.
Лістинг програми
program
linii;
uses
Graph,crt;
var
GraphDriver:integer;
GraphMode:integer;
mx,my:word;
x11,x12,x21,x22,x31,x32,y11,y12,y21,y22,y31,y32:integer;
ax,ay,dx,dy:integer;
m,
y:real;
ns,і:byte;
sx,sy,
x0,y0:integer;
procedure
XY(xn,yn:integer);
begin
SetLineStyle(0,0,1);
Line(xn,320,xn,10);
Line(xn,10,xn-5,20);
Line(xn,10,xn+5,20);
Line(40,yn,600,yn);
Line(600,yn,593,yn-3);
Line(600,yn,593,yn+3);
SetColor(4);
SetTextJustify(0,0);
SetTextStyle(0,0,1);
OutTextXY(597,yn+15,'X');
OutTextXY(xn-15,15,'Y');
end;
begin
GraphDriver:=3;
GraphMode:=1;
InitGraph(GraphDriver,GraphMode,'C:\BPZ\BGI');
SetBkColor(9);
GetAspectRatio(mx,my);
dx:=320;
dy:=125; ax:=0;ay:=0;
y:=0;
sy:=0; ns:=0;
x11:=50;y11:=50;
x12:=80;y12:=50;
x21:=80;y21:=50;
x22:=80;y22:=150;
x31:=80;y31:=150;
x32:=110;y32:=150;
for sx:=0
to 20 do
begin
if ns=0
then
begin
SetActivePage(0);
SetVisualPage(1);
end
else begin
SetActivePage(1);
SetVisualPage(0);
end;
ClearDevice;
XY(dx,dy);
SetColor(7);
SetLineStyle(0,0,3);
Line(dx+Round(my/mx*x11),dy-Round(mx/my*y11),dx+Round(my/mx*x12),dy-Round(mx/my*y12));
Line(dx+Round(my/mx*x21),dy-Round(mx/my*y21),dx+Round(my/mx*x22),dy-Round(mx/my*y22));
Line(dx+Round(my/mx*x31),dy-Round(mx/my*y31),dx+Round(my/mx*x32),dy-Round(mx/my*y32));
SetColor(13);
m:=y;
Line(dx+Round(my/mx*(x11*m))-20*ax,dy-Round(mx/my*y11*m)+15*ay,dx+Round(my/mx*(x12*m))-20*ax,
dy-Round(mx/my*(y12*m))+15*ay);
Line(dx+Round(my/mx*(x21*m))-20*ax,dy-Round(mx/my*y21*m)+15*ay,dx+Round(my/mx*(x22*m))-20*ax,
dy-Round(mx/my*(y22*m))+15*ay);
Line(dx+Round(my/mx*(x31*m))-20*ax,dy-Round(mx/my*y31*m)+15*ay,dx+Round(my/mx*(x32*m))-20*ax,
dy-Round(mx/my*(y32*m))+15*ay);
ax:=ax+1;ay:=ay+1;
y:=y+0.1;
sy:=sy+1;
if ns=0
then
ns:=1
else
ns:=0;
Delay(50000);
end;
readln;
CloseGraph;
end.
Варіанти завдань
Створити програму, що реалізовує засобами графіки мови програмування
TurboPascal наступне динамічне зображення:
а) фігура для побудови визначається відповідно до завдань,
наведених у попередній лабораторній роботі;
б) початкове зображення будується на початку першого квадранта.
Ліва нижня точка зображення має координати (20,10);
в) зображення
переміщується відповідно до наступних варіантів завдання:
1.
зсув до точки (120, -30) з поворотом на кожному кроці на 1° за
годинниковою стрілкою;
2.
зсув до точки (-60, 60) із збільшенням до кінця руху фігури в
два рази;
3.
зсув до точки (100, 90) з поворотом проти годинникової стрілки
на 2° на кожному кроці;
4.
зсув до точки (-60, -30) з поворотом за годинниковою стрілкою на
3° на кожному кроці;
5.
зсув до точки (100, -80) із зменшенням до кінця руху фігури в
два рази;
6.
зсув до точки (-80,60) з поворотом проти годинникової стрілки на
кожному кроці на 1;
7.
зсув до точки (140, 130) з поворотом за годинниковою стрілкою на
кожному кроці на 2°;
8.
зсув до точки (70, -80) зі збільшенням до кінця руху фігури в
1,5 рази;
9.
зсув до точки (70, 80) з поворотом проти годинникової стрілки на
кожному кроці на 3;
10. зсув до точки (-130, -120) зі зменшенням фігури до кінця руху в
2 рази;
11. зсув до точки (-60, 170) з поворотом за годинниковою стрілкою на
кожному кроці на 1°;
12. зсув до точки (80, -110) з поворотом проти годинникової стрілки
на кожному кроці на 2°;
13. зсув до точки (140, 130) з поворотом проти годинникової стрілки
на кожному кроці на 3°;
14. зсув до точки (60, 90) з поворотом на кожному кроці на 1º
проти годинникової стрілки;
15. зсув до точки (-200,120) зі зменшенням до кінця руху фігури в 2
рази;
16. зсув до точки (150, -120) з поворотом за годинниковою стрілкою
на кожному кроці на 1°;
17. зсув до точки (-280, 160) з поворотом проти годинникової стрілки
на кожному кроці на 2°;
18. зсув до точки (300, 150) з поворотом за годинниковою стрілкою на
кожному кроці на 3°;
19. зсув до точки (-280, -140) з поворотом проти годинникової
стрілки на кожному кроці на 1;
20. зсув до точки (60,170) зі збільшенням до кінця руху фігури в 1.6
рази.
Зміст звіту
1)
Зміст завдання;
2)
лістинг програми;
3)
надруковане зображення.
Контрольні питання
1.
Чи можна отримати динамічне зображення на основі однієї
графічної сторінки?
2.
Чи можна сумістити під час руху три види перетворень: зсув,
поворот і масштабування?
3.
Чому рівна мінімальна дискрета переміщення зображення по осях X
і Y?
4.
Чим визначається швидкість переміщення зображення по екрану?
5.
Які варіанти завдання
допускають однократну побудову координатних осей?