РОЗДІЛ 1. КООРДИНАТНІ ПЕРЕТВОРЕННЯ ТА ПРОЕКЦІЇ
1.1. Афінна геометрія
1.1.1. Афінні перетворення точок у просторі
Нехай довільна фігура внаслідок якихось дій переходить в фігуру . Знайдемо формули, які визначають зв'язок між координатами довільної точки фігури і відповідної точки фігури . Афінні перетворення задають формулами
(1.1)
Тут - будь які дійсні числа, що задовольняють умову
.
Це визначення інваріантне щодо вибору системи координат. Координати точки в одній системі виражають лінійно через її координати в будь-якій інший системі. Запишемо вираз (1.1) у матричному вигляді
. (1.2)
Матриця в формулі (1.2) не є квадратною і тому не може мати оберненої. Цю складність можна обійти, доповнивши її до квадратного розміру
. (1.3)
Унаслідок таких дій отримаємо новий вектор у розширеному вигляді. Четвертий елемент тут можна розглядати як додаткову координату вектора положення. Такі координати називають однорідними, їхнє точне означення наведено в параграфі 1.2.1. Тут останній стовпець є нульовим з одиницею в останньому елементі
,
який поки що залишимо без розгляду. Детально вивчення кожен елемент четвертого стовпця вивчимо в наступних параграфах. А зараз розглянемо вплив окремих елементів матриці (1.3) на вектор перетворення [17].
Елементи матриці частково змінюють масштаб.

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

З цих прикладів можна зробити висновок, що матриця (33), яка є частиною загальної матриці перетворень (44)
(1.4)
забезпечує комбінацію операцій зміни масштабу та зсуву.
Для виконання тривимірного (дзеркального) відображення без зміни масштабу треба, щоб визначник матриці (1.4) дорівнював -1. Для відображення щодо площини потрібно, щоб змінився лише знак координати , щодо – знак координати , а щодо – знак
.
Проте, якщо визначник матриці (1.4) дорівнює +1, то є чисте обертання навколо початку координат. У разі обертання на довільний кут довкола осі розміри вздовж не змінюються. В цьому випадку матриця з виразу (1.3) матиме вигляд
.
Уважатимемо обертання додатним, якщо воно відбувається за годинниковою стрілкою при спогляданні з початку координат уздовж осі обертання. Для обертання на кут навколо осі та на кут навколо осі , відповідно, отримаємо матриці перетворення (рис. 1.1)
.
Припустимо, що треба обернути якесь тіло спочатку навколо осі , а потім навколо осі . В цьому випадку сумару матрицю перетворень можна отримати шляхом перемноження матриць . Зазначимо, що тривимірні обертання не комутативні . Це означає таке: якщо спочатку обернути тіло навколо осі , а потім – навколо , то отримаємо цілком інший результат, ніж тоді, коли обертати тіло спочатку навколо осі , а потім навколо .

Рис. 1.1. Обертання навколо осей Рис. 1.2. Обертання навколо координат довільної осі
Тривимірне обертання радіуса-вектора точки на кут довкола довільної осі, яка проходить через початок координат, виконують за допомогою таких перетворень (рис. 1.2). Позначимо через напрямні косинуси заданого радіуса-вектора.
.
Тут матриця перетворень набуде вигляду

Елементи матриці перетворень беруть участь у тривимірному перенесенні, яке можна записати у вигляді
.
Для виконання тривимірного обертання навколо довільної осі, яка не проходить через початок координат, треба виконати такі дії:
Перенести дану вісь в початок координат.
Виконати обертання довкола цієї осі.
Перенести зображення в вихідне положення.
Якщо вісь обертання проходить через точку з координатами , то в матричному вигляді ці дії можна зобразити так
.
Як частковий випадок, розглянемо перетворення у двовимірному випадку. Матриця афінних перетворень матиме такий вигляд:
.
Зауважте, що для елементів матриці перетворень , які беруть участь у двовимірному перенесенні, залишено ті ж позначення, що і в тривимірному випадку, це зроблено з метою єдності позначень.
Завдяки однорідному зображенню векторів на площині, можна показати, як відбувається обертання довкола кожної осі координат. У разі обертання фігури на довільний кут довкола осі , кут довкола осі у і кут довкола осі матриці перетворень, відповідно матимуть вигляд
.
У першій і другій матрицях останній стовпець є ненульовим. Це означає, що відображення вже буде не афінним, а перспективним [36].
Розглянемо низку прикладів афінних перетворень на площині та у просторі.
Приклад 1.1. Визначити матрицю перетворень , яка виконує масштабування об’єкта на одиниць відносно осі , та на одиниць відносно осі, перенесеного в точку (рис. 1.3).

Рис. 1.3. Перенесення та масштабування об’єкта
Побудуємо спочатку матрицю , яка відображає перенесення точки P в початок координат за допомогою вектора , що має вигляд , потім побудуємо матрицю та матрицю , що виконує перенесення точки у її початкове положення за допомогою вектора .
,,.
Отже, остаточну матрицю перетворень отримаємо з формули
Приклад 1.2. Визначити матрицю перетворень , яка виконує повертання точки на кут ? довкола центра обертання з координатами (рис. 1.4)

Рис. 1.4 Повертання довкола точки .
Діємо аналогічно до попереднього прикладу, спочатку виконуємо перенесення точки за допомогою вектора в початок координат, після цього – обертання довкола осі , і, на завершення, повертаємо точку в попередню позицію за допомогою вектора
.
Сумарну матрицю можна записати у вигляді
Приклад 1.3. Визначити точку, симетричну до точки відносно осі , яка утворює кут ? з віссю (див. рис. 1.5)

Рис.1.5. Віддзеркалення щодо довільної осі
Оскільки вісь утворює кут ? з віссю , то використаємо спочатку матрицю обертання на кут –?, для того, щоб вісь збіглася з віссю . Наступним кроком виконаємо операцію віддзеркалювання, симетричного щодо осі , за допомогою матриці , і на решті, повернемо об’єкт на кут ? за допомогою матриці
, , .
На підставі узагальнення попередніх викладок, запишемо:
.
Приклад 1.4. Записати матрицю перетворень , яка визначає симетрію об’єкта відносно лінії , яка перетинає вісь у точці з координатами і утворює кут ? з віссю (рис. 1.6).

Рис. 1.6. Симетрія об’єкта щодо лінії
Для того, щоб використати базові перетворення, потрібно сумістити лінію з віссю . Для цього перенесемо лінію так, щоб точка збігалася з початком координат за допомогою вектора , після чого обернемо лінію на кут –?. Коли лінія збігається з віссю , можна застосувати потрібні перетворення для симетричного відображення відносно осі
; ; .
Після цих операцій повернемося в початкову точку, виконуючи дії в зворотному порядку, а саме – обертання на кут ? та перенесення на вектор
; ; ; ;
Сумарна матриця перетворень матиме вигляд.

Якщо вважатинахилом лінії ,
,
а матриця набуде нового вигляду

Приклад 1.5. Знайти перетворення, яке є відображенням прямокутного трикутник ABC на площину х=2.
Спочатку за допомогою вектора (-2, 0, 0) виконаємо перенос площини відображення, щоб вона проходила через початок координат. Наступним кроком буде здійснення відображення на площину х=0, після чого за допомогою вектора (2, 0, 0) змінимо відображення на площину х=2 (рис. 1.7).
.
Розглянемо прямокутний трикутник ABC з такими координатами вузлів: А(0, 0, 0, 1); В(1, 0, 0, 1); С(0, 1, 0, 1). Застосуємо матрицю перетворень до координат вузлів, отримаємо трикутник (див. рис.1.7) з вершинами К(4,0,0,1), L(3, 0, 0, 1); M(4, 1, 0, 1).
Приклад 1.6. Знайти перетворення, необхідне для виконання повороту фігури на 90о відносно деякої осі, яка проходить через точку E(1,2,0,1), паралельна осі OZ і має однакову з цією віссю орієнтацію.
Перш за все, перенесемо фігуру на вектор (-1, -2, 0, 1) для того, щоб вісь обертання проходила через початок координат. Наступний крок – обертання тіла навколо осі OZ і перенесення фігури на вектор (1, 2, 0, 1), після чого вісь обертання займе вихідне положення. Перемо три матриці, отримаємо сумарну матрицю перетворень:

У разі застосування матриці перетворень до координат вершин трикутника з попередньої вправи отримаємо трикутник з новими координатами К(3,1,0,1), L(3, 2, 0, 1); M(2, 1, 0, 1) (рис.1.8 ).

Рис.1.7. Відображення тіла Рис.1.8. Повертання тіла довколо
відносно точки до площини х=2 осі в заданому напрямі
1.1.2. Перетворення ліній та площин у просторі
З означення афінного перетворення (1.1), випливає, що різні точки в разі афінного перетворення переходять у різні точки. Кожна точка є образом деякої точки . Зробимо ще декілька висновків [24].
Площина в разі афінного перетворення переходить у площину, причому різні площини переходять у різні, паралельні площини – у паралельні.
Пряма в разі афінного перетворення переходить у пряму, а відрізок, заданий двома граничними точками, – у відрізок з новими координатами граничних точок.
Середина відрізка прямої переходить у середину відрізка нової прямої.
Оскільки, дві паралельні прямі можна визначити перерізом двох паралельних площин з третьою площиною, а паралельні площини в разі афінного перетворення переходять у паралельні, то у випадку афінного перетворення паралельні прямі переходять у паралельні.
Точка перетину вихідної пари ліній перетворюється в точку перетину перетвореної пари.
Приклад. Перетворення фігури в двохвимірному випадку.
Якщо зобразити фігуру як сукупність точок, то можна виконати перетворення кожної її точки, а потім їх сполучити. Фігурою буде одиничний квадрат з координатами вузлів А(0, 0, 1); В(1, 0, 1); С(1, 1, 1) D(0, 1, 1). Перетворимо квадрат за допомогою матриці перетворень з нульовими коефіцієнтами перенесення :
.
Унаслідок такого перетворення отримано нову фігуру A*B*C*D* (рис. 1.9). На підставі детального аналізу можемо зробити такі висновки.
Вузол А= A*, це означає, що початок координат є в точці з координатами (0, 0, 1).
Якщо відомі координати вузлів B* і D*, то відома матриця перетворень.
Якщо в разі афінного перетворення паралельні прямі переходять у паралельні, то отримана фігура – паралелограм;
Недіагональні елементи і виконують зсув, а діагональні елементи і є масштабними коефіцієнтами. У цьому разі площа нової фігури дорівнює площі старої, помноженої на визначник перетворення.

Рис. 1.9. Перетворення одиничного квадрата
1.2. Перспективно-проекційна геометрія
Афінні перетворення

які розглядалися на початку першого розділу, є частковим випадком більш загальних, так званих перспективно проективних перетворень.
Перспективними зображеннями часто користуються художники та архітектори, оскільки ці зображення дають змогу отримати реальну картину. Побудова таких зображень зумовлює багато складностей. Однак, завдяки використанню однорідних координат, які детально описані нижче, та матриці перетворень (1.3) однаково легко можна побудувати як афінні, так і перспективно проекційні зображення.
Перспективне перетворення є, в тому випадку, коли четвертий стовпець матриці перетворень (1.3) ненульовий. Зазначимо, що в перспективній геометрії не зберігається паралельність ліній. Такі перетворення задають формулами
(1.5)
якщо коефіцієнти задовольняють умову
(1.6)
У разі перспективних перетворень, як звичайно, будують проекції на площину з деякої точки, яку називають центром проекції. Комбінація перспективної геометрії з проекційними перетвореннями утворює перспективну проекцію. Проектування виконують за допомогою прямолінійних променів, які виходять з центра проекції через кожну точку об’єкта до перетину з картинною поверхнею (поверхнею проекції), що є перетворенням зображення з тривимірного простору в двовимірний. Якщо центр проектування в нескінченності, то перспективну проекцію називають аксонометричною.
1.2.1. Однорідні координати
У загальному вигляді матриця перетворень за перспективно-проекційних перетворень має ненульовий четвертий стовпець:
. (1.7)
Щоб ліпше зрозуміти суть однорідних координат, розглянемо окремі випадки. Нехай
,
де

– нормалізований вектор.
Четвертий елемент останнього стовпця матриці перетворень тут розглядаємо як додаткову координату вектора. Після дії матриці перетворень, вектор стає вектором у загальному вигляді або вектором однорідних координат. У цьому випадку , а число є масштабним множником.
Зображення двовимірного вектора тривимірним, тривимірного – чотиривимірним, і в загальному випадку -вимірного вектора -вимірним називають однорідно координатним відтворенням. За допомогою однорідних координат -вимірний вектор відтворюється в - вимірному просторі, а саме відбувається перехід з - вимірного простору в . Обернене перетворення називають проекцією однорідних координат [5].
Однорідні координати точки визначені не однозначно, якщо – однорідні координати точки, то і при також будуть однорідними координатами цієї ж точки. Наприклад (36, 27, 18, 9); (12, 9, 6, 3); (4, 3, 2, 1) є однорідними координатами однієї і тієї ж точки (x=4, y=3, z=2).
З цього прикладу можна зробити висновок, що за допомогою елемента відбувається повна зміна масштабу: при зменшення, а при його збільшення.
Розглянемо точку тривимірного простору з координатами . Її можна описати через однорідні координати як однорідне зображення точки двовимірного вектора. Її координати будуть , звідси можна зрозуміти, що двовимірне зображення точки з координатами виглядає як її проекція на площину (рис. 1.10).

Рис. 1.10. Проекція точки на площину .
Для ліпшого розуміння поняття однорідних координат, розглянемо двовимірний випадок. Зазначимо, що в цьому разі загальна матриця перетворень матиме такий вигляд:

З’ясуємо вплив останнього стовпця матриці перетворень у двовимірному випадку.
.
Тут . Змінна h визначає площину і містить перетворені точки, які наведені в однорідних координатах. В даному випадку h утворює рівняння площини в тривимірному просторі.

Рис.1.11. Перетворення в однорідних координатах
Дію однорідних координат можна прокоментувати так. Відрізок АВ, який лежить у площині xy, спроектовано на відрізок A`B` площини . Для отримання координат (x*,y*,1) треба виконати нормалізацію (рис. 1.11)
.
Нормалізація означає, що отримано відрізок A*B*, який є проекцією відрізка A`B` на площину h=1.
Аналогічно, розглядаючи застосування однорідних координат для векторів тривимірного простору, можна зобразити тривимірний простір як проекцію чотиривимірного простору на гіперплощину , якщо
.
Ненульові елементи матриці відповідають за перспективні перетворення.

де нормалізований вектор має вигляд
(1.8)
Вплив четвертого стовпця матриці перетворень детальніше розглянуто далі.
1.2.2. Проектування тривимірних об’єктів
З’ясуємо, як відбувається презентація тривимірних зображень на двовимірній площині. Для цього потрібно володіти деякими математичними моделями. Ці моделі повинні враховувати різноманітні чинники, які впливають на візуальне сприйняття реальних образів [15].
Для того, щоб побачити на площині монітора тривимірне зображення треба вміти задати спосіб відображення тривимірних точок у двовимірні. Проекції будують за допомогою променів, що виходять з точки, яку називають центром проекції. Промені проходять через проекційну площину та через кожну точку тривимірного об’єкта і так утворюють проекцію. Тип проектування на плоску поверхню, де у як промені використовують прямі, називають плоскою геометричною проекцією. Кожну точку предмета проектують визначеним способом на проекційну площину, а її образ називають точкою проекції. Отже, якщо лінії проекції, які з’єднують точки предмета з відповідними точками проекції паралельні між собою, то маємо плоску паралельну проекцію. Якщо лінії проекції збігаються в одній спільній точці, то отримане зображення називають центральною проекцією.
Якщо змінювати положення центра проекції та площини, на яку проектуємо, отримаємо безмежну кількість фігур (або, інакше кажучи, центральних проекцій тривимірного об’єкта, які чимось будуть схожі на сам об’єкт, але й чимось відрізнятимуться). Наприклад, проектуючи правильний трикутник, можна отримати той же трикутник, але довільної форми. У разі проектування кола можемо отримати еліпс, параболу або навіть гіперболу. За такого проектування не зберігаються метричні характеристики об’єктів (їхні довжина, площа та ін.).
Постає питання, які ж властивості зберігаються в разі проектування? На це питання дав відповідь Ж.Понселе, який виокремив проективні властивості об’єктів у окремий клас і визначив відповідності між метричними властивостями об’єктів, зокрема такі:
якщо об’єкт – пряма, то після проектування отримаємо також пряму;
якщо об’єкт – конічний переріз, який описується квадратичною формою , то проекції точок конічного перерізу ляжуть також на деякий конічний переріз. Отже, окремі види конічних перерізів (коло, еліпс, парабола, гіпербола) у проективній геометрії не відрізняються, на відміну від афінної, наприклад, де еліпс завжди перейде в еліпс.
Залежно від розташування центра проекції плоскі геометричні проекції поділяють на два види: паралельні і центральні.
Якщо центр проекції є на скінченній відстані від проекційної площини, то проекція – центральна (рис.1.13). Якщо ж центр проекції віддалений до нескінченості, то маємо справу з паралельною проекцією (рис.1.12).

Рис. 1.12. Паралельна проекція Рис.1.13. Центральна проекція
1.2.3. Паралельні проекції
Найпростішою є паралельна прямокутна проекція. Відомо декілька типів паралельних проекцій. Їхня особливість – рівність нулю відповідних коефіцієнтів матриці перетворень:.
Тут точки проектуються на площину з центра, розміщеного в безмежності. Такого типу проекції в проективній геометрії часто називають аксонометричними (від грец. – зміна по осях). Їх часто використовують у кресленнях. Залежно від співвідношення між напрямами проектування і нормаллю до проекційної площини аксонометричні проекції поділяються на ортогональні, в яких ці напрями збігаються, і косокутні, у яких вони не збігаються.
Позначимо через кут, який утворюють промінь проектування та проекційна площина. Тоді якщо , то маємо косокутну проекцію, а якщо , то – ортогональну. Якщо напрям паралельного проектування на площину креслення перпендикулярний до цієї площини і площина проекції збігається з однією з координатних площин, то маємо ортогональну, або нормальну, проекцію. Очевидно, що в разі ортогональної проекції не відбувається зміни ні кутів, ні масштабів.
Приклад. Виконаємо поворот куба відносно осі х на кут 90o і спроектуємо його на площину z=0 (рис. 1.14). Зверніть увагу, що точки, які після повороту куба на 90o будуть на проекційних променях (пари A і C, B і D, E і G, F і I), після перетворення займуть однакове положення (пари A* і C*, B* і D* Е* і G*, F* і I* збіжаться в одній точці). В матричній формі ці перетворення набудуть вигляду
. (1.9)

Рис.1.14. Проекція одиничного куба на площину z=0
У випадку аксонометричного проектування зберігається паралельність прямих, а кути змінюються; вимірювання відстані вздовж кожної з координатних осей у загальному випадку потрібно виконувати зі масштабним коефіцієнтом. Тут зазначають косинуси кутів нахилу координатних осей до площини креслення, які називають коефіцієнтами спотворення [13]. Їх також можна розглядати як співвідношення довжини відрізка осі на проекції до справжньої довжини відрізка. Залежно від коефіцієнтів спотворення проекції можуть бути такі:
ізометричні, якщо коефіцієнти спотворення по всіх трьох осях однакові;
діметричні, якщо коефіцієнти спотворення по двох будь-яких осях рівні (а по третій відрізняються від двох перших);
триметричні, якщо всі три коефіцієнти спотворення по осях різні.
Перетворення аксонометричної проекції у відповідну нульову площину завжди містить нульовий стовпець. Цей нульовий стовпець означає площину проекції. Такі проекції ще називають ортографічними. Їх досить часто використовують у кресленні.
Під час проектування зображення зміщується по осі z на m одиниць, після чого проектування відбувається в площині z = 0. Наприклад, таку проекцію отримують з тривимірного простору на площину за допомогою таких дій:
.
У випадку ортогонального аксонометричного проектування матриця перетворень виконує лише обертання, отже координатні осі залишаються ортогональними під час проектування. Тому для отримання вигляду фігури її треба попередньо повернути навколо осей координат, а потім застосувати ортогональну проекцію. Розглянемо композицію обертання навколо осі і , у наслідок чого отримаємо

. (1.10)
Використаємо матрицю перетворень (1.10), розглянемо, у що перетворились одиничні вектори , відкладені на осях координат, а саме знайдемо їхні образи

Спроектуємо отриману фігуру на площину . У цьому разі - координати всіх точок дорівнюватимуть нулю. Знайдемо довжини всіх образів одиничних векторів

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

Після нескладних обчислень отримаємо правило вибору кутів повороту
. (1.11)
Ми вже згадували, що в разі діметричної проекції дві з трьох осей однаково скорочені, а саме – з трьох кутів між нормаллю до площини проекції та головними координатними осями два кути однакові. На рис. 1.15 зображена діметрична проекція одиничного куба. Запропоновано регламентоване розташування осей і коефіцієнтів спотворення. Часто замість коефіцієнта спотворення 0,94 використовують 1, а замість 0,47 – 0,5.

Рис.1.15. Діметрична проекція
Отже, будь-яка комбінація кутів обертання в матриці перетворень, яка задовольняє умову (1.11), відповідатиме діметричній проекції. Це означає, що для отримання діметричної проекції кути обертання необхідно підбирати саме такі, які задовольняють умову (1.11). Одним з варіантів такого підбору можна підібрати коефіцієнти, які дають мінімальне спотворення будь-якого зображення

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

Звідси отримаємо дві тотожності
.
Прирівнюванням їх можна отримати значення кутів для створення ізометричної проекції

(1.12)
Отже, у загальному сенсі отримано проекцію зі зміною масштабу:

З описаного вище можна зробити висновок, що в разі ізометричної проекції зменшення вздовж всіх координатних осей однакові, тому можна виконати вимірювання вздовж напрямів осей з одним і тим же масштабом (звідси й назва „ізометрія”). На рис.1.16 зображена ізометрична проекція одиничного куба. За такого проектування площина проектування нахилена до всіх головних координатних осей під однаковим кутом. Стандартом прийнято вважати коефіцієнт спотворення, 0,82, і кути 120о.
Будь-яка проекція має свої переваги і недоліки (спотворення розмірів зображення по одній з осей, неоднаковість зменшення розмірів по різних осях, приховування одних точок іншими), тому кожну з них використовують там, де це найзручніше: ортографічна – тільки для перенесення і проектування, ортогональна – для обертання і проектування. У разі діметричної проекції зображення по осі y має натуральний розмір, а по осях x і z воно однаково скорочене (на екрані розмір лінії по x і y зменшено в А разів щодо натурального розміру на об’єкті); у випадку ізометричної проекції зображення по трьох осях скорочено однаково.

Рис.1.16. Ізометрична проекція
Коротко розглянемо на косокутні проекції [20]. Їхніми прикладами є проекції Кавальє та Кабіне, в яких дві осі зберігають взаємну перпендикулярність та початковий масштаб. Щодо третьої осі, то вона нахилена до горизонталі. Загальна матриця перетворень має вигляд
,
де – коефіцієнт спотворення (у разі ортографічної проекції ).
У проекції Кавальє третя вісь зберігає масштаб довжини , а кут , матриця перетворень має такий вигляд:
.
У проекції Кабіне третя вісь скорочена вдвічі: а кут , тому матриця перетворень має такий вигляд
.
1.2.4. Центральні проекції
Центральна перспектива є тоді, коли хоча б один з коефіцієнтів матриці перетворень не дорівнює нулю.
Розташуємо осі координат, проекційну площину і центр проекції так, як показано на рис. 1.17. Уважаємо, що проекційною площиною може бути екран комп’ютера, на якому треба відобразити нескінченну кількість точок тривимірного об’єкта. У цьому разі прямі після перетворення переходять у прямі на проекційній площині. Завдяки цій властивості центральної перспективи можна проектувати (а саме обчислювати) тільки для граничних точок відрізків, а потім з’єднувати проекції точок лініями вже на площині.
Розглянемо точку , розміщену за проекційною площиною на відстані і її проекцію на екран. Розташуємо спостерігача в точці , яка є на осі на відстані від екрана (проекційної площини) з координатами . Визначимо координати точки на екрані. Позначимо їх через . З подібності трикутників та випливає, що
, (1.13)
аналогічно для x:
.

Рис. 1.17. Центральна перспективна проекція
Ці ж координати можна отримати за допомогою матричних перетворень при та перспективним проектуванням на площину або з центра, розміщеного в точці .
, (1.14)
де

– нормалізовані координати при . У цьому випадку такі перетворення не є афінними, оскільки тут не зберігається ортогональність осей. Спостерігаючи за центральною проекцією, легко збагнути отримання паралельних проекцій, для цього треба помістити точку в безмежність .
У наслідок проектування на будь-яку площину втрачають багато цінної інформації, яка може бути корисною для розуміння центральної проекції. Розглянемо перетворення
, (1.15)
пам’ятаючи, що

є нормалізованими координатами при .
Застосуємо описані вище пертворення до відрізка АВ, розміщеного на прямій, що паралельна до осі Z. Точка А перейде у точку А* а точка B – у точку В*, унаслідок чого отримаємо відрізок А*В*. Спроектуємо А*В* на проекційну площину z=0, і отримаємо відрізок CD. На підставі дослідження цих перетворень, (рис.1.18), зробимо низку корисних висновків.

Рис.1.18. Проекція відрізка на проекційну площину
Точка початку координат є незмінною:
.
Точка в безмежності на осі з координатами переходить у скінченну точку на цій же осі, називатимемо її точкою збіжності і позначимо буквами VP (Vanishing Point), що розташована на відстані від початку координат. Існує нескінченна множина точок збіжності.
.
Лінії (на рис.1.18 це лінія ), які спочатку були паралельні до осі , після перетворення перестають бути паралельними до осі (лінія і проходять через точку збіжності .
Якщо результати перетворень спроектувати на площину , то отримаємо центральну перспективну проекцію (на рис.1.18 лінія ), причому центр проекції є на тій же осі, що й точка збіжності , на однаковій відстані з протилежного боку проекційної площини. Отже, якщо точка є на осі в точці , то центр проекції є в точці .
Залежно від того, скільки координатних осей перетинаються проекційну площину, або скільки є точок збіжності, розрізняють одно-, дво- і три- точкові проекції.
1.2.5. Неозначені точки
Перш ніж розглядатимемо одно-, дво- та три- точкові проекції, детальніше ознайомимося з неозначеними точками, які розміщені в безмежності. Деякі точки, невизначені в n-мірному просторі, стають визначеними в разі переходу до однорідних координат. Наприклад, однорідний вектор у тривимірному просторі відповідає безмежно віддаленій точці . Оскільки в однорідних координатах цю точку можна зобразити у вигляді при , то в тривимірному просторі це відповідає точці , яка є точкою безмежно віддаленою на осі z. Отже, однорідний вектор (1,0,0,0) відображає точку в безмежності на осі , однорідний вектор (0,1,0,0) – точку в безмежності на осі . Як звичайно, двовимірний однорідний вектор описує точку в нескінченності на лінії .
Розглянемо такий приклад. Нехай дано три невизначених точки в безмежності (A, B, C) на осях ОХ, OY, OZ, відповідно, з координатами (1,0,0,0), (0,1,0,0), (0,0,1,0) і нехай задана матриця перетворень (1.7) з ненульовими коефіцієнтами в четвертому стовпці (триточкова перспектива). Внаслідок перетворень отримаємо три означені нормалізовані точки (A*, B*, C*)
х==.
Так неозначена точка A перетворюється в означену точку A* з координатами ; точка B – в точку B* ; а точка С – в точку C* .
Точки (A*, B*, C*) утворюють три точки збіжності VP1, VP2, VP3. Прямі, які були спочатку паралельні до осі , після перетворення збігаються в точці VP1. Те ж саме відбувається і з прямими, що перед перетворенням були паралельні до осей і , вони, відповідно, збігаються в точках VP2 і VP3.
У разі одноточкової перспективи, внаслідок перетворень отримаємо лише одну точку збіжності на осі . Точки B і C перетворились у точки B* і C* . Отже, прямі, які перед перетворенням були паралельні, відповідно до осей і , залишились паралельними і після перетворення.
1.2.6. Одноточкова перспективна проекція
Суть цього проектування полягає в такому: чим глибше предмет, тим більше значення z-координати і знаменника rz+1, тим меншим виглядає предмет на площині проекції. Перспективні перетворення з однією точкою збіжності VP, відповідно, на осях х, y, z матимуть вигляд
, (1.16)
, (1.17)
. (1.18)
Такі перетворення називають одноточковими, або паралельними, перспективними перетвореннями.
Приклад. Відобразимо одиничний куб з вершинами, (A,B,C,D,E,F,G,I) (рис.1.19) на площину z = 0. Приймемо на осі z значення k = -10 і, отримаємо = -1/10 = -0,1. Запишемо матричні перетворення вершин куба (A,B,C,D,E,F,G,I), одержимо нормалізовані координати проекції (A*,B*,C*,D*,E*,F*,G*,I*). Застосовуємо формулу (1.18) для отримання одноточкової перспективної проекції
.
Після перетворення отримаємо проекцію на площині xy, яка зображена на рис. 1.19,б). Якщо центр ваги куба є в точці (0, 0, 0), то проекція набуде вигляду, як зображено на рис. 1.19 в). Отже, якщо точка спостереження розміщена на лінії, перпендикулярної до передньої грані одиничного куба в її центрі, то одноточкова перспектива не зазнає спотворення.

а б в
Рис.1.19 Одноточкова проекція одиничного куба
Тут усі бічні площини перетинаються в одній точці збіжності (VP) на горизонтальній лінії, яка розташована на рівні очей. Передня і задня площини куба є паралельними до площини зображення і не перетинаються.
1.2.7. Двоточкова перспективна проекція
Якщо два елементи в четвертому стовпці матриці перетворення ненульові, то маємо двоточкову або кутову, перспективу. У разі двоточкової перспективи є дві точки збіжності на відповідні осі. При отримаємо дві точки збіжності – на осі ОХ і осі ОY. По осі ОZ відбувається паралельне проектування, де нормалізований вектор має вигляд

Зміною можна регулювати VP1, VP2 точки збіжності на осі OX (x=) і на осі OY (y=). На рис. 1.20,а зображена двоточкова перспективна проекція одиничного куба на площину z = 0 при . Тут координати вузлів фронтальної і задньої частини куба збігаються, тому проекція інформаційна. Іншого типу проекцію (див. рис.1.20б) отримаємо, якщо попередньо відцентруємо вісь z щодо фронтальної площини.

а б
Рис. 1.20. Двоточкова перспективна проекція
Двоточкова перспектива матиме точки сходження на осях OX і OZ у разі ненульових першого і третього коефіцієнтів останнього стовпця матриці перетворень , а на осях OY і OZ – при .
Для того, щоб отримати інформаційну двоточкову перспективу, треба спочатку повернути зображення відносно осі y на деякий кут і змістити на деяку точку (0,,,1). Точка спостереження повинна бути на осі z на заданій відстані, а проектування – відбуватись на площину z=0.
= (1.19)
Унаслідок таких перетворень отримано двоточкову перспективну проекцію. Тут ненульовими є перший і третій коефіцієнти четвертого стовпця матриці перетворень, На рис. 1.21 зображена проекція одиничного куба на площину z = 0, отримана за допомогою перетворень (1.19), що є результатом обертання навколо деякої осі та перенесенням на деяку точку.
Лінії, які спочатку були паралельні до осей OX, перетинаються в першій точці збіжності VP1 (бо ), а ті, які були паралельні осі OZ – у другій VP2 (). Лінії, які були паралельні до осі OY, залишились паралельними ().

Рис. 1.21. Двоточкова перспективна проекція
1.2.8. Триточкова перспективна проекція
У разі перших трьох ненульових елементів у четвертому стовпці матриці отримаємо триточкову або косу перспективу з трьома точками збіжності, відповіднО на осях ОХ, ОY і ОZ.

На рис. 1.22 зображена триточкова перспективна проекція одиничного куба на площину z = 0 при

а б
Рис. 1.22. Триточкова перспективна проекція
Інформаційну триточкову перспективу, як і у випадку двоточкової перспективи, з точкою спостереження на осі z, можна отримати шляхом обертання навколо двох різних осей. Тут треба спочатку повернути зображення відносно осі y на деякий кут , А потім навколо осі х на кут і змістити на точку (,,,1). Точка спостереження повинна бути розташована на заданій відстані, а проектування – відбуватись на площину z=0.
Результатом є ненульові перші три коефіцієнти четвертого стовпця матриці перетворень, які й визначають перспективу. На рис. 1.22 зображена проекція одиничного куба на площину z=0 за допомогою перетворень (1.20). Зазначимо, що лінії, які спочатку були паралельні до осей OX OY і OZ, перетинаються в кожній з трьох точок збіжності VP1,VP2 і VP3
хх= (1.20)

РОЗДІЛ 2. ПРОСТОРОВІ КРИВІ
У багатьох випадках необхідне попереднє опрацювання інформації перед її виведенням на графічний пристрій. Як звичайно існує якась множина точок на площині, через які треба побудувати криву. Головно є два шляхи інтерпретації кривих. Перший полягає в такому: потрібно, щоб задані точки належали самій кривій. У такому випадку застосовують справу з інтерполяційні методи (рис. 2.1).
Другий шлях передбачає, що крива має проходити близько від заданих точок, які не обов’язково повинні лежати на кривій. У цьому разі маємо методи апроксимації (рис. 2.2).

Рис. 2.1. Інтерполяція Рис. 2.2. Апроксимація
За допомогою методів апроксимації, які забезпечують згладжування, можливо виділити найсуттєвіше, поліпшити не тільки математичне, а й естетичне зображення інформації. Методи апроксимації відіграють важливу роль і під час аналізування функцій. Сучасні пристрої графічного введення і виведення разом зі швидкодійними ЕОM дають змогу математику не тільки бачити результати, а й оперативно втручатись в процес обчислень, вибирати інші вузли, змінювати клас функцій, контролюючи точність наближення [32].
Проблема наближення функцій виникає досить часто, зокрема в разі введення в комп’ютер функціональних залежностей, попередньо отриманих унаслідок експерименту та під час виведення інформації на графічний пристрій. У разі конструювання кривих і поверхонь провідну роль відіграють такі критерії як зовнішній вигляд, гладкість кривої, осциляції та ін.
Оскільки проектовані об’єкти мають, як звичайно, складну форму, яку не можна описати за допомогою простих аналітичних функцій, тому їх зручно описувати частинами. В наступних параграфах розглянемо геометрію просторових кривих, властивості окремих сегментів і складених кривих.
2.1. Геометрія просторових кривих
2.1.1. Параметричне і непараметричне зображення кривих
Математичну криву можна зобразити у параметричній або непараметричній формі. Відповідно непараметричну криву можна описувати у вигляді явної або неявної функції. Для просторової кривої явне зображення має вигляд

Просторову криву можна виразити також у неявній формі. В цьому випадку вона математично зображена перерізом двох поверхонь, заданих співвідношеннями

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

Для кривої з одним параметром радіус-вектор точки на кривій визначають так:
.
Параметричне зображення має деякі переваги над непараметричним. Параметричні функції використовують для рисування замкнених кривих і кривих з багатьма значеннями за заданої незалежної змінної. Оскільки точку на параметричній кривій характеризують значенням параметра, то параметрична крива є осенезалежною. Довжина кривої визначена діапазоном зміни параметра. Це часто застосовують для нормалізації параметра так, щоб параметрична крива була визначена при . Завдяки незалежності від осей параметрична крива легко перетворюється в криву того ж виду, але з іншою орієнтацією. Це дає змогу завдяки використанню методів матричного множення виконувати зміну масштабу, відображення, перенесення, обертання, а також отримувати перспективні проекції.
Просторову криву називаємо регулярною ( разів диференційованою), якщо кожна точка цієї кривої має окіл, який допускає регулярну параметизацію.
,
де – регулярні ( разів диференційовані) функції. При криву називають гладкою.
Постає питання: які повинні бути параметричні функції, щоб бути параметричними рівняннями деякої кривої? На це питання дає відповідь відомий факт. Якщо

– регулярні функції, які задовольняють умову
,
тоді

є параметричними рівняннями деякої кривої. Ця крива є образом відрізка при локальному топологічному відображенні, яке точці відрізка ставить у відповідність точку простору з координатами .
2.1.2. Дотична, головна нормаль і бінормаль до кривої
Виберемо точку P на заданій кривій L і проведемо через цю точку пряму g. Виберемо на кривій ще одну точку Q, позначимо через d і h, відповідно, відстані між точками P і Q та між точкою Q і прямою g.

Рис. 2.3. Дотична до кривої L в точці P
Називатимемо пряму g дотичною до кривої L в точці P, якщо при (рис. 2.3).
Якщо крива L в точці P має дотичну, то пряма PQ при збігається до цієї дотичної. Навпаки, якщо пряма PQ при збігається до деякої прямої g, то ця пряма є дотичною. Зауважимо, що відношення є синусом кута, який утворюється прямими g і PQ.
Гладка крива L має в кожній своїй точці єдину дотичну. Якщо – векторне рівняння кривої, то дотична в точці P, яка відповідає значенню параметра t, має напрям вектора .
На кривій лінії можуть бути точки, які мають дві порізно напрямлені дотичні, що не належать одній прямій, а утворюють між собою якийсь кут. Якщо на кривій L в точці P кут між дотичними не дорівнює , то точку P в цьому випадку називають точкою зламу.
Знаючи напрям дотичної, складемо її рівняння. Справді, якщо крива задана векторним рівнянням , то вектор довільної точки на дотичній можна подати наступним чином
, (2.1)
що є рівнянням дотичної в параметричній формі.
Позначимо одиничний дотичний вектор через
.
Отже, дотична до кривої в точці - є прямою лінією, яка проходить через точку і має напрям . Рівняння цієї дотичної має вигляд
,
де - відстань між точкою на дотичній та точкою дотику.
Замінимо векторне рівняння (2.1) трьома скалярними рівняннями дотичної
,
або в еквівалентній формі
.
Для просторової кривої нормальним вектором є будь-який вектор, перпендикулярний до дотичного вектора . Якщо – одиничний вектор, то вектор є перпендикулярним до вектора . Одиничний вектор , напрям якого збігається з напрям , називають вектором головної нормалі.
Векторний добуток визначає третій вектор, який є перпендикулярний до і , його називають вектором бінормалі .
Три вектори , і утворюють правосторонню трійку взаємно ортогональних одиничних векторів , , . Площини, які проходять через задану точку на кривій і містять вектори і , і , і , відповідно, називають дотичною, нормальною та бінормальна площинами [14].
2.1.3. Кривина, закручування кривої та формули Френе
Якщо регулярна крива задана рівнянням
,
то довжина її дуги визначена формулою
.
Отже, плоску криву лінію можна розглядати як траєкторію руху точки в площині; точка рухається по дотичній до кривої лінії, обходячи цю криву без ковзання.
Рух точки вздовж кривої L пов'язаний з безперервною зміною двох величин: відстані S, на яку віддалена точка від початкового положення, і кута ?? повороту дотичної щодо початкового положення.
Якщо зі збільшенням шляху S безперервно збільшується і ??, то криву називають простою.
Виберемо дві точки P і Q на заданій кривій L. Позначимо через ?? кут між дотичними до кривої в точках P і Q, а – довжину дуги відрізка PQ кривої (рис. 2.4).

Рис. 2.4. Кривина кривої L
Кривиною кривої L називають границю відношення , коли точка
Отже, кут ?? між дотичними в двох нескінченно близьких точках кривої, віднесений до довжини дуги між цими точками, визначає ступінь викривлення кривої лінії, а саме – кривину кривої.
Кривина прямої в будь-якій її точці дорівнює нулю. Кривина довільної кривої лінії в різних точках різна, в окремих точках вона може дорівнювати нулю.
Регулярна (двічі неперервно - диференційована) крива має в кожній точці визначену кривину Якщо параметром є довжина і , то
.
Пов’яжемо одиничний вектор головної нормалі з кривиною :
.
А для кривої, яка задана векторним рівнянням маємо
,
або
.
Для плоскої кривої, розташованої в площині
.
Радіус кривини обчислюють за формулою
.
Знайдемо всі криві, які мають в кожній точці кривину рівну нулю. Запишемо
.
Звідси , а отже , де - постійні вектори.
Отже, крива, кривину якої є всюди рівна нулю, є або прямою, або відкритим відрізком прямої.
У випадку просторової кривої вектор бінормалі не буде сталою величиною. Щоб визначити характер цієї закрученої кривої, треба обчислити похідну , для плоскої кривої =0. Зазначимо, що скалярний добуток векторів а звідси звідки отримуємо , оскільки З огляду на те, що – одиничний вектор, . Тому вектор перпендикулярний до і , а отже, він колінеарний вектору . Прийнято записувати
,
де називають закручуванням кривої. Оскільки то

Звідси випливає, що крива має додатне закручування, якщо закручування нормалі до кривої з дотичної площини відбувається за додатним напрямом вектора
Отже, ми навели всі головні рівняння диференціальної геометрії для просторових кривих. Нижче опишемо ці рівняння для кривої, у якій використано природну параметризацію. Ці рівняння в сукупності відомі як формули Френе:

(2.2)
2.2. Побудова плоских кривих
Розглянемо різноманітні плоскі криві та методи їхнього математичного опису на площині. Розпочнемо з означення кривої. Таких означень можна навести декілька.
У нарисній геометрії криву розглядають як траєкторію, описану точкою, що рухається. Її можна також описати як лінію перерізу двох поверхонь або як множину точок, яка має будь-яку спільну властивість.
В основі класифікації кривих є природа їхніх рівнянь. Криві поділяють на алгебричні та трансцендентні залежно від їхніх рівнянь.
Крива лінія, зображена в декартових координатах рівнянням n-го степеня, називають алгебричною кривою n-го порядку. Порядок плоскої алгебричної кривої лінії визначений найбільшою кількістю точок її перетину прямою лінією. Розглянемо декілька прикладів алгебричних кривих ліній, які отримуємо в разі перерізу поверхні прямого кругового конуса площинами, що по-різному розташовані стосовно його осі. Такі криві називають конічними січеннями.
2.2.1. Конічні переріз
Конічне переріз – це деяке геометричне місце точок, для кожної з яких співвідношення відстані між точкою і фокусом та відстані між точкою і директрисою дорівнює деякому додатному числу (ексцентриситету) Якщо в цьому разі <1, то конічне січення є еліпсом, якщо >1, то – гіперболою, якщо =1, то – параболою.
Конічні січення можна описати неявною кривою другого степеня:
. (2.3)
Рівняння (2.3) описує еліпс, параболу чи гіперболу залежно від значення дискримінанта Крива буде параболою при еліпсом або колом при , і гіперболою при
Парабола–крива другого порядку, пряма перетинає її в двох точках (рис. 2.5,а). Точку F і пряму АN, відповідно називають фокусом та директрисою. Для кожної точки М(x,y), що належить параболі відстань FM=MN.
Параболу можна визначити також як лінію січення прямого кругового конуса площиною, яка не проходить через вершину конуса і паралельна до будь-якої його дотичної площини (рис. 2.5,б). В декартовій системі координат канонічне рівняння параболи в непараметричній формі має вигляд

де р – відстань від фокуса до директриси. Нижче наведемо параметричні зображення параболи
та

а) б)
Рис. 2.5 Парабола
Гіпербола – це множина точок М площини (рис.2.6,а) для яких різниця відстаней (по абсолютній величині) F1M і F2M є постійною величиною:
F1M - F2M=2а<2с.
Середину відрізку F1F2 називають центром гіперболи: .

а) б)
Рис. 2.6.Гіпербола
Гіперболу можна визначити також як лінію перерізу прямого кругового конуса площиною, що складається з двох незамкнених гілок, які простягаються в безмежність і лежать на двох порожнинах конуса (рис.2.6,б).
Рівняння гіперболи в прямокутній системі координат 0ху, на осі 0х якої є фокуси гіперболи, має канонічний вигляд

де – довжини півосей. Рівняння в параметричній формі такі:
або
Еліпс – це множина точок М площини (рис. 2.7,а), для яких сума відстаней МF1 і МF2 є сталою, F1 і F2 точки фокусів еліпса.
МF1 + МF2 =2а.
Середина відрізка F1F2 фокусної відстані називають центром еліпса.
Еліпс можна визначити також як замкнену овальну лінію перерізу прямого кругового конуса площиною, яка не проходить через вершину конуса і перерізає всі прямолінійні твірні однієї порожнини цього конуса (рис. 2.7,б). У декартовій системі координат канонічне рівняння еліпса має вигляд

де – довжини великої і малої півосей еліпса. При фокуси F1 і F2 збігаються і це рівняння визначає коло (рис. 2.7, в), яке розглядають як частковий випадок еліпса.

а) б) в)
Рис. 2.7.Еліпс
Параметричне зображення еліпса з центром у початку координат та з параметром має такий вигляд:

У випадку кола, коли , де – радіус кола, параметричне зображення набуває вигляду

2.2.2. Трансцендентні криві
Трансцендентні криві, на відміну від алгебричних, можуть мати нескінченну кількість точок перетину з прямою, точок перегину, вершин тощо.
Приклад такої функції – синусоїда у=sin x, графіком якої є неперервна крива лінія з періодом . Поряд з цим у трансцендентних кривих можуть бути характерні точки, які не існують в алгебричних кривих: кутові (точки злому), асимптотичні точки та ін. Найпростішими прикладами трансцендентних кривих слугують графіки логарифмічних, показникових, тригонометричних функцій, а також усі спіралі, циклоїди та ін.
2.3. Кубічні сплайни
Розглянемо задачу проведення гладких кривих через задані точки (задачу інтерполяції). Оскільки, через дві точки можна провести скільки завгодно гладких кривих, то для розв’язування цієї задачі необхідно обмежити клас функцій, які визначатимуть шукану криву [1].
Перш ніж вивчатимемо сплайни детальніше проаналізуємо поняття інтерполяції. Для цього розглянемо такий приклад. У табл. 2.1 наведено дані про зростання населення США кожних десять років.
Зростання населення США Таблиця 2.1.
Рік
1930
1940
1950
1960
1970
1980

Насел. ( тис. осіб)
123,203
131,669
150,697
179,323
203,212
226,505


Нехай потрібно визначити кількість населення у 1965 або 2000рр. Це можна легко з’ясувати з інтерполяційної кривої (рис. 2.8).

Рис. 2.8. Крива зростання населення США
Інколи функцію варто шукати у вигляді

Якщо параметри () визначають з умови збіжності з наближеною функцією в точках , які називають вузлами інтерполяції
,
то такий спосіб наближення є інтерполюванням.
Серед способів інтерполювання найпоширенішим є випадок лінійного інтерполювання, коли наближення шукають у вигляді [19]
,
де – фіксовані функції. Значення коефіцієнтів визначають з умови збіжності з функцією, що наближається в вузлах інтерполяції :

Найчастіше маємо інтерполювання поліномами
,
а система рівнянь набуде вигляду

Твердження. Нехай такі, що і , тоді існує один поліном степеня не вище , такий, що
Зазначимо, що є декілька вимог, що їх повинні задовольняти інтерполяційні криві.
1. Якщо крива складається з окремих частин, то постає питання гладкого переходу від однієї частини до іншої.
2. Якщо крива є частиною загального рисунка, з яким можуть відбуватися трансформації (наприклад, повертання на кут), то форма кривої повинна також змінюватись.
3. Кожна невелика зміна окремої точки, що належить кривій, призводить до перерахунку всієї кривої.
4. Сумарна крива повинна не мати значних осциляцій.
Під час побудови таких кривих потрібно обчислювати дотичні, нормалі, кривини тощо, тому необхідна така параметризація, за якої легко виконувати операції диференціювання. В цьому випадку зручно вибрати поліноми від деякої кількості параметрів. Чим складніші криві, тим вони потребують вищого степеня поліномів для їхнього опису. Однак, такі поліноми потребують великої кількості коефіцієнтів і можуть спричинити небажані осциляції кривої.
Сплайнами називають функції, які використовують для апроксимації кривих. Їхньою важливою властивістю є простота обчислень. Надалі розглядатимемо кубічні сплайни.
Слово «сплайн» прийшло до нас з галузі машинобудування, де сплайном називали гнучку лінійку, яку закріплювали в потрібних місцях, так можна було домогтися плавності кривої, яку викреслювали вздовж цієї лінійки. Форма лінійки, якщо її розглядати як функцію , задовольнятиме рівняння Ейлера – Бернулі: , де M(x) – момент згину вздовж рейки: E – модуль Юнга, який залежить від властивостей матеріалу рейки, I – момент інерції, визначений формою кривої. Якщо зафіксувати деякі точки, то момент згину на кожному відрізку змінюється за лінійним законом: . Підставимо останній вираз у вихідне рівняння й отримаємо:
,
двічі проінтегруємо й отримаємо рівняння кривої на заданому відрізку
,
отже, форму фізичного сплайна описує кусковий кубічний поліном.
Математичний опис сплайну є кусковим поліномом степеня з неперервними похідними порядку в місцях з’єднання між сегментами. Отже, кубічний сплайн, який найчастіше використовують на практиці, має в місцях з’єднання неперервність другого порядку[21].
2.3.1. Сплайнова функція однієї змінної
Нехай функція визначена на інтервалі [a,b] і є вузлами на проміжку [a,b].
Кубічний сплайн, задовольняє такі співвідношення:
є кубічним поліномом, а є кубічним поліномом на кожному інтервалі
;
;
;
.
Три останні умови забезпечують умову неперервності та неперервність похідних. На краях повинні виконуватися граничні умови, наприклад, таких:
1.
2.
3.
Нехай – кубічний поліном, який є частиною S на інтервалі

Поліноми і інтерполюють ту ж саму величину в точці так, що

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

і може бути виражена рівнянням прямої між і
,
де .
Проінтегруємо двічі останню формулу
.
Тут C, D – сталі інтегрування, які можна визначити з рівнянь

.
Отже, отримаємо систему
(24)
Далі визначимо . Це можна зробити з неперервності
.
Візьмемо похідну, підставимо значення для , після деяких спрощень отримаємо
;
.
Приймемо і отримаємо

З останньої системи можна отримати таку тридіагональну систему
,
де

Цю систему можна розв’язати деяким чисельним методом, наприклад, Гаусса для тридіагональних систем. Для розв’язування системи повинно виконуватись
Звернемо увагу на вибір Якщо , то маємо природний кубічний сплайн, тоді рівняння (2.4) набуде вигляду.
.
де .
Зазначимо, що природні кубічні сплайни породжують найгладкіші інтерполяційні функції.
Нехай Якщо є природним сплайном, який інтерполює в точках ,
.
Крива, описана фізичним сплайном, мінімізує енергію його внутрішніх напружень. Така крива має мінімальну середньоквадратичну кривину, це означає, що вона є найгладкішою з тих, які проходять через задані точки. В декартових координатах крива мінімальної енергії мінімізує такий інтеграл, узятий між її кінцями.
.
Якщо припустити, що уздовж всієї довжини сплайна, то можна отримати значно простішу задачу мінімізації інтеграла
.
Розглянемо приклади
Приклад 2.1 Визначити всі величини, , для яких наведені нижче функції є кубічними сплайнами:

що інтерполюють такі дані
x
0
1
4

y
26
7
25

Для розв’язування прирівняємо значення функцій у точці .

а також у точці
Отже, треба, щоб справджувались рівності a=c=d. Для того, щоб виконувалась інтерполяція, потрібно

Приклад 2.2. Із застосуванням кубічних сплайнів визначити наближене значення для функції за допомогою такої таблиці.
x
2,2
2,4
2,6

f(x)
0,5207843
0,5104147
0,4813306


Для кожного проміжку запишемо (рис.2.9)



Рис. 2.9. Визначення наближеного значення функції
Знайдемо :


Остаточно отримаємо

2.3.2. Сплайнова функція в тривимірному випадку
У випадку непараметричного, функціонального зображення кривої [1]

можливі виникнення багатозначності в разі самоперерізів і незручностей, якщо значенні похідних дорівнюють . Щоб уникнути цих незручностей, шукатимемо функцію в параметричному вигляді. Нехай – незалежний параметр, такий, що .
Кубічним параметричним сплайном називають систему рівнянь[22]

Координати точок на кривій описувані вектором, а три похідні задають координати відповідного дотичного вектора в точці. Наприклад, для координати
.
У векторному вигляді ці рівняння, які описують сегменти кривих, можна записати так:
, (2.4)
де коефіцієнти – вектори, які визначають за допомогою граничних умов для одного сегмента. Один зі способів задання параметричного кубічного сплайна – задання координат початкової і кінцевої точок, а також векторів, які є дотичні в них, а саме – знаходження і на обох кінцях сегмента. Такий спосіб задання називають формою Ерміта. Задамо спочатку перший сегмент . Позначимо кінцеві точки через і , а дотичні вектори в них – через і .
У середині кубічного сегмента параметр змінюється між двома значеннями кінцевих точок і . Для спрощення запису покладемо . Запишемо граничні умови для першого сегмента
(2.5)
або

З цієї системи легко знайти коефіцієнти .
(2.6)
Підставимо значення коефіцієнтів в векторне рівняння
. (2.7)
Розглянемо випадок, коли треба з’єднати два кубічні сплайни і в одну криву. Для першого сегмента параметр змінюється між значеннями і , а для другого – між і .
(2.8)
Це означає, що нам задано три точки , , і дотичні вектори в кінцевих точках і . Зазначимо, що дотичний вектор у точці з’єднання нам невідомий.
Для забезпечення неперервності другого порядку в разі кубічного сплайну треба накласти умови сталості кривини у точці з’єднання двох сегментів, а саме – неперервності другої похідної в точці з’єднання:
,
або
(2.9)
підставляючи (2.4) у (2.9), отримаємо
(2.10)
З цього рівняння можна визначити невідоме Після перегрупування членів і нескладних перетворень, рівняння (2.10) можна подати у вигляді

У загальному випадку, якщо маємо сегментів, то для знаходження дотичного вектора в точці з’єднання сегментів маємо рівняння з невідомими , за умови, що і нам задані. Дотичні вектори використовують для знаходження коефіцієнтів, які для кожного криволінійного сегмента можна подати у матричному вигляді.
(2.11)
Дослідження гладкості кривої
Гладкість означає, що в разі моделювання на кривій не утворюється петель і різких переломів (розривів). Однак не виключена можливість створення згинів і гострих кутів. Прикладом такої комбінації гладких кривих і гострих зломів є профілі авіакрила. Отже, якщо дотична в сусідніх точках раптово не змінює свого напряму, то таку криву вважають гладкою.
Як вже згадувано, для досягнення неперервності між сегментами у внутрішніх точках треба накласти умови сталості кривини. Проте накладання тільки таких умов не забезпечує гладкості сплайну загалом, а саме – мінімуму кривини вздовж усієї кривої.
Передусім чергу гладкість кривої залежить від правильного вибору діапазону зміни параметрів Діапазон зміни параметра можна вибирати різними шляхами. Якщо точки, через які повинна проходити крива розташовані нерівномірно, то рекомендують вибирати діапазон зміни параметрів такими, що дорівнює довжинам хорд між суміжними точками.
Одним з традиційних методів задання діапазону параметра – це його нормалізація, а саме приймання для кожного кубічного сегмента, що значно спрощує задачу, оскільки системи (2.10) і (2.11) зводяться до вигляду
, ,
або
,
де матрицю називають матрицею Ерміта, а – геометричний вектор Ерміта.
Криву, задану в формі Ерміта, легко змінювати, якщо враховувати, що напрям вектора дотичної задає початковий напрям, а модуль вектора дотичної задає ступінь витягання кривої в напрямі цього вектора. Як відомо, похідні і пропорційні до одиничних дотичних векторів і на кінцях кривої, а саме
.
Якщо одночасно зростають, то крива стає повнішою, якщо ж зростає тільки (рис. 2.10, а), то напрям кривої на більшій частині її довжини збігається з напрямом , після чого крива різко повертається і починає рухатись уздовж вектора (рис. 2.10,б). У разі великих значень виникають залами і петлі на кривій (рис. 2.10,в)

а) б) в)
Рис. 2.10. Вплив коефіцієнтів на форму кривої
2.3.4. Граничні умови
Залежно від того, яку криву хочемо отримати, можна передбачити різні варіанти задання граничних умов. Як уже зазначено в 2.3.2, для того, щоб однозначно визначити невідомі , необхідно мати задані і .
Якщо дотичні вектори і задані безпосередньо, то таку граничну умову називають закріпленою граничною умовою, або фіксованим сплайном. Унаслідок усіх підстановок одержуємо квадратну тридіогональну матрицю. З отриманої системи легко можна знайти дотичні вектори .
Можна задати інші граничні умови на краях кривої, наприклад
(2.12)
Таку умову називають слабкою граничною умовою. Вона збільшує кількість ненульових елементів в сумарній матриці, проте також приводить до тридіогональної матриці.
Для отримання замкнених кривих або кривих, які періодично повторюються, використовують циклічні та ациклічні граничні умови. Циклічні граничні умови передбачають рівність нахилів і кривини в першій та останній точках:
(2.13)
У цьому випадку, сумарна матриця вже не є тридіогональною.
У разі задання ациклічних граничних умов отримаємо сплайн, подібний циклічному.
(2.14)
Сплайни такого типу використовують для отримання паралельних кінцевих ділянок з дотичними векторами, які є однакові за модулем, але протилежні за напрямом.
2.4. Кубічні сплайни Без’є
Крива Без’є визначена вершинами чотирикутника, який єдиним способом задає її форму. Кривій належить перша і четверта вершини, а інші вершини характеризують похідні, порядок і вигляд кривої. Завдяки кривим Без’є можна змінювати форму кривої та її порядок завдяки вхідній інформації доти, доки не буде отримано бажаного результату[31].
Розглянемо форму Без’є, яка відрізняється від форми Ерміта способом задання граничних умов. Тепер радіуси – вектори першої і кінцевої точки сегменту позначимо відповідно, через , а замість векторів і уведемо відповідні їм радіуси – вектори і , як показано на рис. 2.11, такі, що виконуються умови
і (2.15)
при значеннях параметра .

Рис. 2.11. Сегмент кривої Без’є
Перехід від форми Ерміта до форми Без’є відбувається за допомогою таких перетворень:
,
де – геометричний вектор Без’є. Підставимо цей вираз у рівняння
,
отримаємо
. (2.16)
Коефіцієнти можна записати у матричному вигляді

Матрицю називають матрицею Без’є [32].
Отже, для того, щоб побудувати криволінійний сегмент у формі Без’є, треба лише задати чотири вершини багатокутника й обчислити точки вздовж кривої для .
У разі спряження двох кривих такого типу треба задавати похідні для отримання однакового нахилу і кривини в точках спряження. Нехай один сегмент заданий точками а інший , причому остання точка першого сегмента і перша другого збігаються: .
Якщо переписати (2.16) у вигляді
,
то легко побачити, що
,
.
Нахил у кінці першого сегмента дорівнює нахилу наступного сегмента, коли три точки лежать на одній прямій. Справді, прирівнявши нахили і врахувавши, що отримаємо
.
Це означає, що точка є середньою точкою проміжку . Неперервність других похідних для цих же сегментів задана виразами

Чотири задані точки утворюють характеристичну ламану від якої повністю залежить форма кривої Без’є. Таку властивість залежності кривої від ламаної називають властивістю опуклості оболонки.

а б
Рис. 2.12. Залежність форми кривої від характеристичної ламаної
Позначимо через точку перетину дотичних і , тоді і , де – деякі коефіцієнти. При крива буде повністю лежати всередині тетраедра (рис. 2.12,а). При крива може сама себе перетинати, причому петля буде між t=0 і t=1 якщо (рис. 2.12,б).
2.5. Базис Бернштейна-Без’є
2.5.1. Геометричні властивості поліномів Бернштейна
Однією з найпоширеніших форм зображення поліномів є запис у формі Бернштейна. Вище ми розглянули лише кубічні сплайни у формі Без’є. Узагальнимо, математичну криву Без’є можна описати для сплайнів порядку поліноміальною функцією[33], яка виконує інтерполяцію між першою і останньою вершинами:
(2.17)
або

Тут – базисні скалярні функції Бернштейна для множини всіх поліномів степеня не вище на відрізку [0,1], – задані радіус-вектори точок положення.
Досить часто замість одиничного відрізка [0,1] зміни параметра доречно використовувати відрізок . Тоді значення локального параметра на узагальненому відрізку можна обчислити за формулою
.
На відрізку базисні функції Бернштейна такі
.
Тут апроксимує ламану, вершинами якої є заданий набір векторів , і визначає на заданому відрізку дугу кривої Безьє -го порядку. Змінюванням положення векторів, можна керувати формою дуги кривої.
Наведемо головні властивості поліномів Бернштейна.
1. Сума поліномів, визначених на заданому відрізку, дорівнює одиниці
.
Цю властивість мають також поліноми в формі Лагранжа й Ерміта.
2. Усі поліноми невід’ємні на заданому проміжку

3. Крива, визначена поліномом , лежить усередині опуклої оболонки. Часто цю властивість називають властивістю опуклості оболонки. На площині опукла оболонка є областю, що обмежена опуклою ламаною, а в просторі – опуклим багатогранником.
4. Якщо – поліноми Бернштейна степеня , то поліноми степені обчислюються за допомогою виразу
,
де

5. Поліноми Бернштейна досягають максимуму якщо значення параметра . Цю властивість використовують у разі локального контролю форми кривої.
Розглянемо деякі властивості кривих Без’є . Тут -та похідна кривої Без’є в крайніх точках дуги залежить тільки від найближчих точок, включаючи крайню точку. Для очевидно, що вектори і визначають дотичну в точці з параметром У загальному випадку дотична в точці визначена радіусом-вектором цієї точки і радіусом-вектором точки .
На підставі дослідження наведених вище легко довести, що
.
Ламана Без’є однозначно визначає форму кривої Без’є. Змінюванням положення вершин ламаної, можна керувати формою відповідної кривої Без’є. У цьому разі треба пам’ятати таке:
1. Кривій у загальному випадку будуть належати лише перша й остання вершини ламаної Без’є, решта вершин будуть лише впливати на вигляд і гладкість кривої.
2. Нахили дотичних у крайніх точках кривої збігаються з напрямами векторів і .
3. Нахили дотичних векторів у крайніх точках кривої Без’є і ламаної Без’є збігаються, тому в разі спряження двох кривих Без’є, заданих ламаними і, , однаковий нахил кривих у точці з’єднання є в тому випадку, коли точки (точка збігається з точкою ) лежать на одній прямій.
4. Як видно з виразів (2.17), степінь полінома рівна – числу ланок в ламаній Без’є, тому для збільшення порядку кривої Без’є достатньо лише задати додаткові вершини у відповідній ламаній Без’є;
5. За допомогою кривих вищих порядків можна отримати неперервності декількох похідних у місцях з’єднання сегментів складної кривої.
6. Характеристична ламана визнача профіль відповідної кривої, однак чим вищий порядок кривої, тим цей зв’язок щораз втрачається.
2.5.2. Часткові випадки
Розглянемо визначення перших трьох степенів кривої Без’є. Лінійна крива, крива першого степеня (пряма), визначена такою параметричною формулою

Цей вираз є лінійною інтерполяцією між двома точками (рис. 2.13).

Рис. 2.13. Крива першого степеня (пряма)
Квадратична крива, крива другого степеня
.
Цей вираз є параболічною інтерполяцією між точками (рис.2.14)

Рис. 2.14. Крива другого степеня
До кривих другого степеня, як зазначено, належать параболи, гіперболи, еліпси, кола й інші лінії.
Точку з параметром на цій кривій знаходять так. Точку , яка ділить відрізок у відношенні

сполучаємо з точкою яка ділить відрізок у тому ж співвідношенні. Відрізок розділяється в тому ж співвідношенні у точці .

А отже, отримуємо
.
У разі побудови таких сплайнів, як звичайно вважають заданою похідну функції в першому вузлі. Тут забезпечується рівність у вузлах не тільки сусідніх параболічних функцій, а й їхніх перших похідних. Завдяки цьому сплайн–інтерполяція виглядає як досить гладка функція.
2.6. Апроксимація на основі B-сплайнів
Розглянемо інші набори базисних функцій, наприклад B-сплайни, щодо яких базис Бернштейна є частковим випадком. У літературі їх ще називають - NURB (nonuniform rational B-splines – нерівномірні раціональні B-сплайни). Поняття ”раціональні” ми розглянемо в 2.7, спочатку проаналізуємо головні властивості B-сплайнів.
2.6.1. Головні властивості B-сплайнів
В порівнянні з поліномами Бернштейна B-сплайни мають такі додаткові переваги:
Апроксимація B-сплайнами забезпечує точніше наближення ламаної, ніж апроксимація поліномами Бернштейна; B-сплайни можуть зображати будь-яку бажану форму – від точки, прямої лінії і ламаної до конічних відрізків (кіл, еліпсів, парабол і гіпербол), криві довільної форми.
У разі апроксимації методом Без’є на значення координат кожної точки кривої впливають усі вершини ламаної Без’є. Це утруднює коректування окремих ділянок кривої. Водночас апроксимація B-сплайнами має бажану локальність. За допомогою B-сплайнів можна виконувати локальні зміни кривої без її повного перерахунку; вони дають більший контроль над формою кривої. Для керування гладкістю і кривиною кривих можна безпосередньо маніпулювати набором контрольних точок і вузлів, які задають форму кривої.
Єдиним шляхом збільшення (зменшення) порядку кривої Без’є є збільшення (зменшення) кількості вершин відповідної ламаної Без’є. В методі B-сплайнів ці два параметри незалежні і внаслідок цього, можуть бути вибрані довільно. Завдяки таким властивостям вони можуть відображати дуже складні форми з порівняно малим набором даних.
Криву, побудовану на основі B-сплайн - базису, описують таким векторним рівнянням
(2.18 )
де – радіус-вектор точок кривої, – вершина ламаної (усього n+1 вершина), – базисна функція i-ї нормалізованої B-сплайн базисної кривої порядку k (степеня k-1), яка задана рекурентними співвідношеннями
(2.19)
Тут – елементи вузлового вектора, властивості якого ми розглянемо в 2.6.3; t –параметр. Вузловий вектор змінюється в діапазоні від 0 до .
2.6.2. Базисні функції
Визначимо базисні функції . Якщо розглянути ділянку кривої, віддалену від конкретного вузла, то цей вузол не має на неї сильного впливу; якщо ж ми наближаємося, то вузол починає впливати на неї щораз більше. У разі віддалення від нього його дія знову зменшується.
На рис. 2.15 показано приклад базової функції, яка має максимальний ефект у деякій визначеній точці й гладко зменшується з віддаленням від точки. Крива на рис. 2.15 відображає, що найбільше значення майже 95 % при і приблизно 50 % для і .

Рис.2.15. Базисна функція для вектора заданого вузла
Тут кожний вузол має власну базисну функцію, наприклад, В-сплайн-крива, яка має вузлів матиме таких функцій, кожна з яких покриває деяку ділянку кривої.
Часто базисні функції мають однакову форму й охоплюють однакові інтервали часу. Проте інколе виникає потреба змінювати ширину інтервалів так, щоб деякі вузли мали вплив на більшу частину кривої, а інші – на меншу.
Для цього треба визначити ряд точок, які розділяють час на інтервали, Змінюванням відносних довжин інтервалів можемо змінювати час, у подовж якого кожна контрольна точка впливає на криву. Точки, які обмежують інтервали називаються вузлами, а впорядкований їхній список – вузловим вектором.
Наведемо ще деякі важливі характеристики, які виявляє набір базисних функцій.
У будь-який час t, сумарне значення всіх базисних функцій становить у цілому одиницю.
Якщо всі керівні точки мають позитивні ваги, то крива міститься в межах ділянки, відомої як опукла оболонка.
За будь-якого t, не більше ніж k базисних функцій впливають на криву, де k - це порядок кривої.
Крива порядку k визначена тільки там, де k базисних функцій відмінні від нуля.
2.6.3. Вузловий вектор
Вузловий вектор, довжина якого (n+k+1), уводиться для врахування власної кривини B-сплайн -кривих і є не спадною послідовністю цілих чисел - параметричних вузлів. Вузловий вектор визначений кількістю точок у ламаній, яку апроксимують, порядком кривої, а також наявністю складних (кратних) вузлів.
Наприклад, для кривої другого порядку, що задана чотирма вершинами (n+1=4), параметр =3-2+2=3. Довжина вузлового вектора (n+k+1)= 6. Повний вузловий вектор з кратністю 2 (бо крива другого порядку) на кожному кінці матиме вигляд [0,0,1,2,3,3]. Крива четвертого порядку, задана на багатокутнику з п’ятьма вершинами, матиме вузловий вектор [0 0 0 0 1 2 2 2 2]. Тут =4-4+2=2, довжина вектора(n+k+1)= 9, кратність на кожному кінці 4. Під час побудови B-сплайн-кривих можна збільшувати порядок кривої шляхом подвоєння, потроєння тощо, вузлів в одній і тій же вершині. Отже, якщо маємо чотири різні вершини для кривої другого порядку, то вузловий вектор, як ми вже довели, дорівнює [0,0,1,2,3,3]. Якщо ж два вузли збігаються в одній вершині, це означає, що один з відрізків ламаної має нульову довжину, а вузловий вектор зміниться до вигляду [0 0 1 1 2 2].
Якщо гладкості досягають уведенням похідних вищих порядків, то порядок кривої визначає, наскільки вона гладка. Наприклад, крива четвертого порядку є неперервною за першою і другою похідними, а також і за розміщенням точок уздовж усієї кривої.
Зазначимо, що B-сплайн-крива є поліномом степеня (k–1) на кожному інтервалі і всі її похідні до (k–2)-го порядку включно неперервні уздовж всієї кривої.
У разі врахування гнучкості задання кривих на основі B-сплайнів можна використовувати різні способи корекції форми кривої. Наприклад, можна змінити порядок (у межах 2n+1) шляхом уведення кратних вершин або зміни кількості і положення кратних вершин у багатокутнику.
2.6.4. Приклади застосування B-сплайнів
Декілька B-сплайн-кривих різного порядку, які апроксимують ламану, що має шість вершин, зображено на рис. 2.16. У цьому разі крива п’ятого порядку є кривою Без’є для заданої ламаної, крива четвертого порядку – кубічним сплайном, а крива другого порядку – послідовністю зв’язаних відрізків, які збігаються з вихідною ламаною. Крива третього порядку дотикається до внутрішніх відрізків ламаної в їхніх середніх точках.
Зазначимо, що зі зростанням порядку B-сплайн-криві випрямляються, їхня форма стає щораз більше відмінною від ламаної.

Рис. 2.16. Зображення декількох B-сплайн-кривих різного порядку
Розглянемо вплив подвоєної вершини в багатокутнику. В криві, що формуються, можна вносити зломи шляхом уведення в відповідну вершину ламаної кратних вершин. На рис. 2.17 багатокутник складається з п’яти вершин. Третя вершина подвоєна. Тут криві деформуються внаслідок зміни їхнього порядку за незмінного вигляду характеристичного багатокутника.
Перша крива є кривою п’ятого порядку, порядок цієї кривої дорівнює кількості вершин багатокутника. Друга крива – це крива п’ятого порядку. Її форма ближча до вихідного багатокутника, особливо біля подвоєної вершини. Третя крива має порядок 3. Зазначимо, що в подвоєній вершині наявний злам, оскільки нахил і кривина в ній не є неперервними. Подвоєна вершина необхідна для того, щоб створити злам у кривій третього порядку. Потроєна вершина утворює злам у кривій четвертого порядку. Цю властивість, як звичайно використовують під час проектування кораблів.
Типова крива, у якій кожне з’єднання відповідає єдиному вузлу, має неперервність , де n – степінь неперервності кривої. Наприклад, кубічна (третього степеня або четвертого порядку) крива має неперервність за другою похідною в кожному з’єднанні, якщо всі вузли різні. Якщо два вузла збігаються, то неперервність у цьому з’єднанні зменшується на один степінь; якщо три збігаються, то степінь неперервності зменшується на два; й так далі.

Рис. 2.17. B-сплайн-криві з подвоєною вершиною
Проаналізуємо ще один випадок. Загалом випадку В-сплайн складається з декількох сплайнових сегментів, кожний з яких визначений як набір точок. Коефіцієнти полінома будуть залежати тільки від керуючих точок на сегменті кривої. Цей ефект називають локальним керуванням, оскільки переміщення керуючої точки впливатиме не на всі сегменти кривої. На рис. 2.18 показано, як зміна положення точки впливає на форму кривої.

Рис. 2.18. Залежність В-сплайну від положення точки
Наведений нижче приклад відображає, як кратність вершини посилює її притягання. Щоб лінія заходила в гострі кути треба збільшувати кратність вершини (рис. 2.19). Тут розглядаються криві, які мають порядок, що дорівнює кількості вершин завдяки введенню кратних вершин у вузлі . Першій кривій четвертого порядку відповідає багатокутник з чотирма вершинами , друга крива п’ятого порядку має одну подвоєну вершину – , крива шостого порядку має потроєну вершину – , а кривій сьомого порядку відповідає багатокутник .
Отже, тепер зрозуміло, що можна провести криву ближче до конкретної вершини завдяки використанню кратних вершин, зберігаючи одні й ті ж кінцеві нахили для кожної кривої. А зниження порядку призводить до зміщення кривої в напрямі до вершин багатокутника.

Рис. 2.19. Порядок кривої, що дорівнює кількості вершин
2.7. Раціональні криві
2.7.1. Головні принципи раціональних кривих
Для достатньо доброго наближення складних кривих потрібні поліноми високих степенів, тому вводиться ширший клас кривих, спосіб побудови яких пов’язаний з проективним простором. Слово ”раціональні” означає, що математичний вираз, який описує форму модельованої кривої є співвідношенням двох поліномів.
Раціональні криві порівняно зі звичайними (нераціональними) кривими мають дві додаткові й дуже важливі властивості.
Вони забезпечують коректний результат у разі проекційних трансформацій, а нераціональні криві – тільки в разі афінних трансформацій.
Їх можна використовувати для моделювання кривих будь-якого виду, у тім числі конічні січення (кола, еліпси, параболи й гіперболи).
Ці важливі властивості досягають завдяки чотиримірному зображенню звичайної тривимірної точки {х, у, z}. Це означає, що кожна точка має чотири координати {х, у, z, w}. Остання координата w означає вагу (weight) керуючої точки. Вага в математичному сенсі – це значення, вплив, виражений спеціальною функцією або числовим значенням. Це одне з важливих понять у теорії прийняття рішень.
Спочатку координата w дорівнює одиниці, однак зі збільшеннм цього значення для керуючої точки збільшується степінь її впливу на форму кривої і вона відповідно сильніше вигинається в бік керуючої точки (рис. 2.20).

Рис. 2.20. Зміна форми кривої в разі зміні ваги точки
Криві, визначені таким способом з вагою w для кожної керуючої точки, називають раціональними кривими. Математично такі криві визначені в чотиривимірному просторі (оскільки керуючі точки мають чотири компоненти) і проектовані в тривимірний простір. Візуалізація об’єктів у чотирьох вимірах є досить складною. Для розуміння основної ідеї, розглянемо раціональні двовимірні криві: це криві, які є визначені в тривимірному просторі і проектуються на площину, як показано на рис. 2.21.

Рис. 2.21. Проектування тривимірної кривої на площину
Головний метод для такого перспективного проектування полягає у діленні на гомогенний компонент вершини, а саме на w). Використаємо аналогічний підхід проектування чотиримірної раціональної кривої в тримірний простір.
Зазначимо, що суттєвим є тільки відносна зміна ваг керуючих точок. Якщо вдвічі збільшити ваги всіх точок, то форма кривої не зміниться.
Як приклад, розглянемо квадратичну криву, визначену трьома точками (рис. 2.22 ). У всіх трьох кривих вузловий вектор має вигляд {0,0; 0,0; 0,0; 1,0; 1,0; 1,0}.
Ваги першої і останньої точок кожної кривої дорівнюють 1. Якщо вага центральної вершини менше 1, то сумарна крива є сегментом еліпса (див. рис. 2.22,а), якщо дорівнює 1, то – сегмент параболи (див. рис. 2.22,б), якщо ж більше 1, то крива перетворюється в гіперболу (див. рис. 2.22,в).

Рис. 2.22. Криві з різними вагами центральної точки
Зазначимо, що раціональні криві мають деякі недоліки, такі розширені можливості призвели до ускладнення інструментарію для їхньої побудови, а це, відповідно, приводить до глибшого вивчення предмета.
2.7.2. Раціональні квадратичні сегменти конічного перерізу
Раціональні криві найпростіше зображати через однорідні координати (див. розділ 1). Запишемо рівняння

Цей вираз є тотожним векторному рівнянню
. (2.20)
Оскільки
і , .
Перепишемо попереднє рівняння у вигляді

Це рівняння нагадує рівняння квадратичної кривої у формі Без’є. Тільки тут є така відмінність: нераціональна крива у формі Без’є може відображати тільки параболу, а раціональна крива – сегмент будь-якого конічного перерізу.
Граничні умови матимуть такий вигляд

Де
,
З урахуванням того, що, звідки , отримаємо

Конічні криві є квадратичними, тому ми можемо зобразити їх квадратичною (степеня 2 або третього порядку) кривою. Такий метод можна використовувати для генерування конічних дуг.
Приклад. Крива визначена трьома керуючими точками. Перша й остання є кінцевими точками конічної дуги, а розміщення внутрішньої керуючої точки визначає форму кривої. Ваги першої і останньої керуючих точок рівні 1,0. Вага менше 1,0 для внутрішньої керуючої точки генерує еліпс; вага, що дорівнює 1,0, –параболу; вага більше 1,0 – гіперболу. Вектор вузлів дорівнює {0,0; 0,0; 0,0; 1,0; 1,0; 1,0}.
2.7.3. Раціональні криві Без’є
Для заданого масиву вершин раціональна крива Без’є степеня визначена рівнянням [31]
(2.21)
де поліноми Бернштейна
Сума невід’ємних ваг , є додатним числом. Якщо всі ваги однакові, то отримаємо стандартну елементарну криву Без’є m-го степеня.
Наведемо властивості раціональних кривих Без’є
Елементарна раціональна крива Без’є, утворена за допомогою масиву є гладкою кривою.
Крива починається в вершині , , дотикаючись до відрізка характеристичної ламаної
.
Крива закінчується в останній точці , , дотикаючись до відрізка характеристичної ламаної,
.
Крива лежить в опуклій оболонці, яка породжена масивом керуючих точок ;
Крива симетрична в разі зміни порядку вершин масиву на протилежний.
Крива повторює характеристичну ламану.
За заданого набору вершин формою раціональної кривої Без’є можна керувати, змінюючи вагові множники.
У разі додаванні в масив хоча б одної вершини виникає потреба повного перерахунку параметричних рівнянь елементарної кривої Без’є.
Зміна принаймні однієї з вершин у масиві призводить до помітної зміни всієї кривої Без’є.
РОЗДІЛ 3. ОПИС І ПОБУДОВА ПОВЕРХОНЬ
3.1. Геометрія поверхонь
3.1.1.Поняття поверхні, дотична площина до поверхні
Завдяки введенню декартової системи координат у просторі можна виявити однозначну відповідність між деякими геометричними образами і рівняннями. Поверхнею будемо називати множину точок, координати яких задовольняють рівняння вигляду [26]

Поверхні задають, як множину точок, що мають спільну для всіх них геометричну властивість. Щоб отримати рівняння поверхні, достатньо аналітично записати геометричні умови, що входять у її визначення.
Нехай – елементарна поверхня; – елементарна область у площині, образом якої в разі топологічного відображення є поверхня – декартові координати довільної точки, яка належить області. - координати відповідної точки поверхні є функціями координат точки області :
. (3.1)
Систему рівнянь, яка задає відображення області в просторі, називають рівняннями поверхні в параметричній формі, – криволінійними координатами на поверхні. Рівняння (3.1) за фіксованих або задають криву, яка лежить на цій поверхні. Такі криві називають координатними лініями.
Поверхню будемо називати регулярною (к разів диференційованою), якщо в кожній її точці є окіл, який допускає регулярну параметризацію. Тут – регулярні ( разів неперервно диференційовані) функції, задані в елементарній області площини . При поверхню називають гладкою.
Згідно з означенням, регулярна поверхня в околі кожної своєї точки може бути задана рівняннями в параметричній формі
,
де - регулярні функції в деякій області поверхні площини
Надалі ми будемо користуватися векторним записом рівняння поверхні
.
Нехай векторє дотичним до параметричної кривої , де – константа. Так само дотичний вектор до кривої дорівнює вектору . Площина, дотична до цих кривих у точці їхнього перетину , містить два, згадані вище дотичні вектори.
Побудуємо математичну модель дотичної площини за допомогою векторного добутку диференціалів радіуса-вектора.
. (3.2)
Вираз називають детермінантом першої квадратичної форми, значення цього виразу ми пояснимо далі.
Якщо поверхні мають таку параметризацію
,
тоді, маємо
.
Нормаль до цієї площини дорівнює векторному добутку векторів. Одиничний вектор нормалі (рис. 3.1) визначений за формулою
,
де похідні обчислюють у точці . Орієнтацію вектора вибирають у відповідності до конкретного випадку. Точки, у яких, частинні похідні не існують або в яких , відповідають або особливим точкам параметризації, гребеням, або загостренням поверхні.

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

Приклад. Задано рівняння поверхні в параметричній формі (гелікоїд)

Перепишемо рівняння у векторному вигляді

Знайдемо векторний добуток

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

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

де – похідні за параметром .
Визначимо коефіцієнти першої квадратичної форми, загальноприйнятими є такі позначення:

Якщо – кут між дотичними векторами, то
. (3.3)
Для ортогональних координат на поверхні Уведемо позначення для детермінанта першої квадратичної форми, враховуючи позначення з формули (3.2)
.
З урахуванням виразу для одиничного вектора нормалі можна записати
.
Перша квадратична форма описує поверхню в першому наближенні, коли малу ділянку поверхні замінюють на ділянку дотичної площини. З її допомогою визначають кути між лініями і довжини дуг на поверхні, а також площі будь-яких ділянок поверхні.
Малий елемент площі поверхні, враховуючи (3.2), (3.3) запишемо у вигляді
.
Отже, для того, щоб знайти площу деякої обмеженої ділянки поверхні, яка відповідає області площини змінних , треба обчислити інтеграл
,
.
Розглянемо деякі формули, пов’язані з першою квадратичною формою поверхні. Довжину дуги відрізка кривої з кінцями в точках , обчислюють за формулою
.
Одиничний вектор, дотичний до кривої , визначають співвідношенням

Нехай дві криві , які лежать на одній поверхні, перетинаються під кутом , тоді

Оскільки , а , то косинус кута перетину між цими двома кривими можна отримати з формули
.
Кут між координатними лініями на поверхні набуде вигляду
.
Звідси можна зробити висновок, що координатна сітка на поверхні є ортогональною (координатні лінії перетинаються під прямим кутом) тоді і тільки тоді, коли .
3.1.3. Друга квадратична форма поверхні
Друга квадратична форма описує поверхню в другому наближенні. Вона відображає, як відхиляється поверхня від дотичної площини, і повністю визначає кривину поверхні.
Нехай – регулярна поверхня, - якась її регулярна параметризація, – одиничний вектор нормалі поверхні в точці
Другою квадратичною формою поверхні називають квадратичну форму
.
Для коефіцієнтів використаємо такі позначення

Поняття другої квадратичної форми тісно пов’язане з кривиною поверхні.
Відомо, що , тоді ,
отримаємо вираз

.
З врахуванням попередніх позначень, запишемо

Матриця є матрицею другої квадратичної форми поверхні, бо , матриця є симетричною.
Визначимо коефіцієнти першої квадратичної форми, загальноприйнятими є такі позначення:
;
;
.
3.1.4. Нормальна кривина поверхні
Для двовимірного випадку скалярною кривиною кривої, яка лежить на площині, як вже згадувалося в 2.1.3, називають величину
=.
Тут всі вектори лежать в одній площині.
Нехай – регулярна параметризація якоїсь регулярної поверхні. Нехай якась регулярна крива на цій поверхні походить через деяку точку і має в ній напрям () та нормаль , тоді отримаємо величину
=, (3.4)
де – кут між вектором нормалі до поверхні та напрямом вектора головної нормалі кривої.
Нормальною кривиною заданої поверхні в напряму () або в напрямі вектора є кривина кривої, по якій поверхню перерізає площина, що містить нормаль до поверхні і дотичний вектор . Для такої кривої напрям вектора нормалі до поверхні збігається з напрямом вектора головної нормалі кривої, нормальна кривина визначена співвідношенням (3.4).
Виберемо за параметр, що визначає положення точки на кривій, довжину дуги. Тоді криволінійні координати точки будуть функціями довжини дуги , .
Вектори перпендикулярні до нормалі . З рівняння (3.4) одержуємо [23]
.
Або
(3.5)
Знайдемо з останнього рівняння нормальні кривини координатних ліній:
;
. (3.6)
Параметр визначає кручення поверхні. Простежимо за зміною в разі повертання перерізу навколо нормалі до поверхні. Для гладких поверхонь кривина буде плавно періодично змінюватись від мінімального до максимального значення. Знайдемо ці значення. Перепишемо вираз (3.5) у вигляді
.
Розкриємо дужки і перегрупуємо члени:
.
Отримаємо квадратичну форму
.
За теоремою Крамера необхідною і достатньою умовою існування нетривіального розв’язку є рівність нулю визначника матриці. Отримаємо квадратне рівняння для кривини
.
Звідси можна знайти два екстремальні значення , які називають головними кривинами поверхні в заданій точці. Відповідні їм напрями називають головними. Головні напрями є взаємно перпендикулярними.
Проведемо лінії на поверхні так, щоб у кожній точці дотичні до них ішли вздовж головних напрямів. Такі криві називають лініями кривини; їх зручно вибирати як координатні криві. Якщо поверхнева координатна сітка () збігається з лініями кривини поверхні, то головні кривини збігаються з (3.6). Якщо коефіцієнт першої квадратичної форми то це сітка ортогональних криволінійних координат; якщо то сітку називають спряженою.
З властивостей квадратного рівняння для добутку і пів суми головних кривин маємо вирази


Величини і називають відповідно, гаусовою кривиною поверхні та середньою кривиною поверхні в заданій точці.
3.1.5. Перетворення параметрів поверхні
Нехай – регулярна параметризація деякої регулярної поверхні. Введемо нову параметризацію поверхні (не обов’язково ортогональну) . Задана однозначна відповідність. . Радіус-вектор і нові похідні задаватимуть так:
.
Матриця Якобі набуде вигляду

У цій матриці стовпці є компонентами дотичних векторів до координатних ліній . Отже, якщо і – відповідно, матриці першої та другої квадратичних форм поверхні , то і матриці першої і другої квадратичних форм поверхні
;
.
Зазначимо, що одиничний нормальний вектор, головні напрями і кривини не залежать від параметрів, які ми використовуємо, отже , вони є геометричними властивостями самої поверхні.
3.2. Утворення і зображення поверхонь
Будь-яку поверхню можна зобразити як переміщення лінії по інших лініях. Лінію, яка утворює поверхню, називають твірною, лінію, по якій переміщається твірна – напрямною. Твірні можуть бути сталими і змінними.
3.2.1. Класифікація поверхонь
Поверхні розділяються:
За законом творення: на закономірні і незакономірні. Закономірні задають графічно і аналітично, незакономірні – тільки графічно.
За ознакою розвертання в площину: які розвертаються і які не розвертаються.
За формою твірної: з прямолінійними твірними - лінійчаті поверхні; з криволінійною твірною – криві поверхні.
За способом переміщення твірної: з переміщенням твірної; з обертальним рухом твірної – поверхні обертання; з рухом твірної по гвинтовій лінії - гвинтові поверхні.
3.2.2. Лінійчаті поверхні
Лінійчатою поверхнею називають поверхню, яка утворена сімейством прямих, і тому її можна описати рівнянням
,
де - задана точка на напрямній з параметром , а - напрямний вектор цієї прямої. Параметр задає відстань між точками і . Лінійчата поверхня, твірні якої з’єднують відповідні точки двох просторових кривих можна зобразити у вигляді
.
Криві називають напрямними, а прямі, які з’єднують їхні відповідні точки, називають твірними. Лінійчаті поверхні поділяються на ті, що розгортаються і що не розгортаються. До поверхонь, що розгортаються відносяться циліндричні, конічні, призматичні та конічні поверхні.
3.3. Поверхні Без’є
3.3.1. Параметричне рівняння поверхні Без’є
Нехай задано масив точок

Вони утворюють характеристичний багатогранник (див. рис. 3.2), за їхньою допомогою проектують ділянку поверхні Без’є. Ділянка поверхні в деякому сенсі апроксимує багатогранник, хоча лише кутові точки у них є спільними.
Ділянку поверхні Без’є можна визначити за допомогою векторного рівняння, використовуючи поліноми Бернштейна.
(3.7)
Для ліпшого розуміння викладеного матеріалу розглянемо випадок бікубічної поверхні Без’є при , яка визначена 16 вершинами:

Тоді рівняння (3.6) можна переписати у вигляді

або в матричному вигляді

.
Матрицю називають базисною матрицею бікубічної поверхні Без’є.

Рис. 3.2 Ділянка кубічної поверхні Без’є.
3.3.2. Властивості ділянок поверхні Без’є
Ділянки поверхні Без’є мають такі головні властивості.
Елементарна поверхня Без’є, породжена масивом є гладкою поверхнею.
Граничні криві поверхні Без’є є кривими Без’є відповідних степенів, причому їхні граничні ламані є границею характеристичної багатогранної поверхні.
Елементарна поверхня Без’є лежить в опуклій оболонці, яка породжена масивом і є афінно інваріантна.
Степінь функціональних коефіцієнтів пов’язаний з кількістю вершин у масиві.
Додавання нових вершин призводить до перерахунку параметричних рівнянь.
Зміна вершини в масиві призводить до зміни всієї поверхні Без’є.
Ділянки поверхонь Без’є вищих ступенів будуються за аналогічною схемою. З ділянок поверхонь Без’є можна конструювати складніші поверхні, які є гладкими (неперервними) поверхнями, або їхнім об’єднанням.
3.4. В-сплайн поверхні
3.4.1. Параметричні рівняння ділянок В-сплайн поверхні
Нехай задано масив точок

Ділянку В-сплайнповерхні визначають за допомогою векторного рівняння
; (3.8)


Розглянемо ділянку кубічної В-сплайнповерхні. Нехай задано масив

Тоді рівняння (3.8) можна переписати у вигляді
.
При (степені ) функціональні коефіцієнти та задаються наступними формулами:

Формули для поліномів відрізняються від наведених вище тим, що замість змінної мають змінну .
Матричний запис параметричного рівняння, що описує ділянку бікубічної B-сплайн поверхні, має такий вигляд:


Матрицю називають базисною матрицею бікубічної В-сплайнповерхні.
3.4.2. Властивості ділянок бікубічних В-сплайнповерхонь
Наведемо головні властивості бікубічних В-сплайнповерхонь, які є породженням масиву
Ділянка є гладкою поверхнею.
Ділянка найчастіше не проходить через одну з 16 вершин масиву;
Граничні криві ділянки бікубічної поверхні є кубічними B-сплайнкривими; їхні граничні ламані є границями багатогранної поверхні.
Ділянка бікубічної B-сплайнповерхні лежить в опуклій оболонці, породжена масивом з 16 вершин; ця властивість є наслідком того, що невід’ємні функціональні коефіцієнти в сумі дорівнюють одиниці:
.
5. Форма елементарної бікубічної B-сплайнповерхні однозначно визначена.
РОЗДІЛ 4. ТЕОРЕТИЧНІ ОСНОВИ ТА ГОЛОВНІ АЛГОРИТМИ РАСТРОВОЇ ГРАФІКИ
4.1. Створення базових геометричних форм
4.1.1. Пікселі
Розмір зображення описує фізичні параметри зображення. Роздільною здатністю екрана називають кількість пікселів (від англ. pixel – точка на екрані) на лінійний дюйм. Якщо роздільна здатність, наприклад, 72 пікселі на дюйм, то отримаємо 5184 пікселі на квадратний дюйм (7272=5184). Чим більше точок, тим вища роздільна здатність екрана. Як звичайно на сучасних дисплеях використовують роздільну здатність 12801024, проте вона може бути значно вищою.
Оскільки кількість пікселів у зображенні є фіксованою, тому збільшення розмірів зображення зменшує його роздільну здатність, і навпаки. Отже, зображення, яке добре сприймають на поштовій марці, буде мати негладкі краї, якщо його надрукувати на плакаті 1117 дюймів.
Треба пам’ятати, що людське око не може розпізнавати більше 1000 точок у лінійному сегменті. Отож, якщо потрібно намалювати лінію за допомогою скінченної кількості точок, то це означає, що кожна така точка повинна мати свій конкретний розмір.
Піксель є найменшим елементом екрана, що визначений іменем і деякою адресою. Графічні рисунки створюють завдяки регулюванню інтенсивності і забарвлення пікселів, які творять картину. Для рисування відрізка прямої треба відрегулювати яскравість усіх точок між першою та останньою. Отже екран розглядають як масив пікселів. Координати (i,j) присвоюють кожному з пікселів: починаючи зліва від першого, відраховуємо рядки, де i – номер рядка, а j –номер стовпця.
Растром називають прямокутну сітку точок, яка формує зображення на екрані комп'ютера. Кожну точку растру характеризують двома параметрами: розташуванням на екрані та кольором для кольорових моніторів, або ступенем яскравості у випадку чорно-білого монітора. Оскільки растрові зображення складаються з багатьох дискретних точок, то для роботи з ними потрібні спеціальні алгоритми. Рисування відрізка прямої лінії – одне з найпростіших завдань растрової графіки. Сенс її полягає в обчисленні координат пікселів, які є поряд з відрізками, що лежать на двовимірній растровій сітці. Уважатимемо, що пікселі мають цілочисельні координати (рис.4.1).

Рис. 4.1. Піксель
Пік селі завжди зображають за допомогою цілочислових координат. Наприклад, якщо відомо що треба провести лінію через координати (10,33; 20,72), то кінцеве положення пікселів буде (10; 21). Процедуру заокруглення називають “Зубчастою побудовою” (рис. 4.2).

Рис.4.2. Ефект зубчастої побудови
Такий ефект отримують у разі низької роздільної здатності.
Графічні пакети загального користування забезпечують користувача набором функцій для побудови та редагування рисунка. Ці програми поділяють на категорії щодо застосування їхніх ефектів. Базові структурні блоки для створення рисунків називають примітивами. Вони охоплюють прямі лінії, багатокутники і кола. Програми для створення примітивів є базовими інструментами для створення різноманітних рисунків.
4.1.2. Рисування ліній
Для того, щоб нарисувати лінію або відрізок на площині, треба спочатку розділити цю площину на октанти (рис. 4.3).

Рис. 4.3. Розбиття площини на октанти
Опишемо як малюють лінії в першому октанті, а потім поширимо це на решту за законами симетрії. Нехай потрібно нарисувати сегмент лінії, яка з’єднує два пікселі і в першому октанті, де , пікселі підсвічені на екрані (рис4.4).

Рис. 4.4. Піксель
Оскільки побудова частини прямої полягає в вибірковому підсвічуванні окремих пікселів у відповідному порядку, то після знаходження потрібного пікселя з координатами в першому октанті та його підсвічуванні, наступним підсвіченим пікселем буде або або . Перша координата x збільшена на одиницю, а друга y або така сама, або також збільшена на одиницю. Отже, треба визначити похибку, згідно з якою можна вирішувати, чи є потреба збільшувати другу координату y чи ні.
Для цього запишемо рівняння прямої між двома точками і :
, , .
Тут є нахилом прямої.

Рис 4.5. Визначення відстаней
Обчислимо відстані та їхню різницю (див. рис. 4.5)

Зазначимо, що залежно від знака різниці можна вибрати одну з можливостей для підсвічування наступного пікселя. Нехай похибка
,
тоді, якщо , то наступний пік сель ; якщо ж , то – .
На кожному кроці побудови прямої варто перераховувати нову похибку у вигляді функції від її попереднього значення. Отже отримаємо рекурсивну формулу, яка має такий вигляд:
;
де .
Для відомо, що
.
Остаточно одержимо
.
Оскільки , то можна записати

при
.
Зазначимо, що рекурсивне обчислення наступної похибки таке:
якщо , то , якщо , то .
Розглянемо алгоритм Брезенхема [28] побудови прямої в першому октанті:
INPUT (x1,y1),(x2,y2)
?x := x2-x1
?y := y2-y1
x := x1
y := y1
c1 := 2 ?y
error := c1- ?x
c2 := error- ?x
while x<x2
plot(x,y)
x := x + 1
if error < 0 then
error := error +c1
else
y := y +1
error:=error +c2
end
end
Наголосимо, що алгоритм Брезенхема не містить операції ділення та використовує цілочислову арифметику [29].
Для інших октантів метод треба дещо модифікувати з урахуванням номера квадранта, у якому лежить відрізок, і його кутового коефіцієнта. Якщо абсолютна величина кутового коефіцієнта >1, то міняються місцями x та y. У цьому випадку продовжуємо рухатись в напрямі y з одиничним кроком, обчислюючи наступне значення для x. Для від’ємного кутового коефіцієнта маємо подібний процес згідно з яким одна координата зростатиме, а інша – навпаки, спадатиме.
У потребі побудови прямої, що має форму прямокутника зі скінченною товщиною, необхідно виконати такі кроки. Якщо, наприклад, треба, що б лівий нижній кут прямокутника займав позицію (10, 10), то пікселі підсвічують так, щоб остаточна форма на екрані виглядала як прямокутник (рис. 4.6). Позиція з координатами (10; 9) буде підсвічена на 10%, тоді як (10; 10) повинна бути підсвічена на 80%.

Рис.4.6. Побудова прямої у формі прямокутника
Як звичайно, у графічних пакетах є програма побудови графіків полілінії. Для побудови полілінії (n, x, y) – лінії, яка проходить через n точок – треба задати масиви x і y, які містять координати точок. Графік складатиметься з n-1 сегментів ліній, які будуть з’єднувати n заданих координат з точки у точку з координатами . Програмна реалізація побудована на n-1 виклику алгоритму побудови лінії.
4.1.3. Побудова кола
Коло має симетричну форму. Кожний з алгоритмів для побудови кола може використовувати цю симетрію рисуючи лише одну восьму його частину (рис. 4.7).

Рис. 4.7. Розбиття кола на октанти
Нехай виникає потреба нарисувати коло з центром у (0,0) та радіусом у другому октанті. Якщо ми нарисуємо всі ці точки в цьому октанті, то решта можна дорисувати, використовуючи симетрію.
Нехай треба почати з пікселя у другому октанті (рис. 4.8), тоді наступним можливим підсвіченим пікселем може бути або , або .

Рис. 4.8. Вибір пікселя в другому октанті
Треба визначити змінну, згідно з якою прийматимуть рішення чи залишати координату без зміни, чи ні, тоді як координата буде постійно збільшуватись на 1.

Рис. 4.9. Визначення відстаней і

Якщо координата відповідає деякій координаті , яка є між величинами і , то y задовольняє рівняння
.
Визначимо різниці і у вигляді (рис. 4.9)
;
.
Якщо покласти , то створимо нову змінну, від знака якої залежить вибір наступної точки, яка буде підсвічена. Якщо < 0, то наступна підсвічена точка – , якщо , то –
Запишемо рекурсивну формулу.
,
отже
.
Після підстановки отримаємо
.
Відповідно до знака змінної можна отримати таке:
якщо < 0, то – , якщо , то – .
Оскільки у визначенні другого октанта ми починаємо з , то початкове значення змінної
,
що приводить до такого алгоритму, який називають алгоритмом Брезенгема для побудови кола:
INPUT (r)
x: = 0
y: = r
error: = 3 – 2r
while x ? y do
plot (x, y)
hold on
x: = x + 1
if error ? 0
y: = y + 1
error: = error – 4y
end
error: = error + 4x +2
end.
У другому октанті (рис. 4.10) . У напряму зроблено кроків, що відповідають крокам у напряму . Загалом алгоритм обчислює точок. Загальна кількість точок, які будуть виводитись для рисування кола, .

Рис. 4.10. Другий октант
4.1.4. Побудова еліпса
Нехай треба нарисувати еліпс з центром (0; 0) та головними діагоналями, які дорівнюють 2? і 2b, ?, b (рис. 4.11). Еліпс має чотири симетричні сегменти.

Рис. 4.11Перший сегмент Рис. 4.12. Вибір наступного пікселя
Область 1 відділяється від області 2, якщо. У цій області спочатку підсвічується піксель , а потім – або . Оскільки ми працюємо в першій області, то наступним підсвіченим пікселем може бути або , або . Зазначимо, що координата збільшена на 1 і треба лише визначити, який з двох варіантів вибрати – чи .
Нехай точка ? розміщена посередині сегмента CD, її координати (рис. 4.12)
.
Якщо ? є точкою перетину еліпса з сегментом CD і – відстань від серединної точки ?, то можна записати рівняння еліпса:
.
З наведених вище формул маємо:
.
Позначимо через координати серединної точки ? для області 1, тоді
.
Знак виразу визначає положення наступної точки:
Якщо , то T правіше від M, вибір точки D, якщо , то T лівіше від M, вибір точки C
Знайдемо зв’язок між двома змінними та , для області 1 запишемо

В області 1 , отже вибір точки в першому октанті такий: якщо , то D, якщо – , то C.
Початкове значення для можна вибрати так. Для маємо
.
Відповідний процес можна застосувати й для області 2, що приводить до таких обчислень. Для цього процесу можна подати таблицю 4.7.

Рис. 4.13. Вибір пікселя в області 2.
Вибір точки в області 2 такий: якщо , то ?, якщо , то С.
Межу областями 1 і 2 визначають так. Оскільки зміна областей відбувається в точці, де нахил тангенса є дорівнює -1, то треба обчислити похідну від рівняння еліпса:
; .
Якщо , то відбувається зміна областей з 1 до 2. Для створення алгоритму побудови еліпса достатньо використовувати тільки одну змінну. Змінну після переходу через границю можна обчислити, використовуючи змінну . Точніше кажучи,

Остаточно отримаємо
.
Наведемо загальний огляд алгоритму побудови еліпса (рис. 4.14).

Рис. 4.14. Побудова еліпса в області 1 та 2
В області 1 виконуються кроків в напрямі та кроків у напрямі , сумарно обчислюють точок. В області 2 виконують кроків у напрямі та кроків в напрямі , сумарно обчислюють точок.
Для першого кроку в напрямі області 1 потрібно три додавання на точку. Тому значення необхідних операцій
.
Про цей алгоритм йтиметься у розділі 5.
4.2. Вирізання
Під словом вирізання (кліпінг) ми розуміємо обрізання форми згідно з периметром вікна. Алгоритми вирізання бувають дво- або тривимірні, їх застосовують для регулярних і нерегулярних областей[30].
Область вирізання є дуже простою але може набувати і складних форм. Це трапляється якщо вилучають сегменти, які частково видимі (рисування з областю вирізання), або якщо намагаються рисувати тоді, коли екран не знає меж обрізання (рисування без області обрізання).
Є багато алгоритмів вирізання. Звичайно, згідно з відповідним випадком, треба вибрати найліпший з алгоритмів. Далі вирізання розглянемо згідно з таким припущеннями. Вікно вирізання завжди повинно мати ортогональні боки, паралельні до осей координат; форма складатиметься з лінійних сегментів; точки і лінії поза вікном зникають (зображена лише та частина, яка є в межах вікна) [37].
4.2.1. Алгоритм серединної точки
Спочатку треба дослідити кожну точку (x, y) чи вона є всередині вікна, чи зовні, а чи є не нижче лівого нижнього кута з координатами і не вище правого верхнього згідно з нерівностями:


4.15. Лінії до вирізання 4.16. Лінії після обрізання
Розглянемо алгоритм серединної точки (поділу серединної точки). Припустимо, що точки і (рис. 4.15) є двома кінцями лінійного сегмента. Кожна точка на площині визначена двома параметрами ?? та ?? так
?? = -1,0+1, ?? = -1,0+1.
Отже площину поділяємо на дев’ять ділянок.
Задамо відповідності і , тоді можна розглянути такий алгоритм.
Якщо належать середині вікна, тоді вони зображені. В іншому випадку продовжуємо і переходимо до наступного кроку.
Якщо або є поза вікном, то лінійний сегмент не зображений, що і буде закінченням алгоритму. В іншому випадку відбувається перехід до іншого кроку.
Лінійний сегмент поділяють на дві частини, де координати серединної точки мають вигляд
.
Для кожної з половинок і повторюється алгоритм з першого кроку. Припинення роботи алгоритму відбувається після досягнення заданої точності рисування (рис 4.15, 4.16). Зазначимо, що цей алгоритм можна легко застосувати до програмного забезпечення, оскільки тут наявна єдина операція ділення на два.
4.2.2. Алгоритм Коена-Сазерленда
Розглянемо алгоритм Коена-Сазерленда. У випадку розширення границь заданого вікна ми присвоюємо площині відповідні атрибути:
LEFT : ліворуч від лінії ;
RIGHT: праворуч від лінії ;
??? : вище від лінії ;
BOTTOM: нижче від лінії
ATTR(): множина всіх характеристик точки .
На рис. 4.17 зображені точки з такими атрибутами

Рис. 4.17. Застосування алгоритму Коена - Сазерленда




Сегмент є повністю видимим, якщо , і повністю невидимим, якщо . Розглянемо такий алгоритм
Обчислюємо значення
якщо
то невидимий
вихід
якщо
M:= серединна точка of
обислюємо ATTR(M)
Якщо R or ? ATTR(M)

В іншому випадку якщо L або B ATTR(M)

В іншому випадку якщо , можливо видимі
Повторити алгоритм для ,
В іншому випадку якщо видима, то повторити для
В іншому випадку якщо видимий, то повторити для
Кінець алгоритму
Розглянемо приклад (рис. 4.18.). Обрізати відрізок прямокутним вікном, застосовуючи алгоритм Коена - Сазерленда

Рис. 4.18. Приклад обрізання прямокутним вікном
;
;
можлива видима частина сегмента лінії;
серединна точка of;
;
, мають можливо видиму частину;
Повторення алгоритму для ,.
Лінійний сегмент ;
серединна точка of;
;
;
Друк і повторення для ;
Лінійний сегмент ;
серединна точка на ;
;
;
Друк і повторення для ;
Процес повторюється, доки довжина сегмента не досягне визначеної точності.

Обчислимо точки перетину лінійного сегмента з вікном обрізання так.
Лінія, що проходить через точки , і є перетином вертикальними краями, має вигляд
,
де – нахил за даної лінії.
Аналогічний перетин горизонтальними краями має вигляд

Застосуємо алгоритм серединної точки, запишемо координати серединної точки, які обчислюють за формулами
.
4.2.3. Алгоритм Лянга - Барського
Запишимо сегмент в параметричній формі для і :
;
;
де і .
Для вікна (рис. 4.19), і якщо сегмент є всередині вікна, маємо


Рис.4. 19. Вікно
Або в іншому випадку:

У загальній формулі для маємо

Краї ортогонального вікна розбивають площину на дві частини.
Кожна півплощина, до якої належить вікно, передбачена видимою.
Кожна з наведених вище нерівностей визначена для кожної з видимих півплощин.
З геометричного погляду алгоритм опрацьовує відрізок між точками і .
Кожна з нерівностей дає для відрізка низку значень t, які визначають видиму частину лінії, згідно границям вікна.
Для точка перетину лінії з межами вікна має значення , а знак визначає на кожній з меж вікна наявність точки .
– у видимій області;
– у невидимій області;
– лінія паралельна до i-ї межі, де i=1,2,3,4 – відповідно, ліва, права нижня і верхня межі.
Якщо то лінія проходить через видиму область до невидимої. Для залишається видима область.
За допомогою алгоритму обчислюють параметри і для кожної лінії: параметри визначають відрізок , частина якого належить області вікна. Обчислимо параметри і :

Алгоритм Лянга-Барського [40] має деякі переваги. Для обчислення кожного нового значення і ділення треба виконувати лише один раз, а точку перетину обчислюють лише раз.
Розглянемо приклад. Задано лінійний сегмент, який треба обрізати заданим вікном згідно з алгоритмом Лянга-Барського (рис. 4.20)

Рис. 4.20. Обрізання прямокутним вікном
Приймемо


виходить з невидимої області, визначене границею (1) і прямує до видимої області;
поза областю;
залишається у видимій області, (визначена межею (2)).
належить видимій області (визначене межею (2));
виходить з невидимої області, визначена межею (3) прямує до видимої;
поза областю;
залишається у видимій області, (визначена межею (4) і прямує до видимої;
у межах видимої області (визначене межею (4)).
Точки перетину та параметрів і визначають так:

Для t = 0,33 лінія , відповідно, перетинає межі (2) і (4). Оскільки то обчислюємо межі видимого сегмента:

Отримуємо відрізок ’, видимий у вікні, який є вирізаною частиною відрізка .
4.3 Вирізання областей
4.3.1. Базовий матеріал
Надалі всі вирізання будуть здійснюватись опуклими 9рис. 4.21) багатогранниками (рис.4.21).

Рис.4.21. Опуклий і неопуклий багатогранники
Багатогранник з вершинами та сторонами називають додатновизначеним [39], якщо рухаючись через кожну його вершину в заданому порядку, можна утворити коло проти годинникової стрілки (рис.4.22).

4.22.Додатно визначений 4.23. Від’ємно визначений
багатогранник багатогранник
Якби хтось рухався вздовж граней багатокутника, то його ліва рука належала б внутрішній частині багатогранника(рис.4.23).
Наприклад, задано лінійний сегмент ?? з вершинами . Визначити, з якого (лівого чи правого) боку від сегмента ?? точка (рис. 4.24).;
Вектори ?? і ?? визначають векторний добуток , якщо точка P лежить ліворуч від ??, то векторний добуток матиме напрям (вертикально до площини xy). Якщо точка ? є праворуч від ??, то векторний добуток матиме напрям.

Рис. 4.24. Положення точки відносно прямої
Далі отримуємо

З означення векторного добутку

За напрям векторного добутку визначають з виразу :
якщо ? є ліворуч від ??;
якщо ? то добуток є праворуч ??.
Згідно з наведеними критеріями, якщо точка ? є праворуч від межі вікна додатно визначеного багатокутника, то передбачають що вони є ззовні багатокутника, в іншому випадку (якщо ліворуч від межі ) – всередині.
4.3.2. Алгоритм Сазерленда - Ходгмана
За допомогою цього алгоритму можна виконати вирізання будь-яким багатокутником (опуклим чи ні). Для застосування цього алгоритму треба мати багатокутник з вершинами і опукле додатно визначене вікно зі сторонами . Виберемо одну з граней вікна, наприклад ? (з вершинами ??), а потім повторимо цей процес для всіх меж вікна. Дослідимо розташування кожної зі сторін відносно ? так. Нехай є стороною, яку досліджуємо:
якщо , є ліворуч від ?? записуємо в список вихідних даних вершину (рис. 4.25,а)

а б
Рис. 4.25. Сторони , розташовані по один бік від ??
якщо і праворуч, то нічого не заносимо у список (рис.4.26,б);

а) б)
Рис.4. 26. Сторони , розташовані по різні боки від ??
якщо є ліворуч, а праворуч, то обчислюють точку перетину ?, яку вводять у список вихідних даних (рис.4.26,а).
якщо праворуч, а ліворуч, то обчислюють точку перетину ?. В список вихідних даних уводять точки ? і (рис.4.26.б).
Алгоритм повторюють для кожного боук вікна вирізання з урахуванням кожного разу багатокутника з попереднього кроку.
4.3.3. Алгоритми Сазерленда-Ходгмана вирізання поверхонь
Поверхні часто рисують по їхньому периметру, який можна наблизити багатокутником. У випадку коли багатокутник складається з багатьох ланок, треба вирізати кожну з ланок як це зображено на рис.4.27.

Рис. 4.27. Вирізання багатокутником
Поверхні можна успішно вирізати по кожній з граничних ліній (ліній, які розділяють дві півплощини) опуклого вікна. Для цього треба створити таку вхідну інформацію:
список сторін поверхні, які маємо намір вирізати;
лінії, згідно з якими відбуватиметься вирізання.
На кожному кроці вирізання відбувається два процеси.
1. Для кожної досліджують чи вона видима відносно лінії. Видимі точки заносяться в список вихідних даних.
2. Одночасно досліджується, чи точка є по той самий бік, що і точка. Якщо ні, то обчислюється точка перетину відрізка зі стороною e, і ця точка також з аноситься в список вихідних даних.
Алгоритм Сазерленда - Ходмана
:= перша точка периметра
Q :=
Повторити
Якщо Q видима відносно (е)
Q занести в список вихідних даних
End
P := наступна Q вершина периметра
Якщо QP перетинає (е)
Обчислюємо точку перетину ?
? занести в список вихідних даних
Q := P
Кінець
Алгоритм працює, поки всі вершини не буде переглянуто.
Наприклад. Задано багатокутник ,…,, який треба відрізати по лінії ? (рис.4.28). В таблиці 4.8. подані точки перетину

Рис. 4.28. Вирізання багатокутника по лінії ?
Таблиця 4.1. Визначення точок перетину

Q
P
Точки перетину
Результат

1
1


1



2
2’
2’


2
3




3
4
4’
4’


4


4



5




5


5



6
6’
6’


6
7




7
8
8’
8’


8


8


РОЗДІЛ 5. ЗАСТОСУВАННЯ ПАКЕТІВ MATLAB У КОМПЮТЕРНІЙ ГРАФІЦІ
5.1. Головні відомості про MATLAB
Система Matlab створена як мова програмування високого рівня, що грунтується, головно на масивах даних і є особливо ефективною в технічних розрахунках. Ця система має величезні можливості: підтримує виконання операцій з векторами, матрицями і масивами даних; реалізує сингулярні й спектральні розклади; обчислює ранги і числа зумовленості матриць; підтримує роботу з алгебричними поліномами; підтримує розв'язок нелінійних рівнянь і задач оптимізації, та розв’язування диференціальних і різницевих рівнянь; передбачає побудову різноманітних видів графіки та побудову тривимірних поверхонь. У ній реалізовано зручне операційне середовище.
В системі Matlab об’єднано зручна оболонка, редактор виразів і текстових коментарів, обчислювач і графічний програмний процесор. Тут використано такі потужні типи даних як багатовимірні масиви, масиви комірок, масиви структур, масиви Java і розріджені матриці, що надає нові можливості застосування систем у разі створення і налаштуванні нових алгоритмів матричних і побудованих на них паралельних обчислень та потужних баз даних. Система є сумісною з такими мовами програмування, як C, Fortran і Java, а також оснащена надзвичайно зручним help menu.
5.1.1. Інтерфейс Matlab
Після запуску програми Matlab з’являється її головне вікно (рис. 5.1), яке містить меню, інструментальну лінійку з кнопками і клієнтську частину зі знаком запрошення ">>" Його називають командним вікном Matlab. Це найважливіше вікно Matlab . Тут можна вводити з клавіатури числа, назви змінних і знаки операцій. Назви змінних повинні починатися з букви і складатися з букв, цифр та знаків підкреслювання. Найпростішими знаками операцій є "+" і "-". Знак "=" відповідає операції присвоювання. Після натискання на клавішу Enter система обчислює вираз і виводить результат. Уся видима інформація розташована в двох принципово різних зонах: зоні перегляду і зоні редагування. Зона редагування займає, як звичайно, один останній рядок командного вікна, у якому розміщені знак запрошення ">>". Цей рядок називають рядком уведення. Його можна розширювати шляхом натискання на клавішу Enter після введення трьох або більше крапок ("…").

Рис. 5.1. Головне вікно
Другим, дуже важливим, є вікно редагування (рис. 5.2), у ньому можна записувати функції, які треба створити, оскільки в зоні перегляду нічого не можна змінити, лише виокремлювати і копіювати в буфер інформацію для подальшого її використання.
Третє вікно (рис. 5.3) - цеє вікно, призначене для презентації графіки.

Рис. 5.2. Вікно редагування Рис. 5.3. Вікно презентації
5.1.2. Програмування в Matlab
Пакет Matlab має мову високого рівня програмування. Для втілення намірів щодо отримання потрібних результатів, передбачено, що користувач має навики програмування і знає базові функції. В цьому розділі наведено лише головні команди.
Команди введення/ виведення. Для введення даних у Matlab є безліч шляхів. Найпростіший - введення потрібної інформації крок, за кроком у полі команд. Тут записують ім'я змінної, після знака" =" їй буде присвоєне деяке значення
?.?: >> a = 1
>> B = [1 2 3;4 5 6]
>> s = ‘good’
Зазначимо, що ім’я змінної не може починатися з цифри, а також у Matlab є різниця між великими і малими буквами. Тут змінна a - це не те ж саме, що й змінна A.
Після натискання на клавішу Enter на екрані відразу з’явиться змінна з заданим значенням.
Є ще один шлях для введення даних – команда input. Її використання дуже просте. Запишемо команду
>> ? = input (‘ Надати значення:’);
Після натискання на клавішу Enter, з’явиться повідомлення, записане між комами, і комп’ютер очікуватиме на введення значення, яке буде присвоєно змінній. Якщо виникає бажання побачити результати дій, то використовують команду disp.
>> a = 3;
>> b = 5;
>> c =a + b;
В обох командах змінним a і b присвоєно значення 3 і 5. Після цього їх підсумували і записано результат у змінну c. За потребою побачити отримане сумарне значення результат, то достатньо записати
disp ( c )
Результатом такої дії буде число 8. Якщо треба відобразити ім’я змінної, то записують:
disp (' c = ').
Для імпортування даних використовують команди мови C:fscanf, fprintf, sprintf.
Умовні оператори if - elseif – else. Команди If, elseif - else мають такий вигляд:
if умова
інструкції
elseif умова
інструкції
else
інструкції
end
Умови записують у вигляді
Вираз_1 Оператор_відношення Вираз_2,
як оператори відношення використовують позначення: ==, <, >, <=, >= або ~=, всі є парами символів без пропусків між ними.
Розглянемо невеликий приклад. Якщо змінна a має значення 1, то надрукувати перше повідомлення, якщо вона не дорівнює 1, перевірити чи вона дорівнює 2. У цьому випадку надрукувати друге повідомлення. Якщо ні перша, ні друга умови не виконуються, надрукувати третє.
if a = = 1
disp('a = 1')
elseif a = = 2
disp('a = 2')
else
disp('wrong value')
end
Зазначимо, що команда if повинна завжди супроводжуватись командою end, яка є в кінці тіла умовного оператора.
Для різнопланового вибору або розгалуження використовують конструкції з перемикачем типу switch-case-otherwise. Якщо вираз після заголовка switch має значення одного з виразів case _Вираз..., то виконується блок операторів case, в іншому випадку – список інструкцій після оператора otherwise. У разі виконання блока case виконуються ті списки інструкцій, для яких case _Вираз збігається з switch_Bиразом. Зверніть увагу на те, що case _Вираз може бути числом, константою, змінною, вектором або рядковою змінною. Ці команди мають такий вигляд:
switch switch_вираз
case case_ вираз
Інструкції
case case_ вираз
Список Інструкцій
otherwise
Список Інструкцій
end
Використаємо ці команди в такому прикладі
switch color
case 'red'
c = [1 0 0];
case 'green'
c = [0 1 0];
case 'blue'
c = [0 0 1];
otherwise
error('invalid choise of color');
end
Команди циклу. Цикли типу for...end, як звичайно, використовують для організації обчислень з заданою кількістю циклів, що повторюються. Команда for задає перше й останнє значення змінній, а також крок. Ця команда повинна завершуватись командою end. Команда for може бути всередині тіла іншої команди for. Конструкція цього циклу має такий вигляд:
for змінна = векторний рядок зі значеннями змінних
інструкція
end
Наприклад:
for i = 1:0.1:10
disp( i );
end
Отриманим результатом буде масив чисел від 1 до 10 з кроком 0,1.
Розглянемо ще один тип циклів - цикли типу while. Вони виконуються доти, доки виконується умова:
while Умова Інструкції end
Команду while зручно використовувати тоді, коли працюють з групою команд і не знають скільки треба зробити циклів, проте відомо, що вони повинні виконуватись доти, доки не будуть задовольнятися деякі умови. Розглянемо ще один приклад
sum = 0;
while sum < 10
sum =sum + 3;
end
5.1.3. Створення і застосування М-файлів
Загалом Matlab має близько 200 базових функцій. Деякі функції вбудовані в середовище Matlab і їхні тексти недоступні для користувача. Інші функції доступні й формують бібліотеку функціональних М-файлів, які є в піддерикторії Matlab. М-файл є звичайним текстовим файлом, який містить набір операторів мови Matlab. Для створення М-файлів можна використовувати як вбудований редактор, так і будь-який текстовий редактор, який підтримує формат ASCII. Підготований і записаний на диску М-файл стає частиною системи, і його можна викликати з командного рядка або з іншого М-файлу. Є два типи М-файлів: скрипт - файли і функції-файли. Важливо, що в процесі створення вони проходять синтаксичний контроль за допомогою вбудованого в систему MATLAB редактора/налаштовувача М-файлів.
Скрипт-файли. М-файл може складатися тільки з фрагмента програми, а саме з деякої послідовності операторів мови Matlab, яка не виділена як окрема функція. Такі файли називають скрипт-файлами (Script files). На відміну від функціональних файлів вони не містять слова "function". Усі змінні, оголошені в скрипт-файлі, стають глобальними для програми, в яку вони включені. Отже, скрипт-файл є просто записом серії команд без вхідних і вихідних параметрів і має таку структуру:
Основний коментар Додатковий коментар Тіло файла з будь-яким виразом
Головним коментарем є перший рядок текстових коментарів, а додатковим – наступні рядки. Важливі такі властивості скрипт-файлів:
вони не мають вхідних і вихідних аргументів;
працюють з даними з робочої області;
у процесі виконання не компілюються;
є послідовністю операцій, зафіксованоюй у вигляді файлу, аналогічної до тієї, що використовується в сесії.
Виокремлення деякої частини програми в М-файл виправдане, якщо ця частина складається з великої кількості операторів, використовувана в програмі багаторазова або її наявність у явному вигляді в тексті утруднює читання і роботу програми.
Скрипт-файли працюють з даними з робочої області. Змінні, використовувані в скрипт-файлах, є глобальними, вони діють однаково в командах сесії і всередині програмного блока, яким є скрипт-файли. Тому задання в сесії значення змінних використовують у тілі файла. Імена скрипт-файлів не можна використати, як параметри функцій, оскільки вони не повертають значення. Скрипт-файли – це найпростіші програми мовою програмування MATLAB, їх не можна компілювати, перед компіляцією їх треба перетворити в функції-файли (рис. 5.4).

Рис. 5.4. Скрипт-файл Рис. 5.5. Лого Matlab
Нагадаємо, що як і в змінних, ім'я скрипт-файлу повинно починатись з букви. Недозволено надавати імена вже існуючих змінних. На рис.5.5 показано створення лого Matlab, цей демо- приклад існує в help menu.
Функціональні М-файли. Такого типу файли належать до другої категорії М-файлів. Різниця з скрипт-файлами полягає у тому, що всі змінні є локальними, крім тих які оголошені глобальними. Це означає, що їхня область дії обмежена тілом функції і вони не існують після її завершення. Перший рядок функціональних М-файлів повинен містити ключове слово "function", означає, що це функціональний М-файл. Після того іде тіло функції , а саме - програма написана мовою Matlab. Перший рядок після ключового слова містить ім'я (name) функції, список вхідних параметрів у круглих дужках і список вихідних аргументів перед знаком присвоювання. Якщо функція повертає декілька аргументів, то їхній список поміщений у квадратні дужки, а аргументи відділені комами: function [out 1,…,out n] = name (inp 1,…,inp m).
Для функціонального файла не обовязково мати вхідні або вихідні дані. Тип вхідних і вихідних даних може бути різним, тобто підтримувати числа, рядки, структури, матриці й багато інших типів даних. Важливо в разі роботи з функціями, щоб М-файл мав те ж ім'я, яке було оголошено попередньо (рис. 5.6).

Рис. 5.6. Функціональний М-файл
Для того, щоб викликати функцію, достатньо в командному рядку або в іншій функції написати ім’я функції з її вхідними та вихідними даними і присвоїти результат змінній, наприклад
>> d = kyklos( [0 0],1,10);
Тут d є матрицею 10x2, де перший рядок - x- координата точок периметра кола з центром у точці (0,0), одиничним радіусом, другий - y координата.
Усередині тіла функціонального М-файлу доступні змінні nargin і nargout, які означають кількість вхідних і вихідних аргументів, відповідно.
>>[out1,…,outn]=f(in1,inn)
5.1.4. Робота з матрицями
У вступі зазначено, що система Matlab дуже зручною для роботи з матрицями. Всі дії Matlab виконують тільки одним типом об’єктів – прямокутними матрицями. Елементами матриць можуть бути цілі, дійсні або комплексні числа. Скалярним значенням відповідають матриці розміром 1х1, а векторам - матриці з одним стовпцем або рядком. У разі визначення змінних немає потреби зазаначати розмірності. Розглянемо як задають матриці. Нехай треба працювати з матрицею
.
Для її введення треба в командний рядок записати:
>> ? = [1 2 3;4 5 6;7 8 9]
Крапка з комою між числами означає зміну рядка. Для введення декількох матриць треба повторити цю команду відповідну кількість разів.
Система Matlab дає змогу просто виконувати практично всі можливі дії та операції з матрицями і векторами, а саме: додавання, віднімання, ділення, піднесення до степеня, логарифмування, обертання, транспонування, обчислення рангу та ін. Наведемо нижче головні команди для матричних операцій:
"+" – додавання,
"-" – віднімання,
"*" – множення,
"^" – піднесення до степеня.
" ' " – транспонування.
Крім того, є ще інші корисні програми.
det(A) – визначник матриці A;
inv(A) – обертання матриці А;
eye(n) – одинична матриця ;
zeros(m,n) – нульова матриця ;
ones(m,n) – матриця одиниць ;
rand(m,n) – повертає матрицю випадкових чисел(mxn), елементи якої однорідно розприділені в інтервалі (0,1).
Тут також є шість логічних операторів, які використовують для порівняння двох елементів. Вони повертають логічний масив такої ж довжини з елементом 1(true), якщо співвідношення істинне, або логічний масив з елементом 0 (false) у протилежному випадку.
= = – дорівнює;
>= – більше або дорівнює;
<= – менше або дорівнює;
> – більше;
< – менше;
~= – не дорівнює.
Використовують також логічні оператори:
& – логічне "І"
| – логічне "АБО" OR
~ – логічно "НІ"
Інші корисні функції такі:
cos( ) – косинус та sin( ) – синус; tan( ) – тангенс; exp( ) – експонента; log( ) – натуральний логарифм; sqrt ( ) –квадратний корінь.
Число в Matlab записують як pi, воно повертає значення з рухомою крапкою, як найточніше до значення ?.
5.2. Графіка в Matlab
Графічні можливості системи Matlab дуже потужні і різноманітні. У Matlab є підсистема, яка підтримує всі засоби візуалізації дво- і тривимірної графіки, а також засоби її презентації. Передбачено декілька рівнів роботи з графічними об’єктами.
З поняттям графіки пов’язана робота з графічними об’єктами, які мають деякі властивості. Передусім треба виділити високорівневий інтерфейс, який містить команди і функції, орієнтовані на користувача і призначені для побудови графіків у прямокутних і полярних координатах, тривимірних поверхонь, гістограм, палітри кольорів, масштабу тощо.
На нижчому рівні розв’язування задач використовують дескрипторну графіку (Handle Graphics), тут кожному графічному об’єкту ставиться у відповідність особливий опис – дескриптор, на який можливі посилання в разі використання графічного об’єкта. Дескрипторна графіка дає змогу використовувати візуальне програмування об’єктів інтерфейсу – кнопок керування, текстових панелей та ін. Команди можна використовувати у високорівневій графіці, наприклад, для вилучення осей, зміни кольору тощо, в графічних об’єктах.
5.2.1. Визначення точки споглядання
Спочатку з– ясуємо як відображаються об’єкти в середовищі Matlab. Графічні функції за замовчуванням розташовують поверхню так, щоб спостерігач бачив її частину під деяким кутом, а інша частина є захована від споглядання.

Рис. 5.7. Кути споглядання
На рис. 5.7 розміщення спостерігача визначене двома кутами: азимутом (Azimuth) і кутом підвищення (Elevation). Азимут відраховують від осі, яка протилежна, а кут підвищення – від площини xy. Осі зафіксовані в додатному напрямі. Тут додатні напрями підрахунку кутів позначені стрілками.
Оглянути поверхню зі всіх боків можна за допомогою функції view. Отже, точка споглядання (Viewpoint) повністю визначена кутом азимуту і кутом підвищення. Виклик функції view з двома вихідними аргументами і без вхідних дає змогу визначити положення спостерігача, для цього в командній стрічці треба набрати (кути виводяться в градусах) такі команди:
>> [AZ, EL]=view
AZ =-37.5000
EL =30
Ці значення MatLab використовує за замовчуванням у разі побудови тривимірних графіків. Для задання положення спостерігача потрібно ввести азимут і кут підвищення (у градусах) як вхідні аргументіи view, наприклад: view(0,90) відображає вигляд на графік зверху. Функція view забезпечує ще декілька варіантів виклику:
view(3) – повернення до стандартних налаштувань;
view([x,y,z]) – розташування спостерігача в точці з координатами x,y,z.
Останній варіант задає точку споглядання з декартовими координатами . Якщо потрібно повернутись до вихідних значень (вони задані за замовчуванням), достатньо виконати такі команди:
для 2D – view(2), az = 0, el = 90;
для 3D – view(3), az = -37.5, el = 30.
5.2.2. Об'єкти дескрипторної графіки
Як відомо, графічні засоби MATLAB грунтуються на низькорівневій графіці, яку називають дескрипторною (описовою). Вона забезпечує об’єктно - орієнтоване програмування графічних команд та інтерфейсу користувача, дає нові можливості створення графічних програм MATLAB, а також допомагає зрозуміти, як реалізовані графічні засоби системи. Центральним поняттям дескрипторної графіки є графічний об’єкт. Розглянемо такі типи об'єктів:
root – первинний об’єкт, який відповідає екрану комп’ютера;
figure – об’єкт створення графічного вікна;
uicontrol – об’єкт створення елемента інтерфейсу;
axes – об’єкт, який задає область розташування графіка в вікні об’єкта figure;
uimenu – об’єкт створення меню;
uicontextmenu – об’єкт створення контекстного меню;
image– об’єкт створення растрової графіки;
line– об’єкт створення лінії;
patch – об’єкт створення заповнених фігур;
rectangle – об’єкт створення заповнених прямокутників;
surface – об’єкт створення поверхні;
text– об’єкт створення текстових підписів;
light – об’єкт створення ефектів освітленості.
Зазначимо, що об’єкти взаємопов’язані і можуть звертатись один до одного для отримання відповідного графічного ефекту.
Створення графічного вікна. Всі високорівневі команди і функції, які виводять графічні об’єкти автоматично утворюють графічний об’єкт Figure. Наведемо команди і функції, які призначені для створення графічних вікон і керування ними:
figure – відкрити чисте графічне вікно;
gcf – отримати дескриптор графічного вікна figure;
elf – очистити графічне вікно;
shg – показати попередньо звернен графічне вікно;
close – закрити графічне вікно;
refresh – обновити графічне вікно.
Сстворення координатних осей. Графічний об’єкт axis задає область розміщення графіка у вікні об’єкта figure. Всі команди і функції, які виводять графіки автоматично створюють графічний об’єкт axis. Якщо в одному графічному вікні створено декілька об’єктів axis, то один з них виокремлюється як графічний об’єкт. Розглянемо ще одну групу команд для створення координатних осей і керування ними:
axes – створити осі координат;
box – побудувати прямокутник наввколо рисунка;
сlа – вилучити побудову axes;
gса – отримати дескриптор графічного об’єкта axes;
hold – зберегти осі координат;
ishold – перевірка статусу hold (1, якщо осі збережені, і 0 в іншому випадку).
Зазначимо, що ці команди можна використовувати і в високорівневій графіці.
Побудова ліній. Для ілюстрації команди line побудуємо ламану лінію, яка проходить через три точки з координатами (0,1), (2,4) і (5,-1). Використаємо об’єкт line:
» line([0 2 5],[1 4 -1],'Color','blue')
Особливість команди line полягає в явному заданні всіх умов побудови графіка: координат конкретних точок, параметра кольору 'Color' і самого кольору 'blue' (синій). Результатом цієї команди є два відрізки прямої синього кольору, які проходять через задані точки, відрізки.
Команда Patch. Наступною командою для побудови графічних об’єктів є команда patch. Ця команда створює один або більше багатокутників, зафіксованих у вершинах. Команда особливо потрібна під час роботи з 3D графікою і може набувати таких форм:
patch(X,Y,C) – створює заповнений багатокутник, вершини якого задані векторами і біжучій системі координат, а специфікація заповнення – вектором кольорової палітри С. Можна також задавати колір за допомогою символьної змінної 'color' вигляду 'r', 'g', 'b', 'с', 'm', 'у', w, k, тут V, X і Y можуть бути матрицями;
patch(X,Y.Z,C) – створює багатокутник у тривимірній системі координат, у цьому разі матриця Z повинна мати той же розмір, що й X і Y.
Розглянемо найпростіший шлях використання команди patch. Нехай нам потрібно нарисувати трикутник, заповнений синім кольором, з вершинами: (0,0), (1,0) і (0.5,1).
patch ( [0 1 0.5] , [0 0 1] , [0 0 1] ):
тут перший вектор – х-координати вершин, другий – у-координати а третій визначає зафарбування поверхні об’єкта. Для задання кольору треба конкретно визначати відповідний коефіцієнт кольору ([rgb]) (red, green, blue).
Розглянемо ще один приклад використання команди patch:
» Х=[1 2 3 2 1];
» Y=[l 2 0 5 1];
» patch(X.Y.[l 0 0])
У цьому випадку багатокутник зафарбований червоним кольором, оскільки вектор кольорів [1 0 0] визначає наявність лише червоного кольру. Так само можна працювати і в тривимірному просторі, потрібно лише додати дані про z–координату.
5.2.3. Побудова графіків. Команди Plot, Plot3
Система MatLab має широкий набір засобів для побудови графіків функцій одної і двох змінних, а також відображення різних типів даних. Усі графіки виводяться в графічних вікнах зі своїми меню і панелями інструментів. Вигляд графіків визначений аргументами графічних команд, його можна бути змінити за допомогою інструментів вікна. Для побудови графіків функцій на деякій області зміни аргументів треба обчислити значення функції в точках області, часто для отримання хорошого результату доцільно використовувати достатньо багато точок.
Побудова графіків відрізками прямих. Для відображення таких функцій використовують графіки в декартовій (прямокутній) системі координат. У цьому разі, за звичай, будують дві осі – горизонтальну X і вертикальну Y, та задають координати х і у, які визначають вузлові точки функції у(х). Ці точки з’єднують одна з одною відрізками прямих, під час побудови графіка відбувається лінійна інтерполяція для проміжних точок. Оскільки MATLAB – матрична система, то сукупність точок у(х) задана векторами х і у однакового розміру.
Команда plot слугує для побудови графіків функцій у декартовій системі координат. Вона має низку параметрів, наведених нижче.
Команда plot (X, Y) будує графік функції у(х), координати точок (х, у) якої взяті з векторів однакового розміру Y і X. Якщо X або Y – матриця, то відбувається побудова сім’ї графіків за даними, які містяться в стовбцях.
Наприклад, якщо хочемо нарисувати графік функції в інтервалі [0 8?] то потрібно виконати такі кроки:
function draw_sinx(pedio,shmeia) % 1
h = (pedio(2)-pedio(1))/(shmeia-1); % 2
x = pedio(1):h:pedio(2); % 3
y = sin(x); % 4
plot(x,y) % 5
axis equal % 6
Числа у правій частині тіла функції не впливають на програму, однак, завдяки їм можна проаналізувати, що робить кожний рядок. У першому рядку ми оголошуємо, що створено М-функцію, якій дано ім'я draw_sinx. Тут також оголошено, що вона має два вхідні параметри. З другого рядка зрозуміло, що перший параметр є масивом, розміром , а другий – числом. За допомогою масиву додаємо інтервал, у якому відбуватиметься побудова кривої. В другому рядку – точки графіка. У третьому рядку визначаємо всі х , а в четвертому обраховується значення функції y = sin(x). У п’ятому використана функція plot для малювання графіка обчислених значень аргументу(рис.5.8). Шостий рядок відображає на те, що вздовж кожної осі однакове масштабування. Введемо конкретні параметри для отримання результату, а саме, draw_sinx([0,4*pi],28).

Рис. 5.8. Графік функії
Щоб функція мала вигляд гладкої кривої, необхідно збільшити кількість вузлових точок, розташовання ж їх може бути довільним.
Функція plot(Y) будує графік у(і), значення у беруть з вектора Y, a i є індексом відповідного елемента. Якщо Y містить комплексні елементи, то виконується команда plot (real (Y). imag(Y)). В інших випадках уявна частина даних ігнорована
» х=2*pi:0.02*pi:2*pi; 
» y=sin(x)+i*cos(3*x); 
» plot(y)
Функція plot(X,Y,S) аналогічна до команди plot(X,Y), однак тип лінії графіка можна задавати за допомогою рядкової константи S.
Значеннями константи S можуть бути такі символи (табл.5.1).
Таблиця 5.1. Символи
Колір лінії

Y
М
С
R
G
В
W
К

Жовт.
Фіол.
Голуб.
Червон.
Зел.
Синій
Білий
Чорн.

Тип точки

.
0
+
*
S
D
V
A
<
>
P
H

точ-
ка
коло
плюс
зірка
квад-
рат
ромб
три-
кут-
ник
униз
три-
кут-
ник
уверх
три-
кут-
ник
уліво
три-
кут-
ник
управо
п’яти-
кутник
шести-
кутник

Тип лінії

-
:
-.
--

Суцільна
Подвійний пунктир
Штрих-пунктир
Штрих


Отже, за допомогою рядкової константи можна змінювати колір лінії, задавати вузлові точки різними значками і змінювати тип лінії графіка.
Якщо немає посилання на колір ліній і точок, то він буде вибираний автоматично з таблиці кольорів (білий вилучений). Якщо ліній більше шести, то вибір кольорів повторюється. Для монохромних систем лінії виокремлювані стилем.
Нижче наведено приклад побудови графіків трьох функцій з різним стилем кожної з них.
» x=-2*pi:0.1*pi:2*pi;
» yl=sin(x);
» y2=sin(x).^2;
» y3=sin(x).^3:
» plot(x,yl,'-m',x,y2,'-.+r',х,у3,'--ok')
Тут графік функції y1 побудований суцільною фіолетовою лінією, графік у2 – штрих пунктирною лінією з крапками у вигляді знака «плюс» червоного кольору, а графік уЗ – штриховою лінією з кружечками чорного кольору.
Створення масивів даних для тривимірної графіки. Перш ніж описувати команди plot3, розглянемо різні команди побудови поверхонь. За допомогою Matlab можна рисувати поверхні. Для цього є достатньо команд, які можна легко використовувати, наприклад: meshgrid, surfc, meshc, peaks. Звичайно, можна застосовувати і команду patch.
Тривимірні поверхні, як звичайно описують функцією двох змінних z(x, у). Побудова тривимірних графіків потребує не просто задання векторів х і у, та визначення двовимірних масивів – матриць. Для їхнього створення слугує функція meshgrid, яку головно використовують сумісно з функціями побудови графіків тривимірних поверхонь. Функцію meshgrid записують так:
[X,Y] = meshgrid(x) – аналогічна до [X,Y] = meshgrid(x,x);
[X,Y,Z] = meshgrid(x,y,z) – повертає тривимірні масиви, які використовують для обчислення функцій трьох змінних і побудови тривимірних графіків;
[X,Y] = meshgrid(x,y) – перетворює область, задану векторами х і у, у масиви X і Y, які можуть бути використані для обчислення функції двох змінних і побудови тривимірних графіків. Рядки масиву X є копіями вектора х; а стовпці Y – копіями вектора у.
Команда meshgrid створює координати (x,y), які використовують для утворення z-координати.
[X,Y] = meshgrid(-8:.5:8);
R = sqrt(X.^2 + Y.^2) + eps;
Z = sin(R)./R;
mesh(X,Y,Z)
Унаслідок виконання описанихвище дій можна отримати поверхню.

Рис. 5.9. Поверхня, створена командою meshgrid
За допомогою сіткоподібних графіків з заданим функціональним заповненням поверхні можна зобразити найліпше. Команди, які їх викликають містять слово mesh. Ці команди такі:
mesh(X,Y,Z,C) – виводить у графічне вікно сіткову поверхню Z(X,Y) з кольорами вузлів поверхні, які задані масивом С;
mesh(X,Y,Z) – аналог попередньої команди при C=Z. У цьому випадку використовують функціональне заповнення, за якого колір заданий висотою поверхні.
Можливі також форми команди mesh(x,y,Z), mesh(x,y,Z,C), mesh(Z) і mesh(Z,C).
Система MATLAB має декілька графічних функцій, які повертають матричний образ поверхні. Наприклад, функція peaks(N) повертає матричний образ поверхні з низкою піків і западин.
Інколи графік поверхні доцільно об'єднати з контурним графіком її проекції на площину, розташовану під поверхнею. Для цього використовують команду meshc. Команда meshc(...) – аналогічна до mesh(...), однак, крім графіка поверхні, дає зображення її проекції у вигляді ліній одного рівня.
Уявлення про поверхні можна отримати з сіткових графіків, які використовують функціональне заповнення комірок. Наприклад, колір заповнення поверхні z(x, у) можна задати згідно з висотою z поверхні, вибравши для малих висот темні тони, а для великих – світлі. Для побудови таких поверхонь використовують команди класу surf (...):
surf (X, Y, Z, С) – будує кольорову параметричну поверхню за даними матриць X, Y и Z з кольором, що заданий масивом С;
surf(X,Y,Z) – аналогічна до попередньої команди, де C=Z, так що колір задається висотою тої чи іншої комірки поверхні;
surf(x,y,Z) і surf(x,y,Z,C) з двома векторними аргументами х і у – вектори х і у заміняють перші два матричні аргументи і повинні мати довжини length(x)=n і length(y)=m, де [m,n]=size(Z). Тут вершини областей поверхні задані трьома координатами (x(j), y(i), Z(i,j)). Зазначимо, що х відповідає стовпцям Z, а у – рядкам;
surf(Z) і surf(Z,C) використовують х = 1:n і у = 1:m. Тут висота Z – однозначно визначена функція, задана геометрично прямокутною сіткою;
surfc(...) – аналогічна до команди surf, однак забезпечує додаткову побудову контурного графіка проекції фігури на опорну площину.
Побудова графіків поверхонь. Команда plot3(...) є аналогом команди plot (...), однак належить до функції двох змінних z(x, у). Вона будує аксонометричне зображення тривимірних поверхонь і має різні форми.
Функція plot3(x,y,z) будує масив точок, заданих векторами х, у і z, з’єднує їх відрізками прямих.
Функція plot3(X,Y,Z), де X, Y, Z – три матриці однакового розміру, будує точки з координатами X(i.:), Y(i,:) і Z(i,:) і з’єднує їх відрізками прямих. Розглянемо побудову тривимірної поверхні, яку описує функція z(х, у)=х^2+у^2.
» [X,Y]=meshgrid(-3:0.15:3);
» Z=X.^2+Y. ^2;
» plot3(X,Y,Z)
Функція plot3 (X, Y, Z, S) – забезпечує побудови, аналогічні до наведених нижче але зі специфікацією стилю лінії і точок. Нижче в прикладі цю команду застосовано для побудови поверхні колами.
» [X.Y]-meshgrid([-3:0.15:3]): 
» Z=X.^2+Y.^2; 
» plot3(X,Y,Z,'o')
Функція plot3(xl, yl, zl, sl,х2,у2,z2, s2, хЗ,уЗ,z3,s3,...) будує на одному рисунку графіки декількох функцій zl(xl ,yl), z2(x2,y2) і так далі зі специфікацією ліній і маркерів кожної з них.
» [X,Y]=meshgrid([-3:0.15:3]);
» Z=X.^2+Y.^2;
» plot3(X,Y,Z,'-k',Y,X,Z,'-k')
5.2.4 Примітиви
Лінія. У разі малювання ліній з використанням команди plot треба знати, чи вона є повністю в інтервалі, який хочемо зобразити в Matlab. Нехай потрібно відобразити лінію ?? з точками A(3,4) і B(6, 7). Єдине, що треба зробити – надрукувати в командному вікні: plot([3 6],[4 7]). Є також інший шлях: patch([3 6],[4 7],[0 0 0]).
У другому випадку ми не можемо вибирати кольору для малювання ліній, вони будуть чорними за замовчуванням. Тому набагато зручніше використовувати команду plot.
Можна також застосувати алгоритм Брезенхема. Звичайно, це може призвести до непрердбачених проблем. Унаслідок автоматичного регулювання осями Matlab не дає більш працювати з пік селями. Якщо є бажання, то можна дати користувачу ілюстрацію піксельного рисунка У цьому випадку, якщо треба працювати з пікселями, ліпше використовувати іншу мову програмування.
Коло, еліпс, багатокутник. Для того, щоб намалювати коло, немає готової функції, тому, насправді рисують багатокутник з великою кількістю вершин, які наближатимуть нас до кола. Інколи достатньо використати 40 вершин.
Передусім треба вирішити, який тип буде використано для координат точок. Ліпше працювати з параметричним рівнянням кола, яке задається рівняннями:
, тут і – центр кола з радіусом .
Розібємо інтервал [0,2?] на 40 вузлів, набравши в командному вікні рядок t = 0: 2*pi/40:2*pi; або використавши команду linspace(0,2*pi,50), що виконує ті ж дії.
Наступний крок – обчислимо координати точок еліпса попередньо задавши фіксовані значення .
x = r * sin( t ) + xo; y = r * cos( t ) + yo,
На завершення використаємо команду plot для створення відповідної форми. Після натискання на клавішу enter відкриється нове вікно, яке буде містити коло.
Як зазначено, форма залежить від осей. Для створення кола треба додати команду axis equal.
Якщо потрібно нарисувати круг і замалювати кольором, замість команди plot можна використати команду patch. Наприклад, якщо треба нарисувати круг зеленого кольору, достатньо записати patch( x,y,[0 1 0]).
Для спрощення процесу створення низки кіл, достатньо створити М-функцію, яка вхідними параметрами матиме центр кола і радіус. Вихідними параметрами будуть координати точок кола.
Створення еліпса аналогічне до створення кола. Єдина різниця полягає в параметричних рівняннях еліпса. Зразок програми для створення еліпса наведено в розділі 1.
Багатокутник створюютьнарисуванням його ліній за допомогою команди plot. Якщо багатокутник потрібно заповнити, використовують команду patch.
3D об’єкти. Для рисування 3D об’єктів застосовують команду patch. Опишимо цю команду детальніше. Щоб нарисувати одиничний куб, треба виконати такі дії. Спочатку записати вершини 3D об’єкта в формі масиву, де кожний рядок має три стовпці, які відповідають їхнім координатам. Кожна вершина має порядковий номер. Наприклад, вершина з координатами (0,0,0) має порядковий номер -1, а (0,1,1) – номер 8. Після цього створюють ще одну таблицю зв’язку, яка містить вектор порядкових номерів вершин, що належать кожній грані куба.
Нехай треба нарисувати два одиничні куби, де перший з вершиною в початку координат (0,0,0), порядковий номер якої – 1, і має спільну вершину з другим кубом у точці з координатами (1,1,1), порядковий номер якої 2, для другого куба. Для цього запишемо такий М-файл.
vertex_matrix = [ 0 0 0;1 0 0;1 1 0;0 1 0;... % 1
0 0 1;1 0 1;1 1 1;0 1 1]; % 2
faces_matrix = [1 2 6 5;2 3 7 6;3 4 8 7;... % 3
1 5 8; 1 2 3 4; 5 6 7 8]; % 4
patch('Vertices',vertex_matrix,'Faces',faces_matrix) % 5
hold on % 6
v = [ 1 1 1;2 1 1;2 2 1;1 2 1;... % 7
1 1 2;2 1 2;2 2 2;1 2 2]; % 8
patch('Vertices',v,'Faces',faces_matrix, 'FaceVertexCData'... % 9
,[1 0 0],'FaceColor','flat') % 10
view(3); % 11
axis square % 12
Пояснемо програму. Рядки 1 і 2 містять координати вершин одиничного куба. Рядки 7 і 8 є координатами другого куба. В рядках 3 і 4 задано зв’язки вершин куба згідно з його гранями. В рядку 5 створено перший одиничний куб чорного кольору, а в рядку 9 – інший куб червоного кольору (шляхом уведення [ 1.0.0 ], що відповідає червоному кольору). Будь-який бажаний колір можна задати введенням відповідних значень системи RGB. На рис. 5.10 зображено результат наведених програм.

Рис. 5.10. Два одиничні куби зі спільною вершиною
Сфера. Система Matlab має функцію, яка будує сфери. Ця функція генерує x-, y- і z- координати одиничної сфери за допомогою команд surf і mesh. Для розрахунку масивів X, Y і Z координат точок сфери як тривимірної фігури використовують функцію sphere:
[X.Y,Z]=sphere(N) – генерує матриці X, Y і Z розміром (N+l)х(N+l) для побудови сфери за допомогою команд surf(X,Y,Z) або surfl(X,Y,Z);
[X,Y.Z]=sphere – аналогічна до попередньої функції при N=20;
» [X,Y,Z]=sphere;
» surfl(X.Y.Z)
Отже, сфера утворюється за замовчуванням шляхом побудови 2020 поверхонь або ж задаванням n як вхідного параметра, тоді сфера рисується за допомогоюзі nn поверхонь (рис. 5.11, 5.12).

Рис.5.11.Сфера при Рис 5.12. Сфера при
Проблема виникає у разі використання команди sphere, яка полягає в нечітко зрозумілому відображенні точок, що її утворюють. Для уникнення цих перешкод можна створити команду-функцію, яка створюватиме точки сфери так, щоб полегшити обчислення. Розв'язування грунтується на відокремленні меридіана і паралелей. Припускається, що сфера складається з паралельних круглих дисків зі змінним радіусом. Якщо обчислити точки кожного круга, то їх можна пов’язати між собою. Створіть цю функцію самостійно.
5.2.5. Алгоритми для примітивів
Пакет Matlab має готові функції для створення графічних примітивів. Проте корисно навести також відомі алгоритми, які застосовують в Matlab. Тут немає можливості використовувати пікселі, тому їх створюють іншими методами, а саме застосувати функцію image, яка утворює квадрат з одиничною стороною і центром в (x, y). Розглянемо відповідні коди.
Алгоритм Брезенгейма для побудови ліній. Уточнення алгоритму Брезенгейма для побудови будь-якої прямої лінії грунтується на послідовній побудові ліній. Цей алгоритм застосовують лише в одному октанті з наступним використанням симетрії. Нижче наведено коди цього алгоритму.
function blin(x1,y1,x2,y2,colour)
hold on
dx = x2-x1;
dy = y2-y1;
d = 0; % Auxiliary indicator
i = 0; % Auxiliary indicator
if dx == 0 % Planning of vertical lines
if y2 < y1
t = y1;
y1 = y2;
y2 = t;
end
for y = y1:y2
image(x1,y,colour) % Lighting pixel
end
else if dy == 0 % Planning of horizontal lines
if x2 < x1
t = x1;
x1 = x2;
x2 = t;
end
for x = x1:x2
image(x,y1,colour) % Lighting pixel
end
else if abs(dy) <= abs(dx)
if x2 < x1
t = x1;
x1 = x2;
x2 = t;
t = y1;
y1 = y2;
y2 = t;
end
% 1,4,5 and 8 oktant
if (dy < 0 & dx > 0) | (dy > 0 & dx < 0)
d = 1;
end
dx = abs(dx);
dy = abs(dy);
x = x1;
y = y1;
c1 = 2*dy;
sfalma = 2*dy-dx ;
c2 = sfalma-dx;
while x <= x2
if d == 0
image(x,y,colour) % Lighting pixel
else
image(x,y-2*i,colour) % Lighting pixel
end
x = x+1;
if sfalma < 0
sfalma = sfalma+c1;
else
y = y+1;
i = i+1;
sfalma = sfalma+c2;
end
end
else
if y2 < y1
t = x1;
x1 = x2;
x2 = t;
t = y1;
y1 = y2;
y2 = t;
end
% 2,3,6 and 7 oktant
if (dy < 0 & dx > 0) | (dy > 0 & dx < 0)
d = 1;
end
dx = abs(dx);
dy = abs(dy);
x = x1;
y = y1;
c1 = 2*dx;
sfalma = 2*dx-dy ;
c2 = sfalma-dy;
while y <= y2
if d == 0
image(x,y,colour) % Lighting pixel
else
image(x-2*i,y,colour) % Lighting pixel
end
y = y+1;
if sfalma < 0
sfalma = sfalma+c1;
else
i = i+1;
x = x+1;
sfalma = sfalma+c2;
end
end
end
end
end
Алгоритм Брезенгейма для кола. Для побудови кіл чи еліпсів нема готової функції, тому насправді рисується багатокутник з великою кількістю сторін, які наближаються до кола чи еліпса. Інколи достатньо використати 40 вершин.
Алгоритм Брезенгейма для побудови кіл такий:
function brescircle(center,r,colour)
x = 0;
y = r;
sfalma = 3 - 2 * r;
hold on
while x <= y
image(x + center(1),y + center(2),colour)
image(y + center(1),x + center(2),colour)
image(x + center(1),-y + center(2),colour)
image(y + center(1),-x + center(2),colour)
image(-x + center(1),y + center(2),colour)
image(-y + center(1),x + center(2),colour)
image(-x + center(1),-y + center(2),colour)
image(-y + center(1),-x + center(2),colour)
x = x + 1;
if sfalma >= 0
y = y - 1;
sfalma = sfalma - 4 * y;
end
sfalma = sfalma + 4 * x + 2;
end
axis equal
Алгоритм Капеллі для еліпса:
function kappel(center,a,b,colour)
hold on
xc = center(1);
yc = center(2);
x = a;
y = 0;
asqr = a ^ 2;
bsqr = b ^ 2;
a22 = 2 * asqr;
b22 = 2 * bsqr;
xslope = b22 * a;
yslope = 0;
fmid = bsqr * (0.25 - x) + asqr;
while (xslope > yslope)
image(x + xc,y + yc,colour)
image(-x + xc,y + yc,colour)
image(x + xc,-y + yc,colour)
image(-x + xc,-y + yc,colour)
y = y + 1;
yslope = yslope + a22;
if fmid >= 0
x = x - 1;
xslope = xslope - b22;
fmid = fmid - xslope;
end
fmid = fmid + yslope + asqr;
end
fmid = fmid -(yslope + xslope) / 2 + 0.75 * (bsqr - asqr);
while(x > =0)
image(x + xc,y + yc,colour)
image(-x + xc,y + yc,colour)
image(x + xc,-y + yc, colour)
image(-x + xc,-y + yc, colour)
x = x - 1;
xslope = xslope - b22;
if fmid <= 0
y = y + 1;
yslope = yslope + a22;
fmid = fmid + yslope;
end
fmid = fmid - xslope + bsqr;
end
axis equal
Застосування алгоритмів. Нехай поставлене завдання побудувати лінію (рис. 5.13), яка проходить через точки (0,0) і (50,70). Для цього використаємо команду
>> blin(0,0,50,70,47)
Для побудови кола з центром у точці (0,0) та радіусом 25 (рис. 5.14), можна використати команду
>> brescircle([0 0],25,56)
За допомогою алгоритму Капеллі будують еліпс з центром у точці (3,8) та осями, які відповідають значенням a= 23 та b=17 (рис. 5.15), використовуючи відповідну команду
>>kappel([3 8],23,17,47),

Рис. 5.13. Лінія Рис. 5.14. Коло Рис. 5.15. Еліпс
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];
Для цієї функції вхідними параметрами є кут обертання в радіанах, а вихідними – 33 матриця обертання.
Простір – 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. За позитивний кут приймаємо той, що рухається проти годинникової стрілки. Для такого типу перетворення виконуємо три кроки:
переносимо центр обертання V у початок координат;
повертаємо трикутник на кут p/2 навколо початку координат;
переносимо точку 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;
View(3);
s = surface(L, 'EdgeColor' , 'none', 'FaceColor' , [1 0 0], ...
'FaceLighting', 'phong', 'AmbientStrength', 0.3, ...
'DiffuseStrength', 0.6, 'Clipping', 'off ', ...
'BackFaceLighting', 'lit', 'SpecularStrength', 1.1, ...
'SpecularColorReflectance', 1 , 'SpecularExponent', 7);
t = hgtransform('Parent', w);
set(s, 'Parent',t);
Rz = makehgtform('yrotate', pi/2);
set(t, 'Matrix', Rz);
hold on
s = surface(L, 'EdgeColor' , 'none', 'FaceColor' , [0 1 0], ...
'FaceLighting', 'phong', 'AmbientStrength', 0.3, ...
'DiffuseStrength', 0.6, 'Clipping', 'off ', ...
'BackFaceLighting', 'lit', 'SpecularStrength', 1.1, ...
'SpecularColorReflectance', 1 , 'SpecularExponent', 7);

Рис. 5.17. Вихідне положення - зверху, результат – внизу.
У разі використання симетрії, виділений у рамці оператор буде замінений відповідною матрицею. Перед утворенням об’єкта необхідно помістити рисунок в змінну S, в іншому випадку не отримаємо потрібного результату. Якщо вже маємо один графік, то його треба перемістити в ту саму змінну і це можна зробити так:
vertex = [0 1 1 0 0 0 1 1;
0 0 1 1 1 0 0 1;
0 0 0 0 1 1 1 1];
facesm = [1 2 3 4;5 6 7 8;3 4 5 8;1 2 7 6;2 3 8 7;1 4 5 6];
hold on
h(1)= patch('Vertices',vertex','Faces',facesm,'FaceVertexCData',...
[0 0 1],'FaceColor','flat')
h(2)= plot3([0,0],[0,1],[1.8 1.8]);
Якщо цікавлять двовимірні об’єкти, які хочемо утворити за допомогою команд hgtransform і makehgtform, то в цьому випадку треба уявляти, що працюєте в тривимірному просторі. Наприклад, у разі потреби перенести якусь точку в іншу з координатами (x, y) її треба перенести в точку з координатами (x, y,0). Якщо передбачено поворот, то це буде поворот навкола осі z.
Перетворення осей. Команда makehgtform обчислює таблиці геометричних перетворень. Підсумком команди makehgtform є відповідні таблиці перетворення осей. Навіть якщо використовувати перетворення осей або геометричні перетворення, то остаточний результат (матриця перетворень) повинен бути той самий.
5.3.2. Проекції тривимірного простору в
Розглянемо площинні проекції та з їхнє використанням в Matlab Ці проекції можна розділити на дві головні категорії. До першої належать центральні проекції, в яких відстань від центру проекції до проекційної площини є скінченою, до другої – паралельні проекції, у яких відстань від центра проектування до площини проектування нескінченна.
Ці категорії повинні задовольняти такі властивості:
лінії після перетворення переходять у лінії;
відстань загалом змінюються;
паралельні лінії перестають бути паралельними після проектування, вони перетинаються в певних точках збіжності.
кути між лініями не змінюються, якщо задана площина паралельна до площини проектування.
Центральна проекція. Вважаємо, що проекційною площиною може бути екран комп’ютера, на якому треба відобразити нескінченну кількість точок тривимірного об’єкта. Для цього можна використати лінійну апроксимацію об’єктів у тривимірному просторі за допомогою відрізків прямих та плоских багатокутників. У цьому випадку, як зазначено вище, прямі після перспективного перетворення переходять у прямі на проекційній площині. Завдяки цій властивості центральної перспективи можна проектувати (обчислювати) лише для граничні точки відрізків, а потім з’єднувати проекції точок лініями вже на проекційній площині.
Розглянемо точку , що розміщена за проекційною площиною на відстані , і її проекцію на екран . Розташуємо спостерігача в точці , що на осі на відстані від екрана (проекційної площини) з координатами . Нехай координати точки на екрані є .
У цьому випадку перетворення не є лінійними, тому для використання їх у Matlab буде застосуємо таку матрицю:
така, що ,
де (x,y,z) координати точки на площині xOy. Нам залишається лише нормалізувати вектор, унаслідок чого отримаємо
.
Для цього треба виконати такі кроки:
перемістити центр проекції на вісь z;
обернути об’єкт, так, щоб споглядання відбувалось з xy;
застосувати матрицю перетворень для центральної проекції.
Паралельні проекції. Такі проекції поділяють на дві великі категорії – ортогональні та косокутні. Розглянемо визначення косокутних проекцій. Для цього використаємо теорію. Маємо матрицю перетворень, яка передбачає проекцію на площину xy.
,
а координати точок проекції задають рівняннями
.
Таблицю для ортогональних проекцій обчислюють при d = 0.
Проекції в MATLAB. Найпростіший шлях для побудови проекцій у Matlab – це шлях за якому ми зберігаємо дві матриці, одна з яких є матрицею проекції, а друга – матрицею, яка містить координати об’єкта, який маємо намір перетворювати. Недоліками цього підходу – утруднена побудова другої матриці, що апотребує великих затрат пам’яті. Для того, щоб оминути ці труднощі, можна використати програму, про яку згадано у розділі про перетворення. У випадку попередньо запропонованого методу, можна застосувати команду hgtransform без виклику програми про побудову проекцій матриць, як це робили за допомогою команди makehgtform під час перетворень. Отже, ми постійно повинні створювати нову функцію, яка будує потрібні нам матриці. Функція, яку використовують для побудови паралельних проекцій, може мати такий вигляд
function M = par_proj(a,fi)
d = 1/tan(a);
M = [1 0 d * cos(fi) 0;
0 1 d * sin(fi) 0;
0 0 0 0;
0 0 0 1];
Ця функція вхідними параметрами має два кути фігури і (fi) (обидва в радіанах). Отже, для створення проекції Кабіне одиничного кубу (рис. 5.18) на площині xy, можна використати результати наступного М-файлу. На рис.5.19 зображено результат вищенаведеної програми.
ax = axes;
x = [0 1 1 0 0 0 1 1 0 0 1 1 1 1 0 0];
y = [0 0 1 1 0 0 0 1 1 0 0 0 1 1 1 1];
z = [0 0 0 0 0 1 1 1 1 1 1 0 0 1 1 0];
h=plot3(x,y,z);
t = hgtransform('Parent',ax);
set(h,'Parent',t);
M = par_proj(63*pi/180,pi/6);
set(t,'Matrix',M);
view(0,90);
axis([-0.5 2 -0.5 2])

Рис. 5.18. Одиничний куб Рис. 5.19. Результат
Відповідно, можна побудувати функцію, яка дає матрицю центральної проекції:
function M = cen_proj(d)
M = [1 0 0 0;
0 1 0 0;
0 0 0 0;
0 0 1/d 1];
Використовуємо цю функцію разом з командою hgtransform, то немає необхідності нормалізувати нові координати, оскільки це виконуватиметься автоматично.
Нехай початкову форму описують такі оператори, які задають форму 1, що зображена на рисунку 5.18:
vertex = [0 1 1 0 0 0 1 1;
0 0 1 1 1 0 0 1;
0 0 0 0 1 1 1 1];
facesm = [1 2 3 4;5 6 7 8;3 4 5 8;1 2 7 6;2 3 8 7;1 4 5 6];
view(3)
h = patch('Vertices',vertex','Faces',facesm,'FaceVertexCData', [0 0 1],'FaceColor','flat')
Центральну проекцію з центром проектування в точці (0,0,-2) (d = 10) можна отримати, як результат наступного М–файла у вигляді форм 2 і 3, які зображені на рис. 5.20 і 5.21.
ax = axes;
vertex = [0 1 1 0 0 0 1 1;
0 0 1 1 1 0 0 1;
0 0 0 0 1 1 1 1];
facesm = [1 2 3 4;5 6 7 8;3 4 5 8;1 2 7 6;2 3 8 7;1 4 5 6];
h=patch('Vertices',vertex','Faces',facesm,'FaceVertexCData', [0 0 1],'FaceColor','flat')
t = hgtransform('Parent',ax);
set(h,'Parent',t);
M = cen_proj(2);
set(t,'Matrix',M);
axis([-0.5 2 -0.5 2])

Рис. 5.20.Форма 2. Рис. 5.21 Форма 3.
5.4. Вирізання
Система Matlab має відповідні функції, які можуть задовольнити будь-які потреби. Вирізання не відрізняється від інших функцій. Проте тут необхідно визначити розміри вікна, що можна зробити за допомогою команди axis. Коли вікно означено, можна лише спостерігати за його змістом. Якщо ж збільшувати розміри вікна, то можна побачити частини рисунка, які спочатку були приховані. В такий спосіб Matlab виконує свого роду автоматичне вирізання, яке можливе лише у разі прямокутного вирізання.
Постає питання: чи можливо виконати будь-яке обрізання? Так, можливо лише в тому випадку, якщо створити відповідний m–файл. Тут створені функції будуть працювати лише для окремих випадків побудови рисунків.
Такі дії можна виконувати за двома підходами. Перший полягає у тому, що треба мати постійно доступними всі необхідні дані й застосовувати відповідні функції для отримання результату. Другий – ґрунтується на тому, що форму, яку будемо обрізати, треба мати збереженою в файлі рисунку, підтримуваного Matlab, і використовувати зміну кольорів пікселів поза ділянкою обрізання. Нижче наведено деякі алгоритми обрізання з використанням різних підходів.
5.4.1. Алгоритми вирізання
Для досягнення ефекту вирізання використовують відомі алгоритми, спеціально розроблені з цією метою. Найвідоміші з них такі:
середньої точки
Коена–Сазерленда
Лянга–Барського.
Уведення цих алгоритмів у Matlab є не легким завданням, оскільки весь час треба мати доступною велику кількість інформації, записану в коректній формі. Для ліпшого розуміння розглянемо задачу вирізання і шляхи її розв’язування. Ця специфічна проблема спочатку виглядає складною, однак насправді вона є тривіальним випадком без особливих ускладнень, бо об’єкт складається лише з сегментів ліній, а вікно обрізання прямокутне.
Розглянемо приклад, який допоможе ліпше зрозуміти ці алгоритми. В колі, радіусом R рівномірно розташуємо N точок:
при R=15см., N=30.
Пов’яжемо кожну пару зі всіма іншими , j=1,2…,N, i?j. Якщо i?j, то точка не буде пов’язана з , оскільки це вже зроблено в протилежному напрямі. Отриманий рисунок буде обрізаний квадратом зі стороною 15см. і центром, який збігається з центром кола.
Цю проблему можна вирішити розв’язуватися різними шляхами. Перший полягає в використанні алгоритму Лянга–Барського за допомогою трьох М–файлів, у яких усі елементи задані а сторони вікон є паралельні осям та . Програмний код цих трьох файлів для розв’язування задачі такий:
function crop(n)
AK = [];
%--- Creation and planning of initial form -----
korif(1,1:n) = 15 * cos ((2 * pi * (0:(n-1))/ n));
korif(2,1:n) = 15 * sin ((2 * pi * (0:(n-1))/n));
for i = 1 : (n-1)
for j = (i + 1) : n
AK = [AK;[korif(:,i)' korif(:,j)']];
end
end
clf
hold on
for i = 1 : size(AK,1)
plot([AK(i,1) AK(i,3)],[AK(i,2) AK(i,4)])
end
axis equal
%--------- Coordinates of window -------------------
q = (15 * sqrt(2)) /2;
w=[q q -q q;-q q -q -q;-q -q q -q;q -q q q];
%------------- Beginning of process of clipping-----------
for i=1:4
pause(1)
figure(i+1)
k = 1;
while k <= size(AK,1)
e1 = emfanes(w(i,:),AK(k,[1 2]));
e2 = emfanes(w(i,:),AK(k,[3 4]));
if e1 + e2 == 2
k = k + 1;
elseif e1 + e2 == 0
AK(k,:) = [];
elseif e1 == 0
AK(k,[1 2]) = ST(w(i,:),AK(k,:));
k = k + 1;
elseif e2 == 0
AK(k,[3 4]) = ST(w(i,:),AK(k,:));
k = k + 1;
end
end
%--------------- Planning individual graphic -----------
hold on
for i = 1 : size(AK,1)
plot([AK(i,1) AK(i,3)],[AK(i,2) AK(i,4)])
end
axis equal
end
function P = ST(L1,L2)
P = [0 0];
dx = L2(3) - L2(1);
dy = L2(4) - L2(2);
if L1(1) == L1(3)
P(1) = L1(1);
P(2) = L2(2) + (dy * (P(1) - L2(1)) / dx);
else
P(2) = L1(2);
P(1) = L2(1) + (dx * (P(2) - L2(2)) / dy);
end
function e = emfanes(L,P)
if L(1) == L(3)
if L(4) > L(2)
if P(1) <= L(1)
e = 1;
else
e = 0;
end
else
if P(1) >= L(1)
e = 1;
else
e = 0;
end
end
else
if L(3) > L(1)
if P(2) >= L(2)
e = 1;
else
e = 0;
end
else
if P(2) <= L(2)
e = 1;
else
e = 0;
end
end
end
Описанівище функції виконують таке:
Функція Crop малює рисунок з n вершинами так:
1) утворює матрицю (під назвою AK), яка містить усі координати вершин, що пов’язані між собою;
2) створює координатні вікна;
3) викликає інші функції для отримання вирізання.
Функція ST обчислює постійно точки перетину ліній.
Функція emfanes перевіряє, чи точка P лежить на видимій півплощині. Повертає 1, якщо точка видима, і 0 в іншому випадку.
Для того, щоб розв’язати задачу, достатньо в командній стрічці Matlab записати таку команду:
>>crop(30);
Результат програми зображено на рис. 5.22. Такий підхід не є універсальним, бо залежить від вхідних даних про об’єкт. Тому постає питання: якщо треба вирізати деяку картинку, для якої немає достатньої кількості відомих елементів, то чинити?

Рис. 5.22. Результат обрізання
5.4.2. Інші підходи
Для того, щоб відповісти на питання, наведене вище, спочатку з’ясуємо як можна працювати з файлами, які містять рисунок.
Команда imread. Пакет Matlab забезпечує за допомогою команди imread читати різноманітні графічні файли з розширеннями .jpg, .jpeg, .gif, .bmp, .png, .tif, .tiff (щоб побачити всі типи файлів, які підтримує imread, можна використати команду help). Ця команда розташовує потрібний графічний файл і переводить кожен піксель картинки в системі RGB, на підставі цієї тріади будує матрицю, яка може бути вхідними даними до функції image. Це дуже зручно, оскільки робота Matlab грунтується на матрицях. Для деяких типів файлів imread як вихідні параметри дає матрицю, в якій зберігається тріада RGB.
Опишемо структуру першої матриці, в якій зберігається малюнок. У Matlab можна працювати з багатовимірними матрицями. Ці матриці можуть зберігати рисунки в разі використання команди imread.
Наприклад є рисунок, який зберігається з розширенням .jpg і має розмір 256240. Він буде поміщений в таблицю з розмірами 2402563. Це те саме, що ми маємо три матриці розміром 240256, кожна з яких містить величини від 0 до 256 і відповідає відсоткам кожного з трьох кольорів системи RGB, які містить кожен піксель.
У випадку, якщо маємо графічний файл з розширенням .gif, таблиці будуть простіші 240256 і також міститимуть величини від 0 до 255, проте одночасно треба мати другу матрицю, яка є вихідною. Розглянемо вирізання вікном визначені форми.
Вирізання фотографій. Як зазначено вище, кожну фотографію можна розглядати як таблицю, яка має за елементи кольорів або краще сказати хроматичну комбінацію кожного пікселя. Що робити, якщо потрібно обрізати фотографію в Matlab? Для отримання бажаного результату, цей процес можна розбити на п’ять послідовних кроків.
Імпортувати фотографії в Matlab у формі матриці. Для цього використовують команду imread.
Визначити форми і вимірності вікна вирізання. Такою формою може бути опуклий багатокутник, коло або будь-яка інша опукла форма.
Знайти пікселі, які утворююють межу між видимою і невидимою частинами рисунка. Цього можна виконати за допомогою алгоритму планування базової форми, який розглянуто вище. Змінити значення граничних пікселів за власним вибором (найліпше використовувати оцінку NaN).
Прочитувати матриці за рядках і змінювати всі хроматичні значення доки не буде досягнуто першого граничного значення. Продовжувати читання рядка з кінця, аж доки не буде досягнуто знову граничного значення. На проміжних ланках буде змінено всі значення кольорів.
За допомогою команди image отримати змінену картинку.
Процес, описаний у пункті 4 придатний лише для опуклих вікон вирізання. Якщо потрібно виконати вирізання неопуклих вікон, то достатно змінити лише цей крок.
Уточнення процесу. Описанийвище процес можна назвати алгоритмом вирізання рисунка в Matlab. Є багато шляхів, за допомогою яких можна його реалізувати. Один з них наведений нижче. Для цього створимо функцію croppic m
function [A,map] = croppic(name,window);
[A,map] = imread(name);
[k l m] = size(A);
if m == 3
cr = 255 * ones(1,1,3);
else if m == 1
cr = 255;
end
if window == 1
r=input('r:');
center=input('[xc,yc]:');
Ac = bc(center,r,k,l);
else
shmeia=input('Dwse diadoxika shmeia:');
Ac = bl(shmeia,k,l);
end
for i = 1: k
j = 1;
while ~isnan(Ac(i,j)) && j < l
A(i,j,:)=cr;
j = j + 1;
end
A(i,l,:)=cr;
if j < l
j = l;
while ~isnan(Ac(i,j)) && j > 1
A(i,j,:)=cr;
j=j-1;
end
end
end
Для подальшої роботи необхідне створення трьох функцій: bc.m, bl.m і blc.m, коди яких подані нижче:
bc.m
function Ac=bc(center,r,k,l)
Ac = ones(k,l);
x=0;
y=r;
sfalma=3-2*r;
while x<=y
Ac(x+center(1),y+center(2))=NaN;
Ac(y+center(1),x+center(2))=NaN;
Ac(x+center(1),-y+center(2))=NaN;
Ac(y+center(1),-x+center(2))=NaN;
Ac(-x+center(1),y+center(2))=NaN;
Ac(-y+center(1),x+center(2))=NaN;
Ac(-x+center(1),-y+center(2))=NaN;
Ac(-y+center(1),-x+center(2))=NaN;
x=x+1;
if sfalma>=0
y=y-1;
sfalma=sfalma-4*y;
end
sfalma=sfalma+4*x+2;
end
bl.m
function Ac=bl(shmeia,k,l)
Ac = ones(k,l);
m = size(shmeia,1);
for i = 1: m-1
Ac = blc(shmeia(i,:),shmeia(i+1,:),Ac);
end
Ac = blc(shmeia(1,:),shmeia(m,:),Ac);
blc.m
function Ac=blc(P1,P2,Ac)
x1 = P1(1);
x2 = P2(1);
y1 = P1(2);
y2 = P2(2);
dx = x2-x1;
dy = y2-y1;
d = 0;
i = 0;
if dx == 0
if y2 < y1
t = y1;
y1 = y2;
y2 = t;
end
for y = y1:y2
Ac(x1,y)=NaN;
end
else if dy == 0
if x2 < x1
t = x1;
x1 = x2;
x2 = t;
end
for x = x1:x2
Ac(x,y1)=NaN;
end
else if abs(dy) <= abs(dx)
if x2 < x1
t = x1;
x1 = x2;
x2 = t;
t = y1;
y1 = y2;
y2 = t;
end
if (dy < 0 & dx > 0) | (dy > 0 & dx < 0)
d = 1;
end
dx = abs(dx);
dy = abs(dy);
x = x1;
y = y1;
c1 = 2*dy;
sfalma = 2*dy-dx ;
c2 = sfalma-dx;
while x <= x2
if d == 0
Ac(x,y)=NaN;
else
Ac(x,y-2*i)=NaN;
end
x = x+1;
if sfalma < 0
sfalma = sfalma+c1;
else
y = y+1;
i = i+1;
sfalma = sfalma+c2;
end
end
else
if y2 < y1
t = x1;
x1 = x2;
x2 = t;
t = y1;
y1 = y2;
y2 = t;
end
if (dy < 0 & dx > 0) | (dy > 0 & dx < 0)
d = 1;
end
dx = abs(dx);
dy = abs(dy);
x = x1;
y = y1;
c1 = 2*dx;
sfalma = 2*dx-dy ;
c2 = sfalma-dy;
while y <= y2
if d == 0
Ac(x,y)=NaN;
else
Ac(x-2*i,y)=NaN;
end
y = y+1;
if sfalma < 0
sfalma = sfalma+c1;
else
i = i+1;
x = x+1;
sfalma = sfalma+c2;
end
end
end
Легко зауважити, що файли bc і blc не відрізняються від тих, які наведені на початку і містять графічне зображення базових форм. Відмінність полягає у тому, що обчислювальні точки не виводяться графічно, а лише зберігаються у матриці. Тут немає тільки елементів, що стосуються граничних пік селів.
Розглянемо як працює функція croppic. Вона приймає на вхід ім’я файла картинки, з якою маємо намір працювати у формі FILENAME.FMT, і робить висновки, у яких зазначено тип файлу і його номер. Якщо номер – 1, то вікном обрізання є коло, в іншому випадку – будь-який опуклий багатокутник. Потім функція перетворює фотографію в матрицю і визначає її розмір. Залежно від типу файла, як це як це показано вище за допомогою команди imread.
Під час виконання функція запрошує деякі елементи, які містять тип вікна, яке треба вибрати, а також викликає відповідну функцію, яка визначає граничні пікселі. Це визначення відбувається так. Створюється матриця, всі елементи якої дорівнюють одиниці. Кожен елемент матриці відображає піксель фотографії. Далі для кожного граничного пікселя, визначеного відповідною функцією, задає значення NaN.
Після визначення всіх необхідних пікселів, починається перегляд матриці. Читання відбувається рядками. Перегляд кожного рядка триває доти, доки не буде отримано першого граничного пікселя (а саме поки не знайдемо величину NaN). Далі відбувається заміна значення в матриці, в якій зберігається фотографія, і визначають кольору кожного пікселя. Далі починається той же процес, але вже з кінця рядка. У підсумку видима частина залишається кольоровою. Після завершення перегляду матриці функція породжує нову матрицю і карту кольорів, яка відповідає фотографії. Потрібно ще тільки виконати рисунок: це можна зробити командою image.
Для вивчення цього методу припустимо, що маємо фотографію, яку хочемо обрізати якимось заданим вікном. Рисунок має розміри 800600 пікселів з розширенням jpeg. Розглянемо два приклади для круглого і прямокутного вікна. Система Matlab відображає матричне зображення рисунка, наприклад піксель 1412 є елементом (12,14) матриці, і в разі рисування це квадрат з центром (12,14) і стороною довжини 1. Також ми припускаємо, що піксель 11 є першим зверху ліворуч, а піксель 1412- останнім внизу праворуч.
Спочатку розглянемо випадок із круглим вікном з центром 400300 і радіусом 250 пікселів. Для цього в командному рядку запишемо таке:
>> Pic = croppic('Water lilies.jpg',1);
Тепер визначаємо характеристики вікна
r:250
[xc,yc]:[ 300 400 ]
Результат зберігатиметься в масиві Pic. Потрібно тільки нарисувати форму. Для цього достатньо написати: >> image(Pic) і отримати результат (рис. 5.24).

Рис. 5.23. До обрізання Рис. 5.24. Обрізання Рис. 5.25. Обрізання
круглим вікном квадратним вікном
Якщо потрібне прямокутне вікно з пікселями A(200,100), B(600,100), C (600,500) і D (200,500), то достатньо записати команду
>> Pic = croppic('Water lilies.jpg',0);
Після цього треба визначити характеристики вікна
Dwse diadoxika shmeia:[100 200;100 600;500 600;500 200]
Результат поміститься в масив Pic. Тепер намалюємо форму, для цього запишемо:
>> image(Pic)
Після операцій отримаємо результат, зображений на рис.5.25
5.5. Зображення плоских кривих
Система Matlab може підтримувати побудову 2D кривих за допомогою інструменттарію Spline toolbox. Розглянемо лише деякі команди, та деякі прості застосування. Для ліпшого розуміння можливостей рекомендуємо користуватися допомогою меню Matlab.
5.5.1. Команда SPLINE
Першою базовою командою є команда splinе, що повертає точки відповідного кубічного сплайну, який бажаємо апроксимувати. Ця команда дуже легка для виконання: достатньо задати потрібні точки для побудови кривої, а також інтервал між ними. Розглянемо такий приклад: нехай маємо масив з даними зростання населення в США за 10 років:
Таблиця 5.2. Зростання населення в США за 10 років
Роки
1930
1940
1950
1960
1970
1980

Населення
123,203
131,669
150,697
179,323
203,212
226,505


Приймемо x= [ 1930, 1940,1950,1960,1970,10980 ], а – кількість населення. Після написання відповідного скрипт - файла нарисуємо кубічний сплайн на підставі наведених вище даних:
x = [1930 1940 1950 1960 1970 1980];
y = [123.203 131.669 150.697 179.323 203.212 226.505];
diam = 1930:1:1980;
sp = spline(x,y,diam);
plot(diam, sp)
Результатом виконання програми є графік кривої, який інтерполює задані точки (рис. 5.26).

Рис. 5.26. Графік Рис. 5.27. Використання
інтерполяції кривої команди spline
Розглянемо ще один приклад використання команди spline. Визначимо і намалюємо кубічний сплайн, який інтерполює криву, що відображає верхню частину контуру собаки( рис. 5.27).
Оскільки в точках, де лапи доторкаються голови і голова з’єднується зі спинкою, не забезпечена неперервність похідних, то тут використовують окремі сплайни для кожної з цих ділянок. Наведені нижче результати (таб. 5ю3) відображають вибрані точки, що будуть використані під час інтерполяції. Задача має простий розв'язок, якщо ми використовуємо команду spline. Результат виконання програми зображений на рис. 5.28.
Таблиця 5.3

X1 = [1,2,5,6,7,8,10,13,17];
Y1 = [3,3.7,3.9,4.2,5.7,6.6,7.1,6.7,4.5];
X2 = [17,20,23,24,25,27,27.7];
Y2 = [4.5,7.0,6.1,5.6,5.8,5.2,4.1];
X3 = [27.7,28,29,30];
Y3 = [4.1,4.3,4.1,3.0];
XX1 = linspace(1,17,480);
XX2 = linspace(17,27.7,321);
XX3 = linspace(27.7,30,69);
YY1 = spline(X1,Y1,XX1);
YY2 = spline(X2,Y2,XX2);
YY3 = spline(X3,Y3,XX3);
plot([XX1, XX2, XX3],[YY1, YY2, YY3]);
axis equal;
5.5.2. Команда PCHIP
Ще одна корисна команда Matlab для зображення 2D кривих – pchip. Її запис подібний до запису команди spline. Різниця полягає у тому, що вони обчислюють відповідні інтерполяційні поліноми. Наведемо такий приклад:
x = -3:3;
y = [-1 -1 -1 0 1 1 1];
t = -3:0.1:3;
p = pchip(x,y,t);
s = spline(x,y,t);
plot(x,y,'o',t,p,'-',t,s,'-.')

Рис. 5.28. Результат виконання програми Рис. 5.29. Порівняння результатів
Суцільна крива є результатом використання команди pchip, а пунктирна – результатом використання команди spline. Вхідні дані позначають голубими кілецями.

Список літератури
Алберг Дж., Нильсон Э., Уолш Дж. Теория сплайнов и ее приложения. М.: Мир, 1972.
Аммерал М. Машинная графика: В 4 кн. М.: Мир, 1992.
Андреев И.В., Ланнэ А.А. MATLAB для DSP: SPTool - инструмент для расчета цифровых фильтров и спектрального анализа сигналов // Цифровая обработка сигналов. 2000. № 2.
Волков Е.А. Численные методы. М.: Наука, 1987.
Гардан И., Люка М. Машинная графика и автоматизация конструированияМ.:Мир,1987.
Гилой В. Интерактивная машинная графика. М.: Мир, 1981.
Денискин Ю.И. Геометрическое моделирование криволинейных объектов с использованием барицентрических координат //Прикл. геометрия. 1999. вып.1, №1.
Дубровин Б.А., Новиков С.П., Фоменко А.Т. Современная геометрия. М.: Наука, 1985.
Завьялов Ю.С., Леус В.А., Скороспелов В.А. Сплайны в инженерной геометрииМ.: Машиностроение, 1985.
Иванов В.П., Батраков А.С. Трехмерная компьютерная графика. М.Радио и связь, 1995.
Ньюмен У., Спрулл Р. Основы интерактивной машинной графики/ Пер. с англ. М.: Мир, 1976.
Павлидис Т. Алгоритмы машинной графики и обработка изображений.- М.Радио и связь, 1976.
Петровичев Е.И. Компьютерная графика: Учеб. пособия. М.: Изд-во Мосов. горн. ун-та, 2003.
Победря Б.Е. Лекции по тензорному анализу. М.: Изд-во Москво. Ун-та, 1986.
Препарата П. , М. Шеймос, Вычислительная геометрия: Введение, М. Мир, 1989.
Прэтт У. Цифровая обработка изображений. В 2-х книгах. Пер. с англ. М.: Мир, 1982.
Роджерс.Д., Адамс.Дж.Математические основы машинной графики/Пер.с англ. М.:Мир, 2001.
Роджерс Д. Алгоритмические основы машинной графики/Пер. с англ. М.: Мир, 1989.
Снегирев В.Ф. Применение сплайнов для задания обводов летательных аппаратов. Учеб. пособие. Казань: КАИ, 1986.
Справочник по машинной графике в проектировании/ В.Е.Михайленко, В.А. Анпилогова, Л.А.Кириевский и др.: Под ред. В.Е.Михайленко. А.А.Лященко. Киев: Будiвельник, 1984.
Стечкин С.Б., Субботин Ю.Н. Сплайны в вычислительной математике. М.: Наука, 1976.
Н. Томпсон. Секреты программирования трехмерной графики для Windows 95/Перев с англ. СПб/: Питер, 1997.
Фокс А., Пратт М. Вычислительная геометрия. Применение в проектировании и на производствеМ.: Мир, 1982.
Фоли Дж., Вэн Дэм А. Основы интерактивной машинной графики: В 2 кн. / Пер. с англ. М.: Мир, 1985.
Шикин Е. В., Боресков А.В. Компьютерная графика. Динамика, реалистические изображения. ДИАЛОГ-МИФИ, М/, 1996.
Шикин Е.В., Плис А.И. Кривые и поверхности на экране компьютера. Руководство по сплайнам для пользователей. М.: ДИАЛОГ-МИФИ, 1996.
Эгрон Ж. Синтез изображений. Базовые алгоритмы.М.:радио и связь, 1993.
Bresenham J.E. Algorithm for computer control of a digital plotter // IBM Systems Journal, 1965. Vol.4, No.1..
Bresenham J. A Linear Algoritm for Incremental Didgital Display of Circular Arcs // CACM, 1978Vol. 20, 1977.
Cyrus M., Beck J. Generalized two- and threedimensional clipping // Computer and Graphics, Vol. 3,.
Farin G. Algorithms for Rational Bezier Curves // Computer-Aided Design. 1983. Vol.15.
Forrest A.R. Interactive Interpolation and Approximation by Bezier Polynomials // Computer J. 15, 1, 1972.
Farouki R.T. and Rajan V.T. Algorithms for polynomials in Bernstein form // Computer Aided Geometric Design, 1988.
Mark S. Sobkow, Paul Pospisil and Yee-Hong Yang. A Fast Two-Dimensional Line Clipping Algoritm via Line Encoding // Computer & Graphics. 1987 Vol. 11, No. 4.
Robert F. Sproull and Ivan E. Sutherland. A Clipping Divider // AFIP Fall Joint Computer Conference. San Francisco, 1968.
Rogers, David F. "Mathematical Elements for Computer Graphics". New York: McGraw-Hill College Division, 1989.
Tina M. Nicholl, D.T.Lee and Robin A. Nicholl. An efficient new algoritm for 2-D line clipping: its development and analysis // Computer Graphics, 1987. Vol. 21, N. 4, July.
Watt, Alan и Mark Watt. Advanced Animation and Rendering Techniques: Theory and Practice. New York: Addison-Wesley, 1992.
Weiler K., Atherton P. Hidden Surface Removal Using Polygon Area Sorting // SIGGGRAPH'77 Proceedings, Computer Graphics, 1977. Vol. 11, N. 2.
You-Dong Liang and Brian A. Barsky. A new concept and method for line clipping// ACM Transaction on Graphics, 1984. Vol. 3, No. 1, January.
Покажчик
B-сплайни 45
аксонометричні проекції 15
алгоритм Коена-Сазерленда 70
алгоритм Лянга - Барського 72
алгоритм Сазерленда - Ходгмана 75
алгоритм серединної точки 69
апроксимація 26
афінна геометрія 4
афінні перетворення 4
Без’є форма 41
Бернштейна форма 42
бінормальна площина 29
Брезенхема алгоритм 64
вектор бінормалі 28
вектор головної нормалі 28
вирізання 69
відображення щодо площини 5
В-сплайнповерхні 60
вузловий вектор 45, 46
гаусова кривина 58
гіпербола 31
гладка крива 28
гладкість кривої 39
головна нормаль 29
двоточкова перспективна проекція 23
діметрична проекція 16
довжина дуги відрізка 55
дотична до кривої 28
дотична площина 29
друга квадратична форма 55
еліпс 32
Ерміта форма 38
ізометрична проекція 16
інтерполяція 26
Кабіне проекція 19
Кавальє проекція 19
квадратична крива 44
кліпінг 69
коефіцієнт спотворення 19
конічний переріз 31
координати точки 4
крива Без’є 41
кривина кривої 29
кубічний сплайн 38
кубічні сплайни 33
лінійна інтерполяція 44
лінійчата поверхня 59
недіагональні елементи 5
Недіагональні елементи 5
неозначені точки 21
непараметрична форма 26
нормалізація 14
нормаль до площини 53
нормальна кривина 57
нормальна площина 29
обертання на довільний кут 5
однорідні координати 13
одноточкова перспективна проекція 23
ортогональна проекція 15
парабола 31
паралельна проекція 15
паралельні перспективні перетворення 22
параметрична форма 26
перспективне перетворення 12
перша квадратична форма 52
піксель 62
площина 11
побудова еліпса 67
побудова кола 65
поверхні Без’є 59
проективні властивості об’єктів 15
проекції 14
пряма 11
растр 62
раціональна крива Без’є 50
раціональні криві 48
регулярна крива 27
регулярна поверхня 52, 53
рисування ліній 63
рівняння дотичної 28
середня кривина 58
симетрія об’єкта 9
сплайн 34
тривимірне обертання 6
триметрична проекція 16
триточкова перспективна проекція 24
Френе формули 30
центр проекції 15
центральна перспектива 19
центральна проекція 15
Якобі матриця 58

ЗМІСТ
ВСТУП 3
РОЗДІЛ 1. КООРДИНАТНІ ПЕРЕТВОРЕННЯ ТА ПРОЕКЦІЇ 4
1.1. Афінна геометрія 4
1.1.1. Афінні перетворення точок у просторі 4
1.1.2. Перетворення ліній та площин у просторі 10
1.2. Перспективно-проекційна геометрія 11
1.2.1. Однорідні координати 12
1.2.2. Проектування тривимірних об’єктів 14
1.2.3. Паралельні проекції 15
1.2.4. Центральні проекції 19
1.2.5. Неозначені точки 21
1.2.6. Одноточкова перспективна проекція 22
1.2.7. Двоточкова перспективна проекція 23
1.2.8. Триточкова перспективна проекція 24
РОЗДІЛ 2. ПРОСТОРОВІ КРИВІ 26
2.1. Геометрія просторових кривих 26
2.1.1. Параметричне і непараметричне зображення кривих 26
2.1.2. Дотична, головна нормаль і бінормаль до кривої 27
2.1.3. Кривина, закручування кривої та формули Френе 29
2.2. Побудова плоских кривих 30
2.2.1. Конічні переріз 31
2.2.2. Трансцендентні криві 33
2.3. Кубічні сплайни 33
2.3.1. Сплайнова функція однієї змінної 34
2.3.2. Сплайнова функція в тривимірному випадку 38
2.3.3. Дослідження гладкості кривої 39
2.3.4. Граничні умови 40
2.4. Кубічні сплайни Без’є 41
2.5. Базис Бернштейна-Без’є 42
2.5.1. Геометричні властивості поліномів Бернштейна 42
2.5.2. Часткові випадки 44
2.6. Апроксимація на основі B-сплайнів 44
2.6.1. Головні властивості B-сплайнів 45
2.6.2. Базисні функції 45
2.6.3. Вузловий вектор 46
2.6.4. Приклади застосування B-сплайнів 46
2.7. Раціональні криві 48
2.7.1. Головні принципи раціональних кривих 48
2.7.2. Раціональні квадратичні сегменти конічного перерізу 49
2.7.3. Раціональні криві Без’є 50
РОЗДІЛ 3. ОПИС І ПОБУДОВА ПОВЕРХОНЬ 52
3.1. Геометрія поверхонь 52
3.1.1.Поняття поверхні, дотична площина до поверхні 52
3.1.2. Перша квадратична форма 54
3.1.3. Друга квадратична форма поверхні 55
3.1.4. Нормальна кривина поверхні 56
3.1.5. Перетворення параметрів поверхні 58
3.2. Утворення і зображення поверхонь 58
3.2.1. Класифікація поверхонь 58
3.2.2. Лінійчаті поверхні 59
3.3. Поверхні Без’є 59
3.3.1. Параметричне рівняння поверхні Без’є 59
3.3.2. Властивості ділянок поверхні Без’є 60
3.4. В-сплайн поверхні 60
3.4.1. Параметричні рівняння ділянок В-сплайн поверхні 60
3.4.2. Властивості ділянок бікубічних В-сплайнповерхонь 61
РОЗДІЛ 4. ТЕОРЕТИЧНІ ОСНОВИ ТА ГОЛОВНІ АЛГОРИТМИ РАСТРОВОЇ ГРАФІКИ 62
4.1. Створення базових геометричних форм 62
4.1.1. Пікселі 62
4.1.2. Рисування ліній 63
4.1.3. Побудова кола 65
4.1.4. Побудова еліпса 67
4.2. Вирізання 69
4.2.1. Алгоритм серединної точки 69
4.2.2. Алгоритм Коена-Сазерленда 70
4.2.3. Алгоритм Лянга - Барського 72
4.3 Вирізання областей 74
4.3.1. Базовий матеріал 74
4.3.2. Алгоритм Сазерленда - Ходгмана 75
4.3.3. Алгоритми Сазерленда-Ходгмана вирізання поверхонь 76
РОЗДІЛ 5. ЗАСТОСУВАННЯ ПАКЕТІВ MATLAB У КОМПЮТЕРНІЙ ГРАФІЦІ 78
5.1. Головні відомості про MATLAB 78
5.1.1. Інтерфейс Matlab 78
5.1.2. Програмування в Matlab 79
5.1.3. Створення і застосування М-файлів 81
5.1.4. Робота з матрицями 82
5.2. Графіка в Matlab 83
5.2.1. Визначення точки споглядання 84
5.2.2. Об'єкти дескрипторної графіки 84
5.2.3. Побудова графіків. Команди Plot, Plot3 86
5.2.4 Примітиви 89
5.2.5. Алгоритми для примітивів 91
5.3. Перетворення 95
5.3.1. Геометричні перетворення 95
5.3.2. Проекції тривимірного простору в 97
5.4. Вирізання 100
5.4.1. Алгоритми вирізання 100
5.4.2. Інші підходи 102
5.5. Зображення плоских кривих 107
5.5.1. Команда SPLINE 107
5.5.2. Команда PCHIP 108
Список літератури 110
Покажчик 112
ЗМІСТ 4