asyan.org | 1 Перетворення на площиніПредставлення графічних зображень здійснюється крапками і лініями. Можливість перетворення крапок і ліній є основою комп'ютерної графіки. При використанні комп'ютерної графіки можна змінювати масштаб зображення, обертати його, зміщувати і трансформувати для поліпшення наочності зображення об'єкту. Аффінне перетворення на площині. У комп'ютерній графіці все, що відноситься до двомірного випадку, позначається символом 2d (2-dimension). Користуватимемося декартовою системою координат - це зручний спосіб скріплення геометричного об'єкту (т.м) - з числами X, Y - її координатами, які дозволяють кількісно описувати геометричні фігури. ![]() ![]() y ![]() ![]() M (x, y) M* (x*, y*) M (x, y) ![]() ![]() У декартовій системі координат перетворення можна розглядати двояко: -змінюється положення крапки, а система координат та ж; -зберігається крапка, а змінюється координатна система. Надалі розглядатимемо перший випадок: у заданій системі прямокутних координат перетвориться точка площини. Перетворені координати описуються співвідношеннями: ![]() Y* = cx + dy + ; загальне аффінне перетворення, де a, b, c, d, , – довільні числа. Для переміщення крапки на площині необхідно описати закон зміни її координат. Існує декілька окремих випадків перетворень, використовуючи які досягається необхідні переміщення на площині. Такими перетвореннями є: -паралельне перенесення; -обертання; -зеркальне відображення; - розтягування або стискування. Вибір цих випадків визначається двома обставинами: -кожне з приведених перетворень має простий і наочний геометричний сенс; -будь-яке перетворення на площині можна представити як послідовне виконання (суперпозицію) простих перетворень: паралельне перенесення, обертання, розтягування і віддзеркалення. 1) Паралельне перенесення. ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() M O* ![]() ![]() Переводить крапку С з координатами X і Y в точку М* з координатами X* і Y*. X* = x + ; Y* = y + ; Приклад: переміщення прямої на площині 2). Дзеркальне віддзеркалення. ![]() ![]() ![]() ![]() ![]() ![]() M* x* = +x; x* = –x;y = –y; y* = y;щодо осі абсцис щодо осі ординат 3) Розтягування (стискування) ![]() ![]() ![]() ![]() M M* x* = a * x; y* = d * y; M* M ![]() ![]() Розтягування або стискування залежить від значень а і d. ![]() ![]() ![]() ![]() ![]() x ![]() Якщо a>1 і d<1, то прямокутник розтягується по Х і стискується по Y. Якщо a>1 і d>1, то прямокутник розтягується по X і Y. Для ефективного використання цих відомих формул в комп'ютерній графіці зручніше користуватися матричним записом: -значення координат точки М можна розглядати як ![]() y -так розтягування: ![]() ![]() ![]() 0 d y = y* y* = d * y; віддзеркалення: ![]() ![]() y 0 -1 вісь абсцис y* = –y; ![]() ![]() y 0 1 вісь ординат y* = y; 4) Обертання Перед отриманням матриці обертання розглянемо перетворення одиничного квадрата . ![]() ![]() 0 0 – т. А ![]() ![]() 1 1 – т. С 0 1 – т. D ![]() Застосування загального матричного перетворення до одиничного квадрата приводить до наступного результату: a ![]() c d 0 ![]() ![]() 1 0 a b a b B* 1 1 c d = a+c b+d C* 0 1 c d D* Результати: -початок координат не піддається перетворенню; A=a*=[0 0] -координата В* визначається першим рядком загальної матриці перетворення; -координата D* визначається другим рядком загальною матрицею перетворення. Таким чином, якщо координати точка В* і точка D* відомі, то загальна матриця перетворення визначена. Розглянемо обертання одиничного квадрата навколо початку координат. Обертання проти годинникової стрілки береться за позитивне. ![]() B – B* ; x* = 1 * cos C* y* = 1 * sin ![]() D ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() A A* B x Загальну матрицю обертання можна записати: ![]() ![]() -sin cos y* = x * sin + y * cos; Таким чином, отримали: – ![]() ![]() x cos -sin x* = x * cos – y * sin; y sin cos y* = x * sin + y * cos; - розтягування (dilatation) ![]() ![]() y 0 d y*= d*y; – ![]() ![]() x 1 0 x* =x; по осі абсцис y 0 -1 y* = -y; – перенесення(translation); x* = x + y* = y + Кожне з приведених перетворень координат можна так само описати формулами: x* = ax + by + ; y* = cx + dy + ; – загальні аффінні перетворення; –при a=d=1 и b=c=0 – отримуємо перенесення; –при a=d=cos и –b=c=sin, ==0 – обертання; –при a=1, d=–1, c=b== – віддзеркалення; –при b=c== – розтягування (стискування); У матричному описі основних перетворень відсутня операція паралельного перенесення, тобто за допомогою матриці описані: x* = ax + by; y* = cx + dy; – відсутні. і , а зміна координати по X залежить від трьох параметрів a,b, і по Y залежить від трьох параметрів с, d і . Значить, щоб охопити матричним підходом чотири прості перетворення, необхідно перейти до опису довільної крапки не парою чисел (x,y), а трійкою чисел [x,y,1] і [x*,y*,1] Матриця перетворення після цього стає матрицею розміру 2*3 a ![]() c d , де і викликає зсув x* і y* відносно x і у. Оскільки матриця 2*3 не є квадратною, то вона не має зворотної матриці. Тому її доповнюють до квадратної, розміру 3*3. a b ![]() 0 0 1 змінює. Використовуючи цю матрицю ![]() ![]() ![]() y c d = y* 1 0 0 1 1 отримуємо перетворений вектор [x*, y*, 1]. У загальному випадку [X, Y, H]. Перетворення було виконане так, що [X, Y, H] = [x*, y*, 1] Перетворення, що має місце в тривимірному просторі, в нашому випадку обмежено площиною H=1. Пряма OМ* перетинає площину H=1 в точці M*(x*,y*,1), яка однозначно визначає точку M(x, у) координатної площини XY. Представлення двомірного вектора тривимірним або в загальному випадку n-вимірного вектора (n+1) -вимірним називають однорідним координатним відтворенням. У однорідних координатах запис буде у вигляді: ![]() [x, y, H]=[x, y, 1] * b d 0 1 , де x = x*, y = y*, H = 1. У загальному випадку H не дорівнює 1 і перетворені звичайні координати виходять за рахунок нормалізації однорідних координат, тобто X* = x/H; Y* = y/H. Основна матриця перетворення розміру для однорідних двомірних координат має вигляд: a b c d m n s І може бути розділена на чотири частини a, b, c, d – здійснює зміну масштабу, зрушення і обертання; і – виконує зсув; m і n – отримання проекції; s – проводить повну зміну масштабу. Оскільки при H, яке не дорівнює, ми отримуємо зображення в тривимірному просторі, то для простоти обчислень в 2d використовуваний H=1 і матрицю узагальнену на чотири перетворення: x ![]() ![]() y* = y * c d y* = cx + dy + ; 1 1 0 0 1 1 = 1. Для того, щоб реалізувати те або інше переміщення по заданих геометричних характеристиках, треба знайти елементи відповідної матриці, використовується матриці: -обертання (rotation): ![]() sin cos 0 зворотна -sin cos 0 0 0 1 0 0 1 – розтягування (dilatation): ![]() ![]() 0 d 0 зворотна 0 1/d 0 y* = dy; 0 0 1 0 0 1 – віддзеркалення (reflection): ![]() ![]() 0 –1 0 зворотна 0 –1 0 y* = -y; 0 0 1 0 0 1 – ![]() ![]() 1 0 1 0 - x* = x + ; 0 1 зворотна 0 1 - y* = y + . 0 0 1 0 0 1 Двомірне обертання навколо довільної крапки. Вище було розглянуто обертання зображення біля початок координат. Однорідні координати забезпечують поворот зображення навколо крапок, відмінних від початку координат. У загальному випадку алгоритм обертання навколо довільної крапки наступний: -перенос центру обертання в початок координат; -поворот відносно початку координат; -перенос точки обертання в початкове положення. Приклад: побудувати матрицю перетворення при повороті на кут j навколо точки M(m,n), не співпадаючої з початком координат. ![]() ![]() ![]() ![]() M ![]() 1) Перенесемо площину на вектор M(-m, -n) для поєднання точки повороту з початком координат: 1 0 -m T_= 0 1 -n 0 0 1 2 ![]() cos -sin 0 R= sin cos 0 0 0 1 3).Перенесем площину на вектор M(m, n) для обертання точки повороту в початок координат: 1 0 m T= 0 1 n 0 0 1 ![]() ![]() M=T * R * T_= 0 1 n * sin cos 0 = 0 0 1 0 0 1 ![]() ![]() ![]() cos -sin m 1 0 -m cos -sin -mcos + nsin + m = sin cos n * 0 1 -n = sin cos -msin – ncos + n 0 0 1 0 0 1 0 0 1 ![]() ![]() x* x y* = y * M ![]() T * R –T_ X* = xcos – ysin – mcos + nsin + m; Y* = xsin + ycos – msin – ncos + n; Приклад: побудувати матрицю перетворення при розтягуванні уздовж координатних осей з коефіцієнтами а і d. 1 0 -m 1). T_ = 0 1 -n 0 0 1 ![]() a 0 0 2). D = 0 d 0 0 0 1 ![]() 1 0 m 3). T = 0 1 n 0 0 1 ![]() ![]() ![]() 1 0 m -a 0 0 1 0 -m M= 0 1 n * 0 d 0 * 0 1 -n ; 0 0 1 0 0 1 0 0 1 ![]() a 0 -am + m M= 0 d -dn + n 0 0 1 |