1. ЗАВДАННЯ

Розробити блок-схему алгоритму та програму мовою Turbo Pascal для побудови рухомого зображення: рух кульки по видимому квадратному контуру проти годинникової стрілки. Кольори кульки і контуру різні. Діаметр кульки d=16, сторона квадрату a=60. При написанні програми використати матриці перетворень.


2. ТЕОРЕТИЧНА ЧАСТИНА
При виконанні роботи постає питання, як здійснити поворот певної точки. Для розв’язання цієї проблеми можна використати матриці перетворень:
- матриця переміщення.
Переміщуємо точку, відносно якої буде відбуватися поворот на початок координат.
- матриця повороту.
Здійснюємо поворот точки на кут .
- матриця переміщення.
Переміщуємо точку, відносно якої відбувся поворот на своє початкове місце.
Щоб реалізувати цей метод на практиці і вивести рівняння для отримання нових координат точки, знаючи її початкові координати, координати точки, відосно якої буде відбуватися поворот, та кут, на який необхідно здійснити цей поворот, треба перемножити наведені вище матриці:
- результуюча матриця.
Замінимо елементи матриці умовними позначеннями:

Таким чином можна отримати систему рівнянь:
Введемо деякі пояснення:
1) (; ) – координати точки, відносно якої відбувається поворот.
2) (; ) – початкові координати точки (до повороту).
3) (; ) – координати точки після повороту.
4) - кут повороту; додатній, якщо поворот відбувається проти годинникової стрілки, і від’ємний, якщо поворот відбувається за годиниковою стрілкою.
3. БЛОК-СХЕМА АЛГОРИТМУ
3.1. Головна блок-схема.


3.2. Блок-схема встановлення графічного режиму.
4. ПРОГРАМА
Program Graph2;
uses graph,crt;
var x1,x2,x3,x4,y1,y2,y3,y4,cx,cy:integer;
k,xn1,yn1,xn2,yn2,xn3,yn3,xn4,yn4:real;
{процедура встановлення графiчного режиму }
PROCEDURE grafika_on;
var drv,mode:integer;
BEGIN
drv:=9; {VGA }
mode:=2; {VGAHi}
initgraph(drv,mode,'');
END;
{-------------------------- головна програма ---------------------------}
BEGIN
grafika_on; {встановити графiчний режим }
x1:=352; x2:=368; y1:=200; y2:=200;
x3:=360; x4:=360; y3:=192; y4:=208;
cx:=360;
cy:=200;
k:=5.625/pi;
{РУХ ПО СТОРОНI CB}
while cx>300 do
begin
setfillstyle(1,8);
bar(300,200,360,260); {малюємо зафарбований прямокутник }
setcolor(7);
arc(cx,cy,0,360,8); {малюємо коло }
setfillstyle(1,0);
floodfill(cx,cy,7); {зафарбовуємо його чорним кольором }
setcolor(4);
line(x1,y1,x2,y2);
line(x3,y3,x4,y4);
{обчислюємо координати контрольних точок}
xn1:=x1*cos(k)+y1*sin(k) + cx*(1-cos(k))-cy*sin(k);
yn1:=y1*cos(k)-x1*sin(k) + cy*(1-cos(k))+cx*sin(k);
xn2:=x2*cos(k)+y2*sin(k) + cx*(1-cos(k))-cy*sin(k);
yn2:=y2*cos(k)-x2*sin(k) + cy*(1-cos(k))+cx*sin(k);
xn3:=x3*cos(k)+y3*sin(k) + cx*(1-cos(k))-cy*sin(k);
yn3:=y3*cos(k)-x3*sin(k) + cy*(1-cos(k))+cx*sin(k);
xn4:=x4*cos(k)+y4*sin(k) + cx*(1-cos(k))-cy*sin(k);
yn4:=y4*cos(k)-x4*sin(k) + cy*(1-cos(k))+cx*sin(k);
x1:=trunc(xn1); y1:=trunc(yn1);
x2:=trunc(xn2); y2:=trunc(yn2);
x3:=trunc(xn3); y3:=trunc(yn3);
x4:=trunc(xn4); y4:=trunc(yn4);
cx:=cx-1; {змiна однiєї з координат центра кола }
delay(35000); {затримка перед продовженням циклу }
setcolor(7);
bar(100,100,500,500); {замальовуємо область }
end;
{РУХ ПО СТОРОНI BA}
while cy<260 do
begin
setfillstyle(1,8);
bar(300,200,360,260); {малюємо зафарбований прямокутник }
setcolor(7);
arc(cx,cy,0,360,8); {малюємо коло }
setfillstyle(1,0);
floodfill(cx,cy,7); {зафарбовуємо його чорним кольором }
setcolor(4);
line(x1,y1,x2,y2);
line(x3,y3,x4,y4);
{обчислюємо координати контрольних точок}
xn1:=x1*cos(k)+y1*sin(k) + cx*(1-cos(k))-cy*sin(k);
yn1:=y1*cos(k)-x1*sin(k) + cy*(1-cos(k))+cx*sin(k);
xn2:=x2*cos(k)+y2*sin(k) + cx*(1-cos(k))-cy*sin(k);
yn2:=y2*cos(k)-x2*sin(k) + cy*(1-cos(k))+cx*sin(k);
xn3:=x3*cos(k)+y3*sin(k) + cx*(1-cos(k))-cy*sin(k);
yn3:=y3*cos(k)-x3*sin(k) + cy*(1-cos(k))+cx*sin(k);
xn4:=x4*cos(k)+y4*sin(k) + cx*(1-cos(k))-cy*sin(k);
yn4:=y4*cos(k)-x4*sin(k) + cy*(1-cos(k))+cx*sin(k);
x1:=trunc(xn1); y1:=trunc(yn1);
x2:=trunc(xn2); y2:=trunc(yn2);
x3:=trunc(xn3); y3:=trunc(yn3);
x4:=trunc(xn4); y4:=trunc(yn4);
cy:=cy+1; {змiна однiєї з координат центра кола }
delay(35000); {затримка перед продовженням циклу }
setcolor(7);
bar(100,100,500,500); {замальовуємо область }
end;
{РУХ ПО СТОРОНI AD}
while cx<360 do
begin
setfillstyle(1,8);
bar(300,200,360,260); {малюємо зафарбований прямокутник }
setcolor(7);
arc(cx,cy,0,360,8); {малюємо коло }
setfillstyle(1,0);
floodfill(cx,cy,7); {зафарбовуємо його чорним кольором }
setcolor(4);
line(x1,y1,x2,y2);
line(x3,y3,x4,y4);
{обчислюємо координати контрольних точок}
xn1:=x1*cos(k)+y1*sin(k) + cx*(1-cos(k))-cy*sin(k);
yn1:=y1*cos(k)-x1*sin(k) + cy*(1-cos(k))+cx*sin(k);
xn2:=x2*cos(k)+y2*sin(k) + cx*(1-cos(k))-cy*sin(k);
yn2:=y2*cos(k)-x2*sin(k) + cy*(1-cos(k))+cx*sin(k);
xn3:=x3*cos(k)+y3*sin(k) + cx*(1-cos(k))-cy*sin(k);
yn3:=y3*cos(k)-x3*sin(k) + cy*(1-cos(k))+cx*sin(k);
xn4:=x4*cos(k)+y4*sin(k) + cx*(1-cos(k))-cy*sin(k);
yn4:=y4*cos(k)-x4*sin(k) + cy*(1-cos(k))+cx*sin(k);
x1:=trunc(xn1); y1:=trunc(yn1);
x2:=trunc(xn2); y2:=trunc(yn2);
x3:=trunc(xn3); y3:=trunc(yn3);
x4:=trunc(xn4); y4:=trunc(yn4);
cx:=cx+1; {змiна однiєї з координат центра кола }
delay(35000); {затримка перед продовженням циклу }
setcolor(7);
bar(100,100,500,500); {замальовуємо область }
end;
{ПЕРЕХIД ДО КОНТРОЛЬНИХ КООРДИНАТ}
x1:=352; x2:=368; x3:=360; x4:=360;
y1:=260; y2:=260; y3:=252; y4:=268;
{РУХ ПО СТОРОНI DC}
while cy>200 do
begin
setfillstyle(1,8);
bar(300,200,360,260); {малюємо зафарбований прямокутник }
setcolor(7);
arc(cx,cy,0,360,8); {малюємо коло }
setfillstyle(1,0);
floodfill(cx,cy,7); {зафарбовуємо його чорним кольором }
setcolor(4);
line(x1,y1,x2,y2);
line(x3,y3,x4,y4);
{обчислюємо координати контрольних точок}
xn1:=x1*cos(k)+y1*sin(k) + cx*(1-cos(k))-cy*sin(k);
yn1:=y1*cos(k)-x1*sin(k) + cy*(1-cos(k))+cx*sin(k);
xn2:=x2*cos(k)+y2*sin(k) + cx*(1-cos(k))-cy*sin(k);
yn2:=y2*cos(k)-x2*sin(k) + cy*(1-cos(k))+cx*sin(k);
xn3:=x3*cos(k)+y3*sin(k) + cx*(1-cos(k))-cy*sin(k);
yn3:=y3*cos(k)-x3*sin(k) + cy*(1-cos(k))+cx*sin(k);
xn4:=x4*cos(k)+y4*sin(k) + cx*(1-cos(k))-cy*sin(k);
yn4:=y4*cos(k)-x4*sin(k) + cy*(1-cos(k))+cx*sin(k);
x1:=trunc(xn1); y1:=trunc(yn1);
x2:=trunc(xn2); y2:=trunc(yn2);
x3:=trunc(xn3); y3:=trunc(yn3);
x4:=trunc(xn4); y4:=trunc(yn4);
cy:=cy-1; {змiна однiєї з координат центра кола }
delay(35000); {затримка перед продовженням циклу }
setcolor(7);
bar(100,100,500,500); {замальовуємо область }
end;
closegraph; {вихiд з графiчного режиму }
END.
5. ВИСНОВКИ
Щоб виконати цю програму, необхідно знати і вміти використовувати матриці перетворень, вміти використовувати в мові Turbo Pascal цикли, а також – знати необхідні команди і процедури при роботі з графічним режимом. Написання програми дає особливо добрий практикум в галузі роботи з графічним режимом. Виконавши цю прогаму, можна навчитися будувати рухомі зображення в середовищі Turbo Pascal, використовуючи матриці перетворень.