Будь умным!


У вас вопросы?
У нас ответы:) SamZan.net

тематиків що володіють обчислювальною технікою знання питань пов~язаних з комп~ютерною графікою є достатн

Работа добавлена на сайт samzan.net:


PAGE 48

3

Передмова

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

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

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

  •  Зображення двовимірних статичних сцен;
  •  Побудова графіків математичних функцій у декартових координатах;
  •  Зображення функцій у полярних координатах;
  •  Побудова обмежених областей на площині;
  •  Анімація двовимірних зображень;
  •  Програмування тривимірних статичних сцен;
  •  Моделювання зображень поверхні.

При виконанні навчальних завдань посібника можна використовувати мови програмування, що достатньо забезпечені образотворчими можливостями. Матеріал посібника орiєнтується на TurboPascal7.

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

Матеріали посібника пройшли апробацію на практичних та лабораторних заняттях з програмування на математичному факультеті Запорізького національного університету.

Цей навчальний посібник пропонується використовувати для організації лабораторних та самостійних робіт студентів математичних спеціальностей з дисциплін ”Комп’ютерна графіка”, ”Програмування”; та факультативної роботи з абітурієнтами - учнями класів з поглибленим вивченням інформаційних технологій.


Загальні теоретичні відомості

Комп'ютерна графіка – це прикладна дисципліна, що вивчає методи створення й обробки зображень (малюнків, креслень і т.д.) за допомогою комп'ютера.

Області застосування комп'ютерної графіки

Сучасна комп'ютерна графіка розвивається по різноманітним напрямкам. Кожен з них має спеціальне програмне забезпечення, що називають графічними програмами, або графічними пакетами.

Можна виділити наступні різновиди комп'ютерної графіки:

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

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

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

Конструкторська графіка. Застосовується в роботі інженерів, винахідників нової техніки. Цей вид графіки є обов'язковим елементом систем автоматизації проектування (САПР), де використовується для підготовки технічних креслень проектованих пристроїв. Графіка в сполученні з розрахунками дозволяє проводити в наочній формі пошук оптимальної конструкції, найбільш удалого компонування деталей, прогнозувати наслідки, до яких можуть привести зміни в конструкції. Засобами конструкторської графіки можна одержувати як плоскі (перетини, проекції) так і просторові зображення.

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

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

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

Способи формування зображень на екрані

Розрізняють два основні способи створення предметних зображень – растровий і векторний і, відповідно, два види комп'ютерної графіки – растрову і векторну.

Растрова графіка

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

Кожний растровий малюнок містить визначене число крапок по горизонталі і вертикалі. Ці два числа характеризують розмір малюнка. Наприклад, для системи Windows типові розміри екрана дисплея в пікселях 640480, 800600, 1024768, 12801024. Зрозуміло, що чим більше число пікселів міститься по горизонталі і вертикалі при тих самих геометричних розмірах малюнка, тим вище якість відтворення малюнка. Крім розмірів, малюнок характеризується кольором кожного пікселя.

Таким чином, для створення або збереження растрового малюнка необхідно зазначити його розміри і колір кожного пікселя.

Інформація про те, що малюнок має розмір 640480, нічого не говорить про його дійсні розміри. Малюнок набирає геометричних розмірів тільки при появі його на екрані дисплея або принтері. Ці розміри залежать від вирішення пристрою, що вимірюється числом пікселів, що виводяться на одиницю довжини або ширини екрана. Так, якщо малюнок має розміри 640480 пікселів, а вирішення дисплея 40 пікселів на сантиметр, то геометричні розміри малюнка на даному дисплеї 1612 см. На іншому дисплеї малюнок може мати інший розмір.

Растрова графіка дозволяє одержати високу якість зображення, тому що око людини пристосоване для сприйняття об'єктів як великих наборів дискретних елементів, що створюють предмет.

Нестачі растрової графіки – великі розміри файлів, що зберігають растровий малюнок (для збереження копії графічного екрана дисплея Windows із розмірами 1024768 за умови, що колір пікселя кодуєтся трьома байтами, потрібно 10247683:=2.3 Мбайт пам'яті), складності зміни масштабу і редагування елементів малюнка.

Векторна графіка

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

Для створення об'єктів-примітивів у векторній графіці використовують прості команди типу Малювати лінію від точки А до точки Б або Малювати коло радіусом А з центром у точці Б. Такі команди сприймаються пристроями, що власне виконують малювання об'єктів.

Перевагою векторної графіки є те, що файли, в яких зберігається векторний малюнок, мають розміри в 10 – 1000 разів менші, ніж аналогічні графічні растрові файли.

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

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

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

Формування кольору малюнка

Відомо, що змішуючи в різних пропорціях три основних кольори: червоний, зелений і синій, можна одержати будь-який колір. Це відбувається через здатність людського ока змішувати кольори і бачити тільки один колір – усереднений. Таку систему формування кольорів називають системою RGB (абревіатура від англійських слів red – червоний, green – зелений і blue – синій).

Таким чином, для завдання будь-якого кольору треба зазначити пропорції (інтенсивності) основних кольорів. Загальна кількість кольорів залежить від кількості градацій інтенсивностей кожного з основних кольорів. Так, якщо кожний з основних кольорів має чотири градації інтенсивності, то загальна кількість можливих кольорів складає 444=64. У сучасних комп'ютерах для кодування інтенсивності кожного з основних кольорів виділяється один байт, що дає 256 градацій інтенсивності, а кількість можливих кольорів досягає 256256256=16 777 216.

Значно рідше, ніж систему RGB, використовують систему HLS. У ній колір задається трьома параметрами: відтінком, контрастністю і яскравістю. Існує також система CMYK.

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

Для збереження графічних зображень у файлі існує багато форматів, що підтримують растрову, векторну чи обидва види графіки (bmp, pcx, pic, jpg, tif, gif та ін.).

Технічні аспекти комп’ютерної графіки

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

Існує декілька типів дисплеїв з різними технічними характеристиками (фізичні розміри, вирішення, зернистість, глибина кольору, частота поновлення кадра).

Так, наприклад, дисплеї з EGA-адаптерами (Enhanced Graphics Adapter, 640 крапок по горизонталі і 350 крапок по вертикалі) та VGA-адаптерами (Video Graphics Array, 640 на 480 крапок) забезпечують достатньо високу якість зображень. Сучасні дисплеї з SVGA-адаптерами (Super VGA) мають різні характеристики вирішення у різних фірм-виготовлювачів (800600, 1024768, 12801024 та інші), але, взагалі вони потужніші, ніж попередні.

Крім зернистостi зображення також суттєві і його кольорові характеристики: EGA і VGA підтримують палітру з 16 кольорів, у SVGA кількість кольорів у палітрі може бути від 256 до 16,7 млн. Крім того, кожний дисплей має свій набір підрежимів.

За розмірами діагоналі дисплеї поділяють на 14”, 15”, 17”, 19”, 22” (1”=1 дюйм=2.54 см) та інші.

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

Кожна крапка (піксел) на екрані характеризується координатами і кольоровими характеристиками (колір фону і колір зображення). Формувати зображення програмним шляхом справа досить клопітна і тому для спрощення роботи керуюча плата (адаптер) може працювати в одному із двох режимів: алфавітно-цифровому (текстовому) або графічному. Режими є взаємовиключаючі і в конкретний момент часу може підтримуватися тільки один із цих режимів.

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

Переключення із алфавітно-цифрового в графічний режим вимагає підготовчих дій. Вони виконуються програмами, що працюють з дисплеєм у графічному режимі (наприклад, оболонка Windows). Так, на мові Basic це здійснюється оператором Screen, а синтаксис мов програмування Turbo Pascal і С++, розроблених фiрмою Borland International, вимагає виконати цілий комплекс допоміжних робот.

Особливості реалізації роботи з графікою у мові Turbo Pascal 7.0

Всі графічні процедури і функції компілятора Turbo Pascal 7.0 зібрані в окремий модуль - файл з ім'ям Graph.tpu. У програмі для використання цього модуля він повинен бути вказаний в рядку Uses. Оскільки існує декілька типів дисплеїв, то для програмного керування ними розроблені спеціальні програми - драйвери, що знаходяться в файлах з розширенням імені .bgi. Вони зібрані в окремий каталог з ім'ям BGI. В ньому зберігаються також файли з розширенням імені .chr – графічні шрифти для формування текстових повідомлень.

Для переходу в графічний режим у програмах на мові Turbo Pascal необхідно використати процедуру InitGraph, що визначає тип дисплея і відповідний йому номер драйвера. Ця інформація після виконання процедури зберігається в першому параметрі gd (graph driver) процедури. Процедура також визначає максимально можливий номер підрежиму дисплея і цю інформацію зберігає в наступному параметрі gm (graph mode). Третій параметр задається користувачем і містить у лапках шлях до файла графічного драйвера, наприклад, ' c: \ tp \ bgi '.

Таким чином, після виконання процедури InitGraph дисплей повинен бути переведений до графічного режиму із занесенням відповідної інформації в параметри процедури.

З різних причин, наприклад, неправильно вказаний програмістом шлях до драйвера, перехід у графічний режим може не статися. Необхідно проконтролювати перехід до графічного режиму. Для цього після виконання процедури InitGraph в операторі умови потрібно перевірити повернений код виконання графічної операції (виклик функції GraphResult), порівнюючи його з числовою константою 0 (або GrОk). У випадку, коли перехід не стався, виконання програми треба припинити, застосувавши процедуру Halt.

Виклик процедури ClearDevice (без параметрів) реалізує очищення екрану в графічному режимі.

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

Завершення роботи в графічному режимі реалізується викликом процедури CloseGraph (без параметрів).

Приклад графічної програми та інформаційні таблиці можливостей графічних процедур і функцій (та їх параметри) наведені у Додатках.


Математичні основи графічних побудов

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

Аффінні перетворення на площині

У комп'ютерній графіці усе, що відноситься до двомірного випадку прийнято позначати символом (2D) (2-dimension). Нехай на площині введена прямолінійна система координат. Тоді кожній точці М ставиться у відповідність упорядкована пара чисел (x,y), її координат. Уводячи на площині ще одну прямолінійну систему координат, ми ставимо у відповідність тій же точці М іншу пару чисел (x1,y1). У цьому випадку перехід від однієї системи координат до іншої описується співвідношеннями

x1=A1•x+B1•y+d1,

y1=A2•x+B2•y+d2,                         (*)

де A1, B1, d1, A2, B2, d2 – довільні числа, що задовольняють умові .

Формули (*) можна розглядати подвійно:

А) зберігається точка і змінюється координатна система – довільна точка М залишається тією ж, змінюються лише її координати;

Б) змінюється точка і зберігається координатна система – формули (*) задають відображення, що переводить довільну точку М(x,y) у точку М(x1,y1), координати якої визначені в тій же координатній системі.

Надалі будемо розглядати формули (*) у змісті Б.

Приведемо декілька окремих випадків, вважаючи, що введена система координат є прямокутною декартовою.

А. Поворот навколо початкової точки на кут u описується формулами

x1=x•cos(u)-y•sin(u),

y1=x•sin(u)+y•cos(u).

Б. Розтягування (стискування) уздовж координатних осей описується формулами

x1=R1•x,

y1=R2•y,

де R1>0, R2>0.

Розтягування уздовж осі абсцис забезпечується за умови R1>1, стискування відповідно при R1<1.

В. Відбиття (відносно осі абсцис) задається за допомогою формул

x1=x,

y1=-y.

Аналогічно легко записати формули для відбиття відносно осі ординат.

Г. Паралельний перенос на вектор із координатами (d1,d2) забезпечується співвідношеннями

x1=x+d1,

y1=y+d2.

Вибір цих окремих випадків визначається двома обставинами:

1) кожне з приведених вище перетворень має простий і наочний геометричний зміст,

2) як відомо з курсу аналітичної геометрії, будь-яке перетворення виду (*) завжди можна представити як послідовне виконання (суперпозицію) найпростіших перетворень виду А, Б, В, Г.

Для ефективного використання цих формул у задачах комп'ютерної графіки більш практичним є їхній матричний запис. Матриці, що відповідають випадкам А, Б і В мають відповідно наступний вид:

.

Бажаючи охопити матричним записом усі чотири випадки, необхідно перейти до опису довільної точки площини за допомогою трійки чисел.

Уведемо для цього однорідні координати довільної точки. Широко використовувані в проективній геометрії, однорідні координати дозволяють досить ефективно описувати невласні елементи.

Нехай М - довільна точка площини з координатами x,y. Однорідними координатами точки називається трійка одночасно нерівних нулю чисел x1, x2, x3, якщо виконуються наступні співвідношення x1/x3=x, x2/x3=y.

У комп'ютерній графіці однорідні координати вводяться за такою схемою:

Точці M(x,y) ставиться у відповідність точка М'(x,y,1) у просторі. Відмітимо, що довільна точка на прямій, що з'єднує початок координат, точку О(0,0,0), із точкою М'(x,y,1), може бути задана трійкою (hx,hy,h).

Виключаючи точку О з розгляду, будемо вважати, що h≠0.

Вектор, обумовлений трійкою hx,hy,h, є направляючим вектором прямої, що з'єднує точки O і М'. Ця пряма перетинає площину z=1 у точці (x,y,1), що однозначно визначає точку (x,y) координатної площини xOy. Тим самим між точкою (x,y) і множиною трійок (hx,hy,h), h≠0, установлюється взаємно однозначна відповідність. Це дозволяє вважати числа hx, hy, h її координатами.

Таким чином, при h=1, записи (*) і нижченаведений можна вважати рівнозначними

.

Щоб реалізувати зображення по заданих геометричних характеристиках, треба знайти елементи відповідної матриці. Процес її побудови розбивають на етапи. На кожному етапі будується матриця для одного з розглянутих вище випадків А, Б, В, Г.

Зазначимо ці матриці:

А. Матриця обертання

,

Б. Матриця розтягування (стискування)

,

В. Матриця відбиття

,

Г. Матриця переносу

.

Аффінні перетворення в просторі

Перейдемо тепер до тривимірного випадку (3D) і почнемо з введення однорідних координат.

Згідно вищеописаному плоскому випадку, замінимо трійку (x,y,z), що задає точку в просторі, на четвірку (x,y,z,1) або для більш загального випадку (hx,hy,hz,h), h≠0.

Тобто кожна точка простору (крім початкової точки О) може бути задана четвіркою одночасно не рівних нулю чисел. Ця четвірка визначена однозначно з точністю до спільного множника.

Запропонований перехід дає можливість скористатися матричним записом і в більш складних, тривимірних задачах.

Тому що будь-яке аффінне перетворення в тривимірному просторі може бути подане у виді суперпозиції обертань, розтягань, відбитків і переносів, то досить буде докладного опису матриць тільки цих перетворень.

А. Матриці обертання в просторі.

Матриця обертання навколо осі абсцис на кут u має вид:

,

Матриця обертання навколо осі ординат на кут u має вид:

,

Матриця обертання навколо осі аплікат на кут u має вид:

.

Б. Матриця розтягування (стискування):

,

де R1,R2,R3 – коефіцієнти розтягування (стискування) уздовж осей абсцис, ординат і аплікат відповідно (усі строго більше 0).

В. Матриці відбиття.

Матриця відбиття відносно площини xOy:

,

Матриця відбиття відносно площини zOx:

.

Матриця відбиття відносно площини yOz:

.

Г. Матриця переносу

,

де (d1,d2,d3) – вектор переносу.

Зауваження: як і в двомірному випадку, усі виписані матриці невироджені.

Види проектування

Приведемо класифікацію основних видів проектування, що використовуються в машинній графіці (виходячи з варіантів взаємного розташування картинної площини і координатних осей):

1. Паралельне проектування:

а) ортографічне;

б) аксонометричне:

триметричне,

диметричне,

ізометричне;

в) косокутне:

вільне,

кабінетне.

2. Перспективне проектування:

одноточкове;

двухточкове;

трьохточкове.

Для опису перетворень проектування будемо використовувати матриці й однорідні координати.

Ортографічна проекція - картинна площина співпадає з однією з координатних площин або паралельна їй. Матриця проектування уздовж осі ОХ на площину YOZ має вид:

.

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

.

Аналогічно записуються матриці проектування уздовж інших координатних осей:

.

Аксонометрична проекція – проектуючі прямі перпендикулярні картинній площині.

Розрізняють три види проекцій, у залежності від взаємного розташування площини проектування і координатних осей:

  •  триметрія - нормальний вектор картинної площини утворює з ортами координатних осей попарно різні кути;
  •  диметрія - два кути між нормаллю картинної площини і координатних осей рівні;
  •  ізометрія - усі три кути між нормаллю картинної площини і координатних осей рівні.

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

З курсу аналітичної геометрії відомо, що будь-які дві однаково орієнтовані трійки координатних осей можна сполучити двома поворотами, при кожному з яких залишається незмінною одна координатна вісь. При повороті на кут ψ відносно осі OY, на кут φ відносно осі OX і наступного проектування на площину Z=0 виникає матриця

.

При цьому перетворяться й одиничні орти координатних осей OX, OY, OZ:

,

,

.

При триметрії довжини отриманих у результаті проекцій різні.

Диметрія характеризується тим, що довжини двох проекцій співпадають:

.

У випадку ізометрії додатково маємо

.

З останніх двох співвідношень одержимо

.

Перейдемо до розгляду випадку косокутної проекції (пучок прямих не перпендикулярний площині екрана).

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

При косокутному проектуванні орта осі OZ на площину XOY одержимо зміну .

Матриця відповідного перетворення має вид

.

У випадку вільної проекції вірне співвідношення ; у випадку кабінетної проекції вірне співвідношення .

Перспективні (центральні) проекції будуються більш складно. Припустимо, що центр проектування лежить на осі OZ, точка С(0,0,с), а площина проектування збігається з координатною площиною XOY. Візьмемо в просторі довільну точку M(x,y,z), проведемо через неї і точку С пряму і запишемо її параметричні рівняння:

x1=xt, y1=yt, z1=c+(z-c)t.

Знайдемо координати точки перетинання цієї прямої із площиною XOY. З того, що z1=0, одержимо t=c/(c-z), значить x1=cx/(c-z), y1=cy/(c-z).

Той же результат одержується з залученням матриці

.

Матриця проектування, звичайно, вироджена, а матриця відповідного перспективного перетворення (без проектування) має вид:

.

Розглянемо пучок прямих, паралельних осі OZ, і з'ясуємо, що з ним відбувається під дією матриці .

Кожна пряма пучка однозначно визначається точкою свого перетинання з площиною XOY і описується рівняннями

X=xi, Y=yi, Z=t.

Переходячи до однорідних координат і використовуючи матрицю , одержуємо .

Спрямуємо t у нескінченність.

Точка  перетвориться в , достатньо розділити все на t,  і перейти до границі. Відповідна їй точка  одержується подібним способом з .

Тим самим нескінченно віддалений центр  пучка рівнобіжних осі OZ прямих переходить у точку  осі OZ. Отримана точка називається точкою сходу.

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

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

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

.


Базові алгоритми комп’ютерної графіки

Під дискретною площиною будемо розуміти множину усіх крапок із цілочисельними координатами на звичайній двовимірній площині. Дискретну площину називають також цілочисельними гратами, растровою площиною або растром.

Будемо вважати, що на площині є квадратна сітка з кроком 1, причому вузли цілочисельних грат є центрами відповідних квадратних осередків сітки. Ініціалізації крапки растра з координатами (і,j) відповідає зафарбування (яким-небудь кольором) квадрата, якому вона належить.

Крапки на площині називають 4-сусідами (або безпосередніми сусідами), якщо в них відрізняються координати тільки х або тільки у, причому тільки на 1.

Крапки на площині називаються 8-сусідами (або непрямими сусідами), якщо в них відрізняються координати х або у, але не більш ніж на 1.

Простою кривою на площині називається множина, всі крапки якої, за винятком двох, мають рівно двох сусідів.

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

Припустимо, що на звичайній двовимірній площині є деякий геометричний об'єкт і потрібно одержати дискретне представлення об'єкта на цілочисельній сітці, або, як кажуть, растрове представлення об'єкта.

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

Таке представлення неоднозначне, тому що, термін наближення є багатозначним і існують різні способи наближення неперервного об'єкта.

Будемо вважати, що в нашому розпорядженні є елементарна операція – ініціалізація точки з цілочисельними координатами. У кожному конкретному випадку потрібно зазначити алгоритм вибору послідовності точок, що потрібно ініціювати на растрі, щоб одержати відповідне растрове представлення об'єкта в цілому.

Виникає природнє запитання: навіщо потрібно знати, як працюють алгоритми генерації відрізка прямої, окружності або еліпса, алгоритми зафарбування багатокутника або, у загальному випадку, області площини, якщо усі вони реалізовані у виді стандартних процедур у будь-якому пакеті типу Turbo Pascal або Turbo C. Справа в тому, що монітор не єдиний растровий пристрій, а при роботі з такими пристроями, як принтер, плоттер, миша, необхідно вміти програмно реалізовувати растрову генерацію відповідних геометричних об'єктів.

Уміння побудувати відповідний алгоритм часто дозволяє змінити структуру існуючого алгоритму з метою прискорення його роботи. Такі ситуації типові при розробці алгоритмів видалення невидимих ліній і поверхонь.

Растрове розгорнення відрізка. Алгоритм Брезенхема

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

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

Нехай кінці М1 і М2 відрізка мають координати (x1,y1) і (x2,y2). Тоді відрізок визначається рівнянням

y=y1+k(x-x1), де k=(y2-y1)/(x2-x1), x1≤x≤x2.

Проаналізувавши розташування відрізка щодо квадратних околів вузлів сітки, можна запропонувати наступні правила генерації 4-зв'язного і 8-зв'язного розгорнення відрізка:

1) 4-зв'язне розгорнення відрізка включає ті й тільки ті точки сітки, квадратні околи яких перетинаються з відрізком;

2) 8-зв'язне розгорнення відрізка включає ті й тільки ті точки сітки, бічні боки квадратних околів яких перетинаються з відрізком.

Загальний алгоритм Брезенхема для 8-зв'язного розгорнення відрізка можна представити в наступному виді:

procedure line_8(x1,y1,x2,y2: integer);

var

i,x,y,color,s1,s2,dx,dy,e,z: integer;

change: boolean;

begin

x:=x1;

y:=y1;

dx:=abs(x2-x1);

dy:=abs(y2-y1);

s1:=sign(x2-x1);

s2:=sign(y2-y1);

if dy>dx then

begin

z:=dx;

dx:=dy;

dy:=z;

change:=true

end

else change:=false;

e:=2*dy-dx;

for i:=1 to dx do

begin

putpixel(x,y,color);

while e>=0 do

begin

if change then x:=x+s1 else y:=y+s2;

e:=e-2*dx;

end; {while}

if change then y:=y+s2 else x:=x+s1;

e:=e+2*dy

end; {for}

putpixel(x,y,color)

end; {procedure}

За аналогією можна скласти загальний алгоритм Брезенхема для 4-зв'язного розгорнення відрізка.

Заповнення суцільних областей

Тест приналежності точки багатокутнику

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

Нехай Р(x,y) – деяка точка площини, що не належить ламаній, і потрібно визначити, належить вона багатокутнику чи ні.

Проведемо через точку Р горизонтальну напівпряму з правим кінцем у точці Р. Тому що ламана обмежена, то завжди легко знайти на цій напівпрямій досить віддалену точку Q, що не належить багатокутнику. Якщо відрізок QP не має перетинів із границею багатокутника, то точки Q і Р лежать в одній компоненті зв’язності і, отже, точка Р – зовнішня.

Розглянемо випадок, коли відрізок QP перетинає ламану. Будемо рухатися від точки Q у напрямку до точки Р. Минуючи перше перетинання відрізка і границі, ми потрапимо усередину багатокутника. Минуючи наступне перетинання відрізка і границі, ми опинимося ззовні багатокутника, і так далі. Легко бачити, що якщо ми зустрінемо на своєму шляху парну кількість перетинань, то точка Р буде зовнішньою точкою стосовно багатокутника. Якщо ж кількість перетинань виявиться непарною, то точка Р буде внутрішньою точкою багатокутника. Важливо засвідчитися, що перетинання відрізка з границею були істотними, тобто відрізок дійсно перетнув ламану, а не просто є дотичним до неї в одній із вершин.

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

Заповнення багатокутників

Помістимо багатокутник усередину мінімального за розмірами прямокутника із боками, рівнобіжними осям координат, і будемо аналізувати лише ті точки, що потрапили усередину прямокутника.

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

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

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

Викладена схема заповнення багатокутника зветься заповненням у порядку сканування рядків, а сам алгоритм відноситься до типу алгоритмів сканування по рядках.

Алгоритми заповнення області з затравкою

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

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

Алгоритм заповнення з затравкою по рядках

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

Ініциалізуємо стек, вміщуючи в нього затравочний піксел. Поки стек не порожній:

1. виймаємо піксел (x,y) із стека;

2. заповнюємо максимально можливий інтервал, у якому знаходиться піксел, вправо і вліво аж до досягнення граничних пікселів;

3. запам'ятовуємо крайню ліву Lx і крайню праву Rx абсциси заповненого інтервалу;

4. у сусідніх рядках над і під інтервалом (Lx,Rx) знаходимо незаповнені до дійсного часу внутрішні піксели області, що, як ми вже зауважили, об'єднані в інтервали, а в кожному з цих інтервалів знаходимо крайні праві піксели. Кожний із цих пікселів вносимо в стек у якості пікселу затравки.

Цей алгоритм буде правильно заповнювати будь-яку область, у тому числі й таку, у якій присутні отвори.

{Рор(x,y) – процедура, що виймає зі стека координати чергового піксела,

Push(x,y) – процедура, що поміщає в стек координати піксела,

C(x,y) – колір піксела з координатами (x,y),

Cb – колір границі,

Ci – колір внутрішньої області,

(x0,y0) – координати затравочного піксела.}

Push(x0,y0);

While {стек не порожній} do

Begin

{виймаємо піксел із стека та ініциалізуємо його}

Pop(x,y);

C(x,y):=Ci;

Xm:=x; {запам'ятовуємо абсцису піксела затравки}

While c(x,y) <> Cb {заповнюємо інтервал справа}

Begin

C(x,y):=Ci;

X:=x+1

End;

Rx:=x-1; {запам'ятовуємо крайній справа піксел інтервалу}

X:=xm; {відновлюємо абсцису піксела затравки}

While c(x,y) <> Cb do {заповнюємо інтервал зліва}

Begin

C(x,y):=Ci;

X:=x-1

End;

Lx:=x+1; [запам'ятовуємо крайній справа піксел інтервалу]

X:=xm; {відновлюємо абсцису піксела затравки}

{знаходимо затравочні піксели на нижньому рядку, починаючи з лівого краю інтервалу (Lx,Rx), потім ту ж операцію проробляємо на верхньому рядку}

for j:=-1 step 2 to 1 do

begin

y:=y+1;

x:=Lx;

while x <= Rx do

begin

Empty:=false;

While (c(x,y) <> Cb) and (c(x,y) <> Ci) and (x < Rx) do

{внутрішня точка не заповнена}

begin

if not Empty then Empty:=true;

x:=x+1

end;

{крайній справа піксел вміщуємо в стек}

if Empty then

begin

if (x = Rx) and (c(x,y) <> Cb) and (c(x,y) <> Ci) then

Push(x,y)

Else

Push(x-1,y);

Empty:=false

End;

{шукаємо інші незаповнені інтервали в рядку}

xb:=x;

while (c(x,y) = Cb) or (c(x,y) = Ci) and (x < Rx) do

if x = xb then x:=x+1

end

end {for}

end.

Видалення невидимих ліній і поверхонь

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

Розглянемо загальну постановку завдання видалення невидимих частин поверхні, що підлягає візуалізації.

Припустимо, що в просторі розташований деякий об'єкт, заданий обмежуючою його поверхнею (не обов'язково зв’язною); зобразимо, що бачить спостерігач, що знаходиться на деякій відстані від цього об'єкта.

Формалізація приводить до такої постановки задачі. Виділимо у просторі R3 деяку площину R2 . Простір R3 будемо надалі називати об'єктним простором, а площину R2 – картинною площиною. Нехай в об'єктному просторі знаходиться деяка поверхня S, розташована по один бік від картинної площини. Будемо вважати, що спостерігач розташований по інший бік від картинної площини в центрі проектування (у випадку ортогональної проекції центр проектування нескінченно віддалений).

Будемо казати, що крапка р1 поверхні S загороджує крапку р2 цієї поверхні, якщо проекції цих крапок на картинну площину збігаються і при цьому крапка р1 виявляється розташованою між р2 і їхньою загальною проекцією на картинну площину. Крапка р поверхні називається видимою, якщо ця крапка не загороджена ніякою іншою крапкою поверхні.

Задача видалення невидимих частин поверхні складається у виявленні всіх її видимих ділянок і зображенні їх на картинній площині.

Відомі методи вирішення задачі загороджування розрізняються між собою по чотирьох основних характеристиках:

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

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

Представлення поверхні може бути:

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

Під вирішенням поліедральної поверхні розуміється кількість її граней.

Під вирішенням картинної площини розуміється кількість крапок растра на екрані монітора.

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

По типу простору, у якому відбувається аналіз видимості, алгоритми діляться на три групи:

  •  об'єктні – що аналізують взаємне розташування частин поверхні в об'єктному просторі (характеристики часу праці таких алгоритмів мають квадратичну залежність від кількості об'єктів сцени і їхнього вирішення);
  •  картинні – що визначають видимість кожного елемента картинної площини (піксела) у площини зображення (тимчасові характеристики таких алгоритмів оцінюються як лінійні функції від добутку числа об'єктів на число крапок растра);
  •  змішані – що використовують для аналізу як перший, так і другий підхід.

По способу візуалізації алгоритми загороджування розділяються на дві групи:

  •  алгоритми, орієнтовані на одержання каркасного зображення;
  •  алгоритми, орієнтовані на одержання напівтонового зображення.

Деякі підходи до розв’язування задач загороджування

Методи перебирання

Алгоритми перебирання були історично першими алгоритмами, що розв’язують задачу загороджування. Основною метою їхнього створення є точне вирішення задачі про те, які саме частини елементів сцени повинні бути видалені. Тому ці алгоритми краще розроблені для одержання каркасних зображень. В алгоритмах перебирання, як правило, розглядається кожне ребро, що належить кожному з об'єктів сцени, і аналізується його взаємне розташування з усіма гранями кожного з об'єктів, що складають сцену. При цьому можливі наступні ситуації:

1. Ребро знаходиться в тому ж напівпросторі відносно грані, що і спостерігач.

У цьому випадку ребро цілком видиме відносно цієї грані.

2. Ребро цілком розташоване в напівпросторі, що не містить спостерігача.

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

3. Ребро перетинається з площиною, що містить розглянуту грань.

У цьому випадку варто розбити ребро на дві частини точкою перетинання і застосувати описані вище процедури для кожної з частин. Після завершення процесу будуть відомі усі видимі частини ребра.

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

Кеширування по рівномірній сітці

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

Приведемо деякі прості необхідні умови інцидентності ребра і грані:

1. Оболонковий тест. Якщо ребро і грань інцидентні, то прямокутні оболонки проекцій ребра і грані на картинну площину з сторонами, рівнобіжними координатним осям, перетинаються. Якщо для пари ребро-грань ця умова не виконана, тобто прямокутні оболонки не перетинаються, то з подальшого аналізу таку пару можна виключити.

2. Розіб'ємо картинну площину за допомогою рівномірної сітки на прямокутні елементи. Назвемо ребро й елемент інцидентними, якщо елемент перетинається з проекцією ребра на картинну площину. Грань і елемент називаються інцидентними, якщо проекція грані перетинається з елементом. Вирахувавши попередньо для кожного елемента сітки всі інцидентні з ним грані, перейдемо до аналізу взаємного розташування ребер і граней. З цією метою для кожного ребра багатогранника знайдемо всі елементи, інцидентні з ним. Далі аналізу підлягають лише ті грані, що мають із ребром загальні інцидентні елементи. Список таких граней для кожного елемента в нас уже є.

Якщо порівняємо приблизно витрати часу на роботу алгоритмів без кеширування і з ним, то виявиться наступне:

При прямому переборі для повного аналізу необхідно операцій порядку О(N2). В алгоритмі з кешируванням кількість операцій, необхідних для повного аналізу видимості ребер, має порядок О(N).

Методи пріоритетів. Найпростіший варіант методу художника

Загальна схема методів пріоритетів складається в спробі попередньо упорядкувати елементи сцени по якійсь ознаці. Звичайно в якості параметра впорядкування вибирається глибина елемента в сцені.

Нехай потрібно зобразити поверхню в ортогональній проекції. Використовуючи стандартну тріангуляцію області завдання функції і кусочно-лінійне наближення, одержимо наближення поверхні у виді багатогранної поверхні, гранями якої є трикутники. Виберемо таку нумерацію вузлів сітки Aij=A(xi,yj), 0 ≤ i ≤ N, 0 ≤ j ≤ M, щоб точка (x0,y0) була найближчою до спостерігача.

Зафарбовуючи грані відповідним кольором, скинемо проекції граней на картинну площину:

for i:=n-1 dowto 0 do

for j:=m-1 downto 0 do

for k:=2 downto 1 do

drawface(f(i,j,k));

При такому упорядкуванні граней багатогранника проекції граней, що лежать ближче до спостерігача, скидаються на картинну площину пізніше граней, що лежать далі від точки спостереження. Більш точно, якщо грань F1 стоїть попереду грані F2 , то знайдеться  їхня розділяюча гіперплощина, така що F1 належить одному напівпростору, а F2 і точка спостереження - додатковому напівпростору.

Метод бінарної розбивки простору

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

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

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

Виберемо довільно деяку грань. На цьому кроці будемо називати її активною. Розділимо усієї грані, що залишилися, на дві групи: ті, що лежать в одному напівпросторі зі спостерігачем відносно активної грані і ті, що лежать в додатковому напівпросторі. Грані першої групи не можуть загороджуватися активною гранню, і активна грань не може бути загороджена ніякою гранню другої групи. Тому, якби ми спочатку одержали правильне зображення частини сцени, що складається з граней другої групи, потім зобразили б активну грань і, нарешті, побудували правильне зображення частини сцени, що складається з граней першої групи, то в результаті мали б вірне зображення сцени в цілому.

Таким чином, розбивка сцени на дві частини з використанням активної грані дозволяє звести задачу загороджування для вхідної множини граней до розв'язання двох незалежних задач загороджування усередині кожної групи граней. Це спостереження приводить до побудови рекурсивного алгоритму зображення сцени.

Для цього в кожній групі знову довільно виділяємо активну грань і робимо подальше ділення. Процес рекурсивно повторюється, поки не будуть відсортовані усі грані. Ця процедура нагадує відомий алгоритм швидкого сортування Хоара. Результат розбивки множини всіх граней може бути поданий у виді бінарного дерева, що має таку структуру:

У кожному вузлі дерева міститься грань, у лівій гілці дерева – лицьові грані відносно кореневої, у правій гілці – нелицьові. Для одержання зображення з використанням цього дерева досить скинути рекурсивно на площину зображення проекцій граней по наступному правилу:

1. процедура ”Зобразити дерево”,

2. зобразити праве піддерево (якщо воно не порожнє),

3. зобразити кореневу грань,

4. зобразити ліве піддерево (якщо воно не порожнє).

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

Алгоритми сканування по рядках

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

Для формування зображення потрібно розв’язати в кожній площині двомірну задачу загороджування, проаналізувавши взаємне розташування відрізків відносно спостерігача на площині сканування.

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

Цей метод використовує послідовно роботу в об'єктному просторі й у площині зображення, зводячи тривимірну задачу загороджування до послідовності двомірних задач загороджування (для відрізків на площині).

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

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

Тріангуляція

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

Один із можливих підходів до розв’язання цієї задачі ґрунтується на кусочно-лінійній апроксимації, при якій поверхня, обумовлена функцією, наближається кусочно-лінійною поверхнею, що складається з трикутників. Для цього на площині XOY створюється сітка з  трикутників, що не перетинаються. Проекція кожної точки простору на площину XOY належить лише одній з трикутних граней, і значення функції F(x,y) апроксимується кусочно-лінійною функцією, що приймає задані значення в точках опорної множини. Процес тріангуляції складається в створенні сітки трикутників, що не перетинаються, із вершинами в заданих точках.

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

Однак за переваги тріангуляції доводиться платити складністю програмування.

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

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

У багатьох практичних випадках використовується тріангуляція Делоне. Вона будується однозначно і з'єднує вихідні точки в сітку найбільш правильних трикутників, що дає зручність в розрахунках.

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


Алгоритм побудови тріангуляції

Задача буде розв’язана, якщо визначений список ребер, що утворять тріангуляцію.

Розглянемо алгоритм побудови тріангуляції Делоне.

Попередньо площина розбивається на області Вороного. Позначимо вихідну множину N точок площини через S. Будемо вважати, що ніякі 4 крапки вихідної множини не належать одній окружності.

Областю Вороного V для точки P множини S називається множина таких точок площини, відстань від яких до точки P менше, ніж до будь-якої іншої точки цієї множини. Одержувані в такий спосіб N областей утворять розбивку площини. Об'єднана границя цих областей являє собою деяку сітку – діаграму Вороного.

Якщо множина S складається з двох точок, то серединний перпендикуляр до з'єднуючого їх відрізку ділить площину на дві області Вороного. У загальнім випадку область Вороного точки Р – це перетинання всіх напівплощин, що містять цю точку й обмежують серединні перпендикуляри до відрізків, що з'єднують Р з іншими точками множини S. Кожна область Вороного V буде обмежена опуклою ламаною – замкненою або незамкненою. Області Вороного внутрішніх точок опуклої оболонки опорних точок будуть багатокутниками, зовнішніх – йти на нескінченність. Ребрами сітки, що утворилася, являються відрізки серединних перпендикулярів. Якщо деяка вершина О області V отримана перетинанням серединних перпендикулярів до відрізків АВ і ВС, то вона рівновіддалена від точок А, В та С, тобто О – центр окружності, описаної навколо трикутника АВС. Кожна вершина діаграми Вороного є точкою перетинання в точності трьох ребер діаграми.

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

Мають місце дві важливих властивості цієї тріангуляції:

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

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

Час роботи наведеного алгоритму пропорційний числу крапок.

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

Для того щоб знайти трикутник, до якого потрапила чергова крапка New, з'єднаємо її відрізком із попередньою обробленою вершиною Last і подивимося, які ребра і трикутники він перетинає. Якщо трикутник, якому належить чергова крапка, знайдена, то залишається з'єднати її з вершинами цього трикутника і, при необхідності зробити фліпи. Якщо крапка лежить поза опуклою оболонкою, то необхідно з'єднати її з останнім ребром, що перетнув відрізок із вершинами Last і New. А для того щоб зберегти властивість опуклості тріангуляції, потрібно з'єднати ребрами з New усі вершини, що знаходяться між опорними прямими. Для представлення планарного графа можна скористатися, наприклад, реберним списком із подвійними зв'язками (РСПЗ).


Графічний практикум

Робота I Зображення двовимірних статичних сцен

Загальне формулювання завдання

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

Методичні вказівки

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

Варіанти завдань

Побудувати на екрані наступні зображення (пласкі статичні сцени):

1. Плоску пiрамiду, що складається із рівнобедрених різнокольорових трикутників: в нижньому ряду розташовуються три трикутника, їх основи дотикаються; другий ряд - два трикутника, що стоять на верхніх вершинах перших трьох; третій ряд - один трикутник, що стоїть на вершинах другого ряду. Трикутники залити білим кольором кожний.

2. "Пiфагорові штани", елементи яких зафарбовані окремим кольором.

3. "Семикольоровик" – сім різнокольорових однакових рівнобедрених трикутників тільки шпилем дотикаються в одній точці.

4. Плоску рівнобедрену піраміду, що складається з п'ятнадцяти зафарбованих різнокольорових прямокутників (у нижньому ряду – 5, у наступному ряду – 4 і т.д.), орієнтовану шпилем нагору. Між двома рядами прямокутників відстань в один прямокутник.

5. Олімпійський символ (п'ять зщеплених різнокольорових кілець в білому прямокутнику).

6. Шестикутник, поділений на шість рівних різнокольорових трикутників.

7. "Ромашку" – жовте коло, до країв якого на рівних відстанях приєднуються п'ять однакових білих пелюстків.

8. Сонце, що сходить – півколо в нижній частині екрану, до країв екрану рівномірно розходяться 24 проміня. Фон синій, інші елементи жовті.

9. Дві рівнобедрені трапеції, їх паралельні сторони орiєнтовані горизонтально; трапеції скеровані друг до друга меншими сторонами. Кольори у трапецій і їх сторін різні.

10. П'ять вкладених різнокольорових зафарбованих квадратів; вершини кожного внутрішнього квадрату лежать на серединах сторін зовнішнього. Фігура знаходиться всередині зафарбованого кола.

11. Правильний шестикутник, поміщений в квадрат. Площина екрану, поділена таким чином на три частини, зафарбовується трьома основними кольорами: червоним, зеленим, синім.

12. "Веселку" – сім концентрично укладених напівкілець однакової ширини, зафарбованих основними кольорами, фон голубий.

13. Коло, розбите на 8 рівних зафарбованих в свій колір секторів.

14. N зафарбованих своїми кольорами кіл. Число N, координати центру кола, радіус кола і колір вибираються випадково. Координати і радіус співвиміряються з розмірами екрану.

15. Правильну восьмикінцеву зірку (за принципом безвідривних ліній), вписану в коло. Всі фігури зафарбовані різними кольорами.

№16. Замкнену ламану лінію з п'ятьнадцятьма вершинами. Початкова вершина (0,0), координати інших вибираються випадково, співвимірні з розмірами екрану, і поєднуються відрізками за принципом : перший відрізок єднає т.( 0, 0 ) і ближчу до ньго точку; другий відрізок єднає цю точку з ближчою із тих, що залишились і так далі. Всі лінії товсті та зафарбовані різними кольорами.

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

18. Напис великими друкованими літерами слова " Графіка ", де кожна літера написана окремим кольором.

19. Коло, розбите на N секторів, зафарбованих окремими кольорами. Число N (від 2 до 10) та сукупність N додатних числових значень, котрим пропорційні площи секторів, вводяться користувачем.

20. Стовпчату діаграму – два зафарбовані в різні кольори прямокутника, які відстоять на певній відстані, мають однакові основи, а їхні висоти, пропорційні деяким введеним користувачем N числам.

21. Будиночок, що складається з даха (трикутник), основної будови (прямокутник), дверей (прямокутник), 2 вікон (прямокутники). Всі частини будинку зафарбовані в різні кольори. Організувати вмикання та вимикання світла в будинку натискуванням клавіші <Пробіл>.

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

23. П'ять вкладених різнокольорових різнобічних трикутників. Вершини кожного вкладеного трикутника лежать на серединах сторін зовнішнього.

24. Коло, розбите на дві рівні частки, де кожна – "велика кома". Одержані три частини екрану зафарбувати різними кольорами.

25. Емблему компанії Apple Computer. Перелік кольорів починаючи зверху: світло-зелений, жовтий, оранжевий, червоний, фіолетовий, синій.


Робота II Графіки функцій у декартових координатах

Загальне формулювання завдання:

Використовуючи графічний режим, намалювати на екрані координатну площину ХOY з однаковим масштабуванням осей, відповідними цифровими відмітками та графік частково-неперервної математичної функції.

Малюнок зробити таким чином:

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

Методичні вказівки

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

Нехай, наприклад, функція визначена трьома рівняннями:

y= -2- x;     x ≤ -2;

y = 4 – x2; -2 ≤ x ≤ 2;                                                                     (1)

y=ln ( x-1 ); x 2.

Графік функції розміщується на інтервалах: ]-;-2; [-2;+2]; +2;+[.

Середній інтервал займає чотири одиниці по осі ОX, тому крайні відкриті інтервали повинні бути зображені частково, не менше чотирьох одиниць кожний, отже, вісь ОX повинна бути на екрані не менше 3х4=12 одиниць, тобто, графіки функцій по осі аргументів займають a=12 одиниць.

Довжина екрану по горизонталі займає Ex пікселів, ця величина у кожного дисплея своя, наприклад 640 у дисплея типу VGA. Значення Ex в системі Turbo Pascal можна визначити за допомогою функції GetMaxX, щоб не прив'язуватися програмно до конкретного типу дисплею.

Необхідно чітко уяснити, що значення аргументів функцій ("функціональний" X ) і адресні значення пікселів на екрані ("екранний" X ) є різні, але взаємопов'язані величини, цей взаємозв'язок носить вид прямої пропорційностi. Для встановлення цього взаємозв'язку можна ввести коефіцієнт переходу між "функціональним" та "екранним" X:

kx=Еx/a.                                                                                 (2)

Цей коефіцієнт визначає кількість пікселів, що відповідає масштабній одиниці осі OX.

Виходячи з математичних формул визначаємо, що перша частина графіка - це пряма лінія, друга частина - це парабола, третя частина графіка представлена логарифмічною залежністю. На заданих інтервалах максимальне значення серед значень функцій дорівнює 4, тому, аналогічно, визначаємо коефіцієнт b=8 виходячи з того, що вісь OY перетинає центр екрану. Також визначаємо максимальне значення номеру пікселів Ey для конкретного типу дисплея (за допомогою функції GetMaxY).

Визначаємо коефіцієнт:

ky=Еy/b.                                                                                   (3)

Він вказує, скільки пікселів відповідає одиниці осі OY.

Перша частина графіка може бути зображена за допомогою процедури Line після перерахування координат спочатку по осям OX і OY, після цього користуючись коефіцієнтами kx і ky необхідно перейти до значень координат пікселів на екрані. Але при цьому необхідно врахувати, що нумерація пікселів по горизонталі іде зліва направо від краю екрану, а значення по осі OX на краю екрану приймає в загальному випадку ненульове значення c, конкретно c= – 6. Тому перехід від номерів пікселів до аргументів X буде задано співвідношенням:

X=c + i/kx.                                                                                (4)

При перерахуванні значень по осі OY, крім цього, необхідно врахувати, що нумерація піселів на екрані по вертикалі зростає до низу, а на зображенні значення по осі OY повинно зростати від центру екрану від значення 0 нагору, в конкретному випадку до значення + 4. Таким чином, для переходу від значення осі OY до значення адреси піксела pY по вертикалі можна використати співвідношення:

pY=d - ky*Y,                                                                               (5)

де в нашому випадку d=Ey/2.

Алгоритм перерахування можна сформулювати так:

1). Визначити довжину інтервалів, що складають область визначення функції на осях OX та OY, a і b відповідно.

2). Знайти коефіцієнти переходу значень осей координат і координат пікселів kx і ky згідно з (2) і (3).

3). Визначити значення горизонтальних координат пікселів. Для зображення безперервної непрямої лінії це можна здійснити за допомогою циклу з параметром.

4). За допомогою співвідношення (4) визначити значення "функціональної координати" X, після цього визначити значення "функціональної координати " Y згідно з необхідною формулою (в нашому прикладі співвідношення (1) ); далі, згідно співвідношення (5) визначити значення вертикальних координат пікселів.

5). Маючи значення координат пікселів по вертикалі і горизонталі виконати побудови на екрані, використовуючи відповідні програмні засоби графічного режиму.

Побудову за наведеним алгоритмом в нашому прикладі (1) для першої функції може бути здійснено застосуванням процедури Line, обчисливши заздалегідь координати крайніх точок відрізку згідно до пунктів 3) і 4) алгоритма побудови. Графіки другої і третьої функцій прикладу (1) слід будувати покрапково, тобто пункти 3), 4), 5) алгоритма побудови повинні виконуватися циклічно. Кількість повторень визначається виходячи з кількості пікселів по горизонталі, по 1/3 цієї кількості на кожну частину графіка.

Безпосереднє нанесення точок може бути здійснено в системі Turbo Pascal процедурою PutPixel, що також задає колір малюнка, який для кожної частини лінії повинен бути окремий. В нашому прикладі (1) фрагмент програми на мові Turbo Pascal що будує другу частину графіка, може бути наступним:

For i:= (Ex div 3 ) to 2•(Ex div 3 ) do

begin

X:=-6+i/kx;

Y:=4-x•x;

pY:=Ey/2-ky•y;

PutPixel(i,py,3);

end;

По бажанню лінію графіка можна зробити товщою, додавши ще один виклик процедури PutPixel, де значення другого параметра дорівнює pY+1.

Аналогічно програмується побудова третьої частини функції.

При програмуванні сильно зростаючих функцій, наприклад, експоненти, зміна координат по вертикалі може відбуватися набагато швидше, ніж по горизонталі і в наслідок цього графік на екрані може "розпадатися" на окремі точки так, що навіть важко буде розрізнити лінію функціональної залежності. В цьому випадку рекомендується координати першої точки обчислити перед циклом. В циклі замість PutPixel треба використати процедуру Line, вирахувавши заздалегідь координати наступної точки; після побудови відрізку запам'ятати останню пару координат, як першопочаткову.

Для побудови осей координат необхідно використати процедуру зображення ліній Line; "екранні" координати осі OX визначаються виходячи з того, що вона проходить горизонтально по центру екрану, координати осі OY визначаються згідно конкретного завдання.

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

Тобто, значення координат для OY:(( Ex div 2 ), 0 ) – початок,

(( Ex div 2 ), Ey ) – кінець осі.

для OX:( 0, ( Ey div 2 )) – початок,

( Ex, ( Ey div 2 )) – кінець осі.

Для цифрової розмітки осі необхідно використувати процедуру OutTextXY або пару процедур OutText і МоveTo.

Варіанти завдань

Зобразити осі координат ХOY з масштабними цифровими відмітками і графік математичної функції (див. Загальне формулювання завдання).

1.      

2.      

3.      

4.      

5.      

6.     

7.     

8.     

9.     

10.     

11.     

12.     

13.     

14.     

15.     

16.     

17.     

18.     

19.     

20.     

21.     

22.     

23.     

24.     

25.     


Робота III Графіки функцій у полярних координатах

Загальне формулювання завдання

Згідно варіанта завдання виконати побудову на екрані ПК полярної площини та графіка функції, що задана в аналітичному виді. Фон екрану синій; полярна вісь, масштабні відмітки та числові позначки повинні мати білий колір, графік функції жовтий. Початкове та кінцеве значення для , значення змінних a,l,c повинні бути введені користувачем програми за допомогою клавіатури.

Методичні вказівки

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

Базовим математичним апаратом для віконання завдань є формули зв’язку між прямокутними декартовими координатами xпрямокут, yпрямокут та полярними :

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

У Додатку А приведений приклад розв’язання типової задачі.

Варіанти завдань

1. ,  (цисоїда)

2. ,  (строфоїда)

3. ;  (равлик Паскаля)

4. ,  (кардиоїда)

5. ; (овал Касіні)

6. ,  (лемніската)

7. , (Декартов лист)

8. , (конхоїда Нікомеда)

9.

10.

11.

12.

13.

14.

15.

16.

17.

18.

19.

20.

21.

22.

23.

24. ,  (Архімедова спіраль)

25. ;


Робота IV Побудова обмежених областей на площині

Загальне формулювання завдання

Згідно варіанта завдання зобразити на екрані ЕОМ двовимірну область, обмежену графіками математичних функцій, вдовольняючи наступним умовам:

Графіки функцій виходять за основну область на 20 – 25 % від її розміру. Область, обмежена графіками функцій, заштрихована паралельними лініями з інтервалом в 45 пікселів між лініями. Кут нахилу ліній до осі ОХ складає 45 градусів (якщо в завданні не омовлено інше). Графіки функцій та лінії штрихування мають окремі кольори. Колір осей координат і цифр білий, фон – чорний, числові позначки на осях мають тільки цілі значення.

Методичні вказівки

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

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

While abs (f1(x) –- f2(x)) >e do x :=x+a;

Тут f1(x) і f2(x) – підпрограми-функції, e - значення інтервалу збіжності, a – значення приросту аргумента. Дійсно, значення величин a, e та початкове значення x має вводитися з клавiатури, а по закінченні розрахунків значення x повинне повернутись до головної програми.

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

Знайдені точки - це вихідні параметри для визначення інтервалів зображення графіків функцій. Повна побудова зображення може бути виконана після виконання попередніх досліджень по одному із двох наступних варіантів алгоритмів з використанням допоміжної програми:

Перший варіант

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

Другий варіант

  •  виконати побудову ліній штрихування, заповнивши ними весь екран;
  •  використовуючи точки перетину графіків функцій, виконати побудову графіків функцій одним кольором;
  •  виконати зафарбування ("заливку") зовнішньої, необмеженої області екрану кольором фону, використовуючи колір графіків функцій, як граничний;
  •  виконати повторну побудову графіків функцій, але тепер графік кожноі функції повинен мати свій власний колір;
  •  далі можна виконати побудову осей координат.

В системі Turbo Pascal, крім цього, є можливість сформувати власний стиль заповнення (лінії штриховки) процедурою SetFillPattern, активізувати його процедурою SetFillStyle, заповнити область цим стилем за допомогою процедури FloodFill.

Варіанти завдань

1. .

2. .

3. .

4.  (лінії горизонтальні).

5.  (область точки (0;0); лінії вертикальні).

6.  (лінії вертикальні).

7.  (лінії горизонтальні).

8.  (для x >0).

9.  (лінії вертикальні).

10. .

11. .

12. .

13. .

14. .

15. .

16. .

17. .

18. .

19. .

20. .

21. .

22. .

23. .

24. .

25. .


Робота V Анімація двовимірних зображень

Загальне формулювання завдання

Скласти програму зображення на екрані ПК динамічної фігури згідно варіанта завдання. Швидкість руху (чи зміни) фігури на екрані задається при старті програми, завершення роботи програми реалізується натисканням клавіші <Esc>. Фон екрану чорний, якщо не омовлено інше.

Методичні вказівки

Ідея алгоритму побудови динамічних зображень грунтується на швидкій заміні у певному порядку деякої кількості схожих статичних зображень (кадрів), обмеженому часі знаходження зображення на екрані і властивості iнертностi людського ока при сприйманні зображень. Цей же принцип використовується в кіно, де фільм складається із набору кадрів, що відображають послідовність моментів руху. Кожний кадр проецюється лише частку секунди (1/24 або 1/25) та змінюється наступним, а око людини сприймає результат як рух зображень.

Таким чином програмування зображення, що рухається, здійснюється за схемою:

  •  намалювати зображення,
  •  зробити тимчасову затримку для сприймання оком,
  •  усунути зображення,
  •  намалювати зображення в новій позиції.

Вилучення зображення фігури може бути виконано декількома засобами: можна намалювати цю ж фігуру, але використовуючи колір фону, що дорівнює її вилученню; можна виконати очистку всього екрану, якщо крім динамічної фігури на екрані більше немає нічого; також можна виконати очистку тільки частини екрану - вікна, якщо це не протирічить умові завдання (в Турбо Паскалі процедура ClearViewPort). Також ефективне застосування динамічного читання і запису частини екрану (процедури GetImage і PutImage).

При побудові складних динамічних зображень процес побудови може бути помітний і сильно знижувати ефект сприймання. Для його усунення можна застосовувати переключення відеосторінок: поки в одній (неактивній сторінці) виконується побудова, інша проецюється на екран. Після цього сторінки міняються місцями. В системі Turbo Pascal для цього існують процедури SetActivePage і SetVisualPage.

Варіанти завдань

1. Зобразити на екрані "серце, що пульсує", одночасно застосовуючи зміну відтінку основного кольору екрану.

2. Зобразити рух Сонця над землею, починаючи із сходу і закінчуючи заходом, змінюючи при цьому яскравість фонового забарвлення.

3. Зобразити рух човна з парусом по сінусоїдальній хвильовій поверхні води. Всі частини динамічної картинки зафарбовані.

4. Зобразити в динаміці на екрані, процес розділення однієї круглої клітини з великим ядром на дві круглі клітини, але різних кольорів, відмінних від початкового. Після розділення обидві клітини "доростають" до розміру вихідної клітини.

5. Зафарбоване коло радіусом 50 пікселів рухається по екрану, як м’яч відскакує від країв екрану. початок руху - центр екрану, кут початкового польоту щодо горизонталі вводиться із клавiатури.

6. Зліва направо на екрані по косінусоїдальній траєкторії рухається коло діаметром 40 пікселів. Кожен період коло має нове забарвлення. Амплітуда і період траєкторії вводиться із клавiатури.

7. На екрані два восьмипроменевих хреста з різнокольоровими променями, розташовані симетрично, довжина променя 120 пікселів. Фігури обертаються : права - по годинній стрілці, ліва - проти годинної стрілки.

8. Маятник, що качається, довжина маятника 2/3 висоти екрану, діаметр кола - 20 пікселів, колір кола змінюється з кожним періодом.

9. Прямокутник зі сторонами 20 і 30 пікселів рухається по колу діаметром 220 пікселів, не змінюючи орієнтації і змінюючи забарвлення на кожному витку.

10. Зліва направо по центральній лінії екрану рухається коло, повільно змінюючи свої розміри: на краях екрану діаметр кола 40 пікселів, в центрі екрану - діаметр 200 пікселів. Кожний новий прохід коло має інший колір.

11. 1) В центрі екрану з'являється коло довільного забарвлення, що має початковий діаметр 10 пікселів. Діаметр кола повільно збільшується. 2) При досягненні розміру діаметру на 70 пікселів більше початкового, в центрі виникає знову коло з початковим діаметром, але іншого забарвлення. 3) Кола далі збільшуються одночасно, повторюючи пункти 2) та 3) і так далі. 4) При досягненні кожним зовнішнім колом країв екрану воно зникає, зафарбовуючи область, що залишилася, своїм кольором.

12. На екрані по максимально можливому колу розташовані рівномірно числа від 1 до 12 (години). Із центру екрану на цифри по черзі вказує одна стрілка у вигляді сильно витягненого ромба. Кожен новий оберт стрілка змінює свій колір.

13. Зліва направо по сiнусоїді рухається слово "Program". Розміщення літер відображає траєкторію сінусоїди ( рух змійкою ). Кожен новий прохід слово має нове забарвлення. Амплітуда і період сінусоїди вводиться із клавiатури один раз на початку роботи програми.

14. Дві фігури - по два зхрещених прямокутника різних кольорів з розмірами 100×40 і 80×30 пікселів, обертаються : ліва - по годинній, права - проти годинної стрілки. Обертання виконується довкола центрів фігур.

15. Два відрізка довжиною 70 пікселів орієнтовані взаємноперпендикулярно, з'являються дотичними до невидимого кола, діаметром 200 пікселів, розміщеного в центрі екрану. Відрізки одночасно ковзають по поверхні кола, кожний новий оберт змінюючи колір.

№16. 1) В центрі екрану з'являється зафарбований квадрат ( розмір сторони 20 пікселов ). 2) Квадрат повертається на 45 градусів, одночасно збільшуючи розмір сторони на 50 відсотків. 3) Пункт 2) повторюється до тих пір, поки вершини квадрату не досягнуть країв екрану. Квадрат зникає та зафарбовує своїм кольором весь екран. 4) Пункти 1) та 3) повторюються після зміни кольору.

17. В центрі екрану циферблат годинника з відмітками 1, 2,..., 12. Стрілки - годинна, хвилинна, секундна - мають свій колір і довжину. Годинник показує точний час і кожну хвилину змінює забарвлення циферблату (червоний, жовтий, зелений).

18. На екрані дисплею вітряк із чотирма зафарбованими в різний колір крилами, що обертаються.

19. На екрані правильний трикутник, що обертається довкола свого центру і змінює в процесі обертання свій колір.

20. Різнокольорові великі літери T, E, C, T рухаються з уповільненням із кутів екрану кожна до центру. Там вони утворюють слово ТЕСТ, далі повертаються назад і всі дії повторюються спочатку.

21. Умовно приймаючи, що траєкторії руху планет довкола Сонця – концентричні кола, зобразити діючу модель Сонячної системи. Траєкторії руху зобразити крапковими лініями. Всі планети, що рухаються і Сонце мають свій власний колір.

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

23. Зобразити на екрані прямокутник, що обертається в площині екрану навкруг свого центру та змінює свій колір.

24. Зобразити на екрані різнобічний трикутник, що обертається навкруг однієї з своїх вершин і змінює свій колір.

25. Зобразити п'ятикінцеву зірку, що повільно обертається навкруг свого центру і змінює свій колір.


Робота VI Програмування тривимірних статичних сцен

Загальне формулювання завдання

Побудувати на екрані тривимірну фігуру згідно варіанта завдання.

При формуванні зображень необхідно виконати наступні умови:

Осі координат мають наступну орієнтацію: ОX - зліва направо, ОY - знизу нагору, ОZ -“перпендикулярно” до них, тобто вліво та вниз. Фон екрану чорний, осі координат і числа на них (тільки цілі) - білі, ребра фігур жовті, штриховки граней виконати різними кольорами чи різними стилями, штриховки опуклих і угнутих фігур – дугами. Розміри фігур визначаються в одиничних відрізках осей координат.

Методичні вказівки

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

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

Однак, може здатися проблематичним нанесення координат по осі OZ. Вирішення цього питання може бути наступним. Збудуємо систему координат OXYZ на аркуші паперу і визначимо на малюнку точку з координатами (0;0;1). Вона знаходиться безпосередньо на осі OZ. Далі будемо вважати малюнок двовимірним і визначимо координати цієї точки. Їх значення буде залежати від того, як ми намалювали вісь OZ.

Нехай, наприклад, ці значення будуть дорівнювати -0,5 на осі абсцис і -0,6 на осі ординат. Ці числа є корегуючими коефіцієнтами при нанесенні точок із тривимірної системи координат на двовимірну площину, кожне значення по осі OZ множиться на ці коефіцієнти і результат додається до значень по відповідним осям.

Штриховку граней фігур необхідно виконувати згідно з методикою частини 2 цього посібника. Опуклі і угнуті частини краще заповнювати згідно до першого чи другого варіанту алгоритму, що приведений в частині 2, а штриховку плоских граней слід виконувати згідно з останнім варіантом алгоритму частини 2.

У Додатку А наведено приклад розв’язання типової задачі.

Варіанти завдань

1. Куб з ребром a=3 розташовується у центрі координат одним шпилем, інші вершини розташовані в додатніх напівплощинах. Куб перетнутий площиною x+y+z-5=0. Зобразити більшу частину, що залишилася після перетину куба.

2. Куля із центром у (0;0;0) радіусу 6 перетинається площиною x=4. Зобразити більшу частину, що залишилася після перетину.

3. Піраміда з висотою 7, в основі піраміди рівносторонній трикутник ABC, координати A(3;0;0), C(0;0;3); точка B має невід'ємні координати і лежить в площині y=0. Зобразити ту частину піраміди, що залишилася від її перетину кулею радіусу 3 з центром у точці D, яка має додатні координати.

4. Пiрамiда АBCD з висотою 7, в основі рівносторонній трикутник АBC, що лежить в площині y=0, сторони A(0;0;3), B(3;0;0), точки C і D мають тільки невід'ємні координати. У точці C розташований центр кулі радіусу 2. Зобразити більшу частину пiрамiди, що залишилася від перетину.

5. Куб з ребром 5 розташований шпилем у центрі координат, координати інших вершин невід’ємні. У точці (5;0;5) знаходиться центр кулі радіусу 2, вона перетинає куб. Зобразити більшу частину куба, що залишилася після перетину.

6. Куб з ребром 7 розташований одним шпилем у точці (0;0;0), координати інших вершин невід’ємні. У точці (7;7;5) знаходиться центр кулі радіусу 3, куля відрізає частину куба. Зобразити частину куба поза кулею.

7. Конус з радіусом основи 3, висотою 7 і шпилем у точці (0;0;0), перетнутий площиною x+y+z-9=0; зобразити більшу частину перетнутого конуса.

8. У центрі координат знаходиться центр кулі з радіусом 7 і один шпиль куба з ребром 5, координати ще трьох вершин куба A(0;5;0), C(5;0;0), D1(0;0;-5). Зобразити загальну частину куба та кулі.

9. У центрі координат знаходиться центр кулі з радіусом 7 і один шпиль куба з ребром 5, координати ще трьох вершин куба A(0;5;0), C(5;0;0), D1(0;0;-5). Зобразити частину куба поза кулею.

10. Дві кулі мають наступні координати центрів і радiуси: O1(0;0;0); R1=3; O2(9;0;0); R2=7. Зобразити загальну частину куль.

11. Пiрамiда має координати вершин D(0;0;5), A1(3;0;0), C1(0;3;0), D1(0;0;0); куля має центр у к. C1 і радіус 4. Зобразити частину пiрамiди, що входить до кулі.

12. Зобразити частину еліптичного циліндру, заданого ріавнянням  та обмежену площинами  та .

13. Конус R=60, h=100, центр підстави M(-10;20;0), перерізаний площиною .

14. Параболоїд , перерізаний площиною .

15. Однопорожній гіперболоїд , обмежений площинами  та .

16. Двопорожній гіперболоїд , обмежений площинами  та .

17. Частина простору, що знаходиться в першому октанті та обмежена сферою .

18. Частина еліипсоїда , що знаходиться між площинами  та .

19. Параболоїд , обмежений сферою .

20. Зобразити частину постору, обмежену площинами , , .

21. Однопорожній гіперболоїд , обмежений площинами  та .

22. Двопорожній гіперболоїд , обмежений площинами  та .

23. Куля , перерізана напівпростором .

24. Куб с вершинами A(0;0;0), B(80;0;0), C(0;80;80), D(0;80;0), перерізаний кулею .

25. Зобразити частину простору, обмежену поверхнею  та напівпросторами , .


Робота VII Моделювання зображень поверхні

Загальне формулювання завдання

Побудувати на екрані поверхню згідно варіанта завдання.

При формуванні зображень необхідно виконати наступні умови:

Осі координат мають наступну орієнтацію: ОY - зліва направо, ОZ - знизу нагору, ОX -“перпендикулярно” до них, тобто вліво та вниз. Фон екрану білий, осі координат і числа на них – сині, лінії поверхні чорні. Зображення формується згідно методам проектування (паралельного та перспективного).

Методичні вказівки

При виконанні завдань використовуються як практичні навички, здобуті на попередніх етапах роботи за цим посібником, так і математичні основи побудов у 3D-просторі, що містяться у теоретичній частині посібника.

У Додатку А наведено приклад програми побудови поверхні методом паралельного проектування.

Варіанти завдань

Для x  [-a; a]; y  [-a; a] зобразити поверхню:

1. ;

приблизний вигляд поверхні

2. ;

приблизний вигляд поверхні

3. ;

приблизний вигляд поверхні

4. ;

приблизний вигляд поверхні

5. ;

приблизний вигляд поверхні

6. ;

приблизний вигляд поверхні

7. ;

приблизний вигляд поверхні

8. ;

приблизний вигляд поверхні

9. ;

приблизний вигляд поверхні

10. ;

приблизний вигляд поверхні

11. ;

приблизний вигляд поверхні

12. ;

приблизний вигляд поверхні

13. ;

приблизний вигляд поверхні

14. ;

приблизний вигляд поверхні

15. ;

приблизний вигляд поверхні

16. ;

приблизний вигляд поверхні

17. ;

приблизний вигляд поверхні

18. ;

приблизний вигляд поверхні

19. ;

приблизний вигляд поверхні

20. ;

приблизний вигляд поверхні

21. ;

приблизний вигляд поверхні

22. ;

приблизний вигляд поверхні

23. ;

приблизний вигляд поверхні

24. ;

приблизний вигляд поверхні

25. .

приблизний вигляд поверхні


Додаток А Приклади програмної реалізації графічних задач

ПРИКЛАД 1

Завдання: Ініціювати графічний режим роботи та вивести повідомлення про це,  в разі необхідності обробити аварійну ситуацію.

program example1;

uses Graph;

var GraphDriver, GraphMode, ErrorCode: Integer;

begin

{ ініціація графічного режиму }

GraphDriver:=Detect;

InitGraph ( GraphDriver, GraphMode, 'C:\TP\DRIVERS' );

{ повернення коду помилки графічної операції }

ErrorCode :=GraphResult;

{ якщо перехід до графічного режиму не відбувся, вивести повідомлення про помилку та прокоментувати її}

if ErrorCode <> GrOk then

begin

Writeln ( 'graphics error : ', GraphErrorMsg ( ErrorCode) );

Writeln ( 'program aborted...' );

Halt ( 1 );

end;

{ малювання прямокутника на весь екран }

RectAngle ( 0, 0, GetMaxX, GetMaxY );

{ центрування текстових повідомлень }

SetTextJustify ( CenterText, CenterText );

{ настройка параметрів шрифту }

SetTextStyle ( DefaultFont, HorіzDir, 3 );

{ вивід текстового повідомлення }

OutTextXY ( GetMaxX div 4, GetMaxY div 4, 'The example graphmode');

OutTextXY ( GetMaxX div 2, GetMaxY div 2, 'Borland graphics interface (Bgi)');

{ очікування натискання <ENTER> }

Readln;

{ завершення роботи з графічним режимом }

CloseGraph;

end.


ПРИКЛАД 2

Завдання: Вивести на екран графік функції ρ=φ, для 0φ4π/3.

program exam2;

uses graph,crt;

var

gd,gm,errorcode,chx,nky,nkx,l,i,y0,x0,x,y:integer;

t:real;

s:string;

begin

gd:=detect;

initgraph(gd,gm,'');

setcolor(8);

setbkcolor(15);

chx:=getmaxx div 12;

nky:=5*chx;

l:=2*chx;

for i:=-4 to 4 do

begin

moveto(l,nky-(chx div 10));

lineto(l,nky+(chx div 10));

if i<>0 then

begin

str(i,s);

if i>0 then outtextxy(l-3,nky+(chx div 4),s)

else outtextxy(l-10,nky+(chx div 4),s);

end;

l:=l+chx;

end;

line(chx,nky,getmaxx-chx,nky);

l:=2*chx;

nkx:=6*chx;

t:=0;

x0:=getmaxx div 2;

y0:=5*chx;

moveto(x0,y0);

while t<=4*pi/3 do

begin

x:=round(t*cos(t)*chx);

y:=round(t*sin(t)*chx);

lineto(x0+x,y0-y);

t:=t+0.0001;

end;

while not keypressed do;

closegraph;

end.

Вид зображення на екрані:

ПРИКЛАД 3

Завдання: Зобразити куб (перший октант, шпиль у початку координат, ребро = 5), відсічений кулею радіусу 2 з центром у точці (5,0,5).

program example3;

Uses Crt, Graph; { Підключення бібліотечних модулів }

const num: array[1..10] of char=('1','2','3','4','5','6','7','8','9','0');

var x,y,i: integer;

edmas: integer;

Gdriver, Gmode: integer;

x1, y1, x2, y2, x3, y3: real;

xt, yt: real;

maxx, maxy: integer;

begin

DetectGraph(Gdriver, Gmode); { Визначаємо графічний режим роботи }

InitGraph(Gdriver,Gmode,' '); { Ініціюємо графічний режим }

SetBkColor(15); { Колір фону білий }

SetColor(8); { Колір зображення темно-сірий }

maxx := GetMaxX; { Визначаємо максимальні розміри экрану }

maxy := GetMaxY;

x := maxx div 2; { Обчислюємо координати центру экрана }

y := maxy div 2;

{ Вісь OX: встановлюємо поточний покажчик у центр, проводимо лінію }

MoveTo(x, y);

LineTo(maxx, y);

{ Відмічаємо масштабні одиниці та робимо цифрові позначки на осі OX }

edmas := 30;

for i:= 1 to 10 do

begin

MoveTo(x + edmas*i,y);

LineTo(x + edmas*i,y-4);

MoveTo(x + edmas*i-2,y-15);

if i = 10 then OutText('10')

else OutText(num[i]);

end;

MoveTo(maxx-30,y-30);

OutText('X');

{ Малюємо стрілку на осі OX }

MoveTo(maxx-5,y-3);

LineTo(maxx,y);

LineTo(maxx-5,y+3);

{ Аналогічно ОХ готуємо вісь OY }

MoveTo(x,y);

LineTo(x,0);

for i:= 1 to 7 do

begin

MoveTo(x, y - edmas*i);

LineTo(x+4,y - edmas*i);

MoveTo(x+8,y - edmas*i-2);

OutText(num[i]);

end;

MoveTo(x+10,0);

OutText('Y');

MoveTo(x-3,5);

LineTo(x,0);

LineTo(x+3,5);

{ Аналогічно готуємо вісь OZ }

MoveTo(edmas * 5 div 2,maxy);

LineTo(x,y);

{ масштабна одиниця на осі OZ, edmas / 2 = 15 пікселям }

for i:= 1 to 10 do

begin

MoveTo(x-edmas div 2 * i,y + edmas div 2 * i);

LineTo(x-edmas div 2 * i - 3,y + edmas div 2 * i - 4);

MoveTo(x-edmas div 2 * i -12,y + edmas div 2 * i -11);

if i = 10 then OutText('10')

else OutText(num[i]);

end;

MoveTo(55,maxy-15);

OutText('Z');

MoveTo(77,maxy-8);

LineTo(75,maxy);

LineTo(85,maxy-5);

{ Малюємо ребра куба }

SetColor(7); { колір ребра сірий }

MoveTo(x - edmas * 5 div 2, y + edmas * 5 div 2);

LineTo(x + edmas * 5 div 2, y + edmas * 5 div 2);

LineTo(x + edmas * 5 div 2, y - edmas * 5 div 2);

LineTo(x - edmas * 5 div 2, y - edmas * 5 div 2);

LineTo(x - edmas * 5 div 2, y + edmas * 5 div 2);

MoveTo(x - edmas * 5 div 2, y - edmas * 5 div 2);

LineTo(x, y - edmas * 5);

LineTo(x + edmas * 5, y - edmas * 5);

LineTo(x + edmas * 5 div 2, y - edmas * 5 div 2);

MoveTo(x + edmas * 5 div 2, y + edmas * 5 div 2);

LineTo(x + edmas * 5,y);

LineTo(x + edmas * 5,y - edmas * 5);

{ Виділяємо грані куба }

SetFillStyle(1,7);

FloodFill(x+1,y-99,7);

SetFillStyle(2,7);

FloodFill(x-48,y-48,7);

SetFillStyle(4,7);

FloodFill(x+77,y-75,7);

{ Заповнюємо область, відсічену кулею, у площині XOY кольором фону}

SetColor(15);

SetLineStyle(0,0,3);

for i:= 1 to 60 do

Ellipse( x + edmas * 5 div 2, y + edmas * 5 div 2, 90, 180, i, i);

{ Заповнюємо відсічену область дугами сірого коліру }

SetColor(7);

SetLineStyle(2,0,1);

for i:= 1 to 15 do

Ellipse( x + edmas * 5 div 2, y + edmas * 5 div 2, 90, 180, i*4, i*4);

{ Малюємо еліпси у площині, паралельній YOZ кольором фону}

SetColor(15);

SetLineStyle(0,0,3);

for i := 1 to 30 do

Ellipse( x + edmas * 5 div 2, y + edmas * 5 div 2, 25, 91, i, i*2);

{ Заповнюємо відсічену частину дугами сірого коліру }

SetColor(7);

SetLineStyle(2,0,1);

for i := 1 to 15 do

Ellipse( x + edmas * 5 div 2, y + edmas * 5 div 2, 25, 91, i*2, i*4);

{ Заповнюємо область, відсічену кулею, в площині, паралельній XOZ}

SetColor(15);

SetLineStyle(0,0,3);

for i:= 1 to 30 do

Ellipse( x + edmas * 5 div 2, y + edmas * 5 div 2, 0, 360, 2*i, i);

SetColor(7);

SetLineStyle(2,0,1);

Ellipse( x + edmas * 5 div 2, y + edmas * 5 div 2, 63, 180, 60, 30);

repeat until KeyPressed;

CloseGraph; { вихід з графічного режиму }

end.

Вид зображення на екрані:


ПРИКЛАД 4

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

program example4;

uses graph,crt;

{Зображення поверхні за допомогою паралельного проектування,

що не містить невидимих точок}

const

    b=250; {Половина габариту робочої області}

    ax=-0.25; ay=-1; az=-0.25; {Вектор проектування}

    d1=5; {Шаг площин перерізу}

var

  min,max:array[-10*b..10*b] of integer;

  gd,gm,w,h:integer;

function xscr(c:integer):integer; {функція обчислення екранного х}
begin
    xscr:=w div 2 +c;
end;

function yscr(c:integer):integer; {функція обчислення екранного у}
begin
    yscr:=h div 2 -c;

end;

function func(x,y:real):real; {функція з формулою поверхні}

begin

    func:=100*sin(pi/50*sqrt(x*x+y*y));

end;

procedure planes; {основна процедура побудови поверхні}

var

 y,yb,xb,xe,dx,dy,z0,x0,y0:real;

 n,xstart,xstop,i,x,z:integer;

 f:boolean;

begin

 setbkcolor(15);

 n:=2*b div d1;{число кроків циклу площин перерізу}

 {ініціалізація масивів min,max мінімальних

  і максимальних ординат у картинній площині}

 for i:=-10*b to 10*b do

 begin

      min[i]:= 1000;

      max[i]:=-1000

 end;

 {розрахунок початкової точки (xb,yb) на картинній площині,

 проектуючи точку (-b,b,0)}

 xb:=-b-(ax/y)*b;

 yb:=(-az/ay)*b;

 {розрахунок координати xe кінцевої точки,

 проектуючи точку (b,b,0)}
 xe:=b-(ax/ay)*b;
 {розрахунок шагів по x та y на картинній площині}

 dx:=d1*(ax/ay);

 dy:=d1*(az/ay);

 for i:=0 to n do {цикл площин перерізу}

 begin

      {координата по y початкової точки на картинній площині

      для наступної площини перерізу}

      y:=yb+i*dy;

      {координати по x початкової та кінцевої точки на

      картинній площині для наступної площини перерізу}

      xstart:=round(xb+i*dx);

      xstop:=round(xe+i*dx);

      for x:=xstart to xstop do {цикл вздовж площини перерізу}

      begin

           {проектуючи "назад", обчислюється точка в основі

           площини перерізу - на горизонтальній площині}

           x0:=x-y*(ax/az);

           y0:=-y*(ay/az);

           {обчислюється значення функції для x0,y0}

           z0:=func(x0,y0);

           {обчислюється апліката образа точки (x0,y0,z0)

           на картинній площині}

           z:=round(z0-(az/ay)*y0);

           {перевірка необхідності виведення знайденої точки}

           f:=false;

           if z<min[x] then begin min[x]:=z; f:=true end;

           if z>max[x] then begin max[x]:=z; f:=true end;

           if f then putpixel(xscr(x),yscr(z),8);

      end;

 end;

end;

begin

    gd:=detect;

    initgraph(gd,gm,'');

    w:=getmaxx; {обчислення ширини та висоти екрана}

    h:=getmaxy;

    planes; {зображення поверхні}

    readln;

    closegraph;

end.

Вид зображення на екрані:


Додаток Б Графічна бібліотека компілятора Turbo Pascal 7.0

Для того, щоб компілювати програму, що використовує модуль Graph, Вам знадобиться вихідний код, компілятор, доступ до стандартних модулів в Turbo.Tpl та до модулю Graph в Graph.Tpu. Для того, щоб виконати програму, яка використовує модуль Graph, Вам необхідний один (чи більше) графічний драйвер (Bgi-файл), а якщо програма використовує штрихові шрифти, знадобиться один (чи більше) файл шрифтів (.Chr).

Драйвери

Графічні драйвери підтримують роботу наступних графічних адаптерів: Cga, Mcga, Ega, Vga, Ibm 8514 та деякі інші. Кожен драйвер вміщує код та дані, що зберігаються в окремому файлі.

Під час виконання програми процедура InitGraph визначає графічний пристрій, завантажує та ініціює відповідний графічний драйвер, переводить систему до графічного режиму і повертає управління програмі, що зробила виклик. Процедура CloseGraph звільняє пам’ять від драйверу і відновляє попередній відеорежим. Можна переводити систему у графічний чи текстовий режими, використовуючи RestoreCrtMode і SetGraphMode. Для того, щоб завантажити Ваш власний драйвер або включити його в .exe-файл, див. RegisterBgiDriver.

Файли драйверів:

Cga.Bgi

Egavga.Bgi

Ibm8514.Bgi

Драйвер для Cga, Mcga

Драйвер для Ega, Vga

Драйвер для Ibm 8514

Система координат на екрані

Верхній лівий кут графічного екрану визначений як (0,0). Значення Х {колонка} збільшується направо. Значення Y {рядок} збільшується вниз. В режимі 640x480 адаптеру Vga або SVga екранні координати кожного з чотирьох кутів будуть представлені так:

(0, 0)                        (639, 0)

(0, 479)                    (639, 479)

Перетічний вказівник

Багато графічних систем підтримують поняття перетічного вказівника (Cp -Current Pointer ). Cp подібний до курсора в текстовому режимі, але у відміну від нього Cp не видно. У прикладі:

MoveTo (0, 0);

LineTo (20, 20);

команда MoveTo використовується тільки для переміщення Cp. оператор LineTo помістить Cp у точку (20, 20), виводячи при цьому пряму лінію.

Наступні команди переміщують перетічний вказівник: MoveTo, MoveRel, LineTo, LineRel, OutText, InitGraph, SetGraphMode, GraphDefaults, ClearDevice, SetViewPort, ClearViewPort, причому останні 6 команд переміщують Cp у точку ( 0, 0 ).

Текст

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

Коли побiтовий шрифт збільшується, матриця множиться на коефіцієнт масштабування. При великім коефіцієнті масштабування зображення символів стає грубим. Для невеликих символів побiтовий шрифт буде ефективний, в іншому разі знадобиться штриховий шрифт.

Вирівнювання графічного тексту керується процедурою SetTextJustify. Масштабування і вибір шрифту виконується процедурою SetTextStyle. Текстове повідомлення виводиться викликом процедур OutText та OutTextXY. Запит поточних параметрів тексту виконується процедурою GetTextSettings. Розмір штрихового шрифту може бути визначений (змінений) процедурою SetUserCharSize.

Кожний штриховий шрифт зберігається в окремому файлі типу .Chr. Файли шрифтів можуть бути завантажені з диску автоматично модулем Graph під час виконання програми, або включені в програму користувача.

Програма BinObj.exe забезпечує перетворення файлу шрифтів у файл .obj, що може бути включений в модуль чи програму. Це дозволяє мати файли шрифтів, умонтовані в .exe файл.

Фігури і стилі

Існує достатньо велике число програм для малювання і заповнення фігур, включаючи точки, лінії, кола, дуги, еліпси, прямокутники, багатокутники, смуги, 3-х вимірні смуги та сектори. Процедура SetLineStyle дозволяє керувати товщиною і типом ліній. Використання SetFillStyle і SetFillPattern, FillPoly і FloodPoly дозволяє керувати стилем заповнення фігур.

Вікна і бітові образи

Процедура SetViewPort змушує всі команди виводу працювати у прямокутній області екрану.

Весь графічний вивід залежить від визначення вікна (його координат), доки вікно не буде змінено. Інші програми забезпечують очищення вікна і читання поточного визначення вікна. Якщо перетин активний, весь графічний вивід перетинається по межах поточного вікна. Процедури GetPixel і PutPixel забезпечують обробку пікселів. GetImage і PutImage можуть бути використані для збереження і виводу на екран прямокутної області екрану. Вони забезпечують повний набір бiтових операцій (копіювання, xor, or, and, not).

Обробка помилок

Внутрішні помилки, що виникли під час роботи з процедурами (функціями) бібліотеки Graph обробляються функцією GraphResult, що повертає код помилки останньої графічної операції. Коди помилок визначені в таблиці 1.

Наступні програми встановлюють код GraphResult: Bar; ImageSize; SetFillPattern; Bar3d; InitGraph; SetFillStyle; ClearViewPort; InstallUserDriver; SetGraphBufSize; CloseGraph; InstallUserFont; SetGraphMode; DetectGraph; PieSlice; SetLineStyle; DrawPoly; RegisterBgiDriver; SetPalette; FillPoly; RegisterBgiFont; SetTextJustify; FloodFill; SetAllPalette; SetTextStyle; GetGraphMode.

Примітка: після виклика GraphResult стає рівним нулю. Отже, необхідно запам'ятати значення GraphResult в тимчасовій змінній, а після цього перевірити це значення.

Константи

Константи драйверів і режимів для InitGraph, DetectGraph, GetModeRange:

Константа

Значення

Detect

0

Cga

1

Mcga

2

Ega

3

Ega64

4

Egamono

5

Ibm8514

6

Vga

9

CurrentDriver

128

Константи режимів:

Константа

Значення

Параметри

Cgac0

0

320x200 палiтра 0 {LightGreen, LightRed, Yellow; 1 сторінка}

Cgac1

1

320x200 палiтра 1 {LightCyan, LightMagenta, White; 1 сторінка}

Cgac2

2

320x200 палiтра 2 {Green, Red, Brown; 1 сторінка}

Cgac3

3

320x200 палiтра 3 {Cyan, Magenta, LightGray; 1 сторінка}

Cgahi

4

640x200 {1 сторінка}

Mcgac0

0

320x200 палiтра 0 {LightGreen, LightRed, Yellow; 1 сторінка}

Mcgac1

1

320x200 палiтра 1 {LightCyan, LightMagenta, White; 1 сторінка}

Mcgac2

2

320x200 палiтра 2 {Green, Red, Brown; 1 сторінка}

Mcgac3

3

320x200 палiтра 3 {Cyan, Magenta, LightGray; 1 сторінка}

Mcgamed

4

640x200 {1 сторінка}

Mcgahi

5

640x480 {1 сторінка}

Egalo

0

640x200 {16 кольорів 4 сторінки}

Egahi

1

640x350 {16 кольорів 2 сторінки}

Ega64lo

0

640x200 {16 кольорів 1 сторінка}

Ega64hi

1

640x350 {4 кольору 1 сторінка}

Egamonohi

3

640x350 {64k - 1 сторінка; 256k - 2 сторінки}

Vgalo

0

640x200 {16 кольорів 4 сторінки}

Vgamed

1

640x350 {16 кольорів 2 сторінки}

Vgahi

2

640x480 {16 кольорів 1 сторінка}

Ibm8514lo

0

640x480 {256 кольорів}

Ibm8514hi

1

1024x768 {256 кольорів}

Таблиця 1. Значення помилок, що повертаються GraphResult

Константа

Значення

Опис

GrOk

0

Немає помилок

GrNoInitGraph

1

Не iніціалiзована графіка

GrNotDetected

2

Графічний пристрій не виявлено

GrFileNotFound

3

Файл драйверу не знайдений

GrInvalidDriver

4

Помилковий файл драйвера

GrNoLoadMem

5

Бракує пам'яті для завантаження драйверу

GrNoScanMem

6

Вихід за межі пам'яті при заповненні (ScanFill)

GrNoFloodMem

7

Вихід за межі пам'яті при заповненні (FloodFill)

GrFontNotFound

8

Файл шрифту не знайдений

GrNoFontMem

9

Бракує пам'яті для завантаження шрифту

GrInvalidMode

10

Помилковий графічний режим для цього драйверу

GrError

11

Графічна помилка

GrIOError

12

Помилка графічного в/в

GrInvalidFont

13

Помилковий файл шрифту

GrInvalidFontNum

14

Помилковий номер шрифту

Константи для SetPalette і SetAllPalette:

Константа

Значення

Black

0

Blue

1

Green

2

Cyan

3

Red

4

Magenta

5

Brown

6

LightGray

7

DarkGray

8

LightBlue

9

LightGreen

10

LightCyan

11

LightRed

12

LightMagenta

13

Yellow

14

White

15

Константи типів ліній для GetLineSettings і SetLineStyle:

Константа

Значення

SolidLn

0

DottedLn

1

CenterLn

2

DashedLn

3

UserBitLn

4

Примітка:

UserBitLn задає тип лінії, що визначається користувачем.

Константи управління шрифтом для GetTextSettings і SetTextStyle:

Константа

Значення

DefaultFont

0 {8x8 бiтовий шрифт}

TriplexFont

1 {Штрiхові шрифти}

SmallFont

2

SansSerifFont

3

GothicFont

4

HorizDir

0 {зліва направо}

VertDir

1 {знизу нагору}

UserCharSize

0 {розмір символу визначається користувачем}

Константи, що управляють горизонтальним і прямовисним вирівнюванням для SetTextJustify:

Константа

Значення

LeftText

0

CenterText

1

RightText

2

BottomText

0

TopText

2

Константи управління перетином для SetViewPort. При ClipOn графічний вивід буде перерізатися по межах вікна:

Константа

Значення

ClipOn

True

ClipOff

False

Константи смуги

Використовуються із Bar3d, щоб вказати буде чи ні 3-х вимірний шпиль:

Константа

Значення

TopOn

True

TopOff

False

Константи шаблону заповнення

Використовуються GetFillSettings, SetFillStyle. (SetFillPattern використовується для визначення власного стиля заповнення, після нього викликають SetFillStyle (UserFill, SomeColor) і активізують свій шаблон):

Константа

Значення

Зміст

EmptyFill

0

Заповнює кольором фону

SolidFill

1

Заповнює основним кольором

LineFill

2

Заповнення

LtSlashFill

3

Заповнення

SlashFill

4

Заповнення товстими лініями

BkSlashFill

5

Заповнення товстими лініями

LtBkSlashFill

6

Заповнення

HatchFill

7

Рідка штриховка

XhatchFill

8

Щільна штриховка

InterLeaveFill

9

Лінії, що перетинаються

WideDotFill

10

Рідкі точки

CloseDotFill

11

Щільні точки

UserFill

12

Заповнює стилем користувача

Бiтові оператори

Ці бiтові оператори використовуються із PutImage і SetWriteMode:

Константа

Значення

CopyPut

0 {Mov}

XorPut

1 {Xor}

Ці оператори використовуються тільки із PutImage :

Константа

Значення

OrPut

2 {Or}

AndPut

3 {And}

NotPut

4 {Not}

Константа палiтри.

Цю константу використовує GetPalette, GetDefault, SetAllPalette:

Константа

Значення

MaxColors

15

Типи

Цей запис використовується із GetPalette, GetDefaultPalette і SetAllPalette:

Type PaletteType=Record

Size: Byte;

Colors: Array [0.. MaxColors] of ShortInt;

end;

Цей запис використовується із GetLineSettings:

Type LineSettingsType=Record

LineStyle, Pattern, Thickness: Word;

end;

Цей запис використовується із GetTextSettings:

Type TextSettingsType=Record

Font, Direction, CharSize, Horiz, Vert: Word;

end;

Цей запис використовується із GetFillSettings:

Type FillSettingsType=Record

Pattern, Color: Word;

end;

Цей запис використовується із GetFillPattern і SetFillPattern:

Type FillPatternType=Array[1.. 8] of Byte; {стиль, що визначається користувачем}

Цей тип визначений для користувача. Підкреслимо, що обидва поля типу Integer:

Type PointType=Record

X, Y: Integer;

end;

Цей запис використовується із GetViewSettings для одержання даних про поточне вікно:

Type ViewPortType=Record

X1, Y1, X2, Y2: Integer;

Clip: Boolean;

end;

Цей запис використовується із GetArcCoords і може бути використаний для одержання інформації про останній виклик Arc або Ellipse:

Type ArcCoordsType=Record

X, Y, Xstart, Ystart, Xend, Yend: Integer;

end;

Таблиця 2. Процедури модуля Graph

Процедура

Призначення

Arc

Малює дугу від початкового до кінцевого кута, використовуючи (X,Y), як центр

Bar

Малює смугу, використовуючи поточний стиль і колір

Bar3d

Малює 3-х вимірну смугу, використовуючи поточний стиль і колір

Circle

Малює коло, використовуючи (X,Y), як центр

ClearDevice

Очищує екран і встановлює поточний покажчик у точку ( 0, 0 )

ClearViewPort

Очищує вікно

CloseGraph

Закриває графічну систему

DetectGraph

Перевіряє апаратуру, визначає тип графічного драйверу і режим використування

DrawPoly

Малює багатокутник поточним кольором і типом лінії

Ellipse

Малює елiптичну дугу від початкового до кінцевого кута, використовуючи (X,Y), як центр

FillEllipse

Малює заповнений еліпс, використовуючи (X,Y), як центр, а Xradius і Yradius, як горизонтальні та прямовисні напівосі

FillPoly

Заповнює багатокутник, використовуючи сканування

FloodFill

Заповнює обмежену область, використовуючи поточний шаблон і колір заповнення

GetArcCoords

Дозволяє запросити координати команди Arc

GetFillPattern

Повертає шаблон заповнення, встановлений останнім викликом SetFillPattern

GetFillSettings

Дозволяє запросити поточний шаблон і колір, встановлені SetFillStyle або SetFillPattern

GetImage

Зберігає бiтовий образ зазначеної частини екрану в буфері

GetLineSettings

Повертає поточні стиль, шаблон і товщину лінії, встановлені SetLineStyle

GetModeRange

Повертає мінімальний і максимальний графічні режими для наданого драйверу

GetPalette

Повертає поточну палiтру і її розмір

GetTextSettings

Повертає поточний шрифт, напрям, розмір і вирівнювання тексту, встановлені SetTextStyle і SetTextJustify

GetViewSettings

Дозволяє запросити поточні параметри вікна і перетину

GraphDefaults

Встановлює поточний покажчик в початок і перевстановлює графічну систему

InitGraph

Iніціює графічну систему і встановлює пристрій в графічний режим

Line

Малює пряму лінію від (X1,Y1) до (X2,Y2)

LineRel

Малює пряму лінію від поточного покажчика до точки, що лежить на заданій відстані

LineTo

Малює лінію від поточного покажчика до (X,Y)

MoveRel

Пересуває поточний покажчик на задану відстань від його поточної позиції

MoveTo

Пересуває поточний покажчик в (X,Y)

OutText

Виводить текст на екран від поточного покажчика

OutTextXY

Виводить текст на екран від точки (X,Y)

PieSlice

Малює і заповнює сектор, використовуючи (X,Y), як центр, початковий та кінцевий кут

PutImage

Виводить бiтовий образ на екран

PutPixel

Малює точку в (X,Y)

RectAngle

Малює прямокутник, використовуючи поточний колір і тип лінії

RestoreCrtMode

Відбудовує вiдеорежим, що був до iніціювання графіки

SetActivePage

Встановлює активну сторінку для графічного виводу

SetAllPalette

Змінює колір палiтри

SetBkColor

Встановлює колір фону

SetColor

Встановлює основний колір, яким буде здійснюватися малювання

SetFillPattern

Встановлює шаблон заповнення користувача

SetFillStyle

Встановлює шаблон заповнення і колір

SetGraphBufSize

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

SetGraphMode

Перемикає систему в графічний режим і очищує екран

SetLineStyle

Встановлює поточні товщину і стиль лінії

SetPalette

Змінює один колір палiтри, зазначений через ColorNum і Color

SetRgbPallete

Дозволяє модифікувати палiтру для Ibm 8514 і Vga

SetTextJustify

Встановлює вирівнювання тексту, використовуване OutText і OutTextXY

SetTextStyle

Встановлює поточний шрифт, стиль і розмір тексту

SetUserCharSize

Дозволяє змінити ширину і висоту символу для штрихового шрифту

SetViewPort

Встановлює поточне вікно для графічного виводу

SetVisualPage

Встановлює номер видимої графічної сторінки

SetWriteMode

Встановлює режим виводу (копіювання чи Xor) для ліній, що малюються із DrawPoly, Line, LineRel, LineTo, RectAngle

Таблиця 3. Функції модуля Graph

Функція

Призначення

GetBkColor

Повертає поточний фоновий колір

GetColor

Повертає поточний колір

GetDefaultPalette

Повертає апаратну палiтру в запису PaletteType

GetDriverName

Повертає рядок з ім'ям поточного драйверу

GetGraphMode

Повертає поточний графічний режим

GetMaxColor

Повертає максимальний колір, що можна задати в SetColor

GetMaxMode

Повертає номер максимального режиму поточного завантаженого драйверу

GetMaxX

Повертає максимальний можливий Х для поточного графічного драйверу і режиму

GetMaxY

Повертає максимальний можливий Y для поточного графічного драйверу і режиму

GetModeName

Повертає рядок з ім'ям зазначеного графічного режiму

GetPaletteSize

Повертає розмір таблиці палiтри

GetPixel

Повертає колір точки в (X,Y)

GetX

Повертає координату X поточної позиції

GetY

Повертає координату Y поточної позиції

GraphErrorMsg

Повертає рядок повідомлення про помилку для значення ErrorCode

GraphResult

Повертає код помилки останньої графічної операції

ImageSize

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

InstallUserDriver

Встановлює драйвер користувача для пристрою в Bgi таблицю драйверів прістроїв

InstallUserFont

Встановлює новий шрифт, що не убудований в Bgi систему

RegisterBgiDriver

Реєструє драйвер Bgi для графічної системи

RegisterBgiFont

Реєструє шрифт для графічної системи

TextHeight

Повертає висоту рядка в пікселах

TextWidth

Повертає ширину рядка в пікселах


Глосарій

Поняття

Пояснення

Буфер кадрів (frame buffer)

Спеціально виділена область пам'яті комп'ютера, у котрій ціле зображення або кадр зберігається у вигляді, готовому для виводу на екран.

Векторна графіка (vector graphics)

Розділ комп'ютерної графіки, що передбачає побудову зображення з окремих прямолінійних відрізків, а не з напівтонів.

Векторний шрифт (vector font)

Шрифт, у якому кожен символ заданий як набір прямолінійних відрізків; векторні шрифти легко масштабуються, повертаються.

Відеопамять (bit map)

Область пам'яті, автоматично відображувана на екран.

Візуалізація (visualization)

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

Воксел (voxel)

Об'ємний піксел, елемент масиву паралелепіпедів рівного об'єму, що задають рівномірну розбивку 3D простору.

Відтворення (rendering)

Створення зображення по тому або іншому представленню об'єкта.

Відтворення об'єкта за допомогою поверхні (surface rendering)

Метод представлення зовнішнього вигляду тривимірного об'єкта, але без його внутрішньої будівлі.

Конструктивна геометрія (Constructive Solid Geometry, CSG)

Представлення складних тривимірних об'єктів шляхом комбінування простих тел. Над тілами робляться операції об'єднання, перетинання і вирахування.

Курсор миші (mouse cursor)

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

Ефект сходів (aliasing)

Східчастий характер (зазубреність) ліній, що виникають при зображенні об'єктів на растровому дисплеї.

Масштабування (scalling, zoom)

Збільшення або зменшення об'єкта на екрані.

Метаморфоза (metamorphosis)

Поступове перетворення одного об'єкта в інший шляхом зміни параметрів (колір, орієнтація, розмір, прозорість).

Моделювання поверхонь (surface modeling)

Покриття дротового каркаса багатокутниками і латками для утворення суцільної поверхні.

Мозаїчне представлення зображення (tesselation)

Розбивка гладких поверхонь на багатокутники, з'єднані в мозаїчній структурі.

Об'ємна візуалізація (volume visualization)

Представлення даних у виді тривимірного об'єкта з поверхневими і внутрішніми елементами.

Об'ємне моделювання (solid modeling)

Створення тривимірного представлення об'єкта на екрані дисплея з використанням математичних моделей, що описують об'єкти в природному середовищі.

Відсікання (clipping)

Процес відкидання частин зображення, що виходять за границі вікна.

Палітра (palette)

Набір можливих кольорів.

Перспективна проекція (perspective projection)

Відображення тривимірного простору на площину екрана, що враховує перспективу.

Піксел (pixel)

Мінімальний дискретний елемент, що зображується на екрані растрового дисплея.

Піктограма (icon)

Картинка, що позначає об'єкт або операцію.

Полігональна модель (poligon mash)

Представлення об'єкта набором з'єднаних між собою багатокутників.

Побудова проміжних кадрів (tweening)

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

Примітив (primitive)

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

Розкладання в растр

Представлення об'єкта набором крапок (пікселів), що світяться.

Вирішення (resolution)

Кількість пікселів екрана по кожній з координат.

Растр (raster)

Двомірний масив крапок, упорядкованих у рядки і стовпці на екрані електронно-променевої трубки.

Растрове розгорнення (raster scan)

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

Растровий шрифт (raster font)

Шрифт, у якому кожний символ заданий прямокутною матрицею крапок.

Згладжування (antialiasing)

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

Спосіб виводу (write mode)

Спосіб, що визначає, як виведений піксел взаємодіє з пікселом, на місце якого він виводиться, звичайно в якості способу виводу виступає або просте заміщення, або використовується одна з побітовых операцій над бітовими записами кольорів пікселів.

Сплайн (spline)

Крива або поверхня спеціальної конструкції, використовувана для представлення складних гладких кривих або поверхонь.

Сцена (scene)

Термін, використовуваний для позначення сукупності  об'єктів , що зображуються.

Текстура (texture)

Деталізація будівлі поверхні, що складається в нанесенні на гладку поверхню заздалегідь заданого візерунка.

Топологія (topology)

Математичне поняття для опису властивостей геометричних об'єктів (зв’язність, наявність порожнин, отворів і т.д.).

Трансформація зображення (warping)

Перетворення зображення, у результаті якого воно в одних місцях може збільшитися, а в інших зменшитися.

Тріангуляція (triangulation)

Представлення області у виді об'єднання трикутників, що перетинаються тільки по цілих ребрах і вершинам.

Файл зображення (picture file)

Файл комп'ютера, у якому містяться всі дані, необхідні для створення зображення.

Фільмоцикл (film-loop)

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

Елемент зображення (pixel)

Мінімальна область двомірного зображення, що можна відтворити на екрані.

CGA (Color Graphics Adapter)

Кольоровий графічний адаптер.

BGI (Borland Graphics Interface)

Файл, що містить алгоритм організації роботи адаптеру в графічному режимі (розроблений компанією Borland Inc.)

EGA (Enhanced Graphics Adapter)

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

RGB (red, green, blue)

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

VGA (Video Graphics Array)

Графічний відеомассив, підтримує режим 256 кольорів, має аналоговий відеосигнал.


Додаткова література

1.

Алиев В.Э. Обработка графической информации на ПЭВМ. – М.: МФТИ, 1997. – 506 с.

2.

Аммерал Л. Принципы программирования в машинной графике. – М.: Сол Систем, 1992. – 224 с., ил.

3.

Белецкий Я. Турбо Паскаль с графикой для персональных компьютеров. /Пер. с польск. Д. И. Юренкова. – М.: Машиностроение, 1991. – 320 с.

4.

Вальвачев А.Н. Графическое программирование на языке Паскаль: Справ. пособие. – Минск, Выш. шк., 1992. – 143 с.

5.

Корриган Дж. Компьютерная графика: Секреты и решения: Пер. с англ. – М.: Энтроп, 1995. – 352 с.

6.

Котов Ю.В. Как рисует машина. – М.: Наука. Гл. ред. физ.-мат. лит., 1988. – 224 с.

7.

Романов В.Ю. Популярные форматы файлов для хранения графических изображений на IBM PC. – М.: Унитех, 1992. – 156 с., ил.

8.

Фаронов В.В. Турбо Паскаль 7.0. Начальный курс. Учебное пособие. – М.: Нолидж, 1999. – 616 с., ил.

9.

Шикин Е.В., Боресков А.В. Компьютерная графика. Динамика, реалистические  изображения. – М.: ДИАЛОГ– МИФИ, 1995. – 288 с.

10.

Шикин Е.В., Боресков А.В., Зайцев А.А. Начала компьютерной графики. – М.: ДИАЛОГ–МИФИ, 1993. – 138 с.


ЗМІСТ

[1] Передмова

[2]
Загальні теоретичні відомості

[2.1] Області застосування комп'ютерної графіки

[2.2] Способи формування зображень на екрані

[2.3] Формування кольору малюнка

[2.4] Технічні аспекти комп’ютерної графіки

[2.5] Особливості реалізації роботи з графікою у мові Turbo Pascal 7.0

[3]
Математичні основи графічних побудов

[3.1] Аффінні перетворення на площині

[3.2] Аффінні перетворення в просторі

[3.3] Види проектування

[4]
Базові алгоритми комп’ютерної графіки

[4.1] Растрове розгорнення відрізка. Алгоритм Брезенхема

[4.2] Заповнення суцільних областей

[4.3] Заповнення багатокутників

[4.4] Алгоритми заповнення області з затравкою

[4.5] Видалення невидимих ліній і поверхонь

[4.6] Деякі підходи до розв’язування задач загороджування

[4.7] Тріангуляція

[4.7.1]
Графічний практикум

[5] Робота I Зображення двовимірних статичних сцен

[5.1] Методичні вказівки

[5.2] Варіанти завдань

[6] Робота II Графіки функцій у декартових координатах

[6.1] Методичні вказівки

[6.2] Варіанти завдань

[7]
Робота III Графіки функцій у полярних координатах

[7.1] Методичні вказівки

[7.2] Варіанти завдань

[8]
Робота IV Побудова обмежених областей на площині

[8.1] Методичні вказівки

[8.2] Варіанти завдань

[9]
Робота V Анімація двовимірних зображень

[9.1] Методичні вказівки

[9.2] Варіанти завдань

[10]
Робота VI Програмування тривимірних статичних сцен

[10.1] Методичні вказівки

[10.2] Варіанти завдань

[11]
Робота VII Моделювання зображень поверхні

[11.1] Методичні вказівки

[11.2] Варіанти завдань

[12]
Додаток А Приклади програмної реалізації графічних задач

[13]
Додаток Б Графічна бібліотека компілятора Turbo Pascal 7.0

[14]
Глосарій

[15]
Додаткова література




1.  Переход на рельсы мирного развития С окончанием Великой Отечественной войны необходимо было перестроить
2. Основы муниципального управления.html
3. а заработной платы т
4. руб Показатель За отчетный период За ана
5. дороги но чтобы отремонтировать свой организм одного правильного питания не достаточно
6. На моих руках и ногах кандалы и более ничего
7. Польское восстание 1830-1831 гг
8. .3.643.1 Жанр ролевая игра шутер от первого лица Возрастной рейтинг CB M 15 BBFC 15 CERO Z ESRB M OFLC NZ R16 PE
9. Психология и педагогика для студентов лечебного факультета 20122013 учебный год
10. х КЛАССОВ 3 часа Данная программа составлена на ос
11. Концепции развития рынка ценных бумаг.html
12. Тема 15. Чинники які забезпечують фіксацію незнімного зубного протеза
13. Таблица оптимального приема продуктов в пищу
14. . Выберите правильную форму из слов данных в скобках- 1
15. РЕФЕРАТ Курсовая работа 32с
16. тематического цикла
17. ПН ВТ СР ЧТ
18. Тема- Моя семья Цель- показать значение семьи в жизни человека
19. Реферат- Создание информационной системы
20. 00 хбр 14 сентября 2013 года