Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Коссак графіка.doc
Скачиваний:
2
Добавлен:
01.07.2025
Размер:
6 Мб
Скачать
☆

5.3. Перетворення

5.3.1. Геометричні перетворення

Цікавою ділянкою комп’ютерної графіки є перетворення, а саме – геометричні перетворення, які можна легко створювати за допомогою пакета Matlab у вигляді однойменних матриць.

Простір– 2D. Як зазначено, Matlab має функції, які охоплюють перетворення в 3Dпросторі, а для 2Dграфіки – ні. Один з виходів з цієї ситуації – робота в 3Dпросторі й відображення двовимірних об'єктів як тривимірних. Є ще можливість створити відповідну функцію, використовуючи лише 2Dпростір. Перша можливість є ліпша ніж друга, оскільки дає змогу застосувати перетворення для різних об’єктів без знання точок об’єкта. Нижче наведено приклад такої функції.

function R = strofi2D(theta)

R = [cos(theta) -sin(theta) 0;sin(theta) cos(theta) 0;0 0 1];

Для цієї функції вхідними параметрами є кут обертання в радіанах, а вихідними – 3 3 матриця обертання.

Простір – 3D. Одна з функцій, яка здатна обчислювати геометричні перетворення в 3Dпросторі – makehgtform. Недоліком: вона не охоплює перетворення симетрії в 3D, однак його можна ліквідувати досить просто, як описано в прикладах. Розглянемо спочатку команду Translate, яка виконує перенесення об’єкта в заданоу точку.

M = makehgtform('translate',[tx ty tz]) або M = makehgtform('translate',tx,ty,tz)

Тут Μ є точкою, а [ tx ty tz ] – вектором, який визначає нові координати, на які буде перенесена задана точка з початку координат.

Команду масштабування точки Scaling можна задати двояко

M = makehgtform('scale', s)

M = makehgtform('scale',[ sx, sy, sz ])

У першому випадку спочатку відбувається обчисленняя матриці перетворень, яка виконує масштабування з коефіцієнтом масштабування s для трьох осей. а в другому зазначено, що цей коефіцієнт є різним для кожної з осей.

Команда Rotation виконує обертання заданих точок навколо кожної з осей на кут, у радіанах:

M = makehgtform('xrotate',t) - обертання навколо осі x на кут t.

M = makehgtform('yrotate',t) - обертання навколо осі y на кут t.

M = makehgtform('zrotate',t) - обертання навколо осі z на кут t.

Для обчислення матриці будь-якого перетворення, яка утворюється внаслідок композиції базисних трансформацій, достатньо лише перемножити почерзі всі отримані матриці з makehgtform.

Якщо потрібно застосувати ці матриці-перетворення до об’єктів, то можна скористатись двома можливостями. Перша є до доцільна в разі простих форм, для яких відомо координати точок, а також шляхи, якими вони з’єднанні. Наприклад, для паралелепіпеда відомо вісім вершин, які належать шести площинам за відомих з’єднаннях між собою. Завдяки такому зображенню можна застосувати матриці перетворення в заданих точках для відображення нової форми, яка буде результатом цих перетворень. Такий метод є досить наочний для розуміння перетворень.

У випадку, якщо точки вихідної фігури невідомі? Треба використати другу можливість – застосувати команди hgtransform, set і axes для перетворень у будь-яку потрібну форму без спеціальних відомостей про її форму.

Команда hgtransform утворює групу об’єктів. Команда axes утворює осі, а команда set змінює параметри об’єкта. Всі описані нижче команди будуть використані й пояснені на окремих прикладах.

Наведемо приклад. Нехай треба нарисувати трикутник з вершинами A(0,0), B(1,0) і G(0,1), після чого повернути його на кут /2 з центром обертання у точці V. За позитивний кут приймаємо той, що рухається проти годинникової стрілки. Для такого типу перетворення виконуємо три кроки:

  1. переносимо центр обертання V у початок координат;

  2. повертаємо трикутник на кут p/2 навколо початку координат;

  3. переносимо точку V у вихідне положення.

Нехай матриця координат вершин така:

Тоді наступні команди матимуть вигляд

Points = [0 1 0 0; ...

0 0 1 0; ...

1 1 1 1];

plot (Points( 1 ,: ) , Points( 2 , :) );

M = [0 -1 1 ; ...

1 0 -1 ;...

0 0 1];

Points = M*Points ;

hold on

plot (Points( 1 ,: ) , Points( 2 , :),'r-' );

axis equal

Масив Points на початку містить координати заданої форми. Після перетворення отримаємо потрібний результат. На рис. 5.16 зображено перетворений об'єкт

Рис. 5.16. Перетворення трикутника

Тепер намалюємо лого Matlab на підставі M-файла, з попереднього параграфа, і після цього повернемо його на кут /2 навкола осі y. Використаємо вже описану функцію. За допомогою функції hgtransform створимо об’єкт, який можна легко присвоювати Matlab. Команди, виділені сірим кольором, є загальними для всіх програм. У рамці виділено перетворення, тут стільки перетворень, скільки операторів (рис.5.17):

L = 40 * membrane(1,25);

w = axes;