Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
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 зібрані в окремий модуль - файл з ім'ям 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, багатокутники Вороного яких мають спільне ребро. Отриманий граф із вершинами у вихідних точках називають тріангуляцією Делоне.
Мають місце дві важливих властивості цієї тріангуляції:
Побудова тріангуляції здійснюється індуктивно. Нехай для деякого кроку тріангуляція Делоне вже побудована. На наступному кроці до неї включається нова точка, після чого робиться локальна перебудова тріангуляції. Для кожної нової точки шукається або трикутник, у який вона потрапила, якщо вона належить внутрішній частині опуклої оболонки тріангуляції, побудованої на попередньому кроці, або вершини, із котрими її необхідно з'єднати, якщо точка не належить опуклій оболонці. Потім перевіряється виконання кругового критерію і, при необхідності, робляться фліпи. Як правило, при кожній перебудові буде робитися лише декілька перекидань ребер. Але, можливі ситуації, коли серія фліпів приведе до зміни всієї сітки.
Час роботи наведеного алгоритму пропорційний числу крапок.
Якщо для побудови тріангуляції скористатися областями Вороного, то для кожної крапки необхідно провести серединні перпендикуляри до відрізків, що з'єднують її з всіма іншими вершинами. Отже, час роботи такого алгоритму пропорційний квадрату числа крапок.
Для того щоб знайти трикутник, до якого потрапила чергова крапка New, з'єднаємо її відрізком із попередньою обробленою вершиною Last і подивимося, які ребра і трикутники він перетинає. Якщо трикутник, якому належить чергова крапка, знайдена, то залишається з'єднати її з вершинами цього трикутника і, при необхідності зробити фліпи. Якщо крапка лежить поза опуклою оболонкою, то необхідно з'єднати її з останнім ребром, що перетнув відрізок із вершинами Last і New. А для того щоб зберегти властивість опуклості тріангуляції, потрібно з'єднати ребрами з New усі вершини, що знаходяться між опорними прямими. Для представлення планарного графа можна скористатися, наприклад, реберним списком із подвійними зв'язками (РСПЗ).
Загальне формулювання завдання
Побудувати на екрані компютера зображення двовимірної статичної сцени згідно варіанта завдання. Фон екрану чорний, якщо в завданні не омовлено інше.
Рекомендується спочатку зробити креслення на аркуші паперу, а для перенесення його на екран скористуватися стандартними процедурами роботи з графічними примітивами (точка, відрізок, дуга, коло, прямокутник), кольором зображення та заливкою. Корисним буде ознайомитись з довідковими матеріалами щодо графічних інструментів (їх розміщено наприкінці документу див. Додатки).
Побудувати на екрані наступні зображення (пласкі статичні сцени):
№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. Перелік кольорів починаючи зверху: світло-зелений, жовтий, оранжевий, червоний, фіолетовий, синій.
Загальне формулювання завдання:
Використовуючи графічний режим, намалювати на екрані координатну площину Х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.
Загальне формулювання завдання
Згідно варіанта завдання виконати побудову на екрані ПК полярної площини та графіка функції, що задана в аналітичному виді. Фон екрану синій; полярна вісь, масштабні відмітки та числові позначки повинні мати білий колір, графік функції жовтий. Початкове та кінцеве значення для , значення змінних 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. ;
Загальне формулювання завдання
Згідно варіанта завдання зобразити на екрані ЕОМ двовимірну область, обмежену графіками математичних функцій, вдовольняючи наступним умовам:
Графіки функцій виходять за основну область на 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. .
Загальне формулювання завдання
Скласти програму зображення на екрані ПК динамічної фігури згідно варіанта завдання. Швидкість руху (чи зміни) фігури на екрані задається при старті програми, завершення роботи програми реалізується натисканням клавіші <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. Зобразити п'ятикінцеву зірку, що повільно обертається навкруг свого центру і змінює свій колір.
Загальне формулювання завдання
Побудувати на екрані тривимірну фігуру згідно варіанта завдання.
При формуванні зображень необхідно виконати наступні умови:
Осі координат мають наступну орієнтацію: О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. Зобразити частину простору, обмежену поверхнею та напівпросторами , .
Загальне формулювання завдання
Побудувати на екрані поверхню згідно варіанта завдання.
При формуванні зображень необхідно виконати наступні умови:
Осі координат мають наступну орієнтацію: О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.
Вид зображення на екрані:
Для того, щоб компілювати програму, що використовує модуль 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] [7.1] Методичні вказівки [7.2] Варіанти завдань
[8] [8.1] Методичні вказівки [8.2] Варіанти завдань
[9] [9.1] Методичні вказівки [9.2] Варіанти завдань
[10] [10.1] Методичні вказівки [10.2] Варіанти завдань
[11] [11.1] Методичні вказівки [11.2] Варіанти завдань
[12]
[13]
[14]
[15] |