1. ЗАВДАННЯ
2. ТЕОРЕТИЧНА ЧАСТИНА
При виконанні роботи постає питання, як здійснити поворот певної точки. Для розв’язання цієї проблеми можна використати матриці перетворень:
EMBED Equation.3 - матриця переміщення.
Переміщуємо точку, відносно якої буде відбуватися поворот на початок координат.
EMBED Equation.3 - матриця повороту.
Здійснюємо поворот точки на кут EMBED Equation.3 .
EMBED Equation.3 - матриця переміщення.
Переміщуємо точку, відносно якої відбувся поворот на своє початкове місце.
Щоб реалізувати цей метод на практиці і вивести рівняння для отримання нових координат точки, знаючи її початкові координати, координати точки, відосно якої буде відбуватися поворот, та кут, на який необхідно здійснити цей поворот, треба перемножити наведені вище матриці:
EMBED Equation.3 - результуюча матриця.
Замінимо елементи матриці умовними позначеннями:
EMBED Equation.3
Таким чином можна отримати систему рівнянь: EMBED Equation.3
Введемо деякі пояснення:
1) ( EMBED Equation.3 ; EMBED Equation.3 ) – координати точки, відносно якої відбувається поворот.
2) ( EMBED Equation.3 ; EMBED Equation.3 ) – початкові координати точки (до повороту).
3) ( EMBED Equation.3 ; EMBED Equation.3 ) – координати точки після повороту.
4) EMBED Equation.3 - кут повороту; додатній, якщо поворот відбувається проти годинникової стрілки, і від’ємний, якщо поворот відбувається за годиниковою стрілкою.
3. БЛОК-СХЕМА АЛГОРИТМУ
3.1. Головна блок-схема.
1.
так
cx>300
ні
3
19
Рис. 3.1. Головна блок-схема.
3
15
обчислення контрольних координат
14.
вибір кольору та побудова діагоналей кола
13.
зафарбавування кола
вибір способу заповнення замкнутої області
вибір кольору та побудова кола
7.
x1:=352; x2:=368; y1:=200; y2:=200;
3.
процедура встановлення граф. режиму
12.
11.
10.
9.
8.
6.
5.
4.
2.
побудова зафарбованого прямокутника
вибір способу заповнення замкнутої області
cx:=360; cy:=200; k:=5.625/pi;
x3:=360; x4:=360; y3:=192; y4:=208;
оголош. змінних і констант
початок
2
14
2
7
15.
cx:=cx-1;
Рис. 3.2. Головна блок-схема (продовження).
ні
4
31
4
27
обчислення контрольних координат
26.
вибір кольору та побудова діагоналей кола
25.
зафарбавування кола
вибір способу заповнення замкнутої області
вибір кольору та побудова кола
cy<260
24.
23.
22.
21.
20.
19.
побудова зафарбованого прямокутника
вибір способу заповнення замкнутої області
так
18.
побудова зафабованого прямокутника
17.
вибір кольору
затримка перед продовженням циклу
16.
Рис. 3.3. Головна блок-схема (продовження).
5
43
5
39
обчислення контрольних координат
38.
вибір кольору та побудова діагоналей кола
37.
зафарбавування кола
вибір способу заповнення замкнутої області
вибір кольору та побудова кола
cx<360
36.
35.
34.
33.
32.
31.
побудова зафарбованого прямокутника
вибір способу заповнення замкнутої області
3
19
побудова зафабованого прямокутника
30.
вибір кольору
29.
затримка перед продовженням циклу
28.
cy:=cy+1;
27.
3
26
так
ні
Рис. 3.4. Головна блок-схема (продовження).
6
53
обчислення контрольних координат
52.
вибір кольору та побудова діагоналей кола
51.
зафарбавування кола
вибір способу заповнення замкнутої області
вибір кольору та побудова кола
cy>200
50.
49.
48.
47.
46.
45.
побудова зафарбованого прямокутника
вибір способу заповнення замкнутої області
так
ні
44.
43.
x1:=352; x2:=368; x3:=360; x4:=360;
42.
вибір кольору
41.
затримка перед продовженням циклу
40.
cx:=cx+1;
39.
4
38
4
31
побудова зафабованого прямокутника
y1:=260; y2:=260; y3:=252; y4:=268;
6
57
Рис. 3.5. Головна блок-схема (закінчення).
58.
кінець
закриття графічного режиму
57.
побудова зафабованого прямокутника
56.
вибір кольору
55.
затримка перед продовженням циклу
54.
cy:=cy-1;
53.
5
52
5
45
3.2. Блок-схема встановлення графічного режиму.
початок
1.
Рис. 3.6. Блок-схема встановлення графічного режиму.
5.
кінець
встановити графічний режиму
4.
3.
drv:=9; mode:=2;
оголош. змінних: drv,mode
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, використовуючи матриці перетворень.