Лабораторна робота № 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.                     Які  варіанти завдання допускають однократну побудову координатних осей?