graph - Камышинский технологический институт

advertisement
1. Введение
В конце XX века изображение стало основным носителем информации. Стремление визуализировать информацию наблюдается практически во всех сферах деятельности человека. Интерес к построению изображений объясняется высокой информативностью последних. Информация в изображении представлена в концентрированной форме, и она более доступна для анализа. Например, если владелец магазина хочет
узнать, какие товары ему необходимо приобрести для получения максимальной прибыли, он может бесплодно потратить немало дней на разбор
бухгалтерских записей. Если же эту информацию представить в виде
диаграмм, решения, прежде скрытые в непроходимых джунглях чисел,
сразу становятся очевидными.
Развитие вычислительной техники позволило не только встать на
новый уровень ведения расчетов, делопроизводства, но и потеснить краски и кисти в художественных мастерских. Интерфейс общения с компьютером, телевизором также изменился - он стал графическим. Удобство
изображения очевидны - они наглядны, хорошо воспринимаются, естественны. Компьютер может показать невидимое, визуализировать данные
приборов, датчиков. Компьютерная графика пробуждает к жизни мертвые
числа.
Зародилась компьютерная графика в 60-х годах, вместе с первыми
графическими программами Айвена Сазерленда. Сегодня компьютерная
графика применяется практически всюду - телевидение, кинематрогаф, в
конструкторском бюро, в лабораториях, в кабинете врача, красильных
мастерских и цехах и т.д. Часто мы просто не задумываемся, что такой
красивый рисунок платья был создан ЭВМ, а реклама на телевидении
тоже плод компьютерной графики.
1.1. Немного истории
Первые компьютеры выводили результаты своей работы в куда менее элегантной форме, чем ткацкий станок. Данные поступали на печатающие устройства, напоминающие телетайпы. Иногда компьютеры
оснащали осциллографами, которые, однако, использовались не для удобства вывода информации, а для проверки электронных цепей машины. Но
это не удержало некоторых программистов от экспериментов. Примерно
в 1950 г. неизвестный оператор в Кембриджском университете (Англия)
вывел на один из осциллографов компьютера “Эдсак” изображение танцующего шотландского горца. Через полтора года английский специалист
3
по информатике Кристофер Стрэчи написал для компьютера “Марк-1”,
созданного в Манчестерском университете, программу, игравшую в шашки на экране.
Но это были лишь отдельные попытки, скорее развлечения программистов. Однако, как-то воскресным вечером в декабре 1951 года
зрители телевизионной программы “Смотри это сейчас” (США) с удивлением услышали слова обозревателя Эдварда Р. Мюрроу: “Мы живем во
времена механических и электронных чудес. Одно из них создано в Массачусетском технологическом институте для военно-морского флота”.
Далее Мюрроу сказал, что речь идет о компьютере “Вихрь”. “Мы все
волнуемся, - продолжал он, - сейчас нам предстоит интервьюировать
новую машину. Итак, в Кембридж, в компьютерную лабораторию МТИ!”
Затем зрители увидели на экранах нечто похожее на слова, составленные
из огней иллюминации: ХЭЛЛО, М-Р МЮРРОУ. Но на самом деле никаких лампочек не было - это светились яркие точки на экране электроннолучевой трубки. Так человечество вступило в новый мир компьютерной
графики.
Инженер Массачусетского технологического института (МТИ)
Джей У. Форрестер, опутанный кабелями микрофона и наушников, продемонстрировал телезрителям некоторые возможности своего замечательного изобретения. Из студии в Нью-Йорке Мюрроу связался с какимто адмиралом из Пентагона, и тот поставил перед машиной одну из задач,
для решения которой она предназначалась. Требовалось рассчитать расход топлива, траекторию полета и скорость ракеты “Викинг”, которая
должна была достичь высоты около 200 км, а затем рухнуть на землю.
Телезрители и слегка ошарашенный Мюрроу увидели, как на экране
“Вихря” появились графики пути, скорости и расхода топлива для типичного полета, составленные из тех же светящихся точек, что и приветствие
в начале передачи. “Я не понял вопроса, - признавался позже Мюрроу, - и
до сих пор не понимаю ответа”.
Более поздним поколениям людей, избалованным видеоигровыми
салонами и сложными специальными эффектами компьютерной графики
в кино и на телевидении, нелегко понять смущение тех первых зрителей и
оценить значение примитивных изображений, созданных “Вихрем”. Тем
не менее, те, кто смотрел передачу Мюрроу в то воскресенье, присутствовал при рождении нового способа общения с компьютером, которое
стало привычным для их детей.
Но в 1950 году все это было еще впереди. Чтобы компьютерная
графика превратилась из многообещающей идеи в широко доступный
4
инструмент, потребовались усилия еще одного талантливого молодого
ученого из МТИ - Айвена Сазерленда.
Спустя лишь десяток лет, ноябрьским утром 1961 года, когда жители Бостона и его окрестностей еще нежились в своих постелях, досматривая сны, Айвен Сазерленд, соискатель докторской степени по электротехнике Массачусетского технологического института и незаурядный
программист, сидел в подвале Линкольновской лаборатории МТИ за
пультом компьютера ТХ-2. Он был поглощен своей диссертационной
работой - созданием программы компьютерной графики под названием
“Блокнот” (Sketchpad). Это название пришло от известной привычки
инженеров сначала делать наброски технической идеи на клочке бумаги,
а затем “доводить ее до ума”, внося бесчисленные поправки. Молодой
ученый не сомневался, что ему удастся превратить компьютер в отличный
инструмент для подобной деятельности.
В то ноябрьское утро левая рука Сазерленда порхала над ящичком,
утыканным рядами кнопок, а в правой он держал световое перо, пришедшее на смену изобретенному десятилетием раньше световому пистолету компьютера “Вихрь”. Сазерленд прикоснулся кончиком светового
пера к центру экрана монитора, где светилось слово “чернила”, отчего
оно превратилось в маленький крестик. Затем, нажав на одну из кнопок,
Сазерленд начал двигать световое перо. На экране возникла ярко-зеленая
линия, тянувшаяся от центра крестика к точке, в которой находилось
перо. И куда бы оно не перемещалось, линия следовала за ним, как резинка, привязанная одним концом к центру крестика, а другим к кончику
пера. Нажав другую кнопку, Сазерленд оставил линию на экране и убрал
световое перо.
Эта линия, по современным понятиям не представляющая собой
ничего особенного, четверть века назад стала символом важнейшего достижения. Одним росчерком светового пера Сазерленд раздвинул пределы взаимодействия человека с компьютером. “Блокнот” обещал превратить компьютер в инструмент, доступный любому. Даже на начальных
стадиях разработки программа позволяла человеку, не имеющему никаких навыков программирования, использовать компьютерную графику
для решения сложных технических проблем. В конечном счете, работа
Сазерленда в МТИ возвестила о решающем переломе в истории компьютерной графики. До появления “Блокнота” весьма примитивные средства
компьютерной графики использовались в основном для военных целей.
После работ Сазерленда компьютерная графика все шире начала применяться как средство проведения инженерных и конструкторских разработок в промышленности, прежде всего автомобильной и космической, а
5
затем и во многих других отраслях. В большой степени благодаря таланту
и дальновидности Сазерленда компьютерная графика вышла из стен лабораторий и военных баз в широкий мир.
И если первые работы были в основном направлены на развитие
векторной графики, т.е. рисование отрезками, то с удешевлением растровых дисплеев (где изображение представляется в виде точек) и памяти,
стали применяться растровые алгоритмы. Во многом развитие этого
направления обязано Брезенхейму, который сначала для векторных, а
затем для растровых дисплеев разработал быстрые алгоритмы рисования
линии и окружности.
В 70-е годы появилось значительное число работ по методам отображения пространственных форм и объектов. Это направление принято
называть трехмерной компьютерной графикой. В 1974 году появилась
идея палитры: для получения цветного изображения выбирается некоторое число цветов из всевозможных, и именно они используются для
изображения. Дело в том, что часто на изображении присутствуют не все
цвета и их оттенки, поэтому можно использовать только те, которые присутствуют. Это понадобилось при анализе изображений со спутника,
когда не хватало памяти и требовалась большая скорость обработки изображений.
Начиная с 1975 года, благодаря работам французского математика
Бенуа Мандельброта, начинает развиваться новая теория - фрактальная
геометрия (от латинского fractio - часть, дробь), что подчеркивает дробную размерность геометрических преобразований. Например, прямая одномерна, плоскость - двумерна, о кривой же, проходящей почти через
все точки плоскости, можно в принципе сказать, что ее размерность
больше единицы, но меньше двух. С помощью этой теории стало возможным получение правдоподобных пейзажей. По словам Мандельброта,
фракталы “позволяют охватить причуды природы - изломы дубовой коры,
растрескавшийся ил в руслах пересохших рек, листья капусты брокколи.
Все это нерегулярные формы, обладающие вместе с тем достаточной
регулярностью, чтобы их можно было описать математически”. Фракталы широко применяются в компьютерной живописи и моделировании
реальных природных изображений.
В начале 80-х компьютерная графика стала все глубже проникать в
повседневную жизнь. Телевизионные компании, стремясь повысить популярность своих программ, используют компьютеры для получения
цветных, быстро меняющихся изображений. Кинематографисты идут еще
дальше, вводя в фильмы специальные эффекты, переносящие зрителей в
такие недоступные места, как глубокий космос или “внутренность” ком6
пьютерной видеоигры, показывая причудливых внеземных существ. А
производители игровых автоматов вовлекли миллионы людей в мир интерактивной графики, от электронного пинг-понга до автогонок. Одновременно графика становилась не только целью, но и средством. Некоторые специалисты поняли, что доступность компьютерной графики, позволяющая игрокам почти интуитивно взаимодействовать со специализированными компьютерами, может помочь новичкам в освоении компьютеров. Психологами так же отмечается воздействие игр на сознание людей. Создавая игры, производители моделируют разные миры, которые
откладываются в голове человека, и возможно, влияют на деятельность и
цели человека (на уровне подсознания) в дальнейшем. В середине 80-х
годов графические средства стали непременной принадлежностью большинства серийных персональных компьютеров, причем особенный упор
делается на графический способ общения с пользователем.
Так же в 80-х годах были созданы системы обработки данных,
представляющие данные в виде изображений. Одно из открытий - компьютерная томография - данные, поступающие от рентгеновского аппарата, сканирующего тело человека поступают на компьютер, и он создает
изображение в виде участков различного цвета. Каждый цвет символизирует определенные области человеческих органов. Создается объемная
картина внутренних органов, которую можно посмотреть с различных
сторон и в разных разрезах. Это дает специалистам более глубоко понять
и проанализировать состояние органов и поставить более точный диагноз. Данное открытие позволяет всесторонне изучить исследуемый объект. Разработка компьютерной томографии отмечена нобелевской премией. Преобразование не графической информации в изображение нашло
широкое применение и в других областях - изображение данных снятых с
электронного микроскопа, изображение излучений не лежащих в видимом спектре. С помощью компьютерной графики можно увидеть невидимое.
В конце восьмидесятых - начале девяностых появилась виртуальная реальность, когда с помощью специальных программ и оборудования
(костюм с датчиками, шлем с экраном, перчатки и др.) моделируется не
только вид окружающего мира, но и ощущение его, что не было бы возможным без мощных программ по компьютерной графике.
7
1.2. Место машинной графики в компьютерной проблематике работы
с изображением
Чтобы разобраться, что представляет собой компьютерная графика
можно рассмотреть все методы работ с изображениями:
 Распознавание образов (например, в системах технического зрения),
цель данной задачи: из заданного изображения получить его кодированное описание;
 Обработка изображений, цель данной задачи: из заданного изображения получить другое изображение;
 Визуализация (иллюстрация) информации, цель данной задачи: из
описания получить реалистичное изображение.
Примеры задач решаемых с помощью методов работы с изображением:
 распознавание образов: сканированное изображение текста в виде
графического файла перевести в текст ASCII кодов, сортировка почты
по почтовому индексу, зрение роботов, анализ товаров по штрих-коду;
 обработка изображений: создать полутоновое изображение по каркасному, изменить яркость и контрастность, изменить цвета, изменить
стиль изображения - придать ему какой-либо художественный вид
(скажем импрессионистский);
 визуализация изображений: преобразовать описание фигур в изображение, сделать изменения формы фигуры, компьютерная анимация и
виртуальная реальность, компьютерная томография, модели объектов
(в том числе человеческого тела), картография.
Проблематику изображений можно представить в виде обобщающей схемы:
Обработка изображений
И зображение
И ллюстрация
изображений
Распознавание
образов
Описание
Рис. 1.2.1. Методы работы с изображением
Машинную графику можно определить как науку о математическом моделировании геометрических форм и облика объектов, а также
методов их визуализации.
8
В данном курсе мы будем рассматривать именно визуализацию
изображений, т.е. по описанию или моделям мы будем строить изображения. Задача визуализации наиболее часто встает при работе с компьютером, и она наиболее проста, по сравнению с задачами распознавания
образов и обработки изображений, хотя одна ее ветвь - создание реалистических изображений не менее сложна, чем обработка изображений.
Нельзя рассматривать машинную графику без понимания ее назначения. Сферы применения машинной графики:
 иллюстрация (визуализация) - графическая интерпретация данных
(диаграммы, графики, карты и т.д.), рекламные ролики;
 обслуживание собственных нужд - создание графических пакетов и
редакторов;
 научные исследования - применение в научных целях (компьютерная
томография).
Еще необходимо отметить два важнейших направления развития
машинной графики:
 придание изображению реалистичности;
 придание изображению динамичности.
Эти направления используют один и тот же ресурс ЭВМ - память и
быстродействие, и поэтому они противоречивы (нам нужно время, чтобы
правильно построить реалистичное изображение, а изображение должно
строиться как можно быстрее, чтобы быть динамичным).
9
2. Геометрические преобразования на плоскости и в пространстве
Геометрия в задачах компьютерной графики играет особую роль.
Геометрические законы, подходы, и идеи являются основой эффективного
использования компьютерной графики. Самые простые геометрические
способы и методики обеспечивают заметное продвижение при решении
одной большой графической задачи. Поскольку изображение на экране
состоит из точек, а линию можно представить бесконечным (в общем
случае) или конечным (на экране) числом точек, то изображение фигуры
будет подчинятся всем геометрическим законам. И чтобы уметь работать
с фигурой, с ее формой и динамикой надо уметь выполнять простейшие
геометрические преобразования.
1.
2.
3.
2.1. Аффинные преобразования на плоскости
Сначала вспомним сведения из курса аналитической геометрии:
Декартовы координаты - это точка, называемая началом координат,
и базисные векторы, называемые осями, исходящими из начала координат. Точка в этой системе задается координатами (их число зависит
от размерности системы, в данном разделе их будет две).
Декартовы прямоугольные координаты - декартовы координаты, у
которых угол между осями (базисными векторами) прямой.
Преобразование декартовых координат. Отвечает на вопрос как
найти пару координат x*, y* в новой системе координат по заданным
x, y в старой системе и по заданному положению (начало новой системы координат и положение осей) (см. рис. 2.1.1.).
Переход от одной координатной
системы к другой на
y*
плоскости описывается следуy
ющими уравнениями:
М(x,y)
x*   x   y   , (2.1.1)
*
О1
x
y*   x   y  
Коэффициенты , , ,  зависят от наклона новых базисных
векторов (О1х*) и (О1y*) по
отношению к (Ох) и (Оy). КоРис. 2.1.1. Преобразование координат
эффициенты ,  зависят от
положения начала координат. (2.1.1) можно выполнить при любых , , ,
, , . Однако, обратное преобразование от x*, y* к x, y можно выполнить
только если базисные вектора (О1х*) и (О1y*) не параллельны.
x
О
10
Условие не параллельности (разрешимости) (2.1.1) по отношению
к (х, у):
  
(2.1.2)
 0
det 
 

Замечание: формулы (2.1.1) можно рассматривать двояко, либо изменяется координатная система, а точка остается на прежнем месте (изменяются ее координаты из x, y в x*, y*), либо изменяется точка и сохраняется координатная система. Тогда формулы (2.1.1) задают отображение
переводящее точку М(х, у) в точку М(x*, y* ), координаты которой определены в той же координатной системе (см. рис. 2.1.1 и 2.1.2).
С точки зрения применения в компьютерной графике это будет соответствовать двум различным ситуациям:
 в первом случае объекты неподвижны, а “наблюда-тель” движется
среди них (как пассажир поезда смотрит на лесополосу и телеграфные
столбы за окном);
 во втором случае “наблюдатель” неподвижен, а мимо него движутся
(как человек смотрит через окно на детей, играющих на площадке).
Важно отметить, что
преобразования (2.1.1) линейны
у
и взаимооднозначны. В даль*
М
нейшем мы будем рассматривать (2.1.1) как правило, соМ
гласно которому в заданной
х
системе координат преобразуО
ются точки плоскости. Также,
для удобства, будем полагать,
что заданная система координат
Рис. 2.1.2. Преобразование координат
является декартовой прямоугольной системой. Из этих
условий можно получить определение аффинного преобразования.
Аффинным преобразованием будем называть линейное, взаимооднозначное отображение функции R в Р, ставящее в соответствие
точки из плоскости R точкам на плоскости Р. Аффинное преобразование
удовлетворяет уравнениям (2.1.1) и (2.1.2).
Пример линейного не аффинного преобразования. Таким примером является проекция трехмерных фигур на плоскость. По каждой трехмерной фигуре возможно построение проекции, но по проекции нельзя
восстановить трехмерную фигуру. Данный пример показывает не взаимооднозначность преобразований.
11
Частные случаи аффинных преобразований, достаточные (доказано математикой) для получения любого аффинного преобразования на
плоскости:
1. Поворот точки на угол  относительно начала координат (см.
рис. 2.1.3).
Задача: по заданным координатам (х, у) и углу  найти (х*, у*), где
 - сценарий, а (х, у) - данные.
Решение: используя свойства прямоугольных треугольников,
найдем необходимые соотношения.
x* = r cos ( = r cos cos - r sinsin = x cos - y sin,
y* = r sin () = r cos sin + r sin cos =x sin + y cos.
Или кратко:
x *  x cos   y sin  ,

 y*  x sin   y cos  .
(2.1.3)
В данной формуле
“сценарий” (угол поворота)
смешан с “данными” - ко* * *
*
ординатами подлежащими
М
(х
,у
)
у
повороту. Такая форма
r
М(х,у)
неудобна, так как не позвоу

r
ляет разделить труд сценариста и поставщика исход
ных данных. Технология
*
х
х
х
работы станет гораздо
Рис. 2.1.3. Поворот вокруг начала координат
удобнее и (что еще важнее)
будет допускать разделение
труда, если удастся отделить сценарий от данных. Для этого используем
матрицу R(:
у
x
*

y *  x
y   R (  ).
данны е
x *
y *   x y 
сц ен ар и й
cos 
 sin 
sin 
.
cos 
Матрица поворота (сценарий) будет иметь вид:
12
R( ) 
cos
 sin 
sin  .
cos
Здесь мы впервые встретились с одним из важных принципов компьютерной графики - принцип отделения сценария преобразования изображения от данных. Именно благодаря его использованию появились
поколения игр, одинаковых по программному обеспечению, но совершенно разных по сценарию (как всем знакомые аркадные игры типа
Doom).
Таким образом, чтобы повернуть точку на заданный угол  относительно начала координат, достаточно умножить ее координаты на матрицу
поворота R() (названа от слова rotation). Она не зависит от данных.
Замечание. Можно реализовать процедуру поворота точки как отдельную универсальную подпрограмму с параметром , причем вычисление вести следует только одной функции и только один раз, а вторую
вычислять используя тригонометрические соотношения (1-sin2x=cos2x).
2. Растяжение (сжатие) вдоль координатных осей (см. рис. 2.1.4).
Задача: по заданным координатам (х, у) и параметрам ,  найти
y
M* (x*,y*)
M (x, y)
х
Рис. 2.1.4. Растяжение координат точки
(х*, у*), где ,  - сценарий, а (х, у) - данные.
Решение:
x* =  x ;  > 0;
y* =  y ;  > 0.
Зависимость изображения от параметров , :
Если >0, а =1 изменится вид по х;
Если =1, а >0 изменится вид по y;
Если <1, и/или <1 - изображение сожмется;
Если >1, и/или >1 - изображение растянется.
13
Сконструируем матрицу растяжения (сжатия) D(,) (названа от
слова dilatation), отделив данные от сценария:
 0
 x * y *   x y  0  .
Матрица растяжения (сжатия) будет иметь вид:
 0  .
D( ,  )  

0  
Снова возможно отделение данных от сценария и создание подпрограммы с формальными параметрами , .
Пример. Необходимо одновременно повернуть и растянуть фигуру.
а) Осуществим поворот: [x* y*]=[x y]  R( - промежуточное положение фигуры;
б) Растяжение результата а): [x** y**]=[x* y*]  D(,).
Общая формула: [x** y**]=[x y]  [R(D(,)], где
[x y] - данные,
[R(D(,)] - сценарий.
Замечание. В данном примере под х и у подразумеваются координаты каждой точки фигуры.
3. Отражение (зеркальное) относительно оси Оx или Оy (см. рис.
2.1.5а и 2.1.5б).
Для рисунка 2.1.5а: х*=x, у*=-у, а для рисунка 2.1.5б: x*=-х, у*=у.
y
y
M (x, y)
M*(x*, y*)
M(x, y)
з
е
р
к
а
л
о
x
з е р к а л о
M* (x*, y*)
Рис. 2.1.5а
х
Рис. 2.1.5б
Задача: по заданным координатам (х, у) и параметру t (ось отражения) найти (х*, у*), где t - сценарий, а (х, у) - данные.
14
Решение: создадим матрицы отражения REF(x) и REF(y) (названы от
слова reflection).

Соответствующие формулы будут иметь вид:
для рисунка 2.1.5а:
1 0
x * y*  x y
;
0 1


 

 
0
для рисунка 2.1.5б:
x *
y*  x y
1 0
.
1
Откуда:
1 0 
  1 0
REF

, REF

.
( x) 0  1
( y )  0 1
Матрицы REF(x) и REF(y) не зависят от данных и могут быть выполнены как подпрограмма с параметром t - ось отражения.
4. Перемещение точки по вектору (,  (см. рис. 2.1.6)
y
M*(x*, y*)


M(x,y)

x

Рис. 2.1.6. Перемещение точки
Задача: по заданным координатам (х, у) и параметрам ,  найти
(х*, у*), где ,  - сценарий, а (х, у) - данные.
Решение.
x* = x+,
y* = y+.
Попытаемся создать матрицу:
[x* y*]=[x y]  T(,) (от transition). Получить двухмерную матрицу не удастся, необходимо ввести дополнительную координату:
15
x *
1
y * 1  x y 1  0
0
1
0 , где
0
1
 
единица в векторе - искусственная третья координата.
Тогда можно записать матрицу в виде:
 1 0 0 .
T ( ,  )   0


1

0

1
Матрица T(,) так же не зависит от данных и возможно создание
подпрограммы с параметрами , .
2.2. Однородные координаты
Все формулы мы записывали в матричном виде - это было необходимо для эффективного использования этих формул в задачах компьютерной графики. Однако, желательно, иметь матрицы одной размерности.
Этого можно достичь, перейдя к описанию произвольной точки плоскости не упорядоченной парой чисел, как это было сделано выше, а упорядоченной тройкой чисел. Этот метод носит название метода однородных
координат. В основе его лежит представление о том, что каждая точка в
N-мерном пространстве может рассматриваться как проекция точки из
(N+1)-мерного пространства. Свойства однородных координат позволяют
выражать с помощью единой матрицы все преобразования: сдвиги, повороты, растяжения, переносы и даже проекции (см. далее). Использование
однородных координат позволяет применять единый математический
аппарат для преобразований.
Пусть М - произвольная точка плоскости с координатами х и у, вычисленными относительно заданной прямолинейной координатной системы. Однородными координатами этой точки называется любая тройка
одновременно неравных нулю чисел х1, х2, х3, связанных с заданными
числами х и у следующими соотношениями:
x1
x2
 x,
 y,
x3
x3
х1 - является масштабным изображением точки х (в масштабе х3),
x2 - масштабным изображением у (в том же масштабе).
Если х3=1, то исходные х и у в однородных координатах не искажаются, т.е. координаты нормализованы. Полезно было бы ввести вместо
единицы масштаб в формулы матриц аффинных преобразований, тогда
была бы возможность “подгонки” под заданный размер экрана или окна.
16
Таким образом, однородными координатами называют масштабное изображение реальных координат и сам масштаб.
Пример. Если у нас имеется точка (0.3 0.1 1.7), а нам необходимы
целые координаты, то х3 разумно выбрать равным 10, т.е. (3 1 17).
Рассмотрим другой случай. Чтобы результаты преобразования не
приводили к арифметическому переполнению, для точки с координатами
(90000 20000 5000) можно взять х3=0.001. В итоге получим (90 20 5).
Эти примеры показывают удобство однородных координат при
расчетах. Однако, основной целью введения однородных координат в
формулы компьютерной графики, является их несомненное удобство в
применении к геометрическим преобразованиям. При помощи троек
однородных координат и матриц третьего порядка можно описать любое
аффинное преобразование на плоскости.
Теперь можно записать окончательные формулы элементарных
аффинных преобразований, в которых данные отделены от сценария:
а) Поворот на угол  относительно начала координат:
cos sin  0
R( )   sin  cos 0 ;
0
0
1
б) Растяжение (сжатие) с параметрами , :
 0 0
D( ,  )  0  0 ;
0 0 0
в) Отражение (относительно оси х и оси у):
1 0 0
1 0 0
REF

0 1 0;
REF( x )  0  1 0
( y)
0 0 1
0 0 1
г) Перемещение с параметрами , :
1
T ( ,  )  0
0
1
0
.
0
1
 
Элементы любой из этих матриц аффинного преобразования не
несут в себя явно выраженного геометрического смысла. Поэтому, как
правило, для реализации какого-то отображения, т.е. нахождения элементов соответствующей матрицы по заданному описанию, используют специальный прием. Он заключается в том, что построение этой матрицы
разбивают на несколько шагов.
17
Рассмотрим примеры аффинных преобразований на плоскости.
Пример 1. Поворот вокруг точки на угол  (см. рис. 2.2.1).
Так как у нас нет матрицы для получения поворота вокруг точки,
то ее мы сконструируем из элементарных матриц. Логично было бы выполнить такие действия: перенос в начало координат; поворот на угол ,
относительно начала координат; перенос в начальное положение. Выполним эти шаги.
1. Перенос точки в начаy
ло координат на вектор (а, b) таким образом совмещаем
центр поворота с точкой:
M(a,b)

[x* y* 1] = [x y 1] T(-а, -b).
вектор возврата
2. Поворот на  относительно начала координат:
[x** y** 1] = [x* y* 1] R()
= = [x y 1] T(-а, -b) R().
x
вектор перемещения
3. Возврат точки в
прежнее положение по вектору
Рис. 2.2.1. Поворот вокруг точки
(a, b):
[x*** y*** 1] = [x** y** 1] T(а, b).
После подстановки из шага 2:
[x*** y*** 1] = [x y 1]  [T(-а, -b)  R()  T(а, b)], где
[x y 1] – данные,
[T(-а, -b)  R()  T(а, b)] – сценарий.
Если мы перемножим матрицы сценария, то получим матрицу:

cos 
sin 
0


 sin 
cos 
0 .

 a cos   b sin   a  a sin   b cos   b 1
Элементы этой матрицы не просто запомнить, в тоже время каждая
из трех перемножаемых матриц по геометрическому описанию соответствующего изображения легко строится. Запомнив четыре преобразования, мы можем легко получить любое необходимое нам отображение.
Пример 2. Выполнить одновременно поворот, перемещение и сжатие точки (см. рис. 2.2.2).
18
М**(х**,у**)
у
М***(х***,у***)
М*(х*,у*)

Шаг 1. Поворот.
[x* y* 1] = [x y 1] R().
Шаг 2. Перемещение.
[x** y** 1] = [x y 1]R()T(а, b).
М(х,у)
b
Шаг 3. Сжатие.
[x*** y*** 1] = [x y 1] R() T(а, b)
D(,).
х
a
Вектор перемещения
Рис. 2.2.2. Аффинные преобразования
2.3. Компьютерный практикум 1. Аффинные преобразования на
плоскости
(реализация идеи отделения данных от сценария)
Соглашения об информационной структуре:
а) задание исходной фигуры будем делать следующей структурой массив номеров вершин: Z* ; массив ребер фигуры: “ребро”; процедура R 2,
ставящая в соответствие номеру вершины ее координаты}.
1
5
4
2
3
1
2
3
4
5
1
1
5
5
2
массив
вершин
начало
4
3
2
3
4
конец
ребра z* (тип
“вершина”)
Рис. 2.3.1. Задание фигур
Процедура R2 {вход: вершина} возвращает {x,y,1} - координаты
соответствующие данной вершине.
б) задание преобразованной фигуры: Процедура RP2 {вход: координаты
вершины} возвращает преобразованные (сценарием) координаты.
Состав процедур (система предписаний комплекса программ).
19
1) Начало работы. Чтение из файла (либо присваивание) номеров вершин,
ребер, координат вершин. Должны образовываться общие переменные:
ntop (число вершин), nrib (число ребер).
2) Рисование фигуры {вход: преобразованные (или не преобразованные матрица преобразования равна единичной) координаты фигур, массив
ребер и системные переменные: ntop, nrib}. Выход: процедура соединяет
точки (с преобразованными координатами) ребрами.
3) Умножение матриц {вход: А( )mxn, В( )nxk (описаны как динамический
массив), m, n, k} возвращает С( ) = А( )*В( ) размером mk.
4) Процедура поворот {вход: угол поворота } возвращает матрицу
R()3х3.
5) Процедура сжатия/растяжения {вход: коэффициенты трансформации
, } возвращает матрицу D(,)3х3.
6) Процедура отражения {вход: ось отражения} возвращает матрицу
REF(x) или REF(y) (размерность 3х3).
7) Процедура перемещения {вход: координаты  вектора переноса}
возвращает матрицу Т(,)3х3.
8) Процедура преобразования {вход: матрица преобразования (или одна
из перечисленных, или их произведение, определенное сценарием), координаты исходной фигуры} возвращает координаты преобразованной фигуры.
Лабораторная работа «Аффинные преобразования на плоскости»
Цель работы: Ознакомиться с принципами аффинных преобразований. Создать программу для реализации алгоритма построения аффинных преобразований на плоскости.
Ключевые понятия, которые необходимо знать: аффинные преобразования, декартова система координат, однородные координаты,
взаимооднозначное отображение, преобразование координат, принцип
отделения данных от сценария.
Задание на проведение лабораторной работы:
1. Изучить свойства аффинных преобразований.
2. Разработать (или усовершенствовать) алгоритм построения аффинных
преобразований на плоскости.
3. Программа демонстрации аффинных преобразований должна считывать из файлов координаты двух или более фигур, состоящих из семи
или более точек. С данными фигурами выполнять все аффинные пре20
образования в мультипликационном сценарии или сценарии с оригинальными математическими формулами.
Текст исполнителя “Аффинные преобразования на плоскости”
приведен в приложении 1.
2.4. Платоновы тела
Платоновы тела - это правильные выпуклые многогранники. Правильными многогранниками (платоновыми телами) называются такие
выпуклые многогранники, все грани которых являются правильными
многоугольниками и все многогранные углы при вершинах равны между
собой.
Существует только пять правильных многогранников (это доказал
Евклид): тетраэдр, гексаэдр (куб), октаэдр, икосаэдр и додекаэдр. Основные геометрические характеристики приведены в следующей таблице.
Название многогранника
Тетраэдр
Гексаэдр
Октаэдр
Додекаэдр
Икосаэдр
Число граней, Г
Таблица 2.4.1. Параметры платоновых тел
Число ребер, Р
Число вершин, В
4
6
8
12
20
6
12
12
30
30
4
8
6
20
12
Легко обнаружить, что в каждом из пяти случаев числа Г, Р, В связаны между собой равенством Эйлера:
Г + В = Р + 2.
Правильные многогранники обладают многими интересными
свойствами и выглядят как идеальные формы. Для полного описания
правильного многогранника, вследствие его выпуклости, достаточно
указать способ отыскания всех его вершин.
Построение первых трех тел (тетраэдр, гексаэдр, октаэдр) особенно
простое. С них мы и начнем.
2.4.1 Построение куба
Куб строится несложно (рис 2.4.1). Достаточно построить два одинаковых квадрата параллельных друг другу на расстоянии равным стороне квадрата и соединить каждую вершину одного с соответствующей
вершиной другого.
21
y
x
z
Рис. 2.4.1. Гексаэдр
y
6
8
3
1
z
Рис. 2.4.2. Тетраэдр
Рис. 2.4.3. Октаэдр
x
2.4.2. Построение тетраэдра
Тетраэдр можно построить на основе куба. Для этого строят куб и соединяют попарно
несмежные вершины базового куба (см. рис.
2.4.2). Это равносильно проведению скрещивающихся диагоналей противоположных граней. Вершинами тетраэдра являются любые
четыре вершины куба, попарно несмежные - их
координаты равны координатам вершин куба.
2.4.3. Построение октаэдра
Октаэдр также можно построить на основе куба (см. рис. 2.4.3). Для этого соединяют
центры граней куба. Они являются также центрами тяжести. Центры являются вершинами
октаэдра. Координаты вершин октаэдра можно
вычислить по координатам куба (каждая координата вершины октаэдра является средним
арифметическим координат четырех вершин
содержащей ее грани куба).
2.4.4. Построение икосаэдра
Икосаэдр можно построить из куба, однако, есть более простой способ.
1. Вообразим цилиндр единичного радиуса, ось
которого совпадает с осью аппликат Z. Рассечем его двумя плоскостями: Z1=0.5 и Z2=-0.5
(см. рис. 2.4.4а).
2. Поделим основания на 10 равных частей
2 (по пять на каждое) и пронумеруем:

10
верхнее основание по нечетным (1, 3, 5, 7, 9), а
нижнее по четным (2, 4, 6, 8, 10) номерам.
22
У нас получилось две окружности
(основания), каждая из которых поделена
на пять равных частей (см. рис 2.4.4б).
Соединим полученные точки отрезками - ребрами последовательно, в
y
соответствии с номерами, в порядке возрастания угла поворота: 
  .
Проведя хорды, на каждой из
x
окружностей, мы в итоге получим пояс из
десяти правильных треугольников (см.
Рис. 2.4.4а. Цилиндр с единичным
рис. 2.4.4в).
радиусом
3. Для завершения построе6
ния
икосаэдра
необходимо достро7
5
ить “шляпки”. На оси OZ выберем
8
4
две точки так, чтобы длины боковых ребер пятиугольных пирамид с
9
3
вершинами в этих точках и основа2
10
ниями, совпадающими с построен1
ными пятиугольниками, были равны длинам сторон пояса треугольРис. 2.4.4б. Расположение вершин
ников. Нетрудно посчитать, что их
аппликаты равны:
6
5.
5 и
8
4
z1 
z2  
2
2
10
2
Их обозначим 11 и 12 вершинами.
4. Построим “нижнюю шляпку“, соединив: 1, 113, 115, 117, 119.
5. Построим “верхнюю шляпку“, соеди7
5
нив: 122, 124, 126, 128, 1210.
9
3
В результате описанных построе1
ний получаем 12 точек. Выпуклый многогранник с вершинами в этих точках
Рис. 2.4.4в. Пояс треугольников
будет иметь 20 граней, каждая из которых
является правильным треугольником, и
все его многогранные углы при вершинах будут равны между собой. Получили икосаэдр (см. рис. 2.4.4д).
z
23
12
8
4
6
10
2
5
7
9
1
11
Рис. 2.4.4д. Икосаэдр
3
2.4.5 Построение додекаэдра
Додекаэдр (см. рис. 2.4.5) можно
построить на основе икосаэдра, аналогично тому, как мы строили октаэдр. Вершины додекаэдра являются центрами тяжести
икосаэдра. Координаты каждой вершины
можно найти как среднее арифметическое
по формулам:
1
(x  x  x 3 ) ,
3 1 2
1
( y  y2  y3 ) ,где
3 1
х1, х2, х3, у1, у2, у3 - координаты вершин
соответствующей грани икосаэдра.
2.5. Аффинные преобразования в
пространстве
Настало время перейти к трехмерному
случаю. Поступая аналогично двумерному
случаю, мы можем построить матрицы - совокупность элементарных преобразований.
Рис. 2.4.5. Додекаэдр
Мы также будем использовать однородные
координаты для представления точки в трехмерном пространстве. Таким образом точка у нас будет представляться
четверкой чисел: (х1, х2, х3, х4), где х4 - масштаб (аналогично х3 для двумерного случая), а х1, х2, х3 - масштабное изображение по осям.
Необходимо отметить, что в трехмерном пространстве существует
две декартовы системы координат: правосторонняя и левосторонняя.
Выбор той или иной системы повлияет на исчисление углов при поворотах.
Правосторонние координаты - это координаты, в которых наблюдатель стоящий на оси OY и смотрящий вдоль оси OX будет иметь ось
OZ справа, а в левосторонних слева (см. рис. 2.5.1).
24
Частные случаи аффинных преобразований в пространстве.
1. Поворот (правосторонняя система).
у
а) Поворот относительно оси OX (при
Левосторонние
повороте изменяются координаты у и z,
не изменяется координата х), на угол 
z
(см. рис. 2.5.2.). Точка М(х, у, z) перейдет в точку М’(x, y’, z’).
x
Правосторонние
z
Рис. 2.5.1. Системы координат
Найдем y’ и z’:
y’= r cos(+) = r cos cos - r sin sin = y cos - z sin;
z’= r sin(+) = r sin cos + r cos sin = z cos + y sin;
или, кратко:
x   x ,

 y   y cos   z sin  ,
z   y sin   z cos  .

z
M’
r
M


y
Рис. 2.5.2. Поворот вокруг оси
ОХ
Сконструируем матрицу поворота
Rх() размерностью 4х4 так, чтобы по исходным (х, у, z, 1) получить (х’, у’, z’, 1):
1
0
x y z 1  x y z 1
0

0
0
cos 
 sin 
0
0
sin 
cos 
0
0
0
.
0

1
Матрица поворота на угол  вокруг оси OX:
0
0
0
1
0 cos  sin  0
.
R ( )  
x
0  sin  cos  0


0
0
1
0
б) Поворот на угол  относительно оси OY (при повороте изменяются
координаты х и z, не изменяется координата у) (см. рис. 2.5.3.). Точка
М(х, у, z) перейдет в точку М’(x’, y, z’). Найдем х’ и z’:
x’= r cos () = r coscos + r sin sin = х cos + z sin;
z’= r sin () = r sin cos - r cossin = z cos - x sin,
25
или, кратко:
 x  x cos  z sin  ,

 y   y,
 z    x sin   z cos .

z
M
r
M’


x
2.5.3. Поворот вокруг оси OY
Сконструируем матрицу поворота
Rу() размерностью 4х4 так, чтобы по исходным (х, у, z, 1) получить (х’, у’, z’, 1):
cos
 0
x y z 1  x y z 1
 sin 

 0
0  sin 
1
0
0 cos
0
0
0
0
.
0

1
Матрица поворота на угол  вокруг оси OY:
cos  0  sin  0
 0
1
0
0
R ( )  
.
y
 sin  0 cos  0


0
0
1
 0
в) Аналогично пункту а) конструируется матрица поворота вокруг оси OZ
на угол  (при повороте изменяются координаты х и у, не изменяется
координата z):
cos  sin  0 0
 sin  cos  0 0
R ( ) 
.
z
0
0
1 0
0
0
0 1
2. Растяжение (сжатие) по осям.
Пусть  - коэффициент растяжения (если >1) или сжатия (если <1) по
оси OX, >0.
Пусть  - коэффициент растяжения (если >1) или сжатия (если <1) по
оси OY, >0.
Пусть  - коэффициент растяжения (если >1) или сжатия (если <1) по
оси OZ, >0.
Сконструируем матрицу растяжения (сжатия) D(,,) такую, чтобы исходные координаты точки (х, у, z, 1) преобразовались в (x, y, z,
1).
26
Формула преобразования имеет вид:

0
0
 x  y  z 1  x y z 1
0
0
Получена матрица растяжения (сжатия):
 0 0 0

D( ,  ,  ) 
0
0
0
0 0
0 0
.
0  0
0 0 1

0 0
,  ,  ,   0.
0  0
0 0 1
3. Отражение.
Матрица отражения относительно координатной плоскости XOY REF(x,y)
(см. рис. 2.5.4). Сконструируем матрицу отражения REF(x,y):
1 0
0
0
0 0  1

0 0 0
[x y -z 1] = [x y z 1] 0 1

z
(x,y,z)
y
зеркало
x
Аналогично можно получить
матрицы отражения относительно плоскости XOZ:
1 0
0 1
REF

( x, z ) 0 0
0 0
(x,y,-z)
Рис. 2.5.4. Отражение относительно
плоскости XOY
0
0 .

0

1
0
0
0
0
0
0
,
0
1
0
0
1
0
0
0
.
0
1
и плоскости YOZ:
REF( y , z )
1
0

0
0
0
1
0
0
4. Перемещение.
Пусть точка перемещается на  вдоль оси OX, на  вдоль оси OY и
на  вдоль оси OZ (таким образом , ,  составляют элементы вектора
переноса).
И пусть старые координаты равны (x, y, z, 1), тогда новые координаты будут равны (x+, y+, z+, 1).
27
Сконструируем матрицу переноса:
1
[x+ y+ z+ 1] = [x y z 1]  0

0


0
1
0
0
0
1
 
0
0 .

0

1
Матрица перемещения имеет вид:
1
0
T ( ,  , ) 
0

0
1
0
0 0
0 0
.
1 0
  1
Пример. Построить матрицу вращения на угол  вокруг прямой L, заданной в параметрической форме (то есть проходящей через заданную точку
А(a, в, с) и имеющий направляющий вектор с нормированными проекциями на оси X, Y, Z: l, m, n) (см. рис. 2.5.5).
Запишем условие нормировки:
l2 + n2 + m2 = 1 (вектор единичной
z
L длины).
Задача сводится к последоваA(a,b,c)
тельности элементарных аффинных
преобразований:
n
1) Перенос точки А в начало коордиy
m
нат.
l
2) Поворот так, чтобы прямая напраx
вилась по одной из осей (например по
оси OZ). Это достигается двумя поворотами:
Рис. 2.5.5. Поворот вокруг прямой
а) поворот вокруг оси OХ,
б) поворот вокруг оси OY.
Две операции 1 и 2 являются вспомогательными, которые не несут в себе
выполнения задания, а выполняют лишь подготовительные операции.
Рабочая операция:
3) Поворот вокруг OZ на заданный угол  (цель задачи).
Далее идут операции обратные 1 и 2, чтобы вернуть точку в первоначальное положение (уже с поворотом):
а) поворот вокруг оси OY,
б) поворот вокруг оси OХ,
в) возврат точки А «на место».
28
Выполним все эти шаги.
Шаг 1. Перенос в начало координат точки А задается матрицей:
1
0
T (a,b,c) 
0
a
0
0
1
0
0
1
b c
0
0
.
0
1
Шаг 2. Конструирование двух поворотов (сводится к задаче
нахождения углов, на которые нужно повернуть). Договоримся (это не
обязательно), что первый поворот вокруг оси OХ, а второй поворот вокруг оси OY.
Цель поворотов: добиться чтобы исходные координаты и направление вектора прямой [l, m, n] cтали [0, 0, 1, 1] (то есть прямая будет
направлена по оси OZ).
Конструировать будем относительно конца (то есть результат известен):
cos  0  sin  0
0
1
0
0
l  m  n  1
 0 0 1 1, где
sin  0 cos 
0
0
0
0
1
l’, m’, n’ - неизвестные пока координаты после первого поворота, а в правой части равенства находится желаемый результат.
После умножения получится:
[l’cos + n’sin m’ -l’sin + n’cos 1],
приравниваем к желательному результату [0 0 1 1], получаем условия
на  , m’, l’, n’:
a) m’= 0;
б) l’cos + n’sin = 0;
в) -l’sin + n’cos = 1.
Это условия на первый поворот. Легко из последних двух уравнений найти решение, используя sin2+cos2=1:
l’= -sin , n’= cos,
соответственно, должно быть l’ 1, n’ 1. Проверка: l’n’ - n’l’=0 - верно.
Первый поворот (вокруг оси OХ):
1
0
0
0
0 cos 
sin  0
l  0 n  1  l m n 1
.
0  sin  cos  0
0
0
0
1
29
В левой части “вход” во второй поворот (результат первого поворота), первый множитель в правой части - исходное положение прямой,
перенесенной в начало координат. После умножения доопределим , n’,
l’.
[l m cos - n sin m sin + n cos 1] = [l’ 0 n’ 1].
Поэлементное приравнивание дает следующие условия:
l’ = l;
m cos - n sin  = 0;
m sin + n cos  = n’.
Отсюда получаем:
m mn mn
2
2
2
n
cos  , ; sin   , ; ,  ,  0 ; m + n = n’ .
n
n
n
n
Шаг 2 сконструирован:
 первый поворот (вокруг оси OХ) с параметром  (см. рис. 2.5.6):
n
m
.
cos  
; sin  
2
2
2
z
n  m2
n m
 второй поворот (вокруг оси OY) с параметром :
n
sin
= -l, sin2 + cos2 = l2 + m2 + n2,

y
cos   m2  n2 .
m
Рис. 2.5.6. Первый поворот
Шаг 3. Рабочий поворот вокруг оси
OZ на заданный (в исходных данных) угол
:
cos
 sin 
R ( ) 
z
0
0
sin 
cos
0
0
0
0
1
0
0
0
.
0
1
Шаг 4. Отмена вспомогательных преобразований (порядок отмены
существенен, так как матрицы не перестановочны).
а) поворот на угол - вокруг оси OY (с использованием свойств
четности и нечетности функций синуса и косинуса):
cos 0 sin  0
0
1
0
0
R ( ) 
.
y
 sin  0 cos 0
0
0
0
1
30
б) поворот на угол - вокруг оси OХ (с использованием свойств
четности и нечетности функций синуса и косинуса):
1
0
0 cos 
R ( ) 
x
0 sin 
0
0
0
 sin 
cos 
0
0
0
.
0
1
в) перенос прямой по вектору А(a, b, с):
1 0 0 0
0 1 0 0
.
0 0 1 0
a b c 1
В итоге всех шагов получили сценарий решения задачи:
SCEN = T(-а,-b,-с)  Rx()  Ry()  Rz ()  Ry (-)  Rx (-)  T(а,b,с).
Координаты точки находятся по следующей формуле:
[x’ y’ z’ 1] = [x y z 1] SCEN, где
[x y z 1] – данные,
SCEN – сценарий.
Для того, чтобы убедиться в пользе матричных операций и однородных координат, запишем матрицу, которая получилась бы из геометрических соображений:
 l 2  cos (1  l 2 )
l (1  cos )m  n sin  l (1  cos )n  m sin  


m 2  cos (1  m 2 )
m(1  cos )n  l sin  .
l (1  cos )m  n sin 
l (1  cos )n  m sin  m(1  cos )n  l sin 
n 2  cos (1  n 2 ) 

T ( a , b, c ) 
2.6. Построение проекций трехмерных объектов на плоскости
Мы изучили аффинные преобразования на плоскости и в пространстве. И если координаты точек фигуры после аффинных преобразований на плоскости не требуют никаких преобразований для отображения
на экране дисплея, то для того чтобы отобразить результат аффинных
преобразований в пространстве требуется еще некоторые действия. Изображение на экране дисплея представлено в виде плоского рисунка (даже
трехмерное), поэтому при построении изображений применяется еще
одна операция - проецирование. Для дальнейших рассуждений нам понадобятся следующие определения:
Сцена - двухмерное изображение трехмерного объекта.
31
Картинная плоскость – плоскость, на которой изображается сцена.
Проецирование (проектирование) - отображение объекта на картинной плоскости.
Нами будет применяться проецирование трехмерных объектов на двумерную плоскость. Для выполнения проецирования надо:
 задаться понятием «пучок прямых»;
 через каждую точку объекта, который изображаем, провести прямую
из пучка (пункт а);
 найти совокупность пересечений этих прямых с картинной плоскостью.
В результате этих действий получится проекция. Существует несколько видов проектирования.
Два примера “пучка прямых” (проецирующих прямых):
картинная
плоскость
картинная
плоскость
Так получают параллельные
проекции
Так получают центральные
проекции
Рис. 2.6.1. Параллельные проекции
Рис. 2.6.2. Центральные проекции
У параллельных проекций центр проектирования лежит далеко в
бесконечности, а у центральных проекций в какой-то конкретной точки центра пучка.
a’
картинная
плоскость
a’
b’
c’
а
картинная
плоскость
b’
c’
а
b
b
c
c
Рис. 2.6.4. Точка схода в центральных
проекциях
Рис. 2.6.3. Точка схода в параллельных
проекциях
32
2.6.1. Классификация типовых проекций
Поскольку у нас трехмерное пространство, то для центральных
проекций имеется три частных случая (лучи проецирования в этих проекциях сходятся в точку).
Центральные
проекции
Одноточечная
проекция
Двухточечная
проекция
Трехточечная
проекция
Рис. 2.6.5. Центральные проекции
Параллельные
проекции
Прямоугольная
(ортографическая)
проекция
Аксонометрические
проекции
Триметрическая
проекция
Косоугольные
проекции
Свободная
проекция
Кабинетная
проекция
Диметрическая
проекция
Изометрическая
проекция
Рис. 2.6.6. Параллельные проекции
2.6.2. Построение ортографических проекций
Ортографические проекции - это проекции на координатные плоскости, линии проецирования у которых параллельны оси, перпендикулярной к координатной плоскости, которая выбрана в качестве картинной,
т.е. картинная плоскость совпадает с одной из координатных плоскостей.
33
Пример. Построение проекции на плоскость ХOY вдоль оси OZ
(см. рис. 2.6.7).
Сформируем “заказ” на матрицу проецирования P(z=0), если старые координаты (x
у
y z 1):
[x y z 1] P(z=0) = [x y 0 1], где
х и у остаются без изменения.
х
1 0 0 0
x
y z 1
z
Рис. 2.6.7. Проекция вдоль оси
OZ
0 1 0 0
 x y 0 1.
0 0 0 0
0 0 0 1
Матрица проектирования на плоскость ХОУ:
1
0
P

( z 0) 0
0
0
1
0
0
0
0
0
0
0
0
.
0
1
Матрица P(z=0) особенная: ее определитель det(P(z=0)) равен нулю матрица вырождена. Это отражает тот факт, что по проекции нельзя
построить исходное изображение (не хватит данных):
(проекция) = (исходное изображение) P(z=0),
нельзя: (проекция)  [P(z=0)]-1 = (исходное изображение).
Обратной матрицы [P(z=0)]-1 не существует, так как определитель
равен нулю.
Проекция на плоскость, параллельную XOY.
Отличается тем, что необходимо выполнить сдвиг (матрица
элементарного аффиного преобразования) (см. рис. 2.6.8):
1
0
P
P
T

( z  p)
( z 0) (0 0 p) 0
0
0
1
0
0
0
0
0
0
0
0

0
1
1
0
0
0
0
1
0
0
0
0
1
p
0 1 0
0 0 1

0 0 0
1 0 0
0
0
0
p
0
0
.
0
1
По аналогии, можно вывести матрицы ортографических проекций
на плоскости параллельные другим координатным плоскостям.
0 0 0 0
1 0 0 0
P( x  r ) 
0 1 0 0
;
0 0 1 0
r 0 0 1
P( y  q ) 
34
0 0 0 0
.
0 0 1 0
0 q 0 1
у
При х=0 получаем плоскость
УОZ, а при у=0 получаем плоскость
ХОZ.
р
х
2.6.3. Построение аксонометрических проекций
Аксонометрической
проекцией
z
называют проекцию на картинную
плоскость, расположенную под углом
Рис. 2.6.8. Проекция на плоскость пак координатным плоскостям. Разлираллельную XOY
чают три вида проекций: триметрия нормаль картинной плоскости образует разные углы с координатными осями; диметрия - нормаль картинной
плоскости образует два взаимосвязанных угла с координатными ортами
(длины двух ортов равны); изометрия - нормаль картинной плоскости
образует строго определенные углы со всеми координатными ортами
(длины всех трех ортов равны).
Для начала запишем уравнение плоскости (см. рис. 2.6.9):
<N, r-ro>=0 - скалярное произведение.
y
Не ограничивая общности, будем полагать, что
картинная плоскость содерN
жит начало координат (если
это не так, то можно исполь(xo,yo,zo)
зовать матрицу перемещеro
r-ro
ния).
r (x,y,z)
N - нормаль к плоскоx
сти, углы между нормалью N
z
и осями OX, OY, OZ (, , )
- углы между нормалью и
Рис. 2.6.9. Картинная плоскость в аксонометриче- положительными направлеских проекциях
ниями осей (см. рис. 2.6.10).
Углы между картинной плоскостью и осями (,, )равносильны дополнению , ,  до прямого
угла (так как нормаль к поверхности перпендикулярна):
2

     , если   

2


     , если   
2
2
35
Для углов ,  - аналогично.
y
Техника построения проекций:
1. Выбрать положение картинной плос
кости, то есть задаться нормалью к ней:
N ={l, m, n}; l2 + m2 + n2 = 1
x

(условие нормировки).

(отсюда, с ее бесконечно удаленной
z
вершины смотрит наблюдатель).
2. (см. пример поворота вокруг линии
на заданный угол). Двумя поворотами
Рис. 2.6.10. Углы между нормалью
(на угол  вокруг оси OX и затем на
угол  вокруг оси OY) совместим
нормаль N с осью OZ. ( и  находятся однозначно по l, m, n).
3. Спроецируем фигуру вдоль оси OZ.
N
Реализация:
Пусть нормаль N(l, m, n) - выбрана.
 (см. пример). Найдем:
cos  
n
n m
2
2
m
; sin  
n m
2
2
; tg 
m
.
n
Матрица поворота вокруг оси OХ на угол :
1
0
0 cos 
R ( ) 
x
0  sin 
0
0
0
sin 
cos 
0
0
0
.
0
1
 (см. пример). Найдем:
cos  n 2  m 2 ; sin   l; tg 
l
n  m2
2
.
Матрица поворота вокруг оси OY на угол :
cos
0
R ( ) 
y
sin 
0
0  sin 
1
0
0 cos
0
0
0
0
.
0
1
 В результате поворотов с помощью матриц Rx(), Ry() нормаль N
совместится с осью OZ (см. пример). Спроецируем на плоскость
(Z=0) матрицей P(z=o):
36
1
0
P

( z 0) 0
0
0
1
0
0
0
0
0
0
0
0
.
0
1
Итак, мы получили сценарий построения аксонометрической проекции на картинную плоскость, заданную пользователем нормалью
N(l,m,n):
SCEN=Rx ()  Ry ()  P(z=o),
(2.6.1)
tg 
m
; tg 
n
l
n  m2
2
.
Для того чтобы разобраться, что мы увидим на экране, рассмотрим,
как изобразятся оси OX, OY, OZ. Для этого выполним вычисления в
(2.6.1). Получим:
cos
0
sin  sin  cos 
SCEN 
sin  cos   sin 
0
0
0
0
0
0
0
0
.
0
1
1. Вид орта Оrtx:
[1 0 0 1]  SCEN = [cos 0 0 1].
В левой части стоят старые координаты, а в правой новые. Правая часть
показывает, что вид (длина и направление) оси OX зависит от угла .
2. Вид ортов Оrty и Оrtz:
Оrt’y = [sin sin cos 0 1];
Оrt’z = [sin cos -sin 0 1].
Частные случаи аксонометрической проекции.
1. Диметрия: орты Оrtx, Оrty искажаются одинаково, то есть:
(длина Оrtx)=(длина Оrtу).
Это требование накладывает условие на выбор  (если выбран ),
или наоборот, то есть ограничивает свободу в расположении картинной
плоскости.
(длина Оrt’x)2 = cos2;
(длина Оrt’y)2 = sin2 sin2 + cos2.
Из этих уравнений можно найти взаимосвязь между  и :
cos2 = sin2 sin2 + cos2;
(1 - sin2) = sin2 (1 - cos2) + cos2;
sin2 = tg2.
37
2. Изометрия: все оси искажаются одинаково, то есть:
(длина Оrtx) = (длина Оrtу) = (длина Оrtz).
Это требование накладывает ограничения на ,  не оставляя права выбора углов. Докажем это:
(длина Оrt’x)2 = cos2;
(длина Оrt’y)2 = sin2 sin2 + cos2;
(длина Оrt’z)2 = sin2 cos2 + sin2.
Из этих уравнений вытекает следующее:
 из первого и второго:
sin2 sin2 + cos2 = cos2;
1 - sin2 = sin2 - sin2 cos2 + cos2;
sin2 = sin2 cos2.
 из первого и третьего:
sin2 cos2 + sin2 = cos2;
1 - sin2 = sin2 - cos2 cos2 + cos2;
sin2 = cos2 cos2.
Приравнивая последние полученные уравнения получим:
cos2 cos2 = sin2 cos2;
cos2 = sin2.
Есть только одно значение , при котором будет выполняться это равенство - 1 . Подставив это значение в sin2sin2+cos2=cos2, получим:
2
1 2
1
sin     1  sin 2  .
2
2
Отсюда: sin 2   1 .
3
Условие изометрии: наблюдатель должен быть расположен так,
чтобы ось Z совпадала по направлению с нормалью к координатной плоскости после поворотов на углы  и  такие, что:
1 .
1 ;
sin  
sin  
3
2
Итак, в изометрии углы всегда предопределены.
Замечание. Приемы ускорения расчетов при аффинных преобразованиях.
 в матрицах вращения и при построении аксонометрических проекций
функции синуса и косинуса лучше рассчитывать по положению нормали (тогда не требуется тригонометрических функций, что экономит
время при расчетах):
38
cos  
n
; sin  
m
.
n m
n  m2
 знаменатель этих выражений следует вычислять один раз, а затем
использовать это значение.
3. Триметрия: коэффициенты искажения различны по всем трем осям.
Особых условий на построение проекции нет.
2
2
2
2.6.4. Косоугольные проекции
В этих проекция проецирующие прямые подают на картинную
плоскость под углом, отличающимся от прямого.
Рассмотрим два частных случая: оба проецируют изображение на
плоскости XOY, так как проецирующие прямые не перпендикулярны
плоскости XOY, то есть не параллельны оси OZ, то она видна на этой
плоскости.
Проекция орта Оrtz (см. рис. 2.6.10):
[0 0 1 1]  [Px Py 0 1].
Матрица косоугольного проецирования:
1
0
M

кос P
x
0
y
Py
z
x
Px
Рис. 2.6.10. Проекция орта Ortz
0
1
P
y
0
0 0
0 0
.
0 0
0 1
Частный случай 1: свободная проекция. После проецирования (длина
Оrt’z)=1. Исходная длина:
(длина Оrtz) = (длина (0 0 1 1))=1,
после проецирования: Оrt’z = [Px Py 0 1],
R x2  R y2  1 - единичная длина. P  P  1 .
x
y
2
Свободная проекция - это когда
наблюдатель смотрит на объект под углом
45.
Частный случай 2: длина орта Оrt’z после проецирования - в два раза
меньше, чем длина других ортов - это кабинетная проекция.
39
Матрица этой проекции:
M
1
0
каб
 1

cos
2
4
0
0
1
1

cos
2
4
0
0 0
0 0
0 0
.
0 1
2.6.5. Перспективные проекции
В отличие от параллельных проекций (в которых наблюдатель
находится бесконечно далеко и поэтому линии проецирования параллельны), в центральных проекциях линии проецирования есть пучок, исходящий из единого центра.
Частный случай центральных проекций - перспективные проекции на плоскость XOY.
Задача: Найти проекцию как совокупность точек на плоскости
XOY, таких, что они являются точками пересечения этой плоскости с
пучком проецирующих прямых, исходящих из точки на оси OZ (положение точки задано) (см. рис.2.6.11).
а) Найдем эти точки пересечения,
используя уравнение прямой, проy
ходящей через две точки (1) и (2).
2
1
3
(x’,y’,0)
x
C(0,0,с)
z
Рис. 2.6.11. Центральное проецирование
Начало: (x1, y1, z1) в точке С с
координатами (0 0 c). Конец: (x2, y2,
z2) в точке (x, y, z) на фигуре. Уравнение прямой проходящей через эти
точки:
X  x1
Y  y1
Z  z1 ,


x 2  x 1 y2  y1 z 2  z1
(2.6.2)
где X, Y, Z - координаты на прямой.
На плоскости XOY: Z = 0, X = x’, Y = y’ (проекции), тогда (2.6.2)
запишется в виде:
x ,  0 y,  0 0  с .


x 0
y0 zc
40
(2.6.3)
б) Из (2.6.3) найдем закон образования координатных проекций.
c
c
x
c
y
c
x  x 
; y  y 
,

;

;
zc
zc
x zc y zc
1
(2.6.4)
1
; z '  0.
x  x 
; y  y 
z
z
1
1
c
c
Формулы (2.6.4) являются законом формирования перспективной
проекции.
в) Заметим, что (2.6.4) есть масштабное изображение x и y, с одинаковым
масштабом  1  z  . Используя однородные координаты с масштабом

c
z  сконструируем матрицу перспективного проецирования:

1  

c
[x y z 1]  [Persp] = [x y 0 1  z ].
c
Обратим внимание, что в данном случае эффективно используется
однородная координата - масштаб. Правая часть равна [x’ y’ 0 1], если
разделить на масштаб 1  z :
c
1 0 0
0
0 1 0
0
z

x y z 1
1   x y 0 1  .
0 0 0 
c

c
0 0 0
1
Получена матрица перспективного проецирования (на плоскость
XOY):
Persp 
1 0 0
0 1 0
0 0 0
0 0 0
0
0
1.

c
1
Она должна быть обязательно вырожденная, то есть det(Persp)=0.
Часть информации после проецирования обязательно теряется. Разберем,
что получится на экране, если использовать матрицу Persp на простейшем
примере проецирования куба в сравнение с параллельным проецированием (аксонометрия) (см. рис. 2.6.12).
41
Каждая точка ребра имеет
свой масштаб 1  z , так как z -
y
y
c
различно.
x
x
Осталось привести изображение к одному масштабу
(единичному) делением на масштаб:
z
Рис. 2.6.12. Параллельное проецирование
куба


 x

y
x  y  0 1   z
0 1.
z
1 

1


c
c
Из этого видно, что ближайший план по отношению к z будет казаться на рисунке больше, а дальний меньше. После масштабного преобразования мы будем иметь перспективную проекцию (см. рис. 2.6.13).
y
x
Определим, в какой точке сходится
пучок параллельных прямых при перспективном проецировании.
а) Уравнение пучка прямых, параллельных оси OZ, в параметрической
форме:
X = x, Y = y, Z = t,
где t-любое число.
z
Рис. 2.6.13. Перспективная проекция
x
 t
Однородные координаты точки
на такой прямой [x y t 1]. При t 
точка преобразуется (вводится масштаб):
y
1
1  0 0 1 0 .
t
t


В правой части стоят координаты точки схода параллельных прямых.
42
б) Матрица перспективного преобразования (без проекции на XOY):
1 0 0
0 1 0
0
0
PP 
1;
0 0 1 
c
0 0 0 1


 x
x y z 1 
z
1 
 c

y
z
z
1
c
z
1
c

,
1


z t.
После масштабного преобразования, для пучка параллельных прямых: X=x, Y=y, z=t:

 x

1  t
 c
y
1
t
t
c
1
t
c

1 .

t

Таким образом, при t перспективное преобразование параллельных прямых приведет к их сходу в точке схода: (0, 0,  1 ), связанной
c
с положением наблюдателя (0, 0, с). В общем случае - точек схода три: на
осях OX, OY, OZ. Общая матрица имеет вид:
PP 
1
0
0
0
1
0
0
0
1
0
0
0
1
c
x
1

c .
y
1

c
z
1

2.7. Компьютерный практикум 2. Аффинные преобразования в
пространстве. Построение проекций
Аффинные преобразования в пространстве и построение проекций
неразрывно связаны, так как изображение строится на экране компьютера, а он двумерный. Для отображения трехмерных объектов на экране
необходимо их проецировать на плоскость. Поэтому аффинные преобразования в пространстве и построение проекций выполняются в одной
лабораторной работе.
43
Лабораторная работа «Аффинные преобразования в
пространстве»
Цель работы: Ознакомиться с принципами аффинных преобразований в пространстве. Сравнить с аффинными преобразованиями на
плоскости, выяснить их сходство и различие. Создать программу для
реализации алгоритма построения аффинных преобразований в пространстве.
Ключевые понятия, которые необходимо знать: аффинные преобразования, однородные координаты, взаимооднозначное отображение,
преобразование координат, принцип отделения данных от сценария.
Задание на проведение лабораторной работы:
Изучить свойства аффинных преобразований.
Разработать (или усовершенствовать) алгоритм построения аффинных преобразований в пространстве.
3. Аффинные преобразования отображать на совокупности платоновых
тел и одной собственной фигуре, координаты которых считываются
из файлов.
Текст исполнителя “Аффинные преобразования в пространстве”
приведен в приложении.
1.
2.
Лабораторная работа «Построение проекций»
Цель работы: Ознакомиться с принципами параллельного и центрального проецирования, с алгоритмами построения движущихся перспективных изображений. Создать программу для построения перспективных проекций и исследовать зависимость изображения от точки зрения наблюдателя.
Ключевые понятия: пучок проецирующих прямых, точка схода, однородные координаты, центральные и параллельные проекции.
1.
2.
Задание на проведение лабораторной работы:
Изучить свойства перспективной проекции в зависимости от положения наблюдателя на примере простой фигуры.
Разработать программное обеспечение и реализовать параллельные и
центральные проекции для всех платоновых тел и одной собственной
фигуры, координаты которых считываются из файла. Положение точки наблюдения в центральных проекциях должно быть изменяемым.
44
3.
В триметрии и центральных проекциях сделать возможным вращения фигур.
Контрольные вопросы к разделу «Геометрические
преобразования на плоскости и в пространстве»
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. Что такое точка схода?
26. Чем отличаются матрицы проектирования от матриц аффинных преобразований?
27. Какие особенности могут возникать при проектировании?
28. Как осуществить проекцию четырехмерного объекта на трехмерное
пространство и на экран компьютера?
29. Как осуществить перемещение (движение) объекта на экране?
30. Зачем применяются аффинные преобразования в компьютерной графике?
45
31. Как вы думаете, зачем могут понадобиться аффинные преобразования
в четырехмерном измерении?
Задачи к разделу “Геометрические преобразования
на плоскости и в пространстве”
1. Создать матрицу сценария с помощью которой можно перевести двумерную фигуру из первой полуплоскости во вторую развернув ее на
45 вокруг определенной точки:
 квадрат вокруг центра тяжести;
 правильный треугольник вокруг центра описанной окружности;
 звезду вокруг одного из ее концов.
Считать начальное положение левого нижнего угла фигуры (а, b)
относительно начала координат.
2. Спроектировать совокупность аффинных преобразований таких,
что при любой аксонометрической проекции ось OZ на экране будет
направлена вертикально.
3. Создать матрицу сценария вращения на угол  вокруг прямой L
заданной в параметрическом виде (проходящей через точку А(a, b, c) и
имеющей направляющий вектор с нормированными проекциями на оси x,
y, z: l, m, n.
4. Разработать математику аффинных преобразований в четырехмерном пространстве.
5. Разработать математику проекций из четырехмерного пространства (в том числе и на экран компьютера, сначала в трехмерное пространство, а затем на плоскость). Учесть возможность расширения числа возможных проекций (четырех точечная центральная, еще один вид аксонометрической проекции и т.д.)
6. Покажите как можно было бы реализовать аффинные преобразования вращения и отражения через перемещение.
7. Создайте программу метаморфоз платоновых тел друг в друга и
в другие фигуры.
46
3. Растровые алгоритмы
У большинства компьютеров экран дисплея представляет собой
совокупность точек и вывод на экран изображения имеет свои особенности. Существуют определенные алгоритмы, которые позволяют использовать это свойство (“точечность” дисплея), что значительно ускоряет вывод на экран изображения.
3.1. Понятие растра и растрового алгоритма
Растр – это совокупность точек, заданных на плоской прямоугольной решетке. В технике – это совокупность точек дисплея (пикселей), заданных параметрами: {x, y, value}, где (x, y) – плоские координаты
пикселя, а value – атрибут, засылаемый в пиксель с координатами (х, у)
(он несет в себе цвет пикселя).
Графические примитивы – это совокупность программ, реализующих построение изображения простейших графических элементов (линии, окружность и др.), а также операции с изображением на экране. В
современных пакетах их реализуют встроенные процедуры типа line,
circle и т.п.
Растровый алгоритм – это такой алгоритм, который учитывает
свойства растра (его принципиальную “точечность”) для изменения работы программ, реализующих графические примитивы.
Схема рассуждений при построении изображения.
Идея растровых алгоритмов – отсечь непрерывные преобразования, работать в дискретном пространстве (см. рис. 3.1.1).
Ожидаемый выигрыш (во времени):
 за счет отказа от операций с действительными числами, перехода к
целочисленной арифметике;
 за счет избежания “медленных” операций (умножения, специальных
функций, округления, деления), для этого используется возможность
пошагового изменения пикселей, что позволяет отказаться от всех
медленных операций.
47
Растр
Задание:
рисунок
Математика
Реализация
на растре
Н епрерывные
переменные
Расчетная
модель
Округление
Рис. 3.1.1. Идея растровых алгоритмов
В растровых алгоритмах остаются только “быстрые” операции:
сложение, вычитание, сдвиг, логика.
3.2. Эволюция построения алгоритма для
изображения графического примитива “отрезок
прямой между двумя точками”
Эволюция построения данного алгоритма иллюстрирует формирование идей растровых алгоритмов.
“Математическая” прямая, (не учитывает
свойства растра).
Пусть заданы {x1, y1} - координаты начала отрезка, {x2, y2} - координаты конца отрезка. По смыслу, координаты дисплея целочисленные.
Пусть {x,y} - текущие координаты отрезка.
Уравнение прямой проходящей через две точки записывается в виде:
y  y1
(3.2.1)
yy  2
 x  x 
1
Обозначим:
m
x 2  x1
1
y 2  y1
; a  y1  mx 1 .
x 2  x1
Тогда вместо (3.2.1) получим:
y = a + mx.
48
(3.2.2)
Свойства модели (для определения типов данных):
 Так как в (3.2.2) входит коэффициент m, у которого числитель и знаменатель целые числа, но сам коэффициент - действительное число, то
все переменные задачи должны быть описаны действительными.
 Необходимые операции с действительными числами: сложение,
умножение, округление (см. 3.2.2).
Реализация алгоритма.
ПРОГРАММА математическая_прямая (x1, y1, x2, y2 - действительные)
. Дано:  координаты начала (x1, y1) и конца (x2, y2) отрезка
. Получить:  изображение отрезка на растре
. Система Предписаний (СП):
. . высветить_пиксель (x, y, value) x, y - координаты, value - атрибут
. . округлить (а)  ближайшее целое к а
. Конец СП
. Типы данных:
. . x, y, m, a - действительные
. . value - целое
. Начало
. . m = (y1 - y2)/(x1 - x2)
. . a = y1 - m x1
. . Цикл  x{x1, ...,x2} Выполнять
. . . высветить_пиксель (округлить(x), округлить(a + mx),
value)
. . Конец Цикла
. Конец
КОНЕЦ математическая_прямая.
Недостатки: низкое быстродействие из-за операций с действительными
переменными (умножений и округлений).
Причина: мы делаем лишние операции расчета y вне растра, а затем их не
изображаем.
Шаг 1 эволюции: избежать умножений за счет перехода к рекуррентным
формулам, то есть на (i+1)-м шаге используется вся информация, уже
полученная на i-ом шаге.
49
“Рекуррентная” прямая, учитывающая некоторые
свойства растра.
Запишем уравнение (3.2.2) по шагам:
на i-м шаге: yi = a + mxi,
на (i+1)-м шаге: yi+1 = a + mxi +1
Вычитая из (i+1)-го шага i-й шаг получим отличие между шагами:
yi+1-yi = a + mxi+1 - a - mxi = mxi+1 - mxi = m(xi+1 - xi).
Используя свойство растра xi+1 - xi = 1 (расстояние между соседними пикселями равно единице – шаг на растре), то получим формулу, не
содержащую умножения:
yi+1 = yi + m.
(3.2.3)
Формула (3.2.3) пригодна для m1, т.е. угол наклона прямой не
больше 45 (tg  1), так как иначе шаг yi+1 будет отличаться от yi больше
чем на один пиксель. И при использовании формулы (3.2.3) прямая будет
«рваной» (будут разрывы в изображении прямой).
Чтобы в прямой не было разрывов при m>1 следует поменять роли
осей (шаг по у - расчет идет по х):
x i 1  x i 
1,
m
(3.2.4)
для m>1 (шагаем по yi).
ПРОГРАММА отрезок_без_умножения (x1, y1, x2, y2 - действительные) 
действительные, так как потребуется вычислить m  y2  y1 ; m1.
x 2  x1
. Дано:  (x1, y1) - координаты начала, (x2, y2) - координаты конца
. Получить:  изображение отрезка
. Система Предписаний (СП):
. . высветить_пиксель (x, y, value)
. . округлить (а)
. Конец СП
. Типы:
. . x, y, dy, dx, m - действительные
. . value - целое  атрибут пикселя
. Начало
. Если x1  x2 То
. . dy = y2 - y1
50
. . dx = x2 - x1
. . m  dy
dx
. . y = y1  стартовая точка (начальная)
. . Цикл x{x1, ... , x2} Выполнять
. . . высветить_пиксель (округлить(x), округлить (y), value)
...y=y+m
. . Конец Цикла
. Иначе
. . Если y1 = y2 То
. . . высветить_пиксель (округлить(x1), округлить(y1), value)
. . Иначе
. . . утверждение: “Ошибка в данных”
. . Конец Если
. Конец Если
. Конец
КОНЕЦ отрезок_без_умножения.
Достижения, по сравнению с математической прямой:
1) Использовано свойство растра: xi+1 - xi = 1, это позволило избежать
умножения m на x.
2) Информация (о параметре а в y = a+mx), имеющаяся на i-м шаге, повторно не обрабатывается (y = y+m) благодаря рекуррентной формуле.
Недостаток:
Не удалось избежать действительных чисел из-за использования
y  y1 .
m 2
x1  x 2
Шаг 2 эволюции: отказ от арифметики с действительными числами.
Алгоритм Брезенхейма для построения отрезка.
Данный алгоритм был разработан Брезенхеймом в 1965 году для
использования в графопостроителях.
1) Пусть найден пиксель Рi-1(xi-1 , yi-1).
2) Пусть угол наклона (не ограничивая общности) не превышает 45.
51
3) Тогда из точки (xi-1, yi-1) может быть
y
переход только к пикселям Si или Ti (см.
рис. 3.2.1):
t
Ti
Si(xi, yi-1), Ti(xi, yi)Ti(xi, yi-1+1).
Диагностика необходимости выPi-1
s
светить Ti или Si производится по разSi x
(x1,y1)
ности:
*
если (s - t)<0, то высветить Si,
*
если (s - t)0, то высветить Ti.
Рис. 3.2.1. Выбор пикселя
Таким образом, выбирается ближайшая точка к исходной прямой (“математической”). Заметим, что достаточно знать только знак разности (s - t), тем самым можно отказаться
от действий с действительными числами.
4) Прямую будем рисовать от ближайшей к началу координат точки отрезка.
Обозначим: dy = y2 - y1; dx = x2 - x1, где х1, у1 - координаты начала,
а х2, у2 - координаты конца отрезка. Причем, если dx и dy меньше нуля, то
их необходимо взять по модулю и переобозначить концы отрезка.
y
dy , так как нуль перенесен в начало отрезка.
x
dx
Найдем s и t из рисунка:
dy
s
x  y i 1 ,
dx i
dy
t  yi 
x ,
dx i
dy
dy
st 
x  y i 1   y i 1  1 
x ,
dx i
dx i
dy
s  t  2  x i 1  1  2 y i 1  1.
dx
Умножим на dx (всегда положительное, так как мы договорились
начинать с ближайшей точки к началу координат, и поэтому не меняющему знак разности):
( s  t )dx  2dyx i 1  2dy  2 y i 1dx  dx .
Знак (s - t)dx совпадает со знаком (s - t), и для диагностики будем
использовать правую часть:
di = 2dy xi-1+2dy - 2yi-1dx - dx.
Если di<0, то выбираем Si, то есть yi = yi-1, если di 0, то выбираем
Тi, то есть yi = yi-1+1.
52
Выводим рекуррентные формулы для исключения общей информации i-го и (i+1)-го шага:
di+1 = 2dy xi - 2dx yi + 2dy - dx.
Инкремент - разность между элементами (значениями) на i-ом и (i+1)-м
шаге в рекуррентных формулах:
incri = di+1 - di  di+1 = di+ incri,
incri = 2dy (xi - xi-1) - 2dx (yi - yi-1).
Благодаря свойствам растра xi - xi-1=1, а разность yi - yi-1 либо равна
единице (когда выбрали Ti), либо нулю (когда выбрали Si). Операцию
умножения dx(yi - yi-1) можно заменить на более быструю:
 если di <0, то incri = incr1i = 2dy (при этом выбираем Si, yi=yi-1),
 если di 0, то incri = incr2i = 2(dy-dх) (при этом выбираем Ti, yi=yi-1+1).
Начальное значение di при i=1:
d1 =21dy - 20dx - dx=2dy-dx.
После преобразований остались только “быстрые” операции:
 сдвиг (умножение на 2 в целых числах);
 сложение, вычитание, в целых числах, без умножения и деления;
 сравнение.
ПРОГРАММА прямая_Брезенхейма (x1, y1, x2, y2, value: целые) | угол
наклона 0    45
. Дано: | координаты (x1, y1) начала, (x2, y2) конца отрезка, value - атрибут
(цвет) пикселя
. Получить: | изображение прямой, арифметика целая, без умножения и
деления
. Система Предписаний (СП):
. . высветить_пиксель (x, y, value: целые)
. Конец СП
. Типы:
. . dx, dy, d, incr1, incr2, xend, yend, x, y, value - целые
. Начало
. dx =ABS(x2-x1) | значение по модулю
. dy =ABS(y2-y1)
. d = 2dy-dx
| начальное значение декремента di
. incr1 =2dy
| при выборе Si
. incr2 =2(dy-dx) | при выборе Ti
. Если x1>x2 То | начать с х ближайшего к началу координат
. . x = x2 | введение относительных координат
. . y = y2
. . Хend=x1 | конец отрезка
53
. Иначе
. . x = x1
. . y = y1
. . Хend=x2 | конец отрезка
. Конец Если
. высветить_пиксель (x1, y1, value) | рисуем первую точку
. Цикл пока х  Хend Выполнять
. . х = х +1
. . Если d<0 То
. . . d = d + incr1
. . Иначе
. . . y = y +1
. . . d = d + incr2
. . Конец Если
. высветить_пиксель (x, y, value)
. Конец Цикла
. Конец
КОНЕЦ прямая_Брезенхейма.
Главной операцией алгоритма является сравнение разности расстояний
(вычисляемых рекуррентно) с нулем, т.е. определение знака.
Замечание. Данный алгоритм приведен в обычном, наиболее понятном виде. Существуют различные версии оптимизированного алгоритма, которые работают быстрее “классической” версии алгоритма.
Типичной оптимизацией является построение линии по отрезкам. Дело в
том, что если разобрать изображение линии на растре, то получится, что
она состоит из повторяющихся двух или одного отрезков (горизонтально
или вертикально расположенных). (см. рис. 3.2.2). Тогда построение
изображения линии сводится к
получению длин отрезков и последовательного циклического их
вывода. Ускорение достигается за
счет сокращения операций сравнения.
Рис. 3.2.2. Вид растровой прямой
54
3.3. Компьютерный практикум 3.
Лабораторная работа по теме “Растровый
алгоритм построения прямой”
Цель работы: Освоение основных идей растрового алгоритма построения графического примитива прямой, сравнение быстродействия растрового и нерастровых алгоритмов.
Ключевые понятия: растр, графические примитивы, прямая Брезенхейма, рекуррентные формулы, инкремент.
Задание на проведение лабораторной работы:
1.
2.
3.
4.
Изучить подробно работу растрового алгоритма построения прямой, сравнить с нерастровыми по быстродействию.
Составить программу для алгоритмов построения растровой прямой (желательно на
языке программирования Ассемблер) по Брезенхейму.
Учесть возможность угла наклона прямой к оси OX больше 45, усовершенствования в
алгоритм внести самостоятельно.
Сравнить скорость построения прямой, реализованной в языке программирования
(Pascal, C, Basic и т.п.), с алгоритмом Брезенхейма и с нерастровыми алгоритмами построения прямой.
3.4. Растровый алгоритм построения
окружности
Изображения могут состоять не только из линий, но и из кривых дуг и окружностей. Используя линии и дуги можно описать практически
любое изображение на плоскости. Поэтому мы рассмотрим растровый
алгоритм построения окружности.
1. Начнем с критики очевидных алгоритмов изображения окружности.
а) Будем полагать, что центр окружности в начале координат. Уравнение
окружности имеет вид:
x 2  y2  R 2;
y   R2  x2.
Для одной четверти окружности x(0, R):
y  R2  x 2  0.
На растре образуются пробелы (см. рис. 3.4.1) при xR, так как:
55
dy
 2x


dx 2 R 2  y 2
y
x
Рис. 3.4.1. Изображение окружности
x
2
R y
,
2
(производная меньше нуля, так как
у убывает). Найдем предел производной, при xR: lim dy  
x R dx
(поэтому на растре, при значениях x
близких к радиусу R, малым dx
соответствуют большие dy). Итак,
из выше сказанного можно отметить следующие недостатки обычного уравнения окружности.
Дефект 1: Большие промежутки по оси y при |x|  R.
Дефект 2: Необходима действительная арифметика – извлечение корня.
б) Уравнение окружности можно построить с помощью тригонометрических функций:
x = k sin,
y = k cos; {0, 2}.
Дефект: Медленная работа из-за вычисления функций синуса и косинуса
в действительных числах.
Все указанные выше дефекты не позволяют использовать данные
способы для построения окружности на экране (медленно, не качественно, не используют свойства растра - не экономия ресурсов).
2. Источник ускорения счета – симметрия (см. рис. 3.4.2).
56
у
8
заданная точка
1
7
2
2
х
6
3
5
Благодаря симметрии достаточно в цикле находить точки только от 0
до x  R (в секторе 45), а остальные
можно находить путем замены знака у
координат на противоположный и
сменой мест координаты абсциссы и
ординаты. Для этого можно создать
вспомогательную программу.
4
Рис. 3.4.2. Симметричные точки
ПРОГРАММА точки_окружности
(x, y, value: целые)
. Дано:  координаты (x, y) одной точки на окружности
. Получить:  изображение еще семи точек, симметричных заданной
. Система Предписаний (СП):
. . высветить_пиксель (x, y, value: целые)
. Конец СП
. Начало
. высветить_пиксель (x, y, value)
точка 1 (см. рис. 3.4.2)
. высветить_пиксель (y, x, value)
точка 2
. высветить_пиксель (y, -x, value)
точка 3
. высветить_пиксель (x, -y, value)
точка 4
. высветить_пиксель (-x, -y, value)
точка 5
. высветить_пиксель (-y, -x, value)
точка 6
. высветить_пиксель (-y, x, value)
точка 7
. высветить_пиксель (-x, y, value)
точка 8
. Конец
КОНЕЦ точки_окружности.
Использование программы позволит:
 избежать неоднозначности (в знаках);
 найти правило остановки цикла, не содержащее 2 , sin(45) (и других медленных функций);
Так как х меняется: x  0, R  , при этом y   R, R  , тогда правило оста 2

2 



новки цикла: x = y.
57
Растровый алгоритм изображения окружности
(Bresenham, 1972 г.)
1) Пусть найден пиксель Рi-1(xi-1, yi-1).
2) Положение “математической” окружности (см. рис. 3.4.3, так как договорились, что будем изображать первые 45).
3) Поэтому точки i и i не могут
быть претендентами на высвечиваi
ние.
4) Претенденты на высвечивание:
1
Pi-1
Si(xi, yi) = Si(xi-1+1, yi-1),
Si
Ti(xi, yi) = Ti(xi-1+1, yi-1-1)
2
5) Дискриминатор для выбора между
Ti 3
точками Si и Ti по близости к “реi
альной” окружности:
5
4
D(Si) = (xi-1+1)2 + y2i-1 - R2 (0),
D(Ti) = (xi-1+1)2 + (yi-1-1)2 - R2 ( 0),
где D(Si) - квадрат расстояния от
Рис. 3.4.3. Выбор пикселя
пикселя Si до истинной окружности,
а D(Ti) - квадрат расстояния от пикселя Ti до истинной окружности.
Будем выбирать точку, у которого расстояние до “математической”
окружности меньше:
di = D(Si)- D(Ti).
Правило выбора: если di<0, то будем выбирать точку Si, так как она
ближе к окружности, если di  0, то будем выбрать точку Ti, так как она
ближе к “ математической ” окружности.
Борьба со сложными (и долгими) операциями.
1. Постараемся избежать операции нахождения абсолютного значения
(иначе нет надежды обойтись целой арифметикой) (см. рис. 3.4.3). Случаи возможного расположения окружности около точек Si и Ti:
 Для 3-го случая (см. рис. 3.4.3): точка Si - вне окружности D(Si)>0,
точка Ti - внутри D(Ti)<0, поэтому:
di =D(Si)-D(Ti) эквивалентно di = D(Si) + D(Ti),
если di  0, то выбираем точку Тi, иначе Si.
 Для случая 1 и 2 (см. рис. 3.4.3): точка Ti - внутри, а точка Si - либо
внутри, либо на окружности, но всегда Si ближе к “идеальной”
окружности:
di = D(Si) + D(Ti).
Для этого случая di<0, следовательно, выбираем точку Si.
58
 Для случая 4 и 5 (см. рис. 3.4.3): точка S i - вне окружности D(Si)>0, а
точка Ti - либо вне окружности, либо на окружности D(T i)0.
D(Ti)<D(Si), так как точка Ti ближе к “математической” окружности,
то:
di = D(Si) + D(Ti)>0 - выбираем точку Ti.
Для того чтобы исключить “медленные” операции с действительной арифметикой, используем:
 Свойство растра (расстояние между соседними точками по оси OX, и
по оси OY равно единице).
 Свойство рекуррентности, позволяющее исключить общую информацию из формул (без индексов, например R2).
Для того чтобы упростить алгоритм нужно, чтобы d1 (начальное
значение в рекуррентных соотношениях) также не содержало действительных чисел:
d1 = D(S1) + D(T1),
D(S1) = (xo + 1)2 + yo2 - R2 =1.
Так как в начальной точке (но оси координат) окружности: xo=0,
yo=R. Так же и для T1:
D(T1) = (xo + 1)2 + (yo  1)2  R2 =1+R2 2R+1R2=22R.
Благодаря выбору точек отсчета от xo=0, yo=R удалось исключить
R2. В итоге:
d1 =32R - без умножения (сдвиг и вычитание).
Теперь запишем формулы для общего случая для di и di+1, чтобы
избавиться от степеней:
di =D(Si)+D(Ti) = (xi-1+1)2 +(yi-1)2 R2 +(xi-1+1)2 +(yi-11)2R2 =
=2(xi-1 +1)2 + y2i-1 + (yi-1  1)2  2R2.
Следующий индекс:
di+1 = D(Si+1) + D(Ti+1) = (xi + 1)2 + y2i  R2 + (xi + 1)2 + (yi-1  1)2  R2 .
При этом xi = xi-1 +1.
Теперь рассмотрим два случая:
a) если di<0, то (как доказано выше) выбирается Si, то есть yi-1=yi . Поэтому:
di+1  di = 2(xi-1 + 2)2 2(xi-1 + 1)2, раскроем скобки, получим:
di+1  di = 2x2i-1 + 8xi-1 +8 2x2i-1  4xi-1 2 = 4xi-1 + 6.
59
Получили:
при di < 0: di+1 = di + 4xi-1 + 6 - (без умножения - только сдвиг и сложение).
б) если di  0, то yi = yi-1  1.
di+1 = 2(xi-1 + 2)2 + (yi-1  1)2 + (yi-1  2)2  2R2.
Поэтому:
di+1  di = 4(xi-1  yi-1) + 10, di+1 = di + 4(xi-1  yi-1) + 10
Так же без умножения - только сдвиг и сложение.
Напишем программу-исполнитель.
ПРОГРАММА окружность_Брезенхейма (radius, value: целые)
 целая арифметика без умножения и деления.
. Дано:  центр в начале координат
. Получить:  изображение окружности с радиусом Radius, цвета value
. Система Предписаний (СП):
. . высветить_пиксель (х, у, value: целые)
. . точки_окружности (х, у, value: целые)  симметричные 8 точек
относительно х, у
. Конец СП
. Типы:
. . х, у, d - целые
. Начало
.x= 0
. у = Raduis
. d = 3 - 2Raduis  стартовое значение дискриминатора di
. Цикл Пока х  у Выполнять  остановка при х=у - обходится операция
R
2
. . точки_окружности (х, у, value)
. . Если d < 0 То  принимаем Si с координатой уi-1
. . . d = d +4x+6  новое значение дискриминатора
. . Иначе
. . . d = d + 4(x - y) + 10
. . . y = y -1  выбирается Ti с уi = yi - 1
. . Конец Если
..х=х+1
. Конец Цикла
. Конец
КОНЕЦ окружность_Брезенхейма.
60
3.5. Компьютерный практикум 4. Лабораторная
работа по теме “Растровый алгоритм
построения окружности”
Цель работы: Освоение основных идей растрового алгоритма построения графического примитива окружности, сравнение быстродействия растрового и нерастровых алгоритмов.
Ключевые понятия: растр, графические примитивы, окружность
Брезенхейма, рекуррентные формулы, дискриминатор.
Задание на проведение лабораторной работы:
1.
Изучить подробно работу растрового алгоритма построения окружности, сравнить с
нерастровыми по быстродействию.
2.
Составить программу для алгоритмов построения растровой окружности (желательно на языке программирования Ассемблер) по Брезенхейму, а также программы построения окружности с помощью
тригонометрических функций, и по параметрическому уравнению.
Учесть возможность расположения центра окружности не в начале
координат, усовершенствования в алгоритм внести самостоятельно.
Сравнить скорость построения окружности реализованной в языке
программирования (Pascal, C, Basic и т.п.) с собственной (по Брезенхейму) программой и с нерастровыми алгоритмами построения
3.
4.
3.6. Растровые алгоритмы закрашивания
Нам понадобится понятие связности пикселей на растре для определения понятия границы.
Под связностью понимается способ соединения пикселей на растре.
1. Четырехсвязная область: от любого пикселя четырех связной области
можно перейти к любому другому пикселю данной области движением
вправо, влево, вверх, вниз, но не по диагонали (см. рис. 3.6.1).
Рис. 3.6.1. Четырехсвязный
пиксель
61
2. Восьмисвязная область: от любого пикселя из данной области можно
перейти к любому другому движением вправо, влево, вверх, вниз и по
диагонали во всех направлениях (см. рис. 3.6.2).
Понятие четырехсвязности более
сильное: восьмисвязная область одновременно и четырех связная, но не наоборот.
Рис. 3.6.2. Восьмисвязный
Определение областей внутри границ:
пиксель
1. Внутренне-определенная область: все
пиксели внутри имеют одинаковый атрибут,
пиксели на границе могут иметь разные атрибуты, но (обязательно) не
совпадающий с атрибутом области.
Внутренне-заполняющие алгоритмы - это такие алгоритмы, с помощью которых внутренне-определенные области с каким-то атрибутом
перекрашивают согласно новому атрибуту, отличного от цвета границы и
старого атрибута области.
2. Гранично-определенная область: все пиксели границы имеют одинаковый атрибут, область внутри границы может содержать пиксели с разными атрибутами, но (обязательно) не совпадающим с атрибутом границы.
Гранично-заполняющие алгоритмы - это такие алгоритмы, которые
заполняют гранично-определенную область, атрибуты пикселей которой
имеют различные значения, цветом отличным от цвета границы.
Соотношение связности внутренней области и границы.
а) Если граница 8-ми связная, то область внутри должна быть 4-х связная
(иначе цвет “прольется” через границу) (см. рис. 3.6.3).
б) Если внутренняя область 8-ми связная, то граница должна быть 4-х
связная (см. рис.3.6.3.)
62
Г р а н и ц а 8-м и
с вяз на я,
о б л а с т ь 4-х
Г р а н и ц а 4-х
с вяз на я,
о б л а с т ь 8-м и
Рис. 3.6.3. Соотношение связности границы
и области
Основные
алгоритмы
закрашивания
обычно содержат рекурсию. Рекурсия является
удобным способом запоминания точки возврата (в стеке) к “не закрашенной” части области.
Процедура закрашивания
останавливается,
когда стек возврата пуст.
Рекурсивный алгоритм закрашивания области, заданной гранично.
ПРОГРАММА рекурсивное_закрашивание (х, у, цвет_границы (Ц_Г),
цвет_закрашивания (Ц_З): целые)
. Дано:  область, гранично-невыпуклая, с дырками и точка (х, у) внутри
области
. Получить:  область, закрашенную в Ц_З, Ц_З  Ц_Г по определению
. Система Предписаний (СП):
. . прочесть_пиксель (х, у: целые): атрибут_пикселя: целое
. . высветить_пиксель (х, у, атрибут: целое)
. Конец СП
. Типы:
. . С: целое
. Начало
. С = прочесть_пиксель (х, у)
 С - код цвета пикселя
. Если С  Ц_Г и С  Ц_З То
. . высветить_пиксель (х, у, Ц_З)
. . рекурсивное_закрашивание (х-1, у, Ц_Г, Ц_З)
. . рекурсивное_закрашивание (х+1, у, Ц_Г, Ц_З)
. . рекурсивное_закрашивание (х, у-1, Ц_Г, Ц_З)
. . рекурсивное_закрашивание (х, у+1, Ц_Г, Ц_З)
. Конец Если
. Конец
КОНЕЦ рекурсивое_закрашивание.
Достоинства данного алгоритма:
Абсолютная корректность заполнения области с границей любой формы,
с “дырками”, а также изящество и краткость.
63
Недостатки:
 требования к объему стека возврата,
 требования к наличию рекурсии в языке,
 каждый пиксель приходится анализировать 4 раза (медленность).
Данные недостатки делают алгоритм слишком неэффективным.
Поэтому для решения задачи закрашивания области предпочтительнее
использовать алгоритмы, способные обрабатывать сразу целые группы
пикселей.
Программа закрашивания полосами: из заданной внутренней точки
алгоритм пытается построить горизонтальную прямую наибольшей длины (до упора в границы). Потом она целиком закрашивается (как линия) и
рекурсивно переходит к следующей полосе. Остановка: когда стек станет
пустым. Алгоритм абсолютно корректен, требования к глубине стека
меньше.
ПРОГРАММА закрашивания_полосами (х, у, dir, PrevXL, PrevXR, Ц_З,
Ц_Г: целые)
. Дано:  область, подлежащая закрашиванию, задана гранично цветом
Ц_Г, цвет закраски - Ц_З, шаг по полосам – dir.
 Обозначения: PrevXL, PrevXR (от previous) - значения левой (XL) и
правой (XR) границ полосы на предыдущем такте счета (берутся из стека).
. Получить:  область, закрашенную в Ц_З
. Система Предписаний (СП):
. . закрашивание_линией (х, у, dir, PrevXL, PrevXR: целые): целое
. . линия (х1, у1, х2, у2, цвет: целые)
. . прочесть_пиксель (х, у: целые): целое
. . высветить_пиксель (х, у, цвет: целые)
. Конец СП
. Типы:
. . С: целое
. Начало
.  задать произвольную сложную область с “дырками” и вкраплениями
цвета Ц_Г
.  задать начальную точку внутри границы
. х = закрашивание_линей (х, у, 1, х, х)
. Конец
64
КОНЕЦ закрашивания_полосами.
ФУНКЦИЯ закрашивание_линией (х, у, dir, PrevXL, PrevXR: целые)
. Типы:
. . XL, XR, С: целые
. Начало
. XL = х
. XR = x
. Цикл
. . С = прочесть_пиксель (XL1, y)
. . XL=XL-1
. Пока СЦ_Г и СЦ_З  идем влево до упора в границу или
 в закрашенную точку
. Цикл
. . С = прочесть_пиксель (XR+1, y)
. . XR=XR+1
. Пока СЦ_Г и СЦ_З  идем вправо до упора
. XL=XL+1
. XR=XR-1
. линия (XL, y, XR, y, Ц_З)
 рисует линию
 Разработка стека возврата
. Цикл  х[XL, XR] Выполнять
. . С = прочесть_пиксель (х, у+dir)  полоса вниз
. . Если СЦ_З и СЦ_Г То
. . . х = закрашивание_линией (х, y+dir, dir, XL, XR)
. . Конец Если
. Конец Цикла
. Цикл  х[XL, PrevXL1] Выполнять
. . С = прочесть_пиксель (х, у-dir)  полоса вверх
. . Если СЦ_З и СЦ_Г То
. . . х = закрашивание_линией (х, y-dir, -dir, XL, XR)
. . Конец Если
. Конец Цикла
. Цикл  х[PrevXR, XR1] Выполнять
. . С = прочесть_пиксель (х, у-dir)
. . Если СЦ_З и СЦ_Г То
. . . х = закрашивание_линией (х, y-dir, -dir, XL, XR)
. . Конец Если
65
. Конец Цикла
 возврат функции
Закрашивание_линией = XR
. Конец
КОНЕЦ закрашивание_линией.
Замечание. Рассмотренные алгоритмы не учитывают положение
источников освещения. Если такой учет сделать, то можно повысить реалистичность изображения. Существуют несколько распространенных
алгоритмов (Фонга, Гуро), которые позволяют сделать более реалистичную закрашивание. Иногда это делает изображение более эффективным и
наглядным (например, поверхность функции изображенная с градиентным закрашиванием легче воспринимается, чем ее проволочная модель).
3.7. Растровый алгоритм отсечения отрезка по
границам окна
(алгоритм Сазерленда-Кохена)
Назначение алгоритма отсечения:
1. Для ускорения удаления невидимых линий: анализу подлежат только
отрезки ребер, попавшие внутрь “окна“ (грани полиэдра), (данный прием
называется предкомпиляцией). Определить же попало ли ребро в окно
можно с помощью алгоритма отсечения.
2. Для получения фрагментов рисунка в окнах (которые можно увеличивать, уменьшать, перемещать и т.д.) - удобный пользовательский интерфейс.
Основная идея заключается в том, что вся плоскость (экран дисплея) разбивается на девять зон с помощью прямых. В каждой из этой
зоне расположение точек по отношению к окну одинаково. Если мы
определим, в какие зоны попали концы отрезка, то тогда мы сможем легко провести отсечение.
Присвоим каждой зоне свой код (см. рис. 3.7.1):
 в центре окна: 0000
 слева от центральной зоны: 0001
 справа от центральной зоны: 0100
66
 выше центральной зоны: 0010
0011
0001
1001
(3а)
0010
(2а)
0110
(2б)
(2в)
0100
0000
(1) (3б)
1000
 ниже центральной
1000
 в верхнем левом
0011
 в верхнем правом
0110
 в нижнем левом
1001
 в нижнем правом
1100
1100
(3в)
Рис. 3.7.1. Кодовое обозначение зон и
возможное расположение отрезка
1.
зоны:
углу:
углу:
углу:
углу:
При таком кодировании удается диагностировать три
ситуации:
Начало и конец отрезка (а, следовательно, и весь отрезок) внутри окна, значит, отрезок
виден целиком (см. рис 3.7.1. случай (1), коды начала и конца отрезка - 0000).
Начало и конец отрезка таковы, что отрезок не может пересечь окна,
следовательно, отрезок не виден (см. рис. 3.7.1. случаи (2а), (2б), (2в),
гипотеза имеется, по крайней мере, один разряд в кодах начала и
конца равный единице).
3. Начало и конец отрезка таковы, что возможно пересечение с окном
следующих типов:
 в одной точке, см. рис. 3.7.1. случай (3а);
 в двух точках, см. рис. 3.7.1. случай (3б).
Если посмотреть на коды концов таких отрезков, то можно увидеть, что их по разрядное произведение равно нулю. Рассмотрим это
утверждение, а также гипотезу выдвинутую выше более подробно.
Пусть мы имеем плоскость разбитую на 9 частей (см. рис. 3.7.2).
2.
Пусть отрезок задается координа-
0011
0010
0110
0001
окно
0000
0100
1001
1000
1100
Рис. 3.7.2. Разбиение на зоны
тами:
(x1, y1) - начало отрезка,
(x2, y2) - конец отрезка.
И пусть окно задается координатами:
(xW1, yW1) - левого верхнего угла,
(xW2, yW2) - правого нижнего угла.
Считаем, что:
67
сode_n - код точки начала отрезка,
code_k - код точки конца отрезка.
Для вывода “признака пересекаемости” рассмотрим примеры:
1. code_ n  0000  весь отрезок внутри окна, окно его не отсекает.
code_ k  0000
2. Случай заведомо невозможного пересечения (некоторые примеры):
а) из верхнего левого угла в левый нижний угол - весь отрезок левее окна:
code_ n  0011 наличие 1 в одном и том же разряде кода (в послед
code_ k  1001
нем).
б) отрезок выходит из зоны над окном и кончается в верхнем правом углу
- отрезок выше окна:
code_ n  0010 
 наличие 1 в одном и том же разряде кода (в предcode_ k  0110
последнем).
в) отрезок выходит из зоны под окном и кончается в нижнем правом углу
- отрезок ниже окна:
code_ n  1000 
 наличие 1 в одном и том же разряде кода (в перcode_ k  1100
вом).
Отрезок также может быть правее окна (и в этом случае есть единица в
одном из разрядов в обоих кодах). Итак, перебрав все варианты отсутствия пересечения, можно убедиться:
Признак отсутствия пересечения: хотя бы в одном из разрядов кодов начала и конца - одновременно стоит на одной и той же позиции единица.
3. Отрезок может пересечь границу окна (как отмечалось в одной или
двух точках).
Если перебрать все возможные ситуации потенциальной “пересекаемости”, то получим:
а) начало отрезка в верхнем левом углу, а конец в правом нижнем - отрезок пересекает окно в двух точках:
68
code_ n  0011
 отсутствуют биты равные 1 в одинаковых разряcode_ k  1100
дах кодов.
б) отрезок выходит из окна и кончается в верхнем правом углу - пересекает в одной точке:
code_ n  0000 
 отсутствуют биты равные 1 в одинаковых разрядах
code_ k  0110
кодов.
Признак возможного пересечения: если нет битов в одинаковых разрядах
равных единице.
Пример работы алгоритма.
Фаза 1. Определение кодов начала и конца отрезков (см. рис. 3.7.3).
Исходное присвоение:
code_n=0000.
1) Если х1<xW1 (начало окна), то
(х1, у1)
подправим правый разряд, иначе
без изменения: code_n = 0001.
2) Если y1<yW1, то подправим
предпоследний разряд, иначе без
изменения: code_n = 0011.
3) Если х1>xW2 (правее окна), то
(х2,у2)
подправим 3-й разряд, иначе без
изменения: code_n = 0011 (в
нашем случае это правило не дейРис. 3.7.3. Пример расположения
ствует).
отрезка
4) Если y1>yW2 (начало ниже окна), то подправим 4-й разряд, иначе без изменения: code_n = 0011 (в нашем случае это правило также не
действует).
5) Аналогично получим code_k = 1100.
6) Проверка “пересекаемости”:
code_ n  0011
 нет одинаковых битов равных единице.
code_ k  1100
Вывод: отрезок пересекает окно.
Фаза 2. Из диагностики (фазы 1) ясно, что начало отрезка левее окна.
Тогда отсечем всю часть по левой границе окна (см. рис. 3.7.4).
69
(х1, у1)
Новые координаты (x1, y1) находятся решением системы уравнений
(уравнение отрезка и левой стороны
окна):
 н
y 2  y1с
с
x н  x1 ,
 y1  y1 
x2  x1 1

 x н  xW .
 1
1

Рис. 3.7.4. Отсечение по левой границе окна

В левой части уравнений стоят
новые координаты (с индексом “н”), а в
правой старые (с индексом “с”). В итоге
получим: code_n=0010.
Фаза 3. После фазы 2 окажется, что укороченный отрезок имеет начало
выше окна. Отсечем его часть по верхней границе (см. рис. 3.7.5).
Аналогично фазе 2 рассчитываем
новые координаты (x1, y1), code_n = 0000
(х1, у1)
(начало попало внутрь окна).
Рис. 3.7.5. Отсечение по
верхней границе
Фаза 4. Когда начало отрезка попало
внутрь окна, переобозначим его концы
(начало станет концом - уже отсечено, а
конец началом - надо отсечь). Это позволит, не нарушая цикла, работать (как бы)
всегда с началом отрезка и не переписывать формулы, определяющие координаты отсечения.
Фаза 5. Отсечение части отрезка по правой границе окна.
Расчет координат ничем не отличается от фазы 2.
Фаза 6. Отсечение по нижней границе окна.
Получим, что коды начала и конца отрезка будут равны:
code_ n  0000 
 признак видимости отрезка в окне.
code_ k  0000
Теперь можно отобразить отрезок.
ПРОГРАММА отсечение_отрезка(x1, y1, x2, y2, Х1, У1, Х2, У2: целые)
70
. Дано:  координаты начала (х1, у1) и конца (х2, у2) отрезка, а также координаты верхнего левого угла (Х1, У1) и правого нижнего (Х2, У2) угла
окна.
. Получить:  отсеченный отрезок по границам окна
. Система Предписаний (СП):
. . коды (х, у, Х1, У1, Х2, У2: целые)
. . линия (х1, у1, х2, у2, цвет: целые)
. . обмен (а, в: целые) | обменивает значениями переменные а и в,
данную подпрограмму реализовать самостоятельно
. Конец СП
. Типы:
. . code_n, code_k: целое
. . out, in: логическое
. Начало
. code_n = коды(х1, у1, Х1, У1, Х2, У2)
. code_k = коды(х2, у2, Х1, У1, Х2, У2)
. Если code_n (произведение битовое) code_k = 0 То in=True
. Если code_n (сложение битовое) code_k = 0 То out=True
. Цикл Пока in=True и out=True
. . Если code_n=0 То
. . . обмен (х1, х2)
. . . обмен (у1, у2)
. . . обмен (code_n, code_k)
. . Конец Если
. . Если code_n (сравнение битовое) 0001 То
. . . y1=(y2-y1)(X1-x1)/(x2-x1)
. . . x1=X1
. . Конец Если
. . Если code_n (сравнение битовое) 0010 То
. . . x1=(x2-x1)(Y1-y1)/(y2-y1)
. . . y1=Y1
. . Конец Если
. . Если code_n (сравнение битовое) 0100 То
. . . y1=(y2-y1)(X2-x1)/(x2-x1)
. . . x1=X2
. . Конец Если
. . Если code_n (сравнение битовое) 1000 То
. . . x1=(x2-x1)(Y2-y1)/(y2-y1)
. . . y1=Y2
. . Конец Если
71
. . code_n=коды(х1, у1, Х1, У1, Х2, У2)
. . code_k=коды(х2, у2, Х1, У1, Х2, У2)
. . Если code_n (произведение битовое) code_k = 0 То in=True
. . Если code_n (сложение битовое) code_k = 0 То out=True
. Конец Цикла
. линия (х1, у1, х2, у2, цвет: целые)
. Конец
КОНЕЦ ПРОГРАММЫ отсечение_отрезка.
ПОДПРОГРАММА коды(х, у, Х1, У1, Х2, У2: целые) возвращает (целое)
. Дано: | данные точки и координат окна Х1, У1, Х2, У2
. Получить: | код соответствующий этой точки
. Начало
. code=0
. . Если х<X1 То code=code (сложение битовое) 0001
. . Если y<Y1 То code=code (сложение битовое) 0010
. . Если х>X2 То code=code (сложение битовое) 0100
. . Если y>Y2 То code=code (сложение битовое) 1000
. Возвращает code
. Конец
КОНЕЦ ПОДПРОГРАММЫ коды.
3.8. Компьютерный практикум 5.
Лабораторная работа по теме “Растровые алгоритмы закраски”
Цель работы: Освоить и исследовать различные алгоритмы закрашивания области на растре.
Ключевые понятия: связность, гранично- и внутренне- заполняющие
алгоритмы.
Задание на проведение лабораторной работы:
1.
Внимательно проанализируйте алгоритм пиксельного закрашивания. Необходимо
проследить за ходом работы алгоритма (он содержит четыре уровня рекурсии) и понять, как в ходе работы заполняется и освобождается стек. Почему в ходе работы алгоритма каждый пиксель области анализируется несколько раз?
2.
Изучите алгоритм закрашивания полосой, сравните его с пиксельным
закрашиванием. Почему в этом алгоритме меньше требований к глубине стекового пространства?
72
3.
4.
Составьте программу, реализующую оба алгоритма, сравните их.
Почему эти алгоритмы называются растровыми?
Поэкспериментируйте с различными формами областей закраски, их
внутренним содержимым (точки, области и т.п.)
Лабораторная работа по теме “Растровый алгоритм
отсечения отрезка по границам окна”
Цель работы: Ознакомиться с принципами предкомпиляции граней (за
счет выделения частей граней, не попавших в прямоугольное окно) и
работой алгоритма отсечения отрезка.
Ключевые понятия: кодирование, пересечение отрезков, предкомпиляция.
1.
2.
Задание на проведение лабораторной работы:
Составить программу, реализующую алгоритм Сазерленда - Кохена,
испытать ее.
Попытаться создать математический аппарат (и программу) для отсечения отрезка в окне, стороны которого не параллельны сторонам
экрана.
3.9. Удаление невидимых линий и поверхностей
Для более реалистичного представления геометрических фигур и
объектов на экране необходимо удалить невидимые линии и поверхности
(те которые загораживаются другими поверхностями). После удаления
невидимых линий изображение приобретает более естественный вид.
Несмотря на кажущуюся простоту, эта задача является довольно сложной.
Существует большое количество алгоритмов решающих эту задачу, но у
всех у них есть определенные недостатки или ограничения, либо они
медленны или требуют большого объема памяти.
Удаление невидимых линий в изображении полиэдра имеется два
подхода:
1. Работа в пространстве изображения (линии удаляются после того как
получено изображение на картинной плоскости).
2. Работа в исходном пространстве объекта (линии удаляются до того как
получено изображение).
Полиэдр - пространственная фигура (не обязательно выпуклая)
представляется набором обязательно выпуклых плоских многоугольников
73
(относится к классу поверхностных (не каркасных, не твердотельных)
моделей).
Сравнение подходов по вычислениям (быстродействию).
Идея подхода 1.
 Исходя из центра проецирования (в центральных проекциях) или из
бесконечности (в параллельных проекциях) проведем луч (проектор)
через полиэдр.
 Он пересечет полиэдр, и мы найдем точки пересечения каждой грани с
проектором. Упорядочим грани по расстоянию от наблюдателя (от
центра проецирования) и изобразим на экране ближайшую из них.
Проделаем эти операции для всех точек экрана (или окна).
 Получим совокупность точек, видимых для наблюдателя.
Мы видим, что:
1. Подход основан на растровых свойствах дисплея.
2. Число операций на одно изображение (Ч1):
Ч1 = N  n  (число машинных операций на одну точку, грань), где
N- число точек экрана (окна) порядка 1000  1000 = 106 (грубо),
n - число граней полиэдра (максимально 200000 = 2  105 по данным 1992
года).
Получим:
Ч1  106 5 М1 = 2  1011 М1, где
М1 - число машинных операций.
В данной формуле число Ч1 линейно зависит от числа граней полиэдра.
Идея подхода 2.
 В исходном пространстве объекта (до проецирования) для каждого
ребра полиэдра проделывается операция определения: “затеняет ли
каждая грань ребро или его часть?”
 Запоминаются видимые части ребра, и эти видимые части изображаются на картинной плоскости.
 Переходим к следующему ребру и повторяем расчеты.
 Получается фигура, видимая для наблюдателя.
Вычислительные свойства данного подхода:
1. Растровые свойства дисплея не используются (поэтому подход применим и для нерастровых дисплеев).
2. Число операций на одно изображение (Ч2):
74
Ч2 = Np n  (число машинных, операций на одно ребро и грань), где
Np - число ребер полиэдра 5  n (5 - максимальное число ребер на грань,
n - число граней).
Ч2  5  n5  М2, где
М2 - число машинных операций.
В данной формуле число Ч2 квадратично зависит от числа граней
полиэдра.
Сравнение двух подходов.
 В отличие от Ч1, Ч2 пропорционально квадрату числа граней и при
n=2  105 граней:
Ч1 = 2  1011  М1,
Ч2 = 2  1011  М2.
 Если бы М1=М2, то при n<nmax=2  105 выигрывал бы второй подход:
Ч2<Ч1. Но из-за того, что не учитываются растровые свойства, то есть
используется действительная арифметика М2М1 (по данным 1992
года при n 10000 выигрывал первый подход).
3.10. Графики функции двух переменных
(пример растрового алгоритма удаления невидимых линий)
Постановка задачи:
1. Имеется функция z=f(x,y), которая представлена совокупностью сечений х=const, y=const.
2. Считаем, что в результате параллельного проецирования проекция
вертикальной линии (0, 0, z) будет вертикалью на экране.
Из этого следует, что точка P(x, y, z) проецируется в точку P 1(X, Y).
Причем:
 e2 1 
Y   x y z   e 2  2  .


 e2  3 
 e1 1 
X   x y z   e1  2  ,


 e1  3 
e1[ ] = [cos sin 0],
e2[ ] = [sin sin -cos sin
cos ].
Направление проецирования имеет вид:
75
e3[ ] = [sin cos -cos cos
руется в точку), где
-sin] (после поворота на  и  спроеци-
 0,2  ,
  .
,
 2 2 
  
Идея алгоритма.
Мы будем выводить сечения последовательно от самого ближнего
до самого дальнего к наблюдателю, причем в последующих сечениях
будем выводить точки, которые не закрываются предыдущими сечениями. В результате получится функция с удаленными невидимыми линиями
(см. рис. 3.10.1).
Замечание.
Существуют
алгоритмы, котоz
рые основаны на похожем
принципе. Выводятся грани в
порядке их приближения к
y
k+1 сечение
наблюдателю. Сначала самые
дальние, затем ближние, котоk+2 сечение
рые закроют часть дальних.
k сечение
Получится изображение с
x
удаленными
невидимыми
линиями (алгоритм z-буфера).
Рис. 3.10.1. Построение графика
Функции двух переменных
Алгоритм.
1. Функция задается на сетке {xi, yj}, i=1, ... , n1; j=1, ... , n2.
2. Тогда f(xi, yj) - совокупность точек, их количество равно n1  n2.
3. Тогда на картинной плоскости Y=Yk(X) - совокупность точек, проекции f(x, y).
4. Между точками используется линейная аппроксимация:
 если точка выше горизонта - высвечиваем пиксель наружным
цветом поверхности, корректируем горизонт,
 если точка ниже горизонта, высвечиваем пиксель внутренним
цветом поверхности, корректируем горизонт,
 если точка внутри горизонта - не высвечиваем пиксель и не
корректируем горизонт.
Дополнительные вопросы не связанные с невидимостью (но необходимые для построения графика на экране):
 расчет размеров графика на экране (Xmin, Ymin, Xmax, Ymax);
76
 масштабирование к заданному окну.
Исходные данные для масштабирования: область определения функции
f(x): [x1, y1, x2, y2, fmin, fmax].
Определение размеров графика (зависят от углов  и ). Для этого нужно
перебрать проекции сочетаний:
(х1, у1, 0), (х1, у2, 0), (х2, у1, 0), (х2, у2, 0).
Х1,Y1
Х2,Y2
Х3,Y3
X4,Y4
И найти:
Xmin = min{x1, x2, x3, x4}, Xmax = max{x1, x2, x3, x4},
Ymin = min{y1, y2, y3, y4}, Ymax = max{y1, y2, y3, y4}.
Система кусочно-линейных функций, аппроксимирующих z=f(x, y)
реализуется модифицированным алгоритмом “Прямая Брезенхейма”.
Сущность модификаций.
В отличие от “классической прямой Брезенхейма” вставляется
проверка:
1. Если текущая точка графика ниже текущей линии нижнего горизонта,
то:
 высветить пиксель (точка, внутренний цвет);
 изменить нижний горизонт.
2. Если текущая точка графика выше текущей линии верхнего горизонта,
то:
 высветить пиксель (точка, наружный цвет);
 изменить верхний горизонт.
3. Если точка между линиями верхнего и нижнего горизонта, то (ничего
не делать) перейти к следующей точке.
Масштабирование графика (приведение графика к заданным размерам окна).
Схема масштабирования:
1. Определить, в какой прямоугольник вписывается проекция графика,
т.е. найти Xmin, Xmax, Ymin, Ymax.
2. Изменить Ymin, Ymax с учетом высоты графика, заданной {fmin, fmax}.
3. Привести Xmin, Xmax, Ymin, Ymax к размерам экрана линейным преобразованием, тогда для каждой точки проекции (х, у) найдется координата в окне.
Значение Xmin, Xmax, Ymin, Ymax в координатах проекций зависят от
положения картинной плоскости, то есть от значений: е1[3], е2[3] (содержат sin, sin, cos, cos).
77
После проецирования точка:
 е1 1 

,
X
,
Y
,
0

X
Y
0

 min min 
min
min
 е1  2
 е1  3 

 e 2 1
Y1  X min Ymin 0  e 2 2,
 e2 3

X 1  X min e1 1  Ymin e1 2,
Y1   X minе2 1  Yminе2  2,
X1   X minе1[1]  Yminе1[2] , где
Х1 и Y1 - новые координаты точки.
Таким образом положение Xmin, Xmax, Ymin, Ymax зависит от знаков
е1[1], е1[2], е2[1], е2[2].
Условия для нахождения Xmin:
 если е1[1]  0, е2[1] 0 и е1[2]0, е2[2]0, то
Xmin = Xmin е1 [1]+Ymin е1 [1],
Ymin = Xmin е2 [1]+Ymin е2 [2].
 если е1 [1]<0, е2 [1]>0 и е1[2]>0, е2 [2]>0, то
Xmin = Хmax е1 [1] + Ymin е2 [1],
Ymin = Хmin е2 [1] + Ymin е2 [2].
И так далее перебор сочетания знаков.
Недостаток алгоритма. Существуют изображения в которых данный алгоритм не работает напрямую (см. рис. 3.10.2). Для подобных
изображений упорядочить грани (сечения) по удаленности от наблюдателя не
удается. Тогда необходимо производить
разбиение одной или нескольких граней,
чтобы после разбиения новое множество
граней можно было упорядочить.
Рис. 3.10.2. Особенная фигура
3.11. Нерастровый алгоритм удаления невидимых
линий
(алгоритм работает в исходном пространстве объекта)
Допущения об информационной структуре:
78
 фигура не обязательно выпуклая, но представлена набором выпуклых
многоугольников;
 координаты и особенности фигуры задаются файлом:
Элемент 1. Число граней (выпуклых многоугольников) - ns.
Элемент 2. Число вершин многоугольника nv(s).
x1( ), y1( ), z1( ) - вершина 1, … , x(nv(s)), y(nv(s)), z(nv(s)) - вершина nv(s).
 для соединения вводятся массивы:
x1(nv(s)), y1(nv(s)), z1(nv(s))  x2(nv(s)), y2(nv(s)), z2(nv(s)),
где в левой части координаты начала ребра, а в правой конца.
Общая формула: [x1(i), y1(i), z(i)]  [x2(i), y2(i), z(i)].
Принцип определения видимости.
Для каждой грани выбираем по очереди ребра не принадлежащие
ей, тогда возможны следующие случаи (см. рис. 3.11.1):
1. ребро видно (за пределами
грани) – случаи 1 и 2;
(1)
2.
ребро не видно (под гранью) –
(4)
случай 3;
3. ребро видно (над гранью) –
(3)
(5)
случай 4;
4. ребро видно частично, имеется
одна точка пересечения с реб(2)
(6)
ром грани – случай 5;
5. ребро видно частично, имеются две точки пересечения с
Рис. 3.11.1. Случаи взаимного
расположения грани и ребер
ребром грани – случай 6.
Благодаря выпуклости многоугольника не может быть больше двух точек пересечения ребра с многоугольником.
Алгоритм:
1. Рисуются цветом лицевой стороны все ребра, включая невидимые.
2. В цикле выбирается грань.
3. Для нее определяются размеры прямоугольного окна, в которое вписывается
грань. Все ребра справа, слева, сверху, снизу окна - заведомо видимы.
4. Для тех ребер, у которых хотя бы один конец проецируется во внутрь
окна, привлекается информация о взаимном расположении по высоте.
Для этого:
 на картинной плоскости рассчитывается точка пересечения
проекций ребра грани и “подозрительного” ребра;
79
 если такой не существует, то рассматривают два случая: лежит
ли ребро над гранью или под гранью.
5. Часть ребра (или целиком), попавшая на задний план (под грань), закрашивается
цветом внутренней поверхности (невидимая).
3.12. Обзор алгоритмов удаления невидимых
линий
Как уже отмечалось, существует большое количество алгоритмов
удаления невидимых линий. Рассмотрим идеи, которые применяются в
некоторых из них.
Алгоритм Робертса.
Это самый первый алгоритм, предназначенный для удаления невидимых линий. Немного отличается от рассмотренного нами нерастрового
алгоритма удаления невидимых линий. Шаги алгоритма:
 отбрасываются все ребра, обе грани которых являются нелицевыми
(ребро невидно);
 проверка каждого из оставшихся ребер со всеми гранями многогранника на закрывание (возможно три случая: грань не закрывает ребро,
полностью закрывает ребро, частично закрывает ребро - в этом случае
ребро разбивается на части).
Если количество ребер равно n, то можно показать, что необходимо
выполнить О(n2) действий. Можно сократить количество проверок, если
воспользоваться разбиением картинной плоскости на части (как мы это
делали при отсечении отрезка). Несмотря на то, что при этом требуются
затраты на построение разбиения, при удачном выборе разбиения алгоритм имеет порядок О(n).
Замечание. Принцип разбиения плоскости на равные части очень
часто используется в компьютерной графике, так как позволяет сократить
число расчетов и заметно ускорить построение изображения.
Алгоритм Аппеля.
В данном алгоритме вводится понятие количественной невидимости точки - точка является видимой в том случае, если ее количественная
невидимость равна нулю, определяется как количество лицевых граней
закрывающих точку.
Количественная невидимость точек ребра изменяется на единицу
при прохождении ребра позади так называемой контурной линии, состо80
ящей из тех ребер, для которых одна из проходящих граней является лицевой, а другая не лицевой.
Для определения видимости ребер произвольного многогранника
берется какая-нибудь его вершина и затем непосредственно определяется
ее количественная невидимость. Далее прослеживается изменение количественной невидимости вдоль каждого из ребер, выходящих из этой
вершины. Эти ребра проверяются на прохождении позади контурной
линии, и в соответствующих точках их количественная невидимость изменяется. Те части отрезка, для которых количественная невидимость
равна нулю, сразу рисуются.
Далее определяют количественную невидимость для всех ребер,
выходящей из новой вершины и т.д.
Так как для реальных объектов количество ребер, входящих в контурную линию, намного меньше общего числа ребер, то алгоритм Аппеля
является более эффективным, чем алгоритм Робертса.
Метод z-буфера.
Данный метод удаления невидимых линий является одним из самых простых и в силу этой простоты он часто встречается в аппаратных
реализациях.
Суть данного метода в том, что каждому пикселю сопоставляется
расстояние от картинной плоскости до него вдоль направления проектирования (глубина). Изначально предполагается бесконечная глубина в zбуфере. При выводе грани для каждого ее пикселя находится глубина,
если она меньше, чем глубина хранящаяся в z-буфере (массиве глубин),
(для первого пикселя это всегда так), то пиксель выводится на экран и его
глубина заносится в z-буфер и так далее для каждого пикселя каждой
грани.
Замечание. Данный метод работает в пространстве картинной
плоскости и не требует предварительной обработки данных. Для вычисления глубины соседних пикселей может использоваться вариант алгоритма Брезенхейма.
Метод двоичного разбиения пространства (Binary Space Partitioning).
Это довольно элегантный способ упорядочивания граней. Рассмотрим некоторую плоскость в пространстве. Она разбивает множество
всех граней на два непересекающихся множества. И в зависимости от
того, в каком полупространстве относительно плоскости лежит грань, она
будет видна или невидна для наблюдателя.
81
Очевидно, что ни одна из граней, лежащих в полупространстве, не
содержащим наблюдателя, не может закрывать собой ни одну из граней
лежащих в том же полупространстве, что и наблюдатель. Поэтому надо
сначала вывести грани из дальнего полупространства, а затем из ближнего.
Получить такое разбиение пространства можно с помощью простого определения направления нормали к каждой грани. Если нормаль
смотрит в сторону наблюдателя, то грань видна, иначе нет.
Очевидно, что для выпуклых фигур достаточно одного разбиения
пространства на полупространства, но для не выпуклых требуется несколько разбиений. В этом процессе присутствует определенный произвол в выборе очередной плоскости разбиения (обычно в качестве таковой
берут какую-либо грань). Существует два основных критерия для выбора:
 получить как можно более сбалансированное дерево разбиений;
 минимизировать количество разбиений.
К сожалению, эти критерии, как правило, являются взаимоисключающими, поэтому выбирается некоторый компромиссный вариант.
Одним из основных преимуществ этого метода является его полная
независимость от положения центра проектирования, что делает его
крайне удобным для построения серий изображений одной и той же сцены из разных точек наблюдения. Также он является очень быстрым для
выпуклых фигур.
3.13. Компьютерный практикум 6.
Лабораторная работа по теме «Алгоритмы удаления
невидимых линий»
Цель работы: Освоить растровый и нерастровый алгоритмы удаления невидимых линий, научиться строить графики функций двух переменных.
Ключевые понятия: пространство изображения, исходное пространство объекта, плавающий горизонт, модифицированная прямая
Брезенхейма, полиэдр, ребра, грани, видимость.
Работа состоит из двух частей:
 удаление невидимых линий в изображение полиэдра,
82
 график функций двух переменных с удалением невидимых линий.
Задание на проведение лабораторной работы:
1. Разработать программу удаления невидимых линий в полиэдре, ознакомившись с опубликованными алгоритмами, составить программу по
одному из опубликованных алгоритмов.
2. Составить программу построения графика функции 2-х переменных.
Контрольные вопросы к разделу “Растровые алгоритмы”
Что такое растр?
Что такое графические примитивы?
Что такое растровый алгоритм?
Основные идеи растровых алгоритмов.
Идеи алгоритма построения растровой прямой Брезенхейма.
Последовательность вывода формул для построения растровой прямой.
7. Идеи алгоритма построения растровой окружности Брезенхейма.
8. Последовательность вывода формул для построения растровой
окружности.
9. Сравнение алгоритмов построения прямой линии.
10. Сравнение алгоритмов построения окружности.
11. Понятие связности.
12. Определение четырех и восьми связной области.
13. Определение четырех и восьми связной границы.
14. Что такое гранично-определенная и внутренне-определенная области?
15. Какие алгоритмы называются внутренне-заполняющими, а какие
гранично-заполняющими?
16. Соотношения связности внутренней области и границы.
17. Сравнение и идеи алгоритмов закрашивания.
18. Основные идеи алгоритма отсечения отрезка по границам окна.
19. Два подхода в алгоритмах удаления невидимых линий.
20. Идея алгоритма построения графика функции двух переменных.
21. Нерастровые алгоритмы удаления невидимых линий.
22. Сравнение алгоритмов удаления невидимых линий и их недостатки.
23. Зачем нужны растровые алгоритмы?
24. Зачем нужны алгоритмы отсечения отрезка прямой и закрашивания?
1.
2.
3.
4.
5.
6.
Задачи к разделу “Растровые алгоритмы”
83
1. Напишите состояние стека для пиксельной закраски для прямоугольной области 5х3 пикселя. Покажите работу алгоритма
2. Напишите состояние стека возврата для закраски линиями для прямоугольной области 10х7 пикселей. Покажите работу алгоритма для области с дырками.
3. Создать алгоритм и программу отсечения отрезка по границам квадрата повернутого на 45 (или окружности, эллипса).
4. Разработать алгоритм и программу определения принадлежности
точки многоугольнику (или замкнутой фигуре).
5. Разработать алгоритмы сглаживания нелинейности растровой окружности и прямой.
6. Изучить алгоритмы и разработать программы закрашивания с учетом
освещенности объекта (методы Гуро и Фонга).
7. Усовершенствовать алгоритм Брезенхейма построения линии, реализовать его в виде алгоритма построения линии отрезками.
84
4. Технические средства и стандарты
компьютерной графики
Для реализации растровых алгоритмов и построения изображения
на экране дисплея необходимо знать устройство видеосистемы компьютера. Существуют определенные стандарты в компьютерной графике на
видеосистемы, отображения графической информации, без знания которых невозможно в полной мере использовать возможности компьютерной
графики. На большинстве современных ЭВМ принят растровый способ
изображения графической информации, именно его мы и изучим.
Основой видеосистемы компьютера являются два устройства - видеоадаптер и дисплей (монитор). Видеоадаптер подключается к шине
компьютера, а монитор к выходу адаптера. Рассмотрим более подробно
эти устройства и их характеристики.
4.1. Дисплеи
Одним из средств вывода информации являются дисплеи (видеомониторы, терминалы). На них может выводиться как алфавитноцифровая информация, так и графическая. Сначала система отображения
позволяла выводить только знаковую информацию (были АЦД - аналогоцифровые дисплеи), а затем появились устройства способные выводить и
графическую информацию.
Дисплей - это устройство вывода информации, обеспечивающее
визуальное представление данных в удобной для нас форме, без долговременной ее фиксации (после выключения пропадает). Это инструмент
диалога между человеком и ЭВМ.
По типу перерабатываемой информации дисплеи делятся на текстовые (алфавитно-цифровые) и графические.
Основными характеристиками дисплеев являются:
 характеристики отображения (размер экрана и его пропорции, формат
изображаемой информации, разрешающая способность, число цветояркостных градаций, размер точки экрана (зернистость);
 быстродействие (число векторов, отображаемых без мерцаний; скорость записи на экран; скорость обновления данных);
 точность отображения (кривизна экрана и др.);
85
 характеристики входных сигналов и интерфейсов связи с ЭВМ.
Обычное построение алфавитно-цифрового дисплея основывается
на использовании электронно-лучевой трубки (ЭЛТ). Однако существуют
плазменные (газоразрядные), жидкокристаллические, электролюминесцентные дисплеи.
Для работы дисплея необходим видеоадаптер (видеокарта). Он
подключается к шине ПК, через стандартные слоты. Современные адаптеры имеют память и собственные микропроцессоры, а также другие
устройства, позволяющие разгрузить центральный микропроцессор и
обеспечивать более высокую скорость вывода и качество изображения.
Схема развертки луча в дисплее похожа на телевизионную. Электронный луч пробегает по строчкам сверху вниз, оставляя свечение на
покрытии (обычно люминофоровое) электронно-лучевой трубки.
Лучевые трубки используют три цвета люминофора и три электронные пушки соответственно (для цветных дисплеев). Для обеспечения
точности попадания и отсечения ненужных лучей используется теневая
маска - металлический лист с отверстиями для зерен люминофора. Чтобы
при работе дисплея, при температурном дрейфе, изображение оставалось
четким и нормальным, теневые маски делают из инвара с минимальной
тепловой деформацией.
Существуют электронно-лучевые трубки двух видов - обычные
«Дельтовидные» и усовершенствованные «Линейные». У первых пушки
находятся в вершинах треугольника, точки и отверстия круглые. В линейной же трубке излучатели располагаются в ряд, а точки и отверстия прямоугольные. Линейные трубки хорошо подходят для текста, но хуже воспроизводят графику.
В настоящее время существует популярная технология изготовления лучевых трубок - SONY Trinitron. В ее основу положена апертурная
сетка - множество вертикальных проводков. Люминофор нанесен непрерывными полосами и на экран попадает больше электронов, что позволяет уменьшить мощность пушки (соответственно, меньше потребление
энергии, меньше излучение). Непрерывность люминофора позволяет
использовать всю поверхность экрана. Однако есть и недостатки - темноватое изображение, нечеткий на диагоналях текст. Есть гибрид технологии Trinitron и обычной - Mitsubishi DiamondTron, у него более мощная
пушка, что увеличило яркость и четкость. В последнее время фирмыпроизводители стали производить трубки с плоским экраном (с большим
радиусом кривизны), что делает вид изображения более естественным.
Вывод символов и графики на экране происходит только в рабочей
зоне. Остальная часть экрана - бордюр (край) используется мало, так как
86
луч на ней плохо управляем, но все же может использоваться программами, для вывода рамки (бордюра).
На качество изображения влияет частота развертки: для обычных
телевизоров - 50 Гц, для новых цифровых - 100 Гц, для дисплеев стандарта VGA - 72 Гц. Чем ниже частота, тем сильнее будет мерцать изображение при движении, тем быстрее утомляются глаза.
Так же важно - как изображение выводится - через строку или построчно, если через строку, то частота развертки полного изображения
составит половину от указанной.
Для правильного вывода информации на экран, процессор (блок
управления) монитора определяет частоту выходного сигнала видеокарты
и формирует свои характеристики (обычно по таблице совпадений). Некоторые мониторы имеют память для настройки на видеорежимы настраиваемые развертка, смещение поля изображения, растянутость и
др. - сохраняются в памяти монитора и восстанавливаются при переходе
на этот видеорежим. Существует стандарт связи персонального компьютера с монитором: DDC (Display Data Channel – информационный канал
дисплея) - монитор по запросу выдает свои параметры: марку, производителя, серийный номер, частотные режимы воспроизведения. Производителями поддерживается несколько версий этого стандарта, наиболее часто
встречаются DDC1, DDC2B.
Обозначения для дисплеев:
NI – Non Interlaced (изображение выводится построчно, а не через строчку);
LR – Low Radiation (электронно-лучевая трубка имеет пониженное радиационное излучение);
MPR-II – шведский стандарт защиты (предусматривает определенное
расстояние глаз человека от экрана (для 14 дюймового монитора не менее
50 см), что согласно этому стандарту, удовлетворяет медицинским требованиям).
Energy Star - для экономии электроэнергии мониторы поддерживают
стандарты ЕРА. Мониторы имеют несколько режимов работы с различным потреблением энергии, причем в зависимости от интенсивности
работы они могут переходить на тот или иной режим, экономя энергию. В
спящем режиме потребление у таких мониторов не более 5% энергии от
обычного.
Наиболее часто встречающиеся производители дисплеев: Samsung
(модели Samsung Sync Master 400b, 500s, 700p), ViewSonic, Sony (модель
CPD-100sft), Panasonic (модель TX-T1565). Первые две или одна цифры,
87
как правило, указывают размер экрана в дюймах (для марки 400b - 14
дюймов, TX-T1565 - 15 дюймов).
Немаловажным фактором является защита человека от вредного
излучения экрана. Каждый дисплей должен отвечать шведскому стандарту (принят как международный) MPR-II, иметь пониженное радиационное излучение (буквы LR в марке дисплея).
Вредное излучение дисплея в 95% случаев не удается обнаружить
из-за внешнего фона. В следующей таблице приводятся замеры у дисплея
VGA.
Частота излучения
5-100 Гц
10-150 кГц
150-300 кГц
0.3-30 МГц
30-300 МГц
Таблица 4.1.1. Параметры излучений у VGA дисплея
Магнитное поле,
Электрическое
Нормы VGA для
A/m
поле, B/m
магнитного и электрического поля
0.2
4.8
160-0.8; 2500-117(25)
0.17
4.8
0.8-0.6; 87(10)
0.48
0.6-0.42; 87(2.5)
0.00000066
0.024
0.42-0.073; 87-27.5
0.00000066
0.024
0.073; 27.5
В таблице 4.1.1 приведены допустимые нормы (по стандарту VGA
- последняя колонка, в скобках указаны нормы СанПиД 2.2.2.542-96),
которые безопасны для человека и реальные излучения (вторая и третья
колонки), которые удается зарегистрировать на определенных частотах
(первая колонка) у дисплея. Из таблицы видно, что они как минимум на
порядок ниже допустимых, т.е. дисплеи со стандартом MPR-II безопасны.
Влажность в помещении, где установлен компьютер, рекомендуется поддерживать не ниже 40%, что уменьшит поток ионов. Ионы могут
приводить к появлению сыпи на лице (это может произойти и от влияния
телевизора), других проявлений не отмечалось.
Магнитное поле частотой 15-100 Кгц, излучаемое монитором, не
опасно для здоровья (в том числе и беременных женщин), опыты проводились при работе 20 часов в день. Так в 1996 г. фирма, рекламирующая
фильтры, (в рекламе говорилось, что найдены прямые связи с утомлением
и головными болями) признана виновной судом Швеции в использовании
заведомо ложной информации. Рентгеновское излучение от люминофора
10-30 кВ также не опасно, так как поглощается стеклом экрана.
4.2. Видеоадаптеры
Для видеокарт было разработано несколько стандартов (соответственно было несколько типов адаптеров), которые сейчас не выпускают88
ся, но все современные адаптеры поддерживают последний стандарт, а,
следовательно, и первые. Следующие три являются наиболее распространенными:
CGA (Color Graphics Adapter - цветной графический адаптер) поддерживает текстовый режим 80х24 с 16 цветами, а также графический
320х200 с 4 цветами. Имеются еще некоторые режимы. Появился в 1973г.
Адаптер имеет 8 Кб памяти (для хранения изображения).
EGA (Enhanced Graphics Adapter - усовершенствованный графический адаптер) - поддерживает CGA, а также новые режимы, в том числе
640х480 с 16 цветами из палитры 64, имеет возможность подгрузки национальных шрифтов. Разработан в 1984 году.
VGA (Video Graphics Adapter или Array - видеографический адаптер или массив) - поддерживает EGA. Имеет 256 цветовой режим
320х200, благодаря чему стал самым популярным для игровых программ
(этот режим наиболее простой и быстрый для вывода графики). Требует
аналоговый монитор, имеет новый разъем. Разработан в 1987 году.
Далее появился Super VGA (SVGA), но стандартом он не стал,
каждый производитель выпускает свой тип этих адаптеров. Практически
все они поддерживают режимы 800х600, 1024х768 с числом цветов 256,
32768, 65536, 16 миллионов. Чтобы как-то стандартизировать все новые
режимы был принят стандарт VESA. Все новые выпускаемые адаптеры
поддерживают стандарт VESA. Существуют также стандарты 8514, MDA,
HGC и XGA (отличаются параметрами режимов).
Новые адаптеры содержат графические процессоры, акселераторы,
память. Даже самый простой графический акселератор позволяет увеличить скорость вывода более чем в 30 раз. Одной из характеристик адаптера является его разрядность. Существуют 16, 32, 64, 128, 192, 256 - разрядные акселераторы. Разрядность влияет на скорость вывода и обработки изображения. Наиболее существенными для программиста являются
следующие характеристики видеокарт:
 скорость вывода информации (байт/сек., экранов/сек.);
 объем памяти видеокарты;
 производители.
Первая характеристика важна для быстродействующих программ
(например - анимационных). В ПК существует два типа доступа к видеокарте:
 через BIOS системы;
 напрямую, через порты и каналы данных.
Соответственно, различают скорости вывода информации в зависимости от типа доступа к видеокарте. Измерить скорость вывода можно
89
с помощью определенных утилит (или написать собственную программу)
типа 3DBench, WinBench и т.п. Скорость вывода зависит также от скорости самого компьютера (центрального процессора) и от скорости и разрядности шины данных.
Вторая характеристика влияет на режимы работы видеокарты. Видеорежим - режим работы видеокарты, который характеризуется типом
отображаемой информации (графической или текстовой), разрешением
экрана (максимальное количество элементарных элементов выводимых
на экран) и количеством цветов (максимальное количество цветов отображаемых на экране). У каждого режима есть номер. В зависимости от
количества элементов - разрешения режимов и количества цветов видеоадаптер должен обладать тем или иным объемом памяти. Современные
карты содержат в основном 1Мб памяти (существуют от 4Кб до 24Мб).
Важной характеристикой памяти является скорость доступа к ней и скорость операций в ней, так как вся работа с изображением сводится к тем
или иным операциям с видеопамятью.
Третья характеристика влияет на способы аппаратного доступа к
видеоадаптеру. Наиболее часто встречаются видеокарты следующих производителей: Cirrus Logic, Trident, Diamond Multimedia, S3, Matrox, Realtek, Oak Technologies.
В любой видеоадаптер входят следующие пять устройств:
 контроллер катодно-лучевой трубки (CRTC) - управляет разрешением
и синхронизацией дисплея;
 атрибутный контроллер - управляет передачей атрибутов в видеопамять/из видеопамяти;
 графический контроллер - управляет передачей данных из видеопамяти в шину центрального процессора и данными из видеопамяти в атрибутный контроллер;
 секвенсор (SEQUENCER) - управляет передачей данных из видеопамяти или графического контроллера в атрибутный контроллер;
 DAC (Digital Analog Convector – цифро-аналоговый преобразователь) преобразователь цифрового сигнала в аналоговый, управляет преобразованием 8-ми битового цвета в аналоговый сигнал.
С помощью данных устройств можно работать с видеокартой на
низком уровне. Необходимо также отметить, что при сопряжении дисплея
с видеокартой компьютера необходимо учитывать особенности режимов
работы обоих (чтобы монитор позволял отображать режимы видеоадаптера).
Управление на низком уровне видеоадаптером позволяет использовать его с максимальной эффективностью, не затрачивая ресурсы цен90
трального процессора на лишние операции. При этом необходимо помнить, что изображение нужно записывать в видеопамять карты во время
обратного вертикального хода луча трубки (рисование происходит путем
пробегания луча по экрану слева направо, сверху вниз, при этом во время
возврата луча справа налево (в начало следующей строки) и снизу в вверх
(в начало первой строки) луч на экране не оставляет следа) - наиболее
длительный период отсутствия чтения данных из видеопамяти. Обратный
ход луча называется retrace.
Современные видеокарты, помимо основных своих функций, поддерживают, как правило, какой-либо стандарт (OpenGL, Direct3D или
другой) и встроенные функции графики (спецэффекты, нанесение текстуры и т.п.)
4.3. Видеорежимы
Таблица 4.3.1. Режимы вывода информации устанавливаемые через BIOS
Режим
Разрешение
Число цветов
Количество
видеостраниц
0,1 (текстовый)
360x400
16
8
2,3 (текстовый)
720x400
16
8
4,5 (текстовый)
360x200
4
1
6 (графический)
640x200
2
1
7 (текстовый)
720x400
2
1
Dh (графический)
320x200
16
8
Eh (графический)
640x200
16
4
Fh,10h (графический)
640х350
2, 16
2
11h (графический)
640х480
2
1
12h (графический)
640х480
16
1
13h (графический)
320х200
256
1
Замечание. Количество видеостраниц приведено для карты с памятью 256Кб. Количество видеостраниц - число экранов, которое возможно
иметь одновременно в данном режиме.
Как уже говорилось, возможные режимы работы карты зависят от
объема памяти, поясним это. У нас есть карта с видеопамятью 1Мб и нас
интересует, какие режимы можно будет включать. Для этого берем разрешение интересующего нас режима, например, 640х480 и количество
цветов, например, 16 миллионов. Тогда, если бы каждый пиксель представлялся одним битом (черно-белый режим), то нам нужно
640*480/8=38400 байт, но для получения 16 миллионов цветов (каждому
цвету соответствует одно двоичное число) потребуется 24 бита
91
(224=16777216) - 3 байта, тогда объем памяти такого режима должен составлять 921600 байт (для одной страницы).
1.
2.
3.
4.
5.
6.
7.
Замечания.
Память необходимая для отображения хотя бы одной страницы режима должна быть не больше объема видеопамяти карты.
Если объем видеопамяти карты больше объема одной страницы режима, то это не гарантирует наличие этого режима (режим должен
быть предусмотрен производителем карты).
Существуют только режимы со стандартными разрешениями и количеством цветов. По горизонтали разрешения могут быть: 320, 360,
720, 640, 800, 1024, 1280, 1600; по вертикали: 200, 350, 400, 480, 600,
768, 1024, 1200. Число цветов может быть: 2, 4, 16, 256, 32768, 65536,
16777216. Теоретически можно получить практически любой режим
из возможных комбинаций этих параметров (зависит от возможностей управляющих устройств карты), но на практике обычно достаточно стандартных: 320х200, 640х480, 800х600, 1024х768, 1280х1024,
1600х1200 с количеством цветов: 16, 256, 32768, 65536, 16777216.
Эти режимы, начиная с 256 цветных, приняты стандартом VESA.
Для правильного отображения режима, необходимо, чтобы монитор
поддерживал данный режим (карта генерирует сигнал на определенной частоте, например 72Гц, и если монитор не рассчитан на воспроизведение данного режима на этой частоте, то режим не будет включен). Как правило, карта позволяет больший размах вариантов, чем
монитор и каждый режим необходимо согласовывать. В настоящее
время практически любой выпускаемый монитор и любая видеокарта
поддерживает режимы VESA до 1024х768 и до 16 миллионов цветов
включительно.
Существуют режимы с 32-х битным представлением цвета. Число
цветов в этих режимах не 4294967296, а 16777216, 8 дополнительных
бит используются для ускорения работы с режимом и не несут цветового кодирования. Запись слова (2 байта) или двойного слова (4 байта) на 486-х процессорах и процессорах семейства Pentium можно организовать быстрее, чем запись трех байт (32-х разрядные инструкции).
Производитель иногда включает еще некоторые режимы на свое
усмотрение.
С помощью низкоуровневого программирования устройств видеокарты можно получить нестандартный режим, но нет гарантии, что он
будет работать на всех видеокартах.
92
8.
9.
Под цветом в видеорежимах понимается оттенок цвета.
Режимы с высоким разрешением применяются на больших мониторах, что позволяет улучшить качество изображения (точка экрана
меньше – меньше заметна дискретность) и увеличить количество информации на экране.
4.4. Цветовые схемы и палитра
В 1974 году было разработано понятие палитры. Память в те времена была дорогая, и иметь более 256Кб видеопамяти было очень
накладно. Скорость работы с памятью тоже была низка, а требовалось
качественное представление изображений со спутника. И изобретатели
догадались все многообразие цветов представлять небольшой частью
оттенков, которые использовались в данном изображении, а для следующего менять этот набор оттенков.
Так сложилось, что DAC (Digital Analogy Convector - цифроаналоговый преобразователь) у видеокарт VGA IBM PC имеет 18 разрядов (максимальное количество цветов - 216144) и из этой гаммы выбирается 256 для конкретного изображения. Число 256 не случайно, это количество цветов представляется одним байтом. Тогда режим (единственный
имеющий 256 цветов устанавливаемый через BIOS) 320х200 требует
всего 64000 байт и легко занимает одну страницу обычной памяти. Это
очень удобно для программиста, он может иметь необходимое количество
видеостраниц, храня их в обычной памяти и работать с ними в обычной
памяти, а при необходимости копировать соответствующую страницу в
видеопамять.
Замечание. Описанные преимущества режима 320х200 с 256-ю
цветами сделали этот режим самым популярным среди программистов
пишущих игры. Он самый быстрый и удобный в организации (каждая
точка - пиксель представляется одним байтом памяти). Только современные достижения в развитии видеокарт вытеснили этот режим из применения, на смену ему пришел режим 640х480 с 16 миллионами цветов.
Палитра - это ограниченный набор цветов из возможного множества. В различных видеосистемах существуют различные цветовые схемы
(они могут также использоваться в прикладных программах). Наиболее
часто встречаются схемы: RGB (Red Green Blue - красный, зеленый, синий - представление любого цвета идет с помощью этих трех базовых
цветов) и CMYK (базовые цвета: голубой, фиолетовый, желтый, черный первые три являются обратными к красному, зеленому, синему). Стандарт
RGB распространен не только в компьютерном мире, но и в бытовой
93
технике. Применяется при выводе изображения на дисплей или монитор,
а стандарт CMYK на бумагу (в принтерах).
Необходимо отметить также, что человеческий глаз (самый лучший) не способен отличить более 50000 оттенков (при плавном переходе
цветов). Однако существуют режимы с большим количеством цветов, это
понадобилось для графических станций, когда на экране необходимо
иметь несколько изображений с разными палитрами и обрабатывать еще
несколько изображений в памяти, а также из-за “точечности” экрана (на
растре, вследствие его дискретности, переходы между цветами выглядят
резче). Режимы с 32768 и 65536 цветами называют режимами HiColor
(высоко цветовые), а от 16 миллионов - True Color (с верной передачей
цветов).
Работу с палитрой можно вести через функции BIOS. Для работы
отведена функция 10h прерывания 10h.
Для установки цвета в палитре используют подфункцию 10h. Пример на ассемблере:
mov
AH, 10h
mov
AL, 10h
mov
BX, A
mov
CH, G
mov
CL, B
mov
DH, R
int
10h,
где R, G, B - три байта, характеризующие компоненты цвета - красную,
зеленую, синею (значения от 0 до 255), чем больше значение, тем больше
представлена эта компонента в цвете. Параметр A указывает номер цвета
в палитре для данного цвета (от 0 до 255).
Чтобы получить значения RGB для конкретного цвета в палитре,
можно использовать подфункцию 15h, в BX должен находится номер
цвета, тогда после вызова прерывания 10h в CH будет значение зеленой
компоненты (G), в CL - синей (В), в DH - красной (R).
Однако работать с палитрой по одному цвету, когда надо установить все цвета палитры (скажем для отображения готового изображения
из файла) долго и неудобно. Есть функции позволяющие установить и
считать сразу всю палитру.
Замечание. Представление цвета в компьютере имеет ряд недостатков. Во-первых, управление яркостью и оттенком производится одними и теми же компонентами. Во-вторых, существует ограничение на
значения (определенный отрезок). В природе цвет представляется длиной
94
волны (или частотой излучения), а его яркость энергией, причем нет
ограничений на значение яркости.
4.5. Стандарт VESA
Ассоциацией стандартов в области видеоэлектроники VESA (Video
Electronic Standards Association) была сделана попытка стандартизации
работы с различными SVGA платами путем добавления некоторого стандартного набора функций, обеспечивающих получение необходимой
информации о карте, установку заданного режима и доступа к видеопамяти. При этом ввели стандартный набор расширенных режимов. Номер
режима является 16-ти битовым числом, биты 9-15 зарезервированы и
должны быть равны 0, бит 8 для VESA-режимов равен 1, а остальные
биты указывают тип режима.
Таблица 4.5.1. Разрешения стандарта VESA
Номер
Разрешение
Бит на пиксель
100h
640x480
8
101h
640x480
8
102h
800x600
4
103h
800x600
8
104h
1024x768
4
105h
1024x768
8
106h
1280x1024
4
107h
1280x1024
8
10Dh
320x200
15
10Eh
320x200
16
10Fh
320x200
24
110h
640x480
15
111h
640x480
16
112h
640x480
24
113h
800x600
15
114h
800x600
16
115h
800x600
24
116h
1024x768
15
117h
1024x768
16
118h
1024x768
24
119h
1280x1024
15
11Ah
1280x1024
16
11Bh
1280x1024
24
Количество цветов
256
256
16
256
16
256
16
256
32768
65536
16 миллионов
32768
65536
16 миллионов
32768
65536
16 миллионов
32768
65536
16 миллионов
32768
65536
16 миллионов
В таблице 4.5.1 приведены основные графические режимы VESA.
Существуют также текстовые режимы VESA.
95
Замечание. Не каждый адаптер, поддерживающий стандарт VESA,
обеспечивает все указанные режимы.
О возможных режимах и о самом стандарте у конкретной карты
можно узнать обратившись к прерыванию BIOS 10h с функцией 4Fh,
подфункция 00h и 01h (первая для общей информации, вторая для информации о режимах).
Байты
0-3
4-5
6-9
10-13
14-17
18-19
20-255
Таблица 4.5.2. Структура общей информации VESA
Информация
слово “VESA”
версия VESA BIOS (целое число)
ссылка (адрес) на производителя
Совместимость
ссылка (адрес) на список режимов
память видеокарты в 64Кб блоках (их число)
Зарезервированы
Такую информацию можно получить, обратившись к подфункции
00h.
Байты
1
0-1
2
3
4-5
6-7
8-9
10-11
12-15
16-17
18-19
20-21
22
23
24
25
26
27
28
29
Таблица 4.5.3. Структура информации о режимах VESA
Информация
2
Характеристики режима (бит 0 – режим доступен, бит 1 – режим зарезервирован, бит 2 - вывод в этом режиме через BIOS, бит 3 - режим цветной, бит 4
- режим графический)
Характеристики банка А (бит 0 - банк поддерживается, бит 1 - из банка
можно читать, бит 2 - в банк можно писать)
Характеристики банка В (аналогично)
Шаг установки банка в килобайтах
Размер банка
Сегментный адрес банка А
Сегментный адрес банка В
Ссылка на функции работы с банками
Количество байт на одну строку
Разрешение по Х (максимум) в данном режиме
Разрешение по Y (максимум) в данном режиме
Число символов по Х (в текстовых режимах)
Число символов по Y (в текстовых режимах)
Число плоскостей в данном режиме
Число бит, отводимых на пиксель
Число банков памяти
Тип модели памяти
Размер банка
Число видеостраниц в данном режиме
96
30
31
32
33
1
34
35
36
37
38
39
40-255
Зарезервирован
Размер маски для красного цвета
Позиция поля красного цвета
Размер маски для зеленого цвета
2
Позиция поля зеленого цвета
Размер маски для синего цвета
Позиция поля синего цвета
Размер маски для резервного цвета
Позиция поля резервного цвета
Информация об управлении цветовым режимом
Зарезервированы
Такую информацию можно получить обратившись к подфункции
01h.
Конечно же, каждый раз используя средства компьютерной графики вы не будете опускаться до низкого уровня и программировать переключение банков и управление цветовыми масками, но полезно знать, как
устроены графические режимы (некоторые приемы работы используются
в других устройствах компьютера).
4.6. Два примера устройства графических
режимов
Пример 1. Устройство режима 13h BIOS (320x200 - 256 цветов).
Адрес видеопамяти экрана - 0хА000h. Каждый пиксель в этом режиме представляет собой байт (256 различных вариантов цветов из палитры). Поэтому для высвечивания точки на экране достаточно вычислить адрес смещения, сложить с адресом видеопамяти и занести по этому
адресу один байт требуемого цвета.
Так, например, мы хотим изобразить точку на экране с координатами (150, 76):
смещение 76*320+150=24470, или 5F96h в шестнадцатеричном
формате.
Сложив адрес видеопамяти и смещение мы получим адрес по которому надо заслать байт номера цвета из палитры.
Пример 2. Устройство режима 12h BIOS (640x480 - 16 цветов)
В данном режиме под каждый пиксель изображения необходимо
выделить четыре бита видеопамяти. Однако эти четыре бита выделяются
не последовательно в одном байте, а разделены в четыре блока - цветовые
97
плоскости видеопамяти (см. рис. 4.7.1). Таким образом, каждому пикселю
ставится в соответствие четыре, расположенных друг над другом, бита
(24=16). Все цветовые плоскости проецируются на один и тот же участок
адресного пространства, начиная с 0хА000h. Механизм проекции определяются логикой карты. Поэтому, если записать напрямую байт по адресу
начала видеопамяти, то это не приведет к
записи байта в одну из цветовых плоскостей.
Кроме определения адреса байта в ко0
тором будет содержаться необходимый пик1
2
сель, надо определить позицию пикселя
3
внутри байта.
В рассматриваемом режиме одному
Рис. 4.6.1. Цветовые
байту будет соответствовать 8 пикселей. В
плоскости
строке будет находиться 80 байт (80х8=640).
Если х и у - координаты пикселя, то адрес
байта (смещение относительно базового адреса видеопамяти) будет определяться следующим выражением:
80*у+(х>>3), где
>> - означает циклический сдвиг вправо внутри байта. Число 3 указывает
на количество сдвигаемых плоскостей (если бы была одна плоскость, то
сдвигать не нужно) для правильного расположения пикселей.
А положение бита в байте определяется битовой маской – байт, в
котором отличен от нуля только бит стоящий на позиции пикселя (в общем определении - единица на позициях нужных битов). Битовая маска
задается выражением:
0х80>>(x&7), где
& - битовое логическое “И”. Битовая маска необходима для защиты от
изменения остальных семи пикселей.
Так определяется нужный пиксель в этом режиме. Если не выполнить всех преобразований, то биты, определяющие цвет, не попадут в
соответствующие плоскости, что приведет к искажению изображения.
Остальные существующие режимы основываются на принципах
построения режимов этих примеров. Но наиболее часто встречаются
режимы (все с высоким разрешением) со вторым принципом построения.
98
4.7. Графические форматы изображений
растровой графики
Существует довольно много форматов изображений растровой
графики. Они позволяют хранить изображения в виде специальных файлов. Применение их позволяет различным приложениям использовать
изображения, не смотря на то, кто их создал. Графические форматы являются своеобразной унификацией. Их довольно большое количество
объясняется тем, что при развитии компьютерной графики различные
фирмы и компании старались создать свой стандарт, но время и поддержка большинством фирм только некоторых форматов оставили нам около
десятка, наиболее распространенных форматов. Это такие как: BMP
(BitMaP - битовая карта), PCX - (PiCture eXcels - ячейки изображения),
TGA (Targa), JPG, GIF, ICO (ICOn - файл пиктограмм) и некоторые другие.
4.7.1. Формат BMP
Файл BMP должен храниться в DIB-формате, чтобы его можно было отображать на компьютерах с различной графической аппаратурой.
Структура DIB-формата представлена в таблице 4.7.1.
Таблица 4.7.1. Структура DIB-формата
Смещение от
Структура
начала файла
0х00
BMPHeader - заголовок файла
0х0Е
BMPInfoHeader – характеристики изображения
0х36
RGBQuad - массив используемых цветов
BitmapBits – изображение
1.
2.
Длина элемента
14 байт
40 байт
Переменная
Переменная
Замечания.
Массив RGBQuad может отсутствовать в файле (см. далее).
Изображение в файле хранится перевернутое - первая строка файла
соответствует последней строке изображения. Вывод пикселей осуществляется слева направо.
Рассмотрим каждую структуру BMP-файла более подробно.
Структура BMPHeader. Содержит 14 байт (см. таблицу 4.7.2).
Таблица 4.7.2. Структура заголовка файла
Смещение от
Элемент
начала файла
Type - содержит два байта ASCII-кодов: “В” и “М”
0х00
(bitmap). Если эти поля файла содержат другие
символы, то это не BMP-файл.
99
Длина
элемента
2 байта
0х02
0х06
0х08
0х0А
Size - размер файла в байтах (не является размером
изображения), служит для проверки целостности
файла
Reserved1 - не документировано. Равно нулю
Reserved2 - не документировано. Равно нулю
OffBits - байтовое смещение до начала изображения
- блока BitmapBits
4 байта
2 байта
2 байта
4 байта
При считывании файла, проверяйте обязательно на соответствие
стандарту, поля Type и Size.
Структура BMPInfoHeader. Содержит 40 байт (см. таблицу 4.7.3).
Смещение от
начала файла
0х0Е
0х12
0х16
0х1А
0х1С
0х1Е
0х22
0х26
0х2А
0x2E
0x32
1.
Таблица 4.7.3. Структура характеристик изображения
Элемент
Длина
элемента
Size - размер структуры BMPInfoHeader в байтах
4 байта
Width - ширина изображения в пикселях
4 байта
Height - высота изображения в пикселях
4 байта
Planes - число цветовых плоскостей, равно единице
всегда, так как все BMP-файлы хранятся с одной
2 байта
цветовой плоскостью
BitCount - число битов на пиксель, 1 - монохромное,
4 - шестнадцать цветов, 8 - 256, 24 - более 16 мил2 байта
лионов оттенков (True Color)
Compression - показывает метод упаковки данных
4 байта
(если она есть) и применяется ли упаковка
SizeImage - размер изображения в байтах, может
4 байта
быть равно нулю, если изображение не сжато
XPelsPerMeter - указывает предпочтительное раз4 байта
решение по горизонтали на метр
YPelsPerMeter - указывает предпочтительное раз4 байта
решение по вертикали на метр
ClrUsed - содержит число цветов, если равен нулю,
4 байта
то используется максимум возможных цветов
ClrImportant - содержит число важных цветов изображения (они идут первыми в палитре). Если равен
4 байта
нулю, то все цвета важны. Не имеет смысла для 24х битового режима
Замечания.
Если параметр BitCount равен единице, то это не означает, что изображение черно-белое (хотя так часто бывает). Необходимо считать
первые два элемента (их всего два) из массива RGBQuad и ими выводить изображение.
100
2.
3.
4.
Использовать значения параметров XPelsPerMeter, YPelsPerMeter
можно для выбора подходящего изображения среди многих его вариантов с разными разрешениями. Теоретически чем ближе разрешающая способность устройства отображения соответствует этим параметрам, тем лучше будет выглядеть изображение на экране. На практике это значение используется редко.
Если параметр ClrImportant отличен от нуля, то первые цвета, число
которых он определяет, в массиве RGBQuad должны быть максимально точно отображены, остальные не сильно влияют на качество
изображения.
Параметр Compression может иметь три значения: BI_RGB - изображение не сжато, BI_RLE4 - 4-х разрядное групповое кодирование для
16-ти цветных изображений, BI_RLE8 - 8-ми разрядное групповое
кодирование для 256-ти цветовых изображений. Полноцветные (True
Color) изображения не сжимаются.
Структура RGBQuad
Пиксели растрового изображения являются индексами массива
цветовых значений RGBQuad (кроме изображений True Color, там каждому пикселю соответствует тройка RGB). RGBQuad состоит из трех байтов
RGB (красной, зеленой и синей компонент) и одно дополнительного байта (обычно он равен нулю и неиспользуется). Таким образом, массив
содержит палитру изображения. Пиксель указывает номер цвета - индекс
элемента в этом массиве, которому соответствует четыре байта.
При монохромном изображении в массиве всего два элемента. А
при изображении True Color (24 бита на пиксель) данный массив отсутствует, пиксель напрямую задается тремя байтами.
Сжатие файлов BMP
При сжатии используется техника группового кодирования - группы одноцветных пикселей (идущих подряд в изображении) записаны в
виде числа n и цветового значения v. При распаковки необходимо, соответственно, вывести подряд n пикселей цвета v.
Замечание. Сжатие в самих форматах графических изображений
применяется часто, это обусловлено тем, что изображение хранит очень
много избыточной или повторяющейся информации. В этом можно убедиться, сделав статистический анализ изображений. Наиболее сильное
сжатие (компрессия) применяется в файлах формата JPG.
Рассмотрим формат сжатия BI_RLE8 для 256 цветных файлов.
101
В данном формате пиксели хранятся в виде многобайтовых блоков,
как минимум, по два байта каждый. Если первый байт блока равен нулю,
то это код выхода, за которым последуют командные байты. Командные
последовательности формата BI_RLE8 представлены в таблице 4.7.4.
Если первый байт блока не равен нулю, то необходимо отобразить
столько пикселей цветом следующего байта (из массива RGBQuad),
сколько указано в этом байте (это только если изображение сжато форматом BI_RLE8). Пусть, например, имеется блок 09 2А - первый байт
отличен от нуля, следовательно, он представляет собой число отображаемых пикселей на экране (их девять). Второй байт - индекс цвета. Необходимо взять элемент с индексом 2А из массива RGBQuad. Пиксели выводятся с текущей позиции слева направо, причем первая строка пикселей
файла соответствует последней строке изображения (снизу вверх).
Код выхода
00
00
Байты
00
01
00
02 хх уу
00
nn k1,...,kn
Таблица 4.7.4. Командные последовательности
Команда
Закончить текущую строку развертки и начать новую.
Конец данных. Закончить распаковку изображения.
Вектор. Отобразить следующий пиксель с ххгоризонтальным, уу-вертикальным смещением от
текущей позиции. Цвета пропущенных пикселей не
определяются.
Абсолютный режим. Для 3n255 отобразить nn
несжатых пикселей с цветами, определяемыми индексами k1,...,kn. Поскольку все команды должны иметь
четное число байтов, блок этого типа заканчивается
дополнительным нулевым байтом, если nn нечетное.
Если блок начинается с кода 00, то такой блок требует специальной
обработки. Второй байт этого блока является командой или иным значением от 0 до 255.
Если второй байт равен 00, то (см. табл. 4.7.4) программа обработки должна отобразить следующий пиксель с новой строки развертки
изображения.
Если второй байт равен 01, то (см. табл. 4.7.4.) программа обработки должна прекратить распаковку изображения. Если изображение распаковывалось в буфер, то необходимо отобразить этот буфер.
Если второй байт равен 02, то (см. табл. 4.7.4.) программа обработки должна вывести следующий пиксель со смещением определяемым
следующими двумя байтами, относительно текущей позиции. Так,
например, есть байты 00 02 05 04 10, программа должна сместить пик102
сель с индексом цвета 10 на 5 пикселей правее и на 4 пикселя ниже (на
самом деле выше - вывод происходит снизу вверх) текущей позиции.
Замечание. Данная команда - дельта команда полезна для наложения изображения переднего плана на некоторый фиксированный фон. Это
один из важных приемов мультипликации. Значения цветов пропущенных
пикселей не определяются. При использовании дельта команд программа
должна, как правило, сначала отобразить фон, а затем передний план.
Однако дельта команды не всегда полезны при сжатии большинства BMPфайлов.
Если второй байт равен значению от 3 до 255, то (см. табл. 4.7.4.)
программа вывести группу из nn пикселей цветами определяемыми значениями индексов k1,...,kn. Если nn нечетно, то группу должен замыкать
нулевой байт, который выводить не нужно (нужно быть внимательным,
если nn четно, то последний нулевой байт выводить необходимо). Данный абсолютный режим полезен для малого числа разноцветных смежных пикселей.
Для 16-ти цветных изображений применяется сжатие BI_RLE4, которое отличается тем, что сжатие производится для четырех битов, а не
для байтов.
Замечания.
1. Факт, что изображение в файле хранится снизу вверх, в документации на формат BMP явно не указано. Однако возможно существование файлов, в которых изображение записано сверху вниз.
2. Такое подробное описание форматов не всегда необходимо. Часто
требуется записать файл изображения или считать его в самом простом формате (без сжатия).
4.7.2. Формат Targa
В данном формате изображение имеет один заголовок. Его структура приведена в таблице 4.7.5.
Таблица 4.7.5. Структура форма Targa
Смещение
Длина элемента
относительно
начала файла
00
1 байт
01
1 байт
02
03
05
1 байт
2 байта
2 байта
Элемент
TextSize – размер текстового комментария
к изображению (до 255 символов)
MapType – тип карты вывода (тип изображения)
DataType – тип сжатия данных
MapOrg – организация карты вывода
MapLenght - длина карты вывода
103
07
1 байт
08
2 байта
0А
2 байта
0С
0Е
10
11
2 байта
2 байта
1 байт
1 байт
CMapBits – символ карты битов
XOffset – отступ слева до изображения, в
пикселях
YOffset – отступ сверху до изображения, в
пикселях
Width - ширина изображения, в пикселях
Height - высота изображения, в пикселях
DataBits - число бит на пиксель
ImType - тип изображения
После заголовка из 18 байт, следует строка комментария к изображению, длиной TextSize. А затем данные и палитра (по организации похожи на формат BMP).
Допустим, есть изображение в режиме True Color (24 бита на пиксель). Тогда нам важны следующие параметры: в изображении каждому
пикселю соответствует 3 байта RGB соотношения (красный, зеленый,
синий), причем располагаются они в файле в обратном порядке. Сначала
идет байт синей компоненты, затем зеленой, а после красной. Для данного режима параметр ImType равен 32. Если изображение не подвергать
сжатию, то параметр DataType равен 2. Еще нам понадобятся параметры
высоты и ширины изображения. Этих значений будет достаточно, чтобы
создать файл и записать в него (или считать из него) наше изображение.
Более подробное описание данного формата не приводится из-за
его объема.
Замечание. Полные описания форматов довольно большие. Так,
например, формат JPG описывается на 500 страницах.
На этом рассмотрение форматов закончим.
4.8. Графические стандарты
В компьютерной графике существует несколько стандартов организации графического интерфейса прикладных программ и интерфейсов
трехмерной графики, которые используются на многих аппаратных и
программных платформах. Одним из самых распространенных промышленных стандартов является OpenGL. Однако пользователи и специалисты отобрали еще два: QuickDraw3D и Direct3D. Несмотря на то, что они
напрямую конкурируют друг с другом и близки по функциональным
свойствам, все же отнюдь не одинаковы.
Все три интерфейса способны работать в двух режимах - интерактивном, или непосредственном (immediate) и в режиме сохранения (retained). В первом случае действия пользователя просчитываются и выво104
дятся на экран сразу по поступлении соответствующей команды. Во втором случае, эффективном при выполнении часто повторяющихся команд,
результаты их начального исполнения заносятся в специальную структуру данных, многократно используемую впоследствии. Это бывает полезно, если манипуляции с объектами на некотором этапе заранее известны.
4.8.1. Стандарт OpenGL
OpenGL (Open Graphics Language - открытый графический язык)
зародился в недрах фирмы SGI (Silicon Graphics Inc.). Он изначально
планировался как аппаратно-независимый продукт.
OpenGL - это программный интерфейс для графического оборудования, позволяющий обрабатывать высококачественные цветные плоские
и трехмерные объекты. Стандарт отвечает только за визуализацию, осуществляемую через полностью независимый от производителя прикладной интерфейс пользователя API (Application Program Interface - интерфейс прикладной программы). Моделирование, функции преобразования
в двух- и трехмерном пространстве, управление освещением, формирование цветовых оттенков, затенение, а также работа с текстурами и использование NURBS кривых являются неотъемлемой частью системы визуализации в OpenGL. Используя весь предыдущий опыт развития графической аппаратуры, в данном стандарте предусмотрена работа как непосредственно с графическими ускорителями, так и через дисплейный
файл.
OpenGL является оконным пакетом, независимым от операционной
системы, и уже сегодня прекрасно интегрированный с X-Window System
и Windows NT. Для работы в распределенных приложениях клиент-сервер
предусмотрена подсистема GLX - расширение OpenGL на X-Windows. В
отличие от других стандартов машинной графики, OpenGL требует во
всех его программных системах реализации всех функциональных возможностей, в том числе даже некоторых расширенных приемов по визуализации. Этого нельзя сказать, например, о РЕХ.
Возможности OpenGL.
При работе с текстами в OpenGL предусмотрена возможность преобразования шрифтов из X Window System или MS Windows непосредственно в свой буфер. При выполнении разнообразных графических преобразований возможна организация конвейеров. Обработка изображений
предусматривает различные операции по чтению, копированию и записи
пикселей непосредственно в буфере кадра. Обработка текстур является
одним из наиболее мощных средств OpenGL, среди которых управление
105
временем выполнения преобразований для достижения требуемого качества изображения, автоматическое задание координат и трансформация
текстур с помощью матрицы 4х4, привязка текстуры на поверхность произвольной формы. Для борьбы с чередованием изображения, наблюдаемым на некоторых графических дисплеях, внутренней архитектурой
OpenGL предусмотрен специальный механизм буферизации, позволяющий избежать данного эффекта при выводе всей сцены целиком. Работа с
твердотельными моделями является неотъемлемой частью OpenGL и
предусматривает поддержку булевых операций над объектами. Реализация эффекта глубины изображения, а также иллюзии тумана выгодно
отличают OpenGL. Все это возможно в рамках стандартной системы,
использующей унифицированные алгоритмы и программы, работающие
на большинстве современных аппаратных и программных платформах.
Многоплатформенность, поддержка концепции клиент-сервер и наличие
большого количества совместимых профессиональных приложений является сильной стороной OpenGL.
Для интерактивной работы с трехмерными графическими объектами требуется более высокая производительность, чем при визуализации
плоских сцен. На скорость выполнения графических операций оказывает
влияние не только оперативность геометрических преобразований, но и
загрузка центрального процессора, дисциплина работы с кэшами и использование основной памяти компьютера. В отличие от другого графического стандарта, РЕХ, в OpenGL нет специальной структуры для хранения исходных данных. Вся информация без дополнительных преобразований выбирается непосредственно из прикладной задачи. Как следствие этого, освобождается процессор, не используется кэш-память и
отпадает необходимость дублирования информации. Предусмотренная в
OpenGL дисциплина выборочного изменения атрибутов только по запросу клиента (а не всего дисплейного списка целиком) также способствует
ускорению операций визуализации.
Важной особенностью OpenGL является технология управления
цветом, который задается теперь не тройкой RGB по 8 бит для каждого
цвета, а через нормализованное вещественное число от 0.0 до 1.0 (соответственно от 0 до 100 процентов). Возможность проводить геометрические преобразования относительно произвольной оси, а не последовательно вокруг осей Х, Y, Z, а также трехмерное указание, дополнительно
возвращающее глубину расположения объекта.
Все функции API OpenGL для Windows NT могут быть доступны
для языков программирования С/С++, Ada, Java, Fortran, так как они содержатся в динамических библиотеках DLL.
106
Развитие промышленного стандарта OpenGL контролируется независимой организацией Architecture Review Board (ARB). Членами этой
организации являются фирмы DEC, IBM, Intel, Intergraph, Microsoft, SGI.
OpenGL реализован сегодня на моделях ведущих фирмпроизводителей: Silicon Graphics, начиная с версии операционной системы IRIX 5.2, включает OpenGL в комплект рабочих станций Indy 8/24 бит,
Indigo - Entry Level, XS, XS24, XZ, Elan, Indigo2 - XL, XZ, Onyx и некоторые другие.
Корпорация Digital Equipment предлагает OpenGL как часть продукта DEC Open3D, входящего в состав операционных систем OSF/1,
AXP и OpenVMS AXP. Данный стандарт аппаратно реализует графические устройства семейства PXG, поддерживающие работу с z-буфером,
ускорители ZLX-M1, ZLX-M2, ZLX-E1, ZLX-E2.
Фирма IBM предлагает OpenGL 1.0 на большинстве конфигураций
рабочих станций линии RS/6000. Графические ускорители среднего и
высшего звена POWERgraphics GXT1000 и Freedom Series 6000 полностью аппаратно реализуют все предусмотренные в OpenGL возможности
по обработке текстур, буферов шаблонов, а также высокопроизводительные операции по освещению и геометрическим преобразованиям.
Sony предлагает OpenGL в составе программного обеспечения
RISC-станций серии NEWS под управлением операционной системы
NEWS OS версии 6.х и более поздних.
Недостатками OpenGL является ограниченность набора примитивов, он состоит из линий, поверхностей, полигонов и не содержит таких
элементов, как сферы, эллипсоиды, конусы, торы и т.п. В OpenGL нет
собственного формата файла, а, следовательно, функций ввода-вывода.
Поэтому для создания конечных полнофункциональных приложений
часто применяют инструментарий, состоящий из набора функций, которые реализуют недостающие в OpenGL высокоуровневые компоненты
(например, Open Inventor 2.0).
Для тестирования программ, поддерживающих OpenGL, используют тесты Viewperf, разработанные организацией OpenGL Performance
Characterization Committee. Они подобны популярным тестам SPEC, построены на решении специально подобранных задач. Это, в частности,
полет виртуального самолета над трехмерным ландшафтом, вращение на
экране изображения головы человека, а также некоторые операции с примитивами.
4.8.2. Стандарт QuickDraw3D
107
Интерфейс QuickDraw3D разработанный фирмой Apple, был представлен в 1995 году. В отличие от OpenGL он имеет собственный файловый формат (3DMF - 3D metafile), высокоуровневые примитивы, а также
строенные возможности визуального выбора и редактирования объектов.
Кроме того, функции высокого уровня, предназначенные для создания
приложений, явным образом отделены от интерфейса RAVE (Rendering
Acceleration Virtual Engine - виртуальная машина ускорения трассировки),
управляющего аппаратурой. Этот интерфейс полностью изолирует разработчика от аппаратных особенностей и самостоятельно принимает решения об оптимальном использовании всех ресурсов компьютера, включая
установленное системное программное обеспечение и 3D-ускорители.
Характерно, что сервисом могут пользоваться и другие графические интерфейсы высокого уровня, что обеспечивает QuickDraw3D важное свойство расширяемости. Поддержка в качестве примитивов (как и в OpenGL)
неоднородных рациональных B-сплайнов (NURBS кривые), реализующих построение плавных поверхностей, позволяет интерфейсу QuickDraw3D также претендовать на роль ведущего в приложениях технического моделирования.
Данный стандарт поддерживают такие производители, как S3,
Matrox, Diamond Multimedia, ATI и другие.
4.8.3. Стандарт Direct3D
Интерфейс Direct3D появился в 1996 году (коммерческая версия) и
ограничивается поддержкой Windows 95. Разработан фирмой Microsoft.
Он не имеет таких мощных примитивов и возможностей, как QuickDraw3D, но вместе с тем обладает рядом свойств, отсутствующих в
OpenGL. Direct3D, например, поддерживает создание анимации - свойства, весьма полезного для создания компьютерных игр и мультимедийных приложений. За счет явного выделения программного слоя, отвечающего за взаимодействие с аппаратурой, он так же, как и QuickDraw3D,
является расширяемым. Методы Direct3D доступны посредством вызова
библиотечных функций из C/C++. В ближайшем будущем для этой цели
предполагается задействовать и Visual Basic.
Стандарт включен в пакет драйверов для мультимедиа DirectX.
4.9. Аппаратные ускорители графики
Чтобы обычный компьютер (с процессором Pentium) стал графической рабочей станцией необходимо три специализированных компонента:
аппаратный ускоритель трехмерной графики, мощные программные ин108
терфейсы системного уровня (некоторые были рассмотрены выше), и,
конечно же, разнообразные приложения. Однако существуют компьютеры, которые изначально направлены на решение графических задач графические станции. Их отличает специализация по всем компонентам,
начиная от архитектуры и кончая деталями - процессорами, памятью. Тем
не менее, центральным элементом графической станции является видеокарта с ускорителем.
Аппаратные ускорители.
Одним из важных свойств ускорителей является поддержка программ трехмерной графики. Сердцем ускорителя является специализированная микросхема, она конструируется с расчетом на специальные процессы построения или изменения изображения.
Наиболее часто в ускорителях реализуются следующие процессы,
функции, методы и технологии обработки изображений:
 антиалиасинг (anti-aliasing) - метод обработки изображений, позволяющий слегка “размыть” резкий переход между границами отдельных объектов и фоном. Такое искусственное сглаживание увеличивает реалистичность (“жизненность”) изображения.
 атмосферные эффекты (atmospheric effects) - специальные алгоритмы обработки изображения, позволяющие создать иллюзию тумана,
дыма и т.п., а также скорректировать цвета объекта при удалении от
наблюдателя.
 взвешенное наложение (alpha blending) - технология, позволяющая
добиваться различных эффектов прозрачности («стекло», «дым»,
«туман», «вода» и т.д.), смешивать две текстуры, отображать одну
текстуру поверх другой без полного скрытия последней. Изображение обычно имеет значения красного, зеленого и синего цветов для
каждого пикселя. Кроме того, оно также может иметь значение альфа
для каждого пикселя. Если это значение присутствует, то говорят, что
в данном изображении есть альфа-канал. Значение альфа указывает
на прозрачность пикселя. Обычно канал имеет 8 бит, а, следовательно, до 256 градаций прозрачности от 0 – полностью прозрачного, до
255 – светонепроницаемого
 графические примитивы (graphics primitives) - функции изображения базовых элементов (линии, треугольники, сплайны и т.д.), используемые для создания трехмерных сцен.
 графический конвейер (graphics pipeline) - процесс трехмерного
рендеринга (трассировки), включающий последовательность опреде109








ленных этапов, начиная с задания координат объектов и заканчивая
выводом на экран.
дисеринг (dithering) - метод, позволяющий за счет уменьшения пространственного разрешения создать более богатую цветовую палитру
на устройстве с низким цветовым разрешением. Эффект достигается
аппроксимацией элемента изображения нужного цвета несколькими
пикселями имеющихся цветов, которые воспринимаются пользователем совместно.
затенение Гуро (Gourand shading) - метод, используемый для создания реалистических образов объектов с гладкими поверхностями, аппроксимируемыми большим количеством дискретных плоских полигонов. Эффект “гладкости” достигается за счет линейной интерполяции цветов соседних полигонов.
наложение текстур (texture mapping) - алгоритмы наложения двумерных текстур на трехмерные поверхности объектов с учетом пространственных искажений и эффекта перспективы. Текстура (texture)
- это имитация на экране дисплея каких-либо реальных однородных
или периодических поверхностей (кирпич, метал, пластик, дерево,
травянистое поле и т.п.).
рендеринг (rendering) - процесс преобразования геометрических
данных о трехмерной сцене в ее реалистическое изображение на
экране дисплея.
метод z-буфера (z-buffer) - метод удаления невидимых линий. Важной характеристикой является объем z-буфера.
двойная буферизация (double buffering) – прием, позволяющий делать анимацию или движение полигона более гладким. Часть памяти
используется для хранения законченного кадра, пока компьютер считает следующий. Так, вместо прорисовки кадра во время его расчета,
компьютер сначала завершает расчет кадра и только тогда выводит
его на экран.
фильтрация (filtering) – технология, сглаживающая текстуры, отображенные на трехмерные объекты. При отображении на 3D-объект
текстура может деформироваться, что приводит к ее распадению на
пиксели. Подобное происходит, когда вы, например, приближаетесь
ближе к предмету. Фильтрация устраняет этот эффект.
двулинейная фильтрация (bi-linear filtering) – метод, позволяющий
после применения фильтрации, цвет каждого пикселя текстуры определять смешиванием цветов четырех прилежащих пикселей внутри
исходной текстуры.
110

отображение mip (mip-mapping, название произошло от латинского
изречения «multum in parvum» - многое в одном) – метод использования различных версий одной текстуры (или разных mip-карт) для
различных типов полигонов или для различных пикселей (в зависимости от местоположения). Каждая версия исходной текстуры соответствует своему уровню детализации (LOD – Level Of Detail). Для
примера одна версия будет использована для маленьких полигонов, а
другая для крупных. Первая будет использована на дальних расстояниях, а большая текстура будет использована на близком расстоянии.
Двулинейная фильтрация ослабляет эффект того, что, когда текстура
растягивается, каждый пиксель внутри этой текстуры отображается
на большое количество пикселей на полученной текстуре. Mipmapping «исправляет» изображение в обратном случае, когда объект
удаляется (становится меньше).
 корректирование изображения текстуры в перспективе (Perspective correct texture mapping) – отображение текстуры производится с
корректировкой последней, учитывая расстояние до объекта. Эта
функция важна при создании реалистичных трехмерных объектов.
 растеризация (Rasterization) – процесс преобразования трехмерного
изображения в набор цветных пикселей.
Не вдаваясь в подробности конструкции ускорителей, отметим несколько важных моментов. В большинстве плат устанавливаются универсальные 3D-процессоры, которые помимо своей основной задачи выполняют и другие функции (см. выше), характерные для графической платы.
Так, процессор NV1 фирмы NVIDIA применяется в платах Diamond Edge
3000 фирмы Diamond Multimedia, позволяет аппаратно поддерживать
работу с двухмерной графикой, динамическим видео и аудиофункциями.
К классу универсальных сравнительно дешевых плат можно отнести
очень популярную графическую плату MGA Millennium фирмы Matrox (2
Мб видеопамяти), плату 3D Xpression фирмы ATI Technologies, 3DBlaster компании Creative Labs и некоторые другие. С помощью этих карт
можно выводить графическую анимацию полностью текстурированных
сцен в полноэкранном формате с разрешением 800х600 или даже
1024х768 пикселей и 16-ти разрядном цвете (65536 цветов) при частоте
регенерации изображения 30 кадров в секунду. С помощью же чисто программного рендеринга эту задачу на компьютере класса Pentium 100
можно было бы решить в самом лучшем случае в окне 150х150.
Наряду с процессорами общего назначения есть и более специализированные. Графический процессор Verite фирмы Rendition, устанавли111
ваемый в платы 3D-Blaster, ориентирован, прежде всего, на индустрию
компьютерных игр.
Что касается поддержки графических стандартов, некоторые из
графических плат-акселераторов, по крайней мере, частично поддерживают стандарт OpenGL, а с середины 1996 года многие производители (в
том числе и выше перечисленные) заявили о поддержке интерфейса
RAVE.
В особую группу (очень дорогие) можно выделить платы предназначенные для работы с САПР, киновидеопродукцией и настольными
издательскими системами. Такие платы могут стоить до нескольких тысяч долларов. Наиболее часто в них используется процессор GLINT 300
SX фирмы 3DLabs. Этому процессору принадлежит особое место: он
изначально спроектирован как устройство с максимально полной поддержкой стандарта OpenGL. Он позволяет выполнять все процессы, методы и функции, которые были перечислены выше, а также некоторые
другие. Помимо процессора GLINT, фирма 3DLabs поставляет микросхему Delta, позволяющую взваливать на плечи акселератора и расчет геометрии трехмерных сцен. Представителем конечных продуктов использующих процессоры GLINT, являются, например, плата 3Demon корпорации Omnicorp или GLORIA 4 фирмы Elsa America, по цене 2-4 тысячи
долларов.
Особенностью элитных видеокарт является возможность установки большого количества видеопамяти (обычно до 24 Мб), а также дополнительной динамической памяти, предназначенной для хранения текстур
и Z-буфера. Увеличение памяти, монтируемой на плате, способствует
ускорению работы с изображениями при высоком разрешении (1024х768
и выше).
Интересно, что, как показывают результаты сравнительных испытаний, при низких разрешениях и небогатой палитре цветов, без частого
использования спецэффектов работа плат низкой и высокой стоимости
практически не различается.
4.9.1. Основные 3D-чипсеты для ускорения графики в играх
3Dfx Voodoo.
Различают следующие чипсеты: Voodoo Graphics и Voodoo Rush.
Выпускаемые 3D-ускорители на основе чипсета 3Dfx Voodoo Graphics:
 Diamond Monster 3D;
 Orchid Righteous 3D;
112

Canopus Pure 3D.
3D-ускорители на основе чипсета 3Dfx Voodoo Rush:
 Intergraph Intense 3D Voodoo;
 Hercules Stingray 128/3D.
Основные отличия Voodoo Graphics и Voodoo Rush заключаются в
том, что последний может работать с акселератором двухмерной графики
на одной карте и ускорять трехмерное изображение в окне, а не только в
полный экран как первый чипсет. Однако, производительность второго
несколько ниже первого.
Недостатки данных чипсетов:
 ограничение памяти акселератора 4 Мб пределом;
 отсутствие поддержки двухмерной графики (для работы в Windows
необходима еще одна карта);
 нет поддержки разрешений больше 640х480 при 16-ти разрядном цвете.
В настоящее время появился новый чипсет Voodoo 2. Он также является дополнением для видеокарты 2D или 2D/3D. Поддерживает шину
AGP и разрешение 1024х768. На шине PCI могут использоваться две
карты Voodoo 2 в режиме SLI (Scan Line Interleave), что позволяет удвоить
общую производительность. Данный чипсет оптимизирован для работы с
процессорами Pentium, Pentium Pro, Pentium II. Поддерживает DirectX 6.0
и полноэкранную акселерацию. Базовая конфигурация: 192-битная архитектура памяти, 2.2 Гб/с полоса пропускания текстуровой памяти, более
50 млрд. операций в секунду. Производительность более чем в 3 раза
превышает производительность чипсетов Voodoo Graphics и Voodoo Rush.
Возможности и функции чипсета Voodoo 2:
 корректировка текстур в перспективе;
 двух- и трехлинейная фильтрация текстур (за один цикл);
 z-буфер;
 Mip Mapping по методу LOD;
 аппаратное затенение по методу Гуро;
 поддержка 14 форматов хранения текстур, включая сжатые;
 операции со всеми видами поддерживаемых текстур;
 полная аппаратная поддержка операций с треугольниками;
 антиалиасинг;
 взвешенное наложение;
 операции с альфа-каналом: туман, полупрозрачность, прозрачность;
 наслаивание текстур (если двух, то за один цикл), поддержка анимированных текстур и текстур с морфингом;
113
 поддержка 3Dfx Interactive Glide, Direct3D, OpenGL, QuickDraw, 3D
Rave.
По своим характеристикам Voodoo 2 бесспорно претендует на лидерство в области ускорителей трехмерной графики (на персональных
компьютерах совместимых с IBM PC).
NVidia Riva 128.
Ускоряет как двухмерную, так и трехмерную графику, имеет видеовыход, поддерживает сверхбыстрые типы памяти, поддерживает разрешения больше 640х480 при 16-ти битовой глубине цвета (до 960х712),
поддерживает стандарт PCI 2.1, AGP. Данный чипсет используется в видеокартах:
 Diamond Viper 330;
 Elsa Victory Erazor;
 STB Velocity 128 3D.
Недостатки: ограничение объема памяти 4 Мб, невысокая производительность под Windows NT, как в трехмерной, так и двухмерной
графике при глубине цвета 24 бита.
3D Rage Pro.
Данный чипсет имеет неплохую производительность, поддерживает до 8 Мб сверхбыстрой памяти, обладает хорошей поддержкой функций
трехмерной графики, имеет текстурный кэш объемом 4 Кб, блок акселерации двухмерной графики, поддерживает AGP. Видеокарты использующие данный чипсет:
 ATI Xpert@Work;
 ATI Xpert@Play.
Недостатки: мало видеокарт реализованных на этом чипсете, высокая цена, недостаточная производительность.
MGA 2164W.
Чипсет оптимизирован для работы с Pentium II, поддерживает до
16 Мб быстрой памяти, разрешение до 1920х1200 точек. На данном чипсете построена карта Matrox Millennium II.
Недостатки: высокая цена, отсутствие поддержки даже основных
функций трехмерной графики (хотя об этом заявлено фирмой), самая
низкая производительность в трехмерной графике в данном классе, слабая поддержка другими производителями.
114
4.9.2. Специализированный графический порт AGP
Спецификация AGP (Accelerated Graphics Port) основана на версии
2.1 шины PCI (66 МГц). По сути, это адаптированный для возрастающих
потребностей трехмерной графики вариант PCI. AGP представляет собой
выделенный канал «видеокарта – оперативная память» с полосой пропускания 32 бита. Рабочая частота канала – 66 МГц. Поддерживается пересылка данных на начальной и конечной стадиях каждого цикла, таким
образом эффективная частота увеличивается вдвое – до 132 МГц. Эти
новшества повышают пиковую пропускную способность со 132 Мбайт/с
(как в варианте PCI) до 528 Мбайт/с. Кроме того, AGP позволяет хранить
текстуры не в локальной памяти графической платы, а в системной памяти машины. При использовании DIME (Direct Memory Execute – направленное использование памяти) полоса пропускания не делится между
устройствами, как это было в случае с PCI. Центральный процессор может использовать системную память параллельно, одновременно (concurrently) с чтением из памяти AGP графического чипа. Как правило, центральный процессор осуществляет доступ к основной памяти гораздо
быстрее, чем к графической через AGP, но и в том и в другом случаях все
же быстрее, чем через шину PCI.
Стандарт AGP включает в себя 3 модификации:
1. x1 – первая версия стандарта AGP, поддерживающая пропускную
способность шины до 264 Мбайт/с (вдвое больше максимальной
пропускной способности на 33 МГц).
2. x2 – модификация стандарта AGP с удвоенной пропускной способностью. Работает также на 66 МГц. Обеспечивает увеличение скорости
за счет передачи информации на начальной и конечной стадиях цикла. Для работы необходима поддержка этого стандарта видеокартой,
никаких дополнительных устройств не требуется.
3. x4 – ожидается в начале 1999 года. Пропускная способность выше 1
Гбайт/с. Рабочая частота точно не известна, возможно, 133 МГц.
Поскольку AGP – всего лишь «расширение» шины PCI, то все операционные системы, поддерживающие шину PCI, будут поддерживать
этот новый стандарт. Данный стандарт уже был одобрен ведущими производителями, как программного обеспечения, так и компаниямипроизводителями графических акселераторов. Все платы стандарта AGP
можно разделить на три категории:
 Без поддержки DIME – никаких преимуществ перед обычными платами, за исключением более высокой пропускной способности, возможно отсутствие «многоуровневого запроса» (pipelined request).
115
 С поддержкой DIME – производительность платы увеличивается, если
текстуризация происходит не из локальной памяти видеокарты.
 С поддержкой DIMEL (Direct Memory Execute and Local also) – использует текстуризацию как из графической, так и из системной памяти. Более часто используемые текстуры и/или небольшие хранятся в
графической памяти, остальные - в системной памяти. Дает заметное
повышение производительности.
Для поддержки DIME необходима поддержка GART (Graphics Address Remapping Table – таблица графических адресов масштабирования),
осуществляемая только Windows NT 5.0 и Windows 98. Хотя существуют
драйверы для предыдущих версий этих операционных систем.
Два замечания к возможностям AGP.
1. Вообще говоря, программ, которые вынуждают хранить текстуры за
пределами графической памяти не так уж и много. Обычно, увеличение производительности заметно только при использовании карт с
небольшим количеством графической памяти во время работы с высокими разрешениями и большой глубиной цвета, так как обычных 4
Мбайт вполне хватает.
2. Если обратить внимание на модификацию «х2», то пропускная способность его равна 528 Мбайт/с (для памяти SDRAM с частотой шины 66 МГц). Пропускная способность – это скорость передачи данных из оперативной памяти в графический акселератор. Но тут надо
учесть, что не весь трафик используется под нужды AGP, процессор и
остальные DMA устройства (устройства использующие память не
обращаясь к процессору) также обращаются к памяти. Следовательно, AGP никогда не получит данные со скоростью 528 Мбайт/с – это
пиковая пропускная способность (максимум). Действительная пропускная способность составляет примерно 50-60% от пиковой пропускной способности. Это около 264-290 Мбайт/с, кончено, это
быстрее шины PCI со 132 Мбайт/с, но если сравнить с новыми типами памяти на графических картах, такими как 100 МГц SGRAM, 128битная двухпортовая WRAM, где пропускная способность достигает
1.6 Гбайт/с, то становится ясно, что намного удобнее использовать
локальную память графической карты (хотя это дороже).
4.10. Понятие графических примитивов
В современном мире прикладные программисты используют графические примитивы, которые встроены в среду разработки программного обеспечения для вывода информации на экран в графических режимах.
116
Графические примитивы - это набор процедур (подпрограмм)
обеспечивающих следующие операции:
 рисование простых объектов;
 операции с изображением (установка цвета, определение цвета пикселя и т.п.);
 операции для работы с графическими режимами (установка, переключение экранов и т.п.).
Минимальный набор примитивов состоит из следующих процедур:
установка точки (пикселя) изображение, установка режима вывода графики, чтение пикселя изображения. С помощью этих трех примитивов
можно создать практически любую графическую программу вывода
изображения.
Графические примитивы содержат не только среды разработки
программного обеспечения, но и операционные системы и видеоадаптеры. Так, например, в Windows есть графический примитив окна, кнопки,
линейки прокрутки и т.д. Графические примитивы Windows содержатся в
библиотеке gdi.dll.
4.11. Компьютерный практикум 7.
Лабораторная работа по теме “Технические средства
растровой графики”
Цель работы: Освоить приемы работы с видеокартами и видеорежимами. Научиться пользоваться палитрой. Познакомиться с устройством графических форматов файлов.
Ключевые понятия: растр, видеорежим, видеоадаптер, палитра,
формат BMP, прерывание BIOS.
1.
2.
3.
4.
5.
Задание на проведение лабораторной работы:
Определите видеокарту и отобразите информацию о ней.
Определите возможные графические режимы видеокарты. Установите один из режимов и отобразите всю палитру режима.
Замените некоторые цвета в палитре режима 320х200 с 256 цветами и
отобразите их.
Считайте любой BMP файл и выведите его в соответствующем режиме. Запишите любое изображение экрана в BMP файл.
Сделайте поддержку трех графических форматов BMP, PCX, TGA со
всеми возможными режимами изображения (по желанию студента).
117
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.
26.
27.
1.
2.
Контрольные вопросы к разделу “Технические
средства растровой графики”
Что такое дисплей?
Основные характеристики дисплеев.
Структурная схема работы дисплея.
Как устроена электронно-лучевая трубка? Технологии изготовления
электронно-лучевых трубок.
Принцип построения изображения на дисплее.
Излучение монитора и методы защиты от него.
Типы видеоадаптеров и их характеристики.
Сравнение различных видеоадаптеров.
Устройство видеоадаптера.
Что такое видеорежим и его характеристики.
Устройство видеорежимов.
Что такое палитра?
Функции BIOS позволяющие работать с палитрой.
Стандарт VESA.
Работа и устройство режимов VESA.
Графические форматы растровой графики.
Формат BMP. Описание, применение.
Сравнение графических форматов файлов растровой графики.
Графические стандарты компьютерной графики и их сравнение.
Стандарт OpenGL.
Графические аппаратные ускорители. Их возможности.
Сравнение аппаратных ускорителей.
Ускорители, применяемые в играх.
Функции, методы и технологии работы с изображением современных
ускорителей.
Графический порт AGP.
Что такое графические станции, их возможности и применение.
Что такое графические примитивы?
Задачи к разделу “Технические средства растровой графики”
Напишите программу, которая будет выдавать характеристики всех
режимов видеокарты.
Напишите программу, которая будет уменьшать цветовую палитру
изображения без существенной потери качества изображения
(например, изображения в 256-ти цветах представлять набором из
200 цветов).
118
3.
4.
5.
Напишите программу преобразования графических форматов файлов
друг в друга (BMP, PCX, TGA).
Изучите принципы управления видеоадаптером и установите нестандартный режим 320х240 пикселей с 256 цветами.
Напишите программу демонстрации работы всех графических примитивов языка Си (или системы Windows - по желанию студента).
119
5. Геометрическое моделирование
Назначение геометрического моделирования - машинная работа с
пространственными формами:
 задание пространственных форм;
 расчет оснастки, позволяющий получить пространственную форму;
 создание программ для станков с ЧПУ;
 роботы и технологические линии, производящие сборки пространственных форм;
 машинный дизайн.
Для геометрического моделирования (конструирования форм) важно:
1. Наличие интерактивного режима (из-за принципиальной нечеткости
задачи);
2. Наличие хорошего пользовательского интерфейса.
5.1. Способы задания форм. Виды геометрических
моделей, их характеристики
Виды геометрических моделей:
каркасные (“проволочные”) модели;
поверхностные модели;
твердотельные или модели сплошного тела.
Каркасные модели.
Задаются координатами вершин и ребрами. Эти модели просты, информационно прозрачны, но допускают неоднозначную трактовку.
Пример: неоднозначность каркасной модели куба (см. рис. 5.1.1).



каркасная
модель
трактовка 1 (нет
двух граней)
трактовка 2 (нет трактовка 3 (куб)
одной грани)
Рис. 5.1.1. Неоднозначность каркасной модели куба
120
Из примера видно, что:
 нельзя однозначно указать состав деталей, из которых состоит модель;
 нельзя построить алгоритм удаления скрытых линий;
 нельзя указать способы обработки граней, их текстуру и так далее.
Поверхностные модели.
Данные модели задаются поверхностями, ограничивающие некоторый
объем. С помощью этих моделей:
а) задачи дизайна решаются полностью;
б) задачи конструктора только частично, так как нет информации о строении объекта внутри.
Невозможно:
 построение разрезов;
 определение всех конструкционных размеров (в частности толщины).
Из-за этого возникают трудности в автоматическом создании
оснастки.
Объемные модели.
Данные модели содержат полную информацию о внутреннем строении
(одновременно и о внешнем) объекта. Эта информация задается с помощью примитивов:
 параллелепипед;
 цилиндр;
 конус;
 сфера;
 пирамида.
Математические основы объемного моделирования - специальная
(“булевская”) алгебра, позволяющая сопрягать объемные примитивы:
объединение, пересечение, вычитание.
1. Пересечение: результирующий объект равен общему в двух объемах “сомножителях ” (см. рис. 5.1.2).
2. Объединение: результирующий объект состоит из
двух объектов “слагаемых” (содержит каждое из
них в виде входящей детали) (см. рис. 5.1.3).
3. Вычитание: результирующий объект равен
Рис. 5.1.2. Пересечение двух тел
объекту “уменьшаемому”,
121
из которого изъята общая часть “уменьшаемого” и “вычитаемого” (см.
рис. 5.1.4).
Достоинства объемных моделей и операций с примитивами:
 легкость построения сборочных чертежей;
 возможность деталировок;
 автоматическое
построение
разрезов, включая автоматическую штриховку.
Рис. 5.1.3. Объединение тел
Эти модели являются основными в современных САПР.
Способы задания поверхностных моделей.
1.
Задание системы выпуклых многоугольников (полиэдр).
2.
Задание кусками гладких
криволинейных поверхностей.
Рис. 5.1.4. Вычитание тел
Если мы хотим представить объект первым или вторым способом,
то необходимо учитывать, что в аппроксимации многоугольниками больше элементов, а в аппроксимации криволинейными поверхностями больше вычислений на каждую часть объекта.
Первый способ имеет следующие реализации:
а) задание координатами вершин;
б) задание указателями в список вершин;
в) явное задание ребер.
Второй способ также имеет несколько реализаций:
а) кривые и поверхности Эрмита (Hermit);
б) кривые и поверхности Безье (Bezier);
в) В-сплайны (Base-splain).
1.
2.
3.
4.
5.
Требования к заданию форм:
адекватность объекту;
легкость проверки на непротиворечивость;
легкость управления формой непрофессионалом;
возможность сборки и деталировки;
открытость для развития (ЧПУ, роботы и т.д.)
122
5.2. Способы задания полиэдра
а) Способ задания координат вершин каждого k-го многоугольника, входящего в полиэдр:
p(k) = { V1(x1(k), y1(k), z1(k) ), ... ,Vnk (x1(nk), y1(nk), z1(nk) ) }, k=1, ..., Nm,
где Vi - вершина многоугольника, а xi, yi, zi - соответствующие ей координаты.
Обычно при задании договариваются обходить вершины по порядку (например, по часовой стрелке), тогда будет ясен порядок соединения
ребер: 12, 23, ... , nk-1nk, nk1. Определяется также операция с
индексами: i+1, если i<nk и 1, если i= nk.
Достоинство данного способа: минимальное количество информации, вводимой вручную.
Недостатки:
1. Ребро может рисоваться дважды (или больше), если ребро входит в
два (или более) многоугольников.
2. Это приводит не только к замедлению, но и к возможным ошибкам в
изображении из-за разного влияния погрешностей вычислений на одни и те же координаты вершин, входящих в разные многоугольники
(пример: “лишние“ засвеченные пиксели при удалении невидимых
линий ).
3. Отсутствие (кроме перебора) способа определения принадлежности
вершины данному ребру. Следовательно, при большом количестве
многоугольников алгоритм будет медленный.
б) Задание полиэдра указателями в список вершин.
В данном способе задается список вершин, с указанием их координат: {V1, V2, ..., Vn}, {(x1, y1, z1), (x2, y2, z2), ..., (xn, yn, zn)}. Далее каждая
грань описывается номерами вершин в этом списке, например: 1, 3, 5, 6.
В этом способе задания имеется избыточность, облегчающая построение многоугольников и корректировку информационной структуры.
Облегчается проверка непротиворечивости.
Недостатки:
1) Ребра, общие для многоугольников, рисуются дважды (поэтому возможны искажения рисунка из-за вычислительных погрешностей).
2) Труден (перебором) поиск вершин, принадлежащих одной грани.
в) Способ явного задания ребер:
Имеется список вершин: {V1, V2, V3, V4} и на основе его и вида
фигуры строится список ребер, например: E 1(V1, V2, P1, L), E2(V2, V3, P1,
L), E3(V1, V3, P1, P2). Список многоугольников (задается ребрами):
123
P1={E1, E2, E3}. Обозначение: L - признак того, что ребро не входит ни в
какой другой многоугольник (иначе стоит номер многоугольника).
Благодаря значительной избыточности:
 ребро будет рисоваться однократно;
 явно указываются вершины на одном ребре, их не нужно искать вычислениями;
 явно указывается граница грани (для удаления невидимых линий);
 легко проверяется непротиворечивость данных.
5.3. Компьютерный практикум 8.
1.
2.
3.
4.
5.
6.
7.
8.
1.
2.
3.
4.
Контрольные вопросы к разделу “Геометрическое моделирование”
Что такое геометрическое моделирование и его назначение.
Виды геометрических моделей.
Сравнение геометрических моделей.
Объемное моделирование. Его назначение и аппарат реализации.
Способы задания каркасных и твердотельных моделей.
Основные требования к заданию форм.
Способы задания полиэдра.
Сравнение способов задания полиэдра.
Задачи к разделу “Геометрическое моделирование”
Напишите программу, которая будет аппроксимировать объемную
фигуру многоугольниками (от треугольников до пятиугольников).
Возможные фигуры: сфера, эллипсоид, тор, цилиндр, конус.
Напишите программу, которая будет реализовывать все способы задания полиэдра.
Разработайте (или изучите) математический аппарат реализации булевой алгебры к объемным телам. Напишите соответствующую программу моделирования.
Подумайте и создайте (или изучите) аппарат моделирования физических свойств твердых тел, которые влияют на геометрическую форму
объекта (упругость, твердость, текучесть и т.д.)
124
6. Геометрические сплайны
Впервые сплайны математически были описаны в работе Шенберга в 1946 году. Сначала сплайны применялись в качестве удобного инструмента приближения функций. Но затем они стали активно использоваться в численных методах, в системах автоматического проектирования
и во многих других областях. Термин сплайн (spline) в переводе с английского языка означает «полоска стали», с помощью которой чертежники
плавно соединяли точки. Этому термину соответствует другой более распространенный, но с появлением персональных компьютеров стал забываться, - лекало. Лекало это своеобразный чертежный инструмент, с помощью которого можно плавно соединять точки – что-то вроде кривой
линейки.
125
Строить точные плавные кривые довольно сложная задача и только
с появлением компьютерных программ в области САПР, художественных
издательских систем и редакторов строить сплайны стало простым делом.
В компьютерной графике сплайны заняли особое место. С их помощью в основном решают две задачи аппроксимации:
 интерполяция (аппроксимирующая кривая должна точно пройти
через контрольные точки);
 сглаживания (аппроксимирующая кривая должна быть гладкой и
пройти как можно ближе к контрольным точкам).
Существует два подхода к задачам аппроксимации:
1. С помощью интерполяционного полинома.
2. С помощью кусочно-линейной аппроксимации.
6.1. Методы построения интерполяционных
полиномов
Пусть на плоскости задан набор точек (xi, yi), где i=0, 1, ..., m, таких, что x0<x1< ... <xm. И пусть мы хотим провести прямую проходящую
через эти точки, тогда для произвольной точки х значение у(х) нашей
кривой естественно выбрать как взвешенные значения известных yi с
весами Р(xi, yi, x), i=0, ... m:
m
(6.1.1)
y ( x )   P ( xi , yi x )  yi
i0
Формула (6.1.1) является общей идеей для всех аппроксимирующих полиномов.
Интуитивные требования к весовым коэффициентам:
1. Сумма всех коэффициентов должна быть равна единице. Это необходимо для соизмерения относительной важности вклада каждой точки
в итоговое значение.
2. Если х совпадает с каким-нибудь из хi, то вклад коэффициента Pi
должен быть равен единице, а остальных коэффициентов нулю (тогда
аппроксимирующая кривая точно пройдет через контрольную точку
yi).
3. Чем ближе (по расстоянию) xi к х, тем больше должен быть вклад
коэффициента Pi.
Все полиномы, имеющие свойства 1-3, называют классом Полиномов Бернштейна, имеющих хорошо разработанный математический аппарат.
126
Пример полинома: полином Лагранжа (см. курс “Математические основы
кибернетики”).
 x  x j 
j  0 , j i
n
Pi  x , xi  
 
m
j  0, j i
xi  x j

 весовые коэффициенты.
m
y  f ( x )   yi Pi ( x , xi ).
i 0
Пусть i=0, 1, 2 (полином второго порядка (т.е. на один порядок
меньше числа точек) относительно х).
y  f ( x)  y0
 x  x1  x  x 2 
 x  x 0  x  x 2 
 x  x 0  x  x1 
y
y
;
 x 0  x1  x 0  x 2  1  x1  x 0  x1  x 2  2  x 2  x 0  x 2  x1 
Если, например, x=x1, то
y  f ( x1 )  y1
 x  x 0  x  x 2 
y ,
 x1  x 0  x1  x 2  1
то есть полином точно проходит через точки y0, y1, y2.
Преимущества и недостатки интерполяционных полиномов.
Преимущества:
 Коэффициенты Р(x, xi) могут быть рассчитаны заранее, поэтому легко
пересчитать аппроксимацию при других yi.
 Полином точно проходит через заданные точки.
Недостатки:
 степень полинома зависит от числа точек (на 1 меньше), поэтому при
большом числе точек возникают неожиданные и нежелательные явления сильной осцилляции между xi (см. рис. 6.1.1) и замедление счета.
127

у
Ожидаемый
вид функции
Аппроксимация
Лагранжа
х
Рис. 6.1.1. Осцилляция полинома.
при изменении одного из хi
подлежат пересчету все вычисления y = f(x), причем часто с
существенным изменением вида задаваемой кривой.
Кусочно-линейная аппроксимация выглядит следующим
образом (см. рис. 6.1.2), точки соединяются отрезками прямых линий. Это просто, но не всегда дает
требуемое качество.
Преимущества и недостатки кусочно-линейной аппроксимации.
Преимущества:
 простота;
у
 локальность: изменение одной очки
приведет к пересчету только двух
соседних участков.
Недостатки:
х
 аппроксимирующая кривая не является гладкой (разрывы первой и старРис. 6.1.2. Кусочно-линейная
ших производных).
аппроксимация.
Возникает идея: объединить
простоту и локальность кусочно-линейной аппроксимации и гладкость
полиномов Бернштейна, тогда получим функцию, “сшиваемую” фрагментами, а на фрагментах функция будет гладкой.
Требования к сплайновой функции:
1. В точках xi сплайновая функция непрерывна.
2. Она имеет всюду непрерывную производную 1-го (и 2-го, если нужно) порядка.
Полином минимальной степени, удовлетворяющий этим условиям,
имеет 3-й порядок. А сплайновая функция относится к так называемым
интерполяционным кубическим сплайнам.
6.2. Кубические сплайны.
К теории геометрических сплайнов.
128
Параметрическое задание пространственной кривой: z=f(x, y) обычное задание кривой, а параметрическое задание имеет вид:
x  x (t ) 

y  y ( t )  t  a , b.
z  z(t ) 

Задание кривой определяет порядок появления точек z=f(x, y) при
плавном изменении t.
Заменой переменных: u  t  a интервал изменения параметра
ba
приводится к единичному [0, 1]. Поэтому далее считается (без ограничения общности), что t[0, 1].
Общая формула для кубических сплайнов:
 x (t )  a x t 3  bx t 2  cx t  d x

3
2
 y ( t )  a y t  by t  c y t  d y ,

3
2
z (t )  a z t  bz t  cz t  d z
(6.2.1)
t [ 0, 1],
так как формулы отличаются только индексами, то выкладки сделаем
только для х(t).
Общая постановка задачи для расчета сплайновых кривых:
а) Найти ax, bx, cx, dx, ay, by, cy, dy, az, bz, cz, dz по заданным условиям.
б) Рассчитать x(t), y(t), z(t),  t[0, 1].
в) Если нужно построить кривую.
Метод решения:
 задать четыре условия (для каждой из x(t), y(t), z(t));
 получится линейная система уравнений: относительно ax, bx, cx, dx (y,
z);
 решить ее;
 использовать (6.2.1) для расчета и построения кривой.
Известны три вида задания четырех условий:
а) Заданы конечные точки (Р1, Р4) и касательные в конечных точках (см.
рис. 6.2.1). Требуется соединить точки гладкой гривой. Кривая проходящая через эти точки описывается полиномами Эрмита.
б) Заданы четыре точки. Требуется соединить их гладкой кривой (см. рис.
6.2.2). Требуется совпадение начала кривой с Р 1, а конца кривой - с Р4.
Такие кривые называются кривыми Безье.
129
в) Заданы 4 точки. Не требуется
совпадение начала кривой с Р1, а
конца с Р4. Но если кривая замкнется, то требуется гладкость в точке
замыкания (см. рис. 6.2.3.) Такие
кривые описываются В-сплайнами.
Р3
Р2
Р1
Р4
Рис. 6.2.1. Кривая Эрмита
Р2
Р3
Р2
Р3
Р4
Р1
Р1
Р4
Рис. 6.2.3. В-сплайн
Рис. 6.2.2. Кривая Безье
6.3. Полиномы Эрмита
Заданы точки Р1, Р4 начала и конца фрагмента, касательные векторы R1, R4 в кольцевых точках (см. рис. 6.3.1), надо найти: ах, bx, cx, dx (а
так же эти коэффициенты с индексами y и z).
a
x (t )  ax t 3  bx t 2  cx t  d x 
b

3 2
 T  Cx ,
dx
  x (t )  t t t 1 
2
c
 3ax t  2bx t  cx 
dt

dx


где Сх - вектор неизвестных коэффициентов, а T - матрица строка.
Надо найти Сх (Сy, Cz) по известным Px (Py, Pz).
При t=0: x(0)=P1x = [0 0 0 1]Cx.
При t=1: x(1)=P4x =[1 1 1 1]Cx.
В векторном виде:
dx
 3t 3 2t 1 0  C ,
x
dt
130


тогда при t=0:
dx
 R1  0
dt t 0
1 0  C ,
x
0
R4
R1
а при t = 1:
dx
 R4  3
dt t 1
Р1
Р4
Рис. 6.3.1. Кривая Эрмита
1
0 C .
x
Если теперь объединить в одну матрицу найденные строки - вектора, то получим:
0 0
1 1
0 0
3 2
P1x
0
1
1
1
1
P1x
1
P4 x
 Cx 
,
0
R1x
0
R4 x
P4 x
.
R1x
R4 x
2 2 1
1
 3 3  2 1
 Mh 
,
0
0
1
0
1
0
0
0
Cx  
  1
2
1 
где Mh - матрица Эрмита.
Окончательно имеем:
 P1x
P
4x
Gh  
 R1x
R
 4x
P1 y
P4 y
R1 y
R4 y
P1z 
P4 z 
,
R1z 
R4 z 
 x (t ) 
P (t )   y (t ) ,


 z (t ) 


T  t3 t3 t 1.
P(t) - внутренние точки кривой (нужно вычислять при 0t1), Gh - задано
по условию,
P(t) = T  Mh  Gh.
(6.3.1)
Это так называемая формула Эрмита.
131
Замечания.
Кривая проходит через начальную и конечную точку отрезка [0;1].
Имеет в начальной и конечной точке заданные касательные.
Непрерывна и дважды непрерывно дифференцируема.
Сумма коэффициентов при P1, P4, R1, R4 равна единице (относится к
классу полиномов Бернштейна).
Примеры управления формой кривой. Органы управления P1, P4, R1, R4.
1.
2.
3.
4.
3
2
3
1
2
2
1
3
3
1
1
2
2
1
1
2
3
3
Рис. 6.3.2. Управление формой кривой Эрмита
Плавное сопряжение фрагментов кривыми Эрмита 3-го порядка
(см. рис. 6.3.3).
Правила сопряжения фрагментов (i) и (i+1)-го порядка:
а) должна быть общая точка
R1(1)
(1)
на стыке;
R4
б) касательные вектора в
фр а г ме н т 2
общей точке должны лежать
на одной прямой.
фр а г ме н т 1
R1(2)
Начальные условия примут
вид:
R4(2)
 P1(1)   P4(1) 
 (1)   ( 2 ) 
 P4    P4  ,
 R1(1)   kP4(1) 
 (1)   ( 2 ) 
 R4   R4 
Рис. 6.3.3. Сопряжение фрагментов
кривой Эрмита
где k - произвольный коэффициент.
Недостаток полиномов Эрмита.
Ненаглядность управления касательными (R1, R4) для пользователя (художников, дизайнеров, архитекторов).
132
Желательно заменить производные их неявным заданием (через
промежуточные точки между Р1 и Р4).
6.4. Кривые Безье (Bezier)
Пусть на плоскости есть упорядоченный набор точек. Определение: ломанная (Ро  Р1) + (Р1  Р2) + (Р2  Р3) называется контрольной ломаной над массивом точек Р0, Р1, ... Pm с заданными координатами (см.
рис. 6.4.1).
Цель задачи: построить гладкую кривую,
сглаживающую контрольную ломаную.
z
P0
P1
P2
x
y
Рассмотрим частный случай, когда имеется четыре точки, и используем совпадение
кривой Безье с кривой Эрмита (это возможно при делении на три равные части
отрезка [0;1]).
P3
Рис. 6.4.1. Контрольная
ломанная
Приближенные касательные R1 и R2 (см.
рис. 6.4.2) можно вычислить:
P  P1 P2  P1
R1  2

 3( P2  P1 ),
t 2  t1
1/ 3
P  P3 P4  P3
R4  4

 3( P4  P3 ).
t4  t3
1/ 3
Из этих выражений и выражений для
начальной и конечной точек можно получить матрицу отличия полиномов Эрмита
от кривых Безье:
 1 0 0 0
t1=0
t4=1
 0 0 0 1
.
M bh  
Рис. 6.4.2. Нахождение
 3 3 0 0
касательных
 0 0  3 3


Тогда из формулы Эрмита (6.3.1)
можно получить матрицу Безье, которая будет определять искомую кривую:
P(t) =TMhGh= TMhMhbGb,
t2=1/3
t3=2/3
133
где обозначим Mb=MhMhb - матрица Безье.
После вычисления получим:
  1 3  3 1
 3  6 3 0
.
Mb  
0 0
 3 3
1
0
0 0

Обобщение. Откажемся от полного совпадения кривых Эрмита и
Безье (то есть от деления t[0, 1] на 3 равные части), но сохраним матрицу Mb Безье:
 P1 
 x (t ) 
P 
2
P(t )  T  Mb  Gb ,
Gb   ,
P(t )   y (t ) ,
T  t3 t3 t 1 .


 P3 
 z (t ) 
P 
 4
Выполняя умножение, найдем:
P(t) = (1 - t)3P1 + 3t(1-t)2P2 +3t2(1-t)P3 + t3P4. Или кратко:


3
P(t )   C3i  t i  (1  t )3i ,
(6.4.1)
i 0
где Сi3 - число сочетаний из 3-х элементов по i. Эта формула является
частным случаем (для 3-ей степени) бинома Ньютона.
Свойства кривых Безье
В каждой точке t[1, 0] координаты вектора P(t) рассчитываются как
взвешенные значения заданных точек. Поэтому изменение координат
одной (хотя бы) заданной точки скажется на всей кривой, но влияние
“удаленных” точек на данную точку меньше, чем “близких” (по t).
По свойствам коэффициентов бинома Ньютона сумма всех весов равна
единице: (1- t)3 + 3t(1- t)2 + 3t2(1- t) + t3 = 1.
Поэтому (следует из второго пункта) вся кривая Безье лежит в выпуклой
оболочке точек Р1, Р2, Р3, Р4 (см. рис. 6.4.3) (это очень удобно для машинной графики, так как дает возможность определить охватывающие ее окно (для удаления невидимых линий в дизайне и мультипликации).
Из формулы (6.4.1) следует, что кривая Безье точно проходит через Р 1 и Р4
и касается прямых (Р1  Р2) и (Р3  Р4). Отсюда следует, что для формы кривой является существенным порядок пересечения точек в мас134
сиве (Р1, ..., Р4). Кривая может быть самопересекающейся, замкнутой
и т.д. (см. рис. 6.4.4)
Сопряжение фрагментов кривых Безье.
Р3
Для того чтобы сопряжение фрагментов имело непрерывную первую произР4
водную (единичный вектор касательной к кривой изменяется непрерывно),
нужно чтобы каждые три точки Р3i-1,
P3i, P3i+1 лежали на одной прямой (см.
Р1
Р2
рис. 6.4.5), а для второй производной
(вектор кривизны изменяется непреРис. 6.4.3. Расположение кривой
рывно вдоль кривой) нужно чтобы пять
Безье
точек лежали на одной прямой.
Для получения гладкой во всех точках,
Р2
Р3
Р2
Р3
Р2
Р3
Р4
Р1
Р4
Р1=Р4
Р1
Рис. 6.4.4. Виды кривой Безье
Р2
Р3i-1
Р5
Р1
P2
Р3i
P1
Pm
Р3i+1
Р4
Рис. 6.4.5. Сопряжение кривых Безье
135
Рис. 6.4.6. Получение замкнутой
кривой
замкнутой кривой необходимо, чтобы точки Pm, P1, P2 лежали на одной прямой (см. рис. 6.4.6.)
Обобщение формулы бинома Ньютона на случай с (m+1) управляющими
точками, m 3:
m
m!
P(t )   C mi t i (1  t ) mi ,
C mi 
.
i
!
(
m
 i)!
i 0
Свойства те же, что и кривой 3-го порядка, а число управляющих
точек больше.
Недостатки кривой Безье.
 Изменение положения одной точки (даже удаленной) вызывает необходимость пересчета всех коэффициентов. Кривая Безье - не локальна
относительно возмущений по положению точек. Для пользователя дизайнера это означает невозможность закрепить форму на участке
кривой.
 При добавлении или удалении хотя бы одной точки требуется пересчет всех коэффициентов.
 Степень функциональных коэффициентов полинома связана с количеством точек в заданном наборе.
6.5. Базовые кубические сплайны (В-сплайны)
Постановка задачи: заданы два участка, примыкающие друг к другу (см. рис. 6.5.1).
Запишем систему контрольных
точек:
i
i+1
 для участка 1: Pi-1, Pi, Pi+1,
i-1
Pi+2 - заданы,
i+2
 для участка 2: Pi, Pi+1, Pi+2,
i+3
Pi+3 - заданы.
1 участок
2 участок
Рис. 6.5.1. Постановка задачи
В-сплайнов
Точки Pi, Pi+1, Pi+2 являются общими для обоих участков, а
точки Pi-1, Pi+3 - уникальны (первая принадлежит только первому
участку, а вторая только второму). Требуется найти Р(t), при
0t1 в классе кубических поли136
номов типа Бернштейна (то есть весовые коэффициенты больше нуля и
их сумма равна единице) по значениям Pi-1, Pi, Pi+1, Pi+2.
Общая формула:
 Pi 1 
 P 
P(t )  t 3 t 2 t 1 M s  i .
 Pi 1 


 Pi  2 
Найдем матрицу Ms размерности 44 из следующих соображений:
 в точке примыкания участков 1 и 2 должна быть равны:
а) сами функции,
б) первые производные,
в) вторые производные.
 сумма всех элементов матрицы Мs должна быть равна единице (свойство полиномов Бернштейна).
На стыке: для первого участка: t = 1, для второго участка: t = 0. Обозначив mij - элементы матрицы Ms, где i, j = 1, ..., 4, получим:
Конец первого участка:
m11 m12 m13 m14   Pi 1 
m
m22 m23 m24   Pi  
21

1
1
1
1

 m m m m   P  1 1 1 1 M s Pi .
 31
32
33
34   i 1 
m


 41 m42 m43 m44   Pi 2 
Начало второго участка (равно концу первого):

m11
m
 0 0 0 1 m21
 31
m
 41
m12
m22
m32
m42

m13
m23
m33
m43
m14   Pi 
m24   Pi 1  

  0 0 0 1 M s Pi 1 .
m34   Pi  2 
m44   Pi  3 
Приравнивая конец первого участка к началу второго, получим соотношение 1:
1 1 1 1 M P   0 0 0 1 M P .
s i 1
s i
Проделав аналогичные преобразования с первыми производными,
получим соотношение 2:
dP
d 3

t
t 2 t 1 M s Pi  3t 2 2t 1 0 M s Pi ,
dt
dt
6 2 1 0M s Pi  0 0 1 0M s Pi 1.


 
137

Такие же преобразования произведем со вторыми производными,
получим соотношение 3:
d2P d

3t 2 2t 1 0 M s Pi  6t 2 0 0 M s Pi ,
dt
dt 2
6 2 0 0 M s Pi  0 2 0 0 M s Pi 1 .



Соотношения 1-3 дают 15 условий (по 5 каждое). Для определения
16-ти элементов mij матрицы Ms необходимо шестнадцатое условие, оно
задается из свойств полиномов Бернштейна - сумма весовых коэффициентов равна единице.
Рассмотрим, как получаются пять условий из соотношения 1.
В скалярах, выполняя умножение матриц:
(m11+m21+m31+m41)Pi-1 + (m12+m22+m32+m42)Pi + (m13+m23+m33+m43)Pi+1 +
(m14+ m24+m34+m44)Pi+2 = m41Pi + m42Pi+1 + m43Pi+2 + m44Pi+3 .
Приравнивая друг к другу коэффициенты при Р с одинаковыми индексами, получим пять соотношений:
m11  m21  m31  m41  0,
m  m  m  m  m ,
22
32
42
41
 12
m13  m23  m33  m43  m42 ,
m  m  m  m  m ,
24
34
44
43
 14
m44  0.
Аналогично получается пять условий из второго соотношения и
третьего соотношения:
3m11  2m21  m31  0,
3m  2m  m  m ,
12
22
32
31


3
m

2
m

m

m
 13
23
33
32 ,
3m  2m  m  m ,
24
34
33
 14

m

0
.
 34
6m11  2m21  0,
6m  2m  2m ,
22
21
 12
6
m

2
m

2
m
 13
23
22 ,
6m  2m  2m ,
24
23
 14
m24  0.
Шестнадцатое условие (для второго участка, в начале, при t=0):
m41Pi + m42Pi+1 + m43Pi+2 + m44Pi+3=1. Сумма элементов в строках 1-3 матрицы Ms равны нулю из выше написанных условий. Так как m44=0 и используя левую часть соотношения 1, получим, что m41 + m42 + m43=1.
Проводя различные подстановки в условиях и делая некоторые
преобразования можно получить следующую матрицу:
138
m12
m13 m14 
 7m12  19m13  37m14
 3m  3m  3m
3m13  3m14 3m14
0 
12
13
14

.
3m13  9m14 3m14
0 
 3m12  9m13  15m14
 m  7m  19m
m13  7m14
m14
0 

12
13
14
После завершения выкладок найдем:
1 3  3 1
1 3 6 3 0
Ms 
.
3 0
6 3 0
1
4
1 0
Удобство для программирования: коэффициенты [t3 t2 t 1]Ms не
зависят от точек (это свойство называется универсальностью), поэтому
кривая рисуется “одновременно” для всех участков с циклами по t,
t[0,1].
Управление свойствами сплайновой кривой.
а) Как сделать, чтобы кривая начиналась в точке Ро, заканчивалась в точке
Рm и касалась векторов (PoP1) и (Pm-1 Pm)?
Для этого добавим две точки: P-1, Pm+1 (см. рис. 6.6.2).
Запишем соотношения для касательных:
P1
P0
P-1
P1  P0 P0  P1

,
t  1 t  1
P1  2 P0  P1 ,
Pm-1
Pm
Pm  Pm 1 Pm 1  Pm

,
t  1
t  1
Pm 1  2 Pm  Pm 1.
Pm+1
Рис. 6.5.2. Добавление точек
Мы получили координаты искусственных точек, с помощью которых мы можем решить поставленную задачу.
б) Как сделать замкнутой сплайновую кривую с непрерывными первой и
второй производными?
Для этого необходимо ввести три дополнительные - искусственные
точки, которые будут иметь координаты первых трех заданных.
Достоинство В-сплайнов.
139
Благодаря тому, что сплайны принадлежат группе полиномов Бернштейна, вся кривая лежит в выпуклой оболочке.
6.6. Классификация сплайнов
Таблица 6.6.1. Классификация сплайнов
Порядок
Название
Список точек
полинома
влияющих на
P(t)
0
Кусочнопостоянные
сплайны
1
линейные
сплайны
2
квадратические
сплайны
Результирующая кривая
Кусочно-линейная аппроксимация.
Результирующая кривая разрывна.
Pi
Функция
непрерывна.
Первая
производная имеет разрыв.
Pi-1, Pi
Функция и первая производная
непрерывные, вторая производная
имеет разрыв.
Pi-1, Pi, Pi+1
Непрерывная функция, первая и
вторая производные.
3
4...
кубические
сплайны
Pi-1, Pi, Pi+1,
Pi+2
Углубление гладкости, ухудшение
локальности.
6.7. Сплайновые поверхности
Одним из самых интересных применений сплайновых функций сплайновые поверхности. Они позволяют создавать поверхностные моде140
ли - выпуклые оболочки объектов, накладывать текстуру на созданный
объект.
Постановка задач.
Зададим решетку на плоскости (xi, yj), i=0, ..., m; j=0, ..., n, где х0<x1< ...
<xm, y0<y1< ... <yn. Число узлов на этой решетке: (m+1)(n+1). На каждом
из узлов зададим координату zij - управляющую (контрольную) точку,
перемещая которую можно управлять кривизной (формой) поверхности.
Таким образом, получаем массив контрольных точек и их координат (xi,
yj, zij).
Задача 1. Объемная интерполяция.
Гладкая поверхностность (имеются непрерывные частные производные
второго порядка, и имеется касательная плоскость, непрерывно “катящаяся” по поверхности) должна пройти через все контрольные точки.
Полином, имеющий такие свойства гладкости с минимальной степенью - бикубический полином:
а) кубический по x при заданном y,
б) кубический по y при заданном x.
Интерполяционным бикубическим сплайном называется функция
двух переменных P(x, y), обладающая следующими свойствами:
 График этой функции проходит через каждую точку заданного массива, P(xi, yi)=zij.
 Функция аппроксимации на каждом частичном прямоугольнике представляет собой многочлен третьей степени по каждой из переменных:
3
3
P ( x , y )    ai j ( x  x l ) i ( y  y k ) j .
i 0 j 0
xl  x  xl+1,
yk  y  yk+1.
 На всем прямоугольнике задания функция P(x, y) имеет по каждой
переменной непрерывную вторую производную.
Для построения интерполяционного бикубического сплайна по заданному массиву (xi, yj, zij) надо определить все коэффициенты, их общее
число 16mn (mn - число прямоугольников).
Достоинство бикубических сплайнов.
График сплайновой функции проходит через все заданные точки, полностью сохраняя первоначальную заданную информацию.
Недостатки.
 Изменение одной точки требует пересчета всех коэффициентов.
 Иногда требование неукоснительного прохождения графика искомой
функции через каждую заданную точку оказывается излишним, так
как исходных набор точек может быть приближенным.
141
Задача 2. Пространственное сглаживание.
Требуется получить поверхность заданной гладкости, не обязательно
проходящую через точки zij, но меняющая форму, при их изменении.
Решение имеется в форме тензорного произведения.
Если параметры поверхности u, v, такие что 0u1, 0v1, тогда поверхность Безье (пример тензорного произведения) будет иметь вид (векторная форма):
 x(u, v)  m n
r (u, v)   y (u, v)    ai (u )  b j (v)  Pi , j ,
i 0 j 0
 z (u, v) 
где Pi,j - координаты управляющих точек.
Для бикубической функции Безье (частый случай)
r ( u, v ) 
3
3
  C i3 C 3j  u i (1  u) 3i  v j (1  v ) 3 j Pi , j .
i 0 j 0
Или в матричной форме (для вычислений):
 P00 P01 P02
 x ( u, v ) 

 y (u, v )   1 u u 2 u 3  M T   P10 P11 P12


 P20 P21 P22
 z (u, v ) 
P
 30 P31 P32

1.
2.
3.

P03 
1

v
P13
  M   2 ,
P23 
v 

v 3 
P33 
 
1
1  3 3
0 3  6 3 
.
M
3  3
0 0
0 0
0
1 

Свойства поверхности Безье.
Имеет четыре точки закрепления.
Гладкая до вторых производных, включительно.
Целиком лежит в выпуклой оболочке управляющих точек P ij (свойство полезное для анализа сцен и удаления невидимых линий).
6.8. Компьютерный практикум 9.
Лабораторная работа по теме “Геометрические сплайны”
Цель работы: Освоить приемы работы со сплайновыми кривыми.
Научиться строить сплайновые кривые.
142
Ключевые понятия: кривая Безье, В-сплайновая кривая, полином
Эрмита, контрольные точки, контрольная ломаная, матрица Безье,
матрица Эрмита.
Задание на проведение лабораторной работы:
1. Создайте программу, которая будет строить кривые Безье, В-сплайны,
кривые Эрмита.
2. Сравните вид кривых и сделайте выводы об их форме.
3. Учтите возможность построения замкнутой кривой.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
1.
2.
3.
4.
5.
Контрольные вопросы к разделу “Геометрические сплайны”
Что такое сплайны?
Общая идея аппроксимирующих полиномов.
Задачи аппроксимации.
Свойства полиномов Бернштейна.
Что такое контрольные точки?
Что такое контрольная ломаная?
Сущность кубических сплайнов.
Сущность кривых Безье.
Сущность кривых Эрмита.
Сущность В-сплайнов.
Недостатки и преимущества полиномов Эрмита.
Недостатки и достоинства кривых Безье.
Преимущества и недостатки В-сплайнов.
Сущность сплайновых поверхностей.
Задачи решаемые с помощью сплайновых поверхностей.
Классификация сплайновых кривых.
Задачи к разделу “Геометрические сплайны”
Разработайте программу моделирования сплайновых поверхностей.
Разработайте математику и программу моделирования объемных тел
путем их аппроксимации сплайновыми поверхностями - поверхностные модели.
Разработайте математический аппарат и программу моделирования
каркасных тел с плавным сопряжением сторон, путем сплайновых
кривых (возьмите для примера платоновы тела).
Попробуйте решить задачу изображения линий равного уровня на
географической карте с помощью сплайновых кривых.
Создайте программу проволочной мультипликации с помощью
сплайнов (сюжет придумайте сами).
143
7. Обзор некоторых дополнительных
вопросов компьютерной графики
В данной главе мы рассмотрим вопросы повышения реалистичности изображений и сделаем обзор программных продуктов одной из ведущих фирм в программном обеспечении для автоматизации чертежных
работ и САПР - AutoDesk.
Существует два подхода к повышению реалистичности изображений:
 повышение динамичности изображения;
 приближение физической модели изображения к реальной.
У каждого подхода имеются свои методы и проблемы. Первый
подход связан с поиском быстрых алгоритмов, упрощений построения
изображения, а второй с поиском более точных, но достаточно простых
алгоритмов. Рассмотрим второй подход, как дающий более качественное
изображение, правда, в основном статическое (в последнее время, с появлением быстрых процессоров и специальных аппаратных ускорителей
стало возможным использование некоторых алгоритмов данного подхода
в реальном времени).
7.1. Метод трассировки лучей
Одним из самых распространенных методов придания изображению более “живого” вида является метод трассировки лучей. С его помощью моделируется распространение света в пространстве и на основе
этого строится изображение в заданном районе этого пространства.
Метод трассировки лучей имеет два подкласса: прямой трассировки и обратной.
Метод прямой трассировки лучей. Для построения изображения
в данном методе выпускаются лучи из источника света во все стороны по
прямолинейным траекториям (см. рис. 7.1.1). Попав на какой-либо объект
сцены, луч может преломиться и уйти внутрь объекта или отразиться.
Отразившись, луч опять распространяется прямолинейно до попадания
144
на следующий объект, и так далее. Часть лучей попадет в глаз наблюдателя и сформирует изображение сцены. Для построения изображения помещают перед глазом воображаемую картинную плоскость (экран) и
считают, что изображение формируется на этом экране. Выпущенные
лучи из источника прослеживаются (трассируются) до тех пор, пока они
не покинут сцену или их энергия не станет так мала, что практически не
будет влиять на изображение.
Основным недостатком
источник света
объекты сцены
прямой
трассировки
лучей является то обстоятельство, что в
экран
получаемое изображение
сколько-нибудь
существенный вклад
вносит лишь очень
небольшая часть траснаблюдатель
сируемых лучей. Тем
самым при реализации
Рис. 7.1.1. Прямая трассировка лучей
этого метода основная
часть работы оказывается проделанной впустую.
Метод обратной трассировки лучей. Для определения освещенности (цвета) точки экрана можно проследить путь, по которому мог пройти
луч света, попавший в эту точку и сформировавший там изображение.
Очевидно, что таким путем является путь луча, выходящего из глаза
наблюдателя и проходящего через соответствующую точку экрана (см.
рис. 7.1.2). Отслеживается путь вдоль этого луча до ближайшего пересечения с каким-либо объектом сцены (перемещение по лучу идет в обратном направлении распространения света). Цвет соответствующей точки
экрана будет определяться долей световой энергии, попадающей в эту
точку и покидающей
ее в направлении глаза.
источник света
объекты сцены
Для определения этой
энергии
необходимо
найти освещенность
экран
точки объекта, для
чего из нее выпускаются лучи в тех
направлениях, из котонаблюдатель
рых может прийти
145
Рис. 7.1.2. Обратная трассировка лучей
энергия. Это, в свою очередь, может привести к определению точек пересечения соответствующих лучей с объектами сцены, выпусканию новых
лучей и так далее.
Данный метод позволяет уменьшить количество расчетов, которые
не влияют на изображение. Однако существует вероятность того, что
некоторая часть энергии не будет учтена, так как при отражении луча от
объекта сцены число выпущенных лучей отражения будет ограничено,
хотя на самом деле это не всегда так. Существуют специальные методы,
которые позволяют устранить этот недостаток.
Основными недостатками методов трассировки лучей являются:
 неэффективность работы с диффузными поверхностями;
 определение освещенности поверхностей проводится параллельно с
построением изображения и зависит от положения наблюдателя так,
что любое изменение положения наблюдателя ведет к полному пересчету всей сцены.
Основная идея алгоритма обратной трассировки лучей.
Через каждый пиксель экрана луч трассируется до ближайшего пересечения с объектами сцены. Из точки пересечения выпускаются лучи
ко всем источникам света для проверки их видимости и определения
непосредственной освещенности точки пересечения. Выпускаются также
отраженный и преломленный лучи, которые, трассируются, в свою очередь, до ближайшего пересечения объектами сцены, и так далее. Получается рекурсивный алгоритм трассировки.
В качестве критерия остановки обычно используется отсечение по
глубине (не более заданного количества уровней рекурсии) и по весу (чем
дальше, тем меньше вклад каждого луча в итоговый цвет пикселя, и, как
только этот вклад опускается ниже некоторого порогового значения,
дальнейшая трассировка этого луча прекращается).
Каждый из выпущенных лучей делает вклад в общую долю энергии попадающей в конкретный пиксель экрана. Чем больше выпущено
лучей из пикселя, тем точнее (путем вычисления среднего значения)
можно определить световую энергию попавшую в пиксель. Энергия
складывается от преломленных, отраженных лучей и фоновой энергии.
Большинство оптимизаций метода связано с расчетом количества выпускаемых лучей из пикселя и учетом различных лучей (диффузного отражения, зеркального отражения, диффузного преломления, идеального
преломления). Наиболее распространенными моделями являются модель
Холла и Уиттеда.
Метод обратной трассировки лучей позволяет добиться хорошего
качества получаемых изображений при небольших вычислительных за146
тратах. Кроме того, данный метод является первой ступенькой получения
фотореалистических изображений, и все пакеты, позволяющие создавать
реалистическую графику, включают его (иногда базируются только на
этом методе с применением дополнительных алгоритмов).
Существует метод излучательности, который устраняет эти недостатки, обеспечивая одновременно и высокую точность при работе с
диффузными объектами, и отдельное вычисление глобальной освещенности независимо от положения наблюдателя. В основе данного метода
лежит закон сохранения энергии в замкнутой системе. Все объекты разбиваются на фрагменты и для этих фрагментов составляются уравнения
баланса световой энергии.
Данный метод довольно сложен и трудоемок. В данном методе образуется система линейных уравнений, которую приходится решать какими-либо методами. Число уравнений системы возрастает квадратично с
повышением качества (уменьшение точки разрешения) изображения.
Наиболее трудоемким шагом метода излучательности также является
вычисление коэффициентов формы, хранящих в себе информацию о геометрии сцены.
7.2. Алгоритмы и методы моделирования
текстуры
Основные идеи алгоритмов. Для придания более естественного вида сцене желательно иметь возможность менять параметры поверхности
объектов (в простейшем случае цвет) в зависимости от положения точки
на ней. Существуют разные способы моделирования текстуры, но практически все они подразделяются на два основных класса:
 проективные текстуры;
 процедурные (сплошные) текстуры.
Если необходимо задать определенную текстуру какому-либо объекту, то можно идти двумя путями:
1. Взять изображение поверхности с реальной текстурой и отобразить
(спроектировать) его каким-либо образом на поверхность объекта. То
есть перевести исходные трехмерные координаты точки в двухмерные и использовать последние для индексации в изображение.
2. Построить некоторую функцию С(x, y, z), определяющую для каждой
точки пространства (x, y, z) цвет таким образом, чтобы объект, цвет
которого задается этой функцией, имел вид объекта, сделанного из
требуемой текстуры.
147
Первый путь соответствует проективным текстурам. Он наиболее
прост, однако имеет целый ряд существенных недостатков: требует большого объема памяти для хранения используемых изображений (поэтому
большинство коммерческих пакетов требует объем оперативной памяти
не менее 16 Мб), обладает сравнительно небольшой гибкостью и к тому
же сопряжен с большими сложностями в подборе способа проектирования для объектов сложной формы.
Поэтому в практических задачах, как правило, используется лишь
небольшое количество стандартных вариантов проектирования:
 плоское (параллельное проектирование вдоль заданного направления);
 цилиндрическое;
 сферическое.
Второй путь не требует больших затрат памяти и одинаково хорошо работает с объектами любой (сколь угодно сложной) формы. Поскольку подобная функция обычно зависит от большого количества параметров, то, изменяя их, можно легко изменять параметры текстуры. Основным недостатком этого подхода является сложность подбора соответствующей функции.
Примеры моделирования текстуры.
1.Текстура типа шахматной доски. Для создания этой текстуры достаточно изменять цвет в зависимости от координат точки поверхности.
Цветовой текстурой является также текстура кирпича.
Кроме цветовых текстур существуют также скалярные текстуры и
текстуры, изменяющие направление нормали в точке поверхности. Последние служат для моделирования рельефа поверхности. Аккуратное
использование подобных текстур позволяет заметно усилить реалистичность получаемых изображений при сравнительно небольших вычислительных затратах.
2. Текстура волн. Для создания поверхности с кольцевыми волнами
классическим подходом - создание нового объекта, требует разрешения
трансцендентных уравнений при пересечении такой поверхности с лучом. Если взять в качестве объекта обычную плоскость с текстурой, которая будет создавать иллюзию волн путем изменения вектора нормали, то
затраты на создание такого объекта будут намного меньше. Функция,
которая будет изменять нормаль соответствующим образом, может иметь
вид:
Amount*sin(2l/WaveLenght+Phase)/(1+s2), где
Amount - амплитуда волн,
WaveLenght - длина волн,
Phase - начальная фаза волны,
148
s - расстояние данной точки плоскости от центра волн.
Недостатком такого подхода является то, что при пересечении волн
с объектами они ведут себя как плоскость - носитель текстуры и пересечение выражается линией. Однако правильное отражение объекта на
волнах делает этот дефект не столь заметным.
Если использовать шумовую функцию, то можно получить рябь
воды и ряд других эффектов.
3. Текстура дерева. Известно, что дерево имеет цилиндрическую
структуру (симметрию), направленную, например, вдоль оси Oz. Несложно построить функцию, которая определяет цвет, меняющийся по
этому закону, например:
C ( x, y, z)  C1  (C1  C2 ) f ( x 2  y 2 ,
где С1 и С2 - некоторые цвета (светлых и темных колец);
f(t) - некоторая неотрицательная периодическая функция, например
0.5(1+sin(t)).
Ясно, что изображение, построенное при помощи подобной функции, будет симметричным и слишком правильным. На самом деле деревьев с идеальной структурой колец нет - некоторое случайное искажение
присутствует практически всегда.
Для моделирования таких искажений вводится так называемая шумовая функция. Обычно на шумовую функцию накладываются следующие требования:
1) чтобы она была непрерывной функцией;
2) принимала значения из отрезка [0;1] и;
3) вела себя в некотором смысле аналогично равномерно распределенной
случайной величине.
Существует несколько способов построения подобной функции.
Простейшим из них является задание случайных значений в узлах некоторой регулярной сетки (например, в точках (i, j, k), где i, j, kZ - целые
числа) и последующей интерполяции на все остальные точки. Тем самым
для отыскания значения этой функции в произвольной точке P(x, y, z)
сначала определяется параллелепипед, содержащий данную точку внутри
себя, затем, используя известные значения функции в вершинах этого
параллелепипеда, посредством интерполяции находится и значение
функции в исходной точке.
В этом случае использования целочисленной решетки приходим к
следующему способу задания функции:
Noise( x, y, z ) 
[ x ]1 [ y ]1 [ z ]1
    ( x  i )  ( y  j )  ( z  k )  aijk ,
i [ x ] j [ y ] k [ z ]
149
где (u) - одномерная весовая функция.
В простейшем случае: (u)=u, u[0,1].
Однако такая трилинейная интерполяция дает не очень хорошие
результаты, так как не является гладкой - на границе параллелепипедов
происходит разрыв первых производных. Для достижения гладкости
наложим на функцию (u) следующее условие: (0)’=(1)’=0. Простейшим вариантом функции, удовлетворяющим этому условию, является
многочлен Эрмита: (u)=3u2-2u3, u[0,1].
Кроме шумовой функции Noise довольно часто используется также
следующая функция:
k
1
Turbulence( p , k )   i Noise( 2 i  p ).
2
i 1
Пример создания текстуры дерева показывает один характерный
прием в моделировании текстур - строится некоторая скалярная функция,
принимающая значения на [0;1], и ее значение используется для получения нужного цвета путем интерполяции. Большим преимуществом подобного подхода является простота и адаптивность - всего лишь заменой
набора цветов, используемых при интерполяции, можно сильно изменить
вид материала.
Аналогичным путем можно получить текстуру мрамора, возмущая
текстуру, состоящую из ряда плоскостей, параллельных оси OX, при помощи шумовой функции.
С помощью нескольких плоскостей можно получить текстуру неба.
Вывод: создавая различные текстуры можно получать изображения высокой реалистичности.
7.3. Программные продукты фирмы AutoDesk
Для решения инженерных задач применяются следующие типы
программных систем (делятся на типы условно):
 расчетные системы (расчет формы, размеров и т.п.);
 системы технологической подготовки (проектирование стадий обработки, испытаний и т.п.);
 чертежно-проектировочные системы (подготовка и создание чертежной документации);
 системы моделирования (предварительных испытаний).
Рассмотрим системы последних двух категорий, именно они нас
интересуют с точки зрения компьютерной графики.
Чертежно-проектировочные системы и системы моделирования.
150
Фирма AutoDesk выпускает в данном классе продукт - AutoCad для
персональных компьютеров фирмы IBM, а в последнее время и для Macintosh. Первая версия AutoCad была выпущена в 1982 году. Наиболее
широко распространены версии с 12 по 14 (на момент написания - последняя). Области применения данного продукта:
 архитектура;
 машиностроение;
 электроника и др.
В литературе описано более 1500 приложений AutoCad.
Основные отличия 12-ой версии от более ранних:
 встроенный SQL (System Query Language - язык системных запросов)
интерфейс;
 связь с СУБД (системы управления базами данных) (dBase, Paradox,
Oracle);
 возможность обработки чертежа в неоднородной сети;
 24-х битовая цветовая шкала;
 поддержка стандарта VESA;
 вывод рисунка чертежа в растровом виде (форматы PCX, TIF, TGA,
GIF);
 поддержка стандарта DXF, IGES - вывода чертежей;
 поддержка шрифтов формата PostScript;
 режим автозаписи по времени;
 встроенный геометрический калькулятор (можно производить вычисления на основе рисунка);
 алгебраический калькулятор.
В AutoCad под Windows есть дополнительная возможность работы
с несколькими программами одновременно и возможность работы в многооконном режиме, а также использование DLL (Dynamic Library Link динамически подключаемые библиотеки) и OLE (Object Link and Embedding - связь и объединение объектов).
Требования к аппаратному обеспечению 12-ой версии AutoCad:
 процессор не ниже Intel 386;
 наличие сопроцессора (допускает эмуляцию, путем специальных
драйверов);
 ОЗУ от 4 Мб по DOS и от 16 Мб под Windows;
 объем свободного пространства на диске не менее 25 Мб (под Windows еще дополнительное место для файла подкачки).
AutoCad версии 13 имеет новый уровень развития, позволяет проводить моделирование объектов. Основные отличия от 12-ой версии:
151
 Реализован на многих платформах (MS-DOS, Windows, Windows NT,
Unix).
 Встроенное твердотельное моделирование, реализуемое с применением
ACIS технологии (AutoCad Interface System - система интерфейсов
Cad-систем), что позволяет использовать непосредственную связь с
пакетом AutoCad Designer (объектно-ориентированное параметрическое твердотельное моделирование) и с пакетом AutoSurf (построение
поверхностей любой сложности).
 Развитая геометрия (NURBS-кривые (B-сплайны на неравномерной
решетке), сплайны, программируемые мультилинии и т.п.)
 Специальные типы линий, в том числе линии, содержащие в разрывах
текст и символы. Возможность создания новых и редактирования уже
существующих типов линий.
 Высококачественное тонирование с помощью пакета AutoVison (16
миллионов цветов, эффекты отражения света, моделирования теней,
интерфейс с AutoDesk 3D Studio).
 Редактирование многострочного текста.
 Автоматические переносы в тексты. Использование шрифтов True
Type, PostScript. Встроенная проверка орфографии.
 Усовершенствована штриховка.
 Перепрограммируемый интерфейс под Windows.
Требования к аппаратному обеспечению:
 процессор не ниже Intel 386;
 наличие сопроцессора;
 ОЗУ от 16 Мб;
 35 Мб на жестком диске и 64 Мб для файла подкачки.
Основные пакеты и приложения к AutoCad.
1. AuroDesk WorkCenter for Windows - программный пакет для управления технической документацией и процессом создания проекта в сети
Novell, полностью интегрирован с AutoCad for Windows и AutoCadLT.
Возможности пакета включают:
 выбор оптимальной структуры документации;
 использование архивов;
 управление версиями документов;
 электронное уведомление, рассылка и утверждение документации;
 управление потоком необходимой информации.
152
2. AutoCad Designer - средство для объемного параметрического твердотельного моделирования на основе конструкторско-технологических
элементов в среде AutoCad. Позволяет создавать жесткую связь между
создаваемой моделью и чертежом. Позволяет получать в требуемом
формате любые виды, разрезы, сечения.
3. AutoSurf - предназначен для построения формообразующих кривых и
сложных поверхностей, Nurbs поверхностей. Позволяет строить новые объекты на их основе. Имеется возможность создания каркасных
моделей и проектирования различных контуров на плоскость или поверхность.
4. ADE - служит для управления данными, обеспечивающими связь
между элементами графического чертежа и не графическими таблицами на основе SQL интерфейса с внешними базами данных типа:
dBase, Paradox, Oracle, Informix.
5. AutoCadLT - служит для двумерного проектирования моделей.
6. AutoVision - средство для получения фотореалистических изображений в среде AutoCad на стадиях дизайна, конструирования и изготовления изделий, минуя создание моделей.
7. AutoDesk 3D Studio - графический пакет, предназначенный для создания трехмерных моделей, получения реалистических изображений,
создания анимационных фильмов.
8. AutoDesk Animator Pro - графический пакет для создания двумерной
анимации.
Тенденции развития современных систем конструкторскотехнологической подготовки.
Отметим только наиболее характерные особенности:
1. Независимость от аппаратной платформы и перенос традиционных
возможностей специализированной рабочей станции на обычный
персональный компьютер.
2. Возможность интеграции с другими системами автоматизированного
управления и обработки информации.
3. Возможность анимации результата расчетов как тенденция использования зрительного канала восприятия, имеющего наибольшую пропускную информационную способность и наиболее естественного
для качественной оценки результатов разработки.
4. Встроенные возможности параметрического моделирования.
5. Возможность ведения сборочных проектов, контроль за изменением
связанных узлов.
6. Встроенные возможности разработки технологического процесса на
основе подготовленной модели.
153
7. Имитация траектории движения инструмента для разработанного
технологического процесса.
8. Автоматическое получение программы обработки детали на станках с
ЧПУ (числовым программным управлением).
9. Использование Windows и всех его возможностей.
10. Как правило, все системы имеют защиту пакетов с помощью джонглов (специальные заглушки вставляемые во внешние разъемы, а
иногда и во внутренние, персонального компьютера).
11. Все системы требуют ОЗУ не менее 16-64 Мб и для размещения полного пакета на жестком диске около 200-600 Мб. Также требуется
наличие CD-ROM для использования библиотек, приложений и примеров.
7.4. Компьютерный практикум 10.
Лабораторная работа по теме “AutoCad”
Цель работы: Освоить приемы работы с промышленным пакетом
инженерной графики.
1.
2.
Задание на проведение лабораторной работы:
Изучите способ работы с AutoCad и создайте чертеж, в котором будет
присутствовать три вида детали, с указанными размерами.
Замечание: чертеж выберите самостоятельно так, чтобы на нем была
бы окружность и сечения или разрезы.
Контрольные вопросы к разделу “Дополнительные
вопросы компьютерной графики”
1. Основные методы повышения реалистичности изображения.
2. Метод прямой трассировки лучей, его суть.
3. Метод обратной трассировки лучей.
4. Сравнение методов трассировок.
5. Метод излучательности, его преимущества и недостатки.
6. Алгоритм работы метода обратной трассировки лучей.
7. Методы моделирования текстуры поверхности.
8. Виды текстур.
9. Примеры моделирования текстур.
10. Классификация продуктов для инженерных задач.
11. Возможности AutoCad.
12. Приложения к AutoCad.
154
13. Тенденции развития современных
технологической подготовки.
систем
конструкторско-
Задачи к разделу “Дополнительные вопросы компьютерной графики”
1. Разработайте математику и программу моделирования текстур поверхности кирпича, волн, мрамора, дерева, асфальта, облаков, пламени.
2. Разработайте математику и программу нанесения текстур на платоновы тела.
3. Создайте алгоритм обратной трассировки лучей для простейшей
задачи (без диффузных поверхностей, есть только простейшие тела сфера и куб).
4. Создайте (или изучите) математику для метода излучательности.
155
8. Приложение
8.1. Исполнитель алгоритма аффинные
преобразования на плоскости
ИСПОЛНИТЕЛЬ Аффиные_преобразования_на_плоскости
. Система Предписаний (СП):
. . ввести_данные (ndat, nrebr: целые; h: целое; FIG[ ]: действительная, REBRO[ ]: целая) | FIG[ndat,3], REBRO[nrebr,2]
. . нарисовать_фигуру (ndat, nrebr: целые; FIG1[ ]: действительная,
REBRO[ ]: целая)
| FIG1[ndat,3]
. . вращение (phi: действительное, R[ ]: действительная) | R[3,3]
. . расширение_сжатие (alpha, delta: действительные; D[ ]: действительная)
| D[3,3]
. . отражение (priznak: действительное, REF[ ]: действительная)
| REF[3,3]
. . перемещение (lambda, mu: действительные; T[ ]: действительная)
| T[3,3]
. . умножить (m, n, k: целые; A[], В[], C[]: действительные)
| А[m, n], B[n, k] С[m, k], m=n=k=4
. . результат (ndat: целое; SCEN[], FIG[], FIG1[]: действительные)
| SCEN[3,3], FIG[ndat,3], FIG1[ndat,3]
. Конец СП.
. Типы:
. . E[ ]: действительная
. Константы:
. . pi=3.141593
. . h=1
НАЧАЛО
. | Формирование единичной матрицы для сценария аффинного преобразования
. Цикл i[1..3] Выполнять
. . Цикл j[1..3] Выполнять
. . . Если i = j То
. . . . E(i, j) = 1
. . . Иначе
156
. . . . E(i, j) = 0
. . . Конец Если
. . Конец Цикла
. Конец Цикла
. ввести_данные (ndat, nrebr, h; FIG[ ], REBRO[ ])
. | Здесь можно формировать сценарий аффинного преобразования,
. | например, поворот на 360. Для этого в цикле от phi=0 до 2*pi надо
. | выполнить процедуры:
. | вращение (phi, R[ ])
. | результат (ndat, R[ ] , FIG[ ], FIG1[ ])
. | нарисовать_фигуру (ndat, nrebr, FIG1[ ], REBRO[ ])
КОНЕЦ Аффиные_преобразования_на_плоскости
Замечание. Подпрограмма считывания из файла данных (ввести_данные) имеет специфичные особенности для каждого из языков
программирования и при ее реализации трудностей в принципе не возникает, поэтому она не приводится.
ПРОГРАММА умножить (m, n, k: целые; A[ ], В[ ], C[ ]: действительные)
. Дано: | матрицы-сомножители A[ ], B[ ] и их размерности
. Получить: | матрицу-результат умножения C[ ]
. Типы:
. . i, j, l: целые
. . s: действительное
НАЧАЛО
. Цикл  i[1, m] Выполнять
. . Цикл  j[1, k] Выполнять
...s=0
. . . Цикл  l[1, n] Выполнять
. . . . s = s + A[i, l] * B[l, j]
. . . Конец Цикла
. . . C[i, j] = s
. . Конец Цикла
. Конец Цикла
КОНЕЦ умножить
157
ПРОГРАММА расширение_сжатие (alpha, delta: действительные; D[]:
действительная)
. Дано: | параметры вектора, по которому нужно переместить фигуру
. Получить: | матрицу 3х3 перемещения D[ ]
НАЧАЛО
. D(1, 1)= alpha; D(1, 2)= 0;
. D(2, 1)= 0;
D(2, 2)= delta;
. D(3, 1)= 0;
D(3, 2)= 0;
КОНЕЦ расширение_сжатие
D(1, 3)= 0
D(2, 3)= 0
D(3, 3)= 1
ПРОГРАММА отражение (priznak: действительное; REF[ ]: действительная)
. Дано: | признак оси отражения: priznak=1 - относительно оси OX;
| priznak=0 - относительно оси OY.
. Получить: | матрицу 3х3 отражения REF[ ].
НАЧАЛО
. Если priznak=1 То
. . REF(1,1)=1
. . REF(2,2)=-1
. Иначе
. . REF(1,1)=-1
. . REF(2,2)=1
. Конец Если
. REF(1,2) = 0; REF(1,3) = 0
. REF(2,1) = 0; REF(2,3) = 0
. REF(3,1) = 0; REF(3,2) = 0
КОНЕЦ отражение.
ПРОГРАММА вращение (phi: действительное, R[ ]: действительная)
. Дано: | угол поворота фигуры phi относительно начала координат.
. Получить: | матрицу 3х3 вращения R[ ].
НАЧАЛО
. R(1,1) = COS(phi); R(1,2) = SIN(phi); R(1,3) = 0
. R(2,1) = -SIN(phi); R(2,2) = COS(phi); R(2,3) = 0
. R(3,1) = 0; R(3,2) = 0; R(3,3) = 1
КОНЕЦ вращение.
158
ПРОГРАММА перемещение (lambda, mu: действительное; Т[ ]: действительная)
. Дано: | координаты lambda, mu вектора перемещения.
. Получить: | матрицу 3х3 вращения Т[ ].
НАЧАЛО
. T(1,1) = 1; T(1,2) = 0; T(1,3) = 0
. T(2,1) = 0; T(2,2) = 1; T(2,3) = 0
. T(3,1) = lambda; T(3,2) = mu; T(3,3) = 1
КОНЕЦ перемещение.
ПРОГРАММА результат (ndat: целое; SCEN[ ], FIG[ ], FIG1[ ]: действительные)
. Дано: | координаты вершин исходной фигуры в матрице FIG[ ] размерности ndat x3, матрица сценария аффинного преобразования SCEN[ ]
размерности 3х3.
. Получить: | координаты вершин фигуры, преобразованной матрицей
сценария.
. Типы:
. . А1(1, 3), С1(1,3): действительные
НАЧАЛО
. | Построчная обработка координат исходной фигуры матрицей сценария
. Цикл  i[1, ndat] Выполнять
. . Цикл  j[1, 3] Выполнять
. . . A1(1, j) = FIG(i, j) | в A1[ ] - строка с координатами вершин,
включая третью вспомогательную
. . Конец Цикла
. . умножить (1,3,3, A1[], SСEN[]), C1[])
| преобразование координат сценарием
. . Цикл  j[1, 3] Выполнять
. . . FIG1(i, j) = C1(1, j)
| в C1[] - строка с координатами
| вершин, включая третью вспомогательную
. . Конец Цикла
. Конец Цикла | в массиве FIG1[] - координаты вершин, преобразованные
сценарием
. нарисовать_фигуру (ndat, nrebr, FIG1[], REBRO[])
КОНЕЦ результат.
159
ПРОГРАММА нарисовать_фигуру (ndat, nrebr: целые; VERSH1[ ]: действительная; REBRO[ ]: целая)
. Дано: | массив координат фигуры, преобразованной сценарием
| в матрице VERSH1[]; массив REBRO[] с номерами вершин,
| подлежащих соединению;
. Получить: | рисунок преобразованной фигуры (соединяя линиями
| координаты вершин, указанных в REBRO[]);
Замечание. Для реализации данной программы приходится употреблять операторы графики, которые в разных языках различны. Соединить вершины фигуры линиями в цикле несложно, поэтому данная программа не приводится.
8.2. Исполнитель алгоритма построения
перспективных проекций
ИСПОЛНИТЕЛЬ Перспективная_проекция.
. Система Предписаний (СП):
. . ввести_данные (ndat, nrebr: целые; VERSH[ ]: действительная,
REBRO[ ]: целая)
| VERSH[ndat,4]; массив REBRO[nrebr,2]
. . нарисовать_фигуру (ndat, nrebr: целые; VERSH1[ ]:
действительная, REBRO[ ]: целая) | VERSH1[ndat,4],
REBRO[nrebr,4]
. . перемещение (lambda, mu, nu: действительные; T[ ]:
действительная) | T[4,4]
. . умножить (m, n, k: целые; A[], В[], C[]: действительные)
| А[m, n], B[n, k] С[m, k], m=n=k=4
. . перспектива (cx, cy, cz: действительные; PR[]: действительная) |
PR[4,4]
. Конец СП.
. Константы:
. . pi=3.141592
НАЧАЛО
. ввести_данные (ndat, nrebr; VERSH[], REBRO[])
. | Сформировать сценарий аффинного преобразования - например,
. | Рисунок исходной фигуры:
. перемещение (-50, -50, -50, t)
160
. умножить (nversh-4, 4, 4, versh, t, versh)
. перспектива (cx, cy, cz, rez)
. умножить (nversh, 4, 4, versh, rez, vershr)
. | затем вызвать программу:
. нарисовать_фигуру (ndat, nrebr, VERSH1[], REBRO[])
. | Построение перспективной проекции можно строить в цикле
КОНЕЦ Перспективная_проекция.
Замечание. Подпрограмма считывания из файла данных (ввести_данные) имеет специфичные особенности для каждого из языков
программирования и при ее реализации трудностей в принципе не возникает, поэтому она не приводится.
ПРОГРАММА умножить (m, n, k: целые; A[], В[], C[]: действительные)
. Дано: | матрицы-сомножители A[], B[] и их размерности
. Получить: | матрицу-результат умножения C[]
. Типы:
. . i, j, l: целые
. . s: действительное
НАЧАЛО
. Цикл  i[1, m] Выполнять
. . Цикл  j[1, k] Выполнять
...s=0
. . . Цикл  l[1, n] Выполнять
. . . . s = s + A[i, l] * B[l, j]
. . . Конец Цикла
. . . C[i, j] = s
. . Конец Цикла
. Конец Цикла
КОНЕЦ умножить
ПРОГРАММА перемещение(lambda, mu, nu: действительные; T[ ]: действительная)
. Дано: | координаты lambda, mu, nu вектора перемещения
. Получить: | матрицу 4х4 вращения Т[ ]
НАЧАЛО
. T[1,1]=1;
T[1,2]=0;
T[1,3]=0;
161
T[1,4]=0
. T[2,1]=0;
T[2,2]=1;
. T[3,1]=0;
T[3,2]=0;
. T[4,1]=lambda; T[4,2]=mu;
КОНЕЦ перемещение
T[2,3]=0;
T[3,3]=1;
T[4,3]=nu;
T[2,4]=0
T[3,4]=0
T[4,4]=1
ПРОГРАММА перспектива (cx, cy, cz: действительные; PR[ ]: действительная)
. Дано: | координаты kx, ky, kz вектора перемещения
. Получить: | матрицу 4х4 вращения PR[ ]
. Типы:
. . kx, ky, kz: целые
НАЧАЛО
. kx=0; ky=0; kz=1;
. PR[1,1]=1; PR[1,2]=0;
. PR[2,1]=0; PR[2,2]=1;
. PR[3,1]=0; PR[3,2]=0;
. PR[4,1]=0; PR[4,2]=0;
КОНЕЦ перспектива
PR[1,3]=0;
PR[2,3]=0;
PR[3,3]=1;
PR[4,3]=0;
PR[1,4]=-kx/cx
PR[2,4]=-ky/cy
PR[3,4]=-kz/cz
PR[4,4]=1
ПРОГРАММА нарисовать_фигуру (ndat, nrebr: целые; VERSH1[ ]: действительная; REBRO[ ]: целая)
. Дано: | массив координат фигуры, преобразованной сценарием
| в матрице VERSH1[ ]; массив REBRO[ ] с номерами вершин,
| подлежащих соединению;
. Получить: | рисунок преобразованной фигуры (соединяя линиями
| координаты вершин, указанных в REBRO[ ]);
Замечание. Для реализации данной программы приходится употреблять операторы графики, которые в разных языках различны. Соединить вершины фигуры линиями в цикле несложно, поэтому данная программа не приводится.
8.3. Исполнитель алгоритма удаления невидимых
линий в полиэдре
ИСПОЛНИТЕЛЬ Удаление_невидимых_линий_полиэдра.
162
. Дано:  имя файла
. Получить:  изображение полиэдра с удаленными невидимыми линиями.
. Система Предписаний (СП):
. . контур_фигуры (s, xl, xr, yt, yb, zf: действительные, выходные)
. . тест_видимости (sr, l, s, xl, xr, yt, yb, zf: действительные)
. . прямая (x1, y1, x2, y2: действительные, color: целое)
. . чтение_из_файла (“имя_файла”, имя_массива)
. Конец СП.
. Глобальные Переменные:
. . ns: целое
| число вершин полиэдра
. . nv: целое
| максимальное число вершин в одной грани
. . nv (ns) | массив элементов nv(i): целое с индексом i=1..ns, число
вершин в каждой i-й грани
. Массивы:
. . x1(ns, nv)
| массив элементов x1(i,j): целое с индексами
i=1..ns, j=1..nv, координаты по оси x
. . y1(ns, nv)
| массив элементов y1(i,j): целое с индексами
i=1..ns, j=1..nv, координаты по оси y
. . z1(ns, nv)
| массив элементов z1(i,j): целое с индексами
i=1..ns, j=1..nv координаты по оси z
. | Таким образом, координаты вершины задаются тройкой {x1(i, j), y1(i,j),
z1(i, j)}.
. | Для того чтобы задать правила соединения вершин ребрами, введены
. | массивы x2(ns, nv), y2(ns, nv), z2(ns, nv).
. . x2(ns, nv)
| массив элементов x2(i, j): целое с индексами
i=1..ns, j=1..nv
|координаты по оси x для вершины, соединенной с вершиной
| {x1(i, j), y1(i, j), z1(i, j)} ребром.
. . y2(ns, nv)
| массив элементов y2(i, j): целое с индексами
i=1..ns, j=1..nv
| координаты по оси x для вершины, соединенной с вершиной
| {x1(i, j), y1(i, j), z1(i, j)} ребром.
163
. . z2(ns, nv)
| массив элементов z2(i, j): целое с индексами
i=1..ns, j=1..nv
| координаты по оси x для вершины, соединенной с вершиной
| {x1(i, j), y1(i, j), z1(i, j)} ребром.
. | Таким образом, координаты вершины, соединенной с {x1(i, j), y1(i, j),
z1(i, j)} ребром, задаются тройкой {x2(i, j), y2(i, j), z2(i, j)}.
. . m(nv), b(nv) | массивы элементов m(i), b(i): целые с индексами
i=1..nv параметры уравнений прямых
. Типы:
. . s, v, sr, l: целые
. . xl, xr, yt, bb, zf: действительные | соответственно левая, правая
граница контура, окаймляющего рассматриваемую грань по осям
x, y; zf - ближайшая к картинной плоскости точка на оси z.
. . color, foncolor: целые | номера цветов для вычерчивания фигуры
и фона
НАЧАЛО
. | Чтение исходных данных
. чтение_из_файла ("файл_исходных_данных", ns) | чтение числа вершин
. Цикл s[1, ns] Выполнять
. . чтение_из_файла ("файл_исходных_данных", nv(s)) | чтение
числа вершин s-й грани
. . чтение_из_файла ("файл_исходных_данных", x1(s, 1), y1(s, 1),
z1(s, 1)) | чтение координат первой вершины грани
. . Цикл v[2, nv(s)] Выполнять
. . . чтение_из_файла ("файл_исходных_данных", x1(s, v),
y1(s,v), z1(s, v)) | чтение координат v-й вершины грани
. . . x2(s, v-1) = x1(s, v) | расчет координат вершины
. . . y2(s, v-1) = y1(s, v) | соединенной с v-й ребром
. . . z2(s, v-1) = z1(s, v)
. . Конец Цикла
. . x2(s, nv(s)) = x1(s, 1)
| для ребра, соединяющего первую и
. . y2(s, nv(s)) = y1(s, 1)
| последнюю вершины грани
. . z2(s, nv(s)) = z1(s, 1)
. Конец Цикла
. | вычерчивание всех линий, включая невидимые
. Цикл s[1, ns] Выполнять
164
. . Цикл v[1, nv(s)] Выполнять
. . . прямая (x1(s, v), y1(s, v), x2(s, v), y2(s, v), зеленый)
. . Конец Цикла
. Конец Цикла
. | Циклическое удаление невидимых линий для каждого ребра, не входящего в данную грань, проверяется условие загораживания.
. Цикл s[1, ns] Выполнять
. . контур_фигуры (s, xl ,xr, yt, yb, zf: действительные) |выходные
переменные
. . Цикл sr[1, ns] Выполнять
. . . Если s <> sr То
. . . . Цикл l[1, nv(sr)] Выполнять
. . . . . тест_видимости (s, xl, xr, yt, yb, zf)
. . . . Конец Цикла
. . . Конец Если
. . Конец Цикла
. Конец Цикла
КОНЕЦ Удаление_невидимых_линий_полиэдра.
ПРОГРАММА контур_фигуры (s, xl, xr, yt, yb, zf: действительные)
. | выходные переменные: xl, xr, yt, yb, zf
. | находятся границы рассматриваемой s-й грани:
. | левая (xl), правая (xr), верхняя (yb), нижняя (yt) и
. | ближайшая точка по оси z (zf)
. Типы:
. . k, p: целые
НАЧАЛО
. xl = x1(s, 1)
. xr = x1(s, 1)
. yt = y1(s, 1)
. yb = y1(s, 1)
. zf = z1(s, 1)
. Цикл  k[1,nv(s)] Выполнять
. . Если z1(s, k) < zf
То zf = z1(s, k)
. . Если z2(s, k) < zf
То zf = z2(s, k)
. . Если y1(s, k) < yt
То yt = y1(s, k)
165
. . Если y2(s, k) < yt
. . Если y1(s, k) > yb
. . Если y2(s, k) > yb
. . Если x1(s, k) < xl
. . Если x2(s, k) < xl
. . Если x1(s, k) > xr
. . Если x2(s, k) > xr
. Конец Цикла
То yt = y2(s, k)
То yb = y1(s, k)
То yb = y2(s, k)
То xl = x1(s, k)
То xl = x2(s, k)
То xr = x1(s, k)
То xr = x2(s, k)
. | определение наклона прямых-ребер s-й грани
. Цикл  p[1, nv(s)] Выполнять
. . Если y1(s, p) = y2(s, p) То |грань горизонтальна
. . . m(p) = 0
|наклон горизонт линии = 0
. . . b(p) = y1(s, p)
. . Иначе Если x1(s, p) = x2(s, p) То |грань вертикальна
. . . . m(p) = 9999 |наклон как бы бесконечен
. . . Иначе
. . . . m(p) = (y2(s, p) - y1(s, p)) / (x2(s, p) - x1(s, p))
. . . . b(p) = y1(s, p) - m(p) * x1(s, p)
. . . Конец Если
. . Конец Если
. Конец Цикла
КОНЕЦ контур_фигуры
ПРОГРАММА тест_видимости (sr, l, s, xl, xr, yt, yb, zf: действительные)
. Типы:
. . z1sr, z2sr, y1sr, y2sr, x1sr, x2sr, x1sk, x2sk, y1sk:
действительные
. . y2sk, mt, bt, xp, yp, xa, ya, xd, yd, zl, zs: действительные
. . c, k, j: целые
НАЧАЛО
. | переобозначения
. z1sr = z1(sr, l)
. z2sr = z2(sr, l)
. y1sr = y1(sr, l)
. y2sr = y2(sr, l)
. x1sr = x1(sr, l)
. x2sr = x2(sr, l)
166
. | Заход в Если ... , когда рассматриваемое ребро входит внутрь контура,
. | ограничивающего грань
. Если (z1sr>zf или z2sr > zf) и (y1sr > yt или y2sr > yt) и
(y1sr < yb или y2sr < yb) и (x1sr > xl или x2sr > xl) и
(x1sr < xr или x2sr < xr) То
. . Если x1(sr, l) = x2(sr, l) То
. . . mt = 9999
| ребро вертикально
. . Иначе Если y1(sr, l) = y2(sr, l) То
. . . . mt = 0
. . . . bt = y1(sr, l) | ребро горизонтально
. . . Иначе
. . . . mt = (y1(sr, l) - y2(sr, l)) / (x1(sr, l) - x2(sr, l))
. . . . bt = y1(sr, l) - mt * x1(sr, l)
. . . Конец Если
. . Конец Если
. . | расчет числа скрытых фрагментов
. . c = 0 | число скрытых фрагментов
. . Цикл  k[1, nv(s)] Выполнять
. . . x1sk = x1(s, k) | переобозначения
. . . y1sk = y1(s, k)
. . . x2sk = x2(s, k)
. . . y2sk = y2(s, k)
. . . | для совпадающих линий вычисления не выполняются
. . . Если x1sk <> x1sr или y1(s, k) <> y1sr или x2sk <> x2sr
или y2sk <> y2sr То
. . . . Если (x1sk <> x2sr или y1(s, k) <> y2sr или
x2sk <> x1sr или y2sk <> y1sr) То
. . . . . Если m(k) <> mt То
|если ребра не параллельны
. . . . . . Если x1(s, k) = x2(s, k) То
. . . . . . . xp = x1(s, k)
. . . . . . . yp = mt * xp + bt
. . . . . . Иначе Если x1(sr, l) = x2(sr, l) То
. . . . . . . xp = x1(sr, l)
. . . . . . . yp = m(k) * xp + b(k)
. . . . . . . Иначе Если y1(s,k)=y2(s,k) То
. . . . . . . . yp = y1(s, k)
. . . . . . . . xp = (yp - bt) / mt
. . . . . . . . Иначе Если y1(sr, l) =y2(sr, l) То
. . . . . . . . . yp = y1(sr, l)
167
. . . . . . . . . xp = (yp-b(k)) / m(k)
. . . . . . . . Иначе
. . . . . . . . . xp = (bt - b(k)) / (m(k) - mt)
. . . . . . . . . yp = (mt*xp + bt)
. . . . . . . . Конец Если
. . . . . . . Конец Если
. . . . . . Конец Если
. . . . . . Если (xp >= x1sk или xp >= x2sk) и
(xp <= x1sk или xp <= x2sk) и
(yp >= y1sk или yp >= y2sk) и
(yp <= y1sk или yp <= y2sk) То
. . . . . . . Если x1(sr, l) = x2(sr, l) То
. . . . . . . . zl = (yp - y1(sr, l)) / (y2(sr, l)-y1(sr,
l))*(z2(sr, l)- z1(sr, l)) + z1(sr, l)
. . . . . . . Иначе
. . . . . . . . zl = (xp - x1(sr, l)) / (x2(sr, l) - x1(sr,
l))*(z2(sr, l)- z1(sr, l)) + z1(sr, l)
. . . . . . . Конец Если
. . . . . . . Если x1(s, k) = x2(s, k) То
. . . . . . . . zs = (yp - y1(s, k)) / (y2(s, k) - y1(s, k))*
(z2(s, k)- z1(s, k)) + z1(s, k)
. . . . . . . Иначе
. . . . . . . . zs = (xp - x1(s, k)) / (x2(s, k) - x1(s,
k))*(z2(s, k) - z1(s, k)) + z1(s, k)
. . . . . . . Конец Если
. . . . . . . Если zl >= zs То
. . . . . . . . Если (xp<x1(sr, l) и
xp < x2(sr, l)) или
(xp > x1(sr, l) и
xp > x2(sr, l)) То
. . . . . . . . . Если ABS(xp - x1(sr, l)) < ABS(xp
- x2(sr, l)) То
. . . . . . . . . . xp = x1(sr, l)
. . . . . . . . . . yp = y1(sr, l)
. . . . . . . . . Иначе
. . . . . . . . . . xp = x2(sr, l)
. . . . . . . . . . yp = y2(sr, l)
. . . . . . . . . Конец Если
. . . . . . . . Иначе
. . . . . . . . Если (yp < y1(sr, l) и
168
yp < y2(sr, l)) или
(yp > y1(sr, l) и
yp > y2(sr, l)) То
. . . . . . . . . Если ABS(yp - y1(sr, l)) <
ABS(yp - y2(sr, l)) То
. . . . . . . . . . yp = y1(sr, l)
. . . . . . . . . . xp = x1(sr, l)
. . . . . . . . . Иначе
. . . . . . . . . . yp = y2(sr, l)
. . . . . . . . . . xp = x2(sr, l)
. . . . . . . . . Конец Если
. . . . . . . . Конец Если
. . . . . . . Конец Если
. . . . . . . Цикл  j[1, nv(s)] Выполнять
. . . . . . . . Если mt = m(j) и
yp = m(j) * xp + b(j) То
. . . . . . . . . k = nv(s) + 1
. . . . . . . . Конец Если
. . . . . . . Конец Цикла
. . . . . . . Если c <> 0 То
. . . . . . . . Если xp <> xa или
yp <> ya То
. . . . . . . . . xd = xp
. . . . . . . . . yd = yp
.........c=c+1
. . . . . . . . Конец Если
. . . . . . . Иначе
. . . . . . . . xa = xp
. . . . . . . . ya = yp
........c=c+1
. . . . . . . Конец Если
. . . . . . Конец Если
. . . . . Конец Если
. . . . Конец Если
. . . Конец Если
. . Конец Цикла
. . Если c >= 2 То
. . . прямая(xa, ya, xd, yd, color) | закрашивание невидимой
| части фоновым цветом
169
. . Конец Если
. Конец Если
КОНЕЦ тест_видимости
Замечание. Подпрограмма рисования прямой не приводится, так
как она рассматривалась нами ранее (см. раздел 3). А подпрограмма считывания из файла данных имеет специфичные особенности для каждого
из языков программирования и при ее реализации трудностей в принципе
не возникает.
8.4. Исполнитель алгоритма графика функции
двух переменных
ИСПОЛНИТЕЛЬ График_функции_двух_переменных.
. Система Предписаний (СП):
. . сечение_графика(x1, y1, x2, y2, fmin, fmax, n1, n2: действительные)
. | x1, x2 - минимальное и максимальное значение по оси OX
. | y1, y2 - минимальное и максимальное значение по оси OY
. | fmin, fmax - минимальное и максимальное значение по оси OZ
. | n1, n2 - число дискрет по осям OX и OY соответственно
. . модифицированная_прямая_Брезенхема(x11, y11, x12, y12: целые)
. | x11, y11 - координаты начальной точки прямой
. | x12, y12 - координаты конечной точки прямой
. . высветить_пиксел(x, y, color: целые)
. . функция_z(xz, yz: действительные): действительное
. | функция рассчитывается по аргументам xz, yz свое значение и
. | возвращает его в виде действительного числа - f(x,y)
. Конец СП.
. КОНСТАНТЫ:
. . pi=3.141592
. . upcolor = 10: целое
. . downcolor=4: целое
| “лицевой” цвет графика
| “изнаночный” цвет графика
170
. . alpha = -30: действительное
. . beta = 10: действительное
. | alpha,beta - для вычисления углов phi,psi поворотов при проецировании
. Массивы:
. . ymin[640], ymax[640]: целые | статические массивы с элементами ymin(i),
. . | ymax(i) для хранения значений горизонта видимости
НАЧАЛО
. | Присвоение признака неопределенности горизонта видимости
. Цикл  i [1, 640] Выполнять
. . ymin(i)=7777
. . ymax(i)=7777
. Конец Цикла
. | Вызов модуля построения горизонта видимости
. сечение_графика(-2, -2, 2, 2, -0.5, 0.5, 100, 100)
КОНЕЦ График_функции_двух_переменных.
ПРОГРАММА сечние_графика(x1, y1, x2, y2, fmin, fmax, n1, n2: действительные)
. Дано: | диапазоны изменения графика по всем осям, число точек отсчета
по осям OX, OY
. Получить: | значение функции в сечениях y=const и горизонты
| видимости для каждого сечения
. Типы:
. . e1[3], e2[3], e3[3]: массивы действительных чисел
| для расчета проекций
. . phi, psi, sphi, spsi, cphi, cpsi, hx, hy, al, bl: действительные
. . xmin, xmax, ymin, ymax, ax, bx, ay, by, x, y, xx: действительные
. . xx1, yy1, xx2, yy2: целые
НАЧАЛО
. | Расчет углов поворота для проецирования графика и значений e1(),
e2(),
. | e3(). Аффинные преобразования выбраны такими, чтобы проекцией
. | вертикальной линии была вертикальная линия.
. phi = alpha * pi / 180; psi = beta * pi / 180
. sphi = SIN(phi); cphi = COS(phi)
171
. spsi = SIN(psi); cpsi = COS(psi)
. e1(1) = cphi; e1(2) = sphi; e1(3) = 0
. e2(1) = spsi * sphi; e2(2) = -spsi * cphi; e2(3) = cpsi;
. | Определение дискрет по осям OX, OY
. hx = (x2 - x1) / n1; hy = (y2 - y1) / n2
. | Определение размеров прямоугольника, в который вписывается весь
. | график при заданных значениях x1, y1, x2, y2, fmin, fmax и при
. | заданном положении картинной плоскости (решается перебором по
. | всем сочетаниям “угловых точек” прямоугольника (x1,y1) (x1,y2)
(x2,y2)
. | (x2,y1) с учетом разброса графика (fmin,fmax) по оси OZ.
. | определение минимального значения по оси OX
. Если e1(1) >= 0 То
. . al = x1
. Иначе
. . al = x2
. Конец Если
. Если e1(2) >= 0 То
. . bl = y1
. Иначе
. . bl = y2
. Конец Если
. xmin = al * e1(1) + bl * e1(2) | минимальное значение по оси OX
. | при заданном положении картинной плоскости
. | определение максимального значения по оси OX
. Если e1(1) >= 0 То
. . al = x2
. Иначе
. . al = x1
. Конец Если
. Если e1(2) >= 0 То
. . bl = y2
. Иначе
. . bl = y1
. Конец Если
. xmax = al * e1(1) + bl * e1(2) | максимальное значение по оси OX при
. | заданном положении картинной плоскости
172
. | определение минимального значения по оси OY
. Если e2(1) >= 0 То
. . al = x1
. Иначе
. . al = x2
. Конец Если
. Если e2(2) >= 0 То
. . bl = y1
. Иначе
. . bl = y2
. Конец Если
. ymin = al * e2(1) + bl * e2(2) | минимальное значение по оси OY при
. | заданном положении картинной плоскости без учета высоты графика
. | определение максимального значения по оси OY
. Если e2(1) >= 0 То
. . al = x2
. Иначе
. . al = x1
. Конец Если
. Если e2(2) >= 0 То
. . bl = y2
. Иначе
. . bl = y1
. Конец Если
. ymax = al * e2(1) + bl * e2(2) | максимальное значение по оси OY при
. | заданном положении картинной плоскости без учета высоты графика
. | Уточнение границ по оси OY с учетом высоты графика
. Если e2(3) >= 0 То
. . ymin = ymin + fmin * e2(3)
. . ymax = ymax + fmax * e2(3)
. Иначе
. . ymin = ymin + fmax * e2(3)
. . ymax = ymax + fmin * e2(3)
. Конец Если
. | Приведение масштаба к окну экрана (10, 10, 610, 310)
. ax = 10 - 600 * xmin / (xmax - xmin)
. bx = 600 / (xmax - xmin)
173
. ay = 10 - 300 * ymin / (ymax - ymin)
. by = -300 / (ymax - ymin)
. | Циклический расчет точек z=f(x,y) в сечениях y=const. Рассчитывается
пара точек (для одного и того же значения y и двух “соседних” значений
x, x+hx). Затем вычисляется значение функции f(x,y) с соответствующим
преобразованием в масштаб окна. Используются аффинные преобразования с углами phi, psi. Рассчитанные координаты двух точек проекции
функции на картинную плоскость передаются в подпрограмму модифицированная_прямая_Брезенхема для изображения с помощью прямой
линии (кусочно-линейная аппроксимация функции f(x,y). Цикл по y организован так, чтобы сечения “удалялись” от картинной плоскости.
. Цикл  i[n2, 1] шаг -1 Выполнять | направление удаления от
|картинной плоскости
. . Цикл  j[1, n1]
. . . x = x1 + (j - 1) * hx
| первая пара координат: (x,y)
. . . y = y1 + (i - 1) * hy
. . . xx = x1 + (j - 1) * hx + hx | вторая пара координат: (xx,y)
. . . | расчет пары точек-проекций f(x,y) для координат (x,y) и
. . . | (xx,y) в целых числах, для использования растровых
. . . | свойств при построении прямой линии
. . . xx1 = INT(ax + bx * (x * e1(1) + y * e1(2)))
. . . yy1 = INT(ay + by*(x*e2(1)+y*e2(2)+функция_z(x, y)*e2(3)))
. . . xx2 = INT(ax + bx*(xx*e1(1) + y*e1(2)))
. . . yy2 = INT(ay + by * (xx * e2(1)+y*e2(2) + функция_z(xx,
y)*e2(3)))
. . . модифицированная_прямая_Брезенхема(xx1, yy1, xx2, yy2) |
вызов подпрограммы
. . Конец Цикла
. Конец Цикла
КОНЕЦ сечение_графика
ПРОГРАММА функция_z(x, y: действительные): действительное
. Дано: | значение аргументов x, y
. Получить: | значение функции, график которой строится
. Типы:
. . r: действительное
НАЧАЛО
174
.r=x*x+y*y
. функция_z= .6 * COS(r) / (SQR(r) + 1)
. | другие примеры многоэкстремальных функций:
. | функция_z= 1.1 * SIN(r) ^ 2 * 10 * COS(r) ^ 10 / (r + 1)
. | функция_z= 2 * COS(r) * SIN(r) * EXP(-.2 * r) / (r + 1)
. | функция_z= 50 * SIN(r) ^ 7 * COS(r) ^ 6 / (r + 1)
КОНЕЦ функция_z
ПРОГРАММА модифицированная_прямая_Брезенхема(x1, y1, x2, y2:
целые)
. Дано: | координаты начала и конца отрезка
. Получить: | изображение видимых частей отрезка, т.е. расположенных
выше или ниже текущего контура горизонта; откорректировать контуры
горизонта с учетом x1, y1, x2, y2.
. Типы:
. . dx, dy, d, d1, d2, i, x, y: целые
НАЧАЛО
. dx = ABS(x2 - x1); dy = ABS(y2 - y1)
. Если x2 >= x1 То sx = 1 Иначе sx = -1 | направление по x
. Если y2 >= y1 То sy = 1 Иначе sy = -1 | направление по y
. Если dy <= dx То | тангенс угла наклона прямой 45.
. . d = 2 * dy - dx
. . d1 = 2 * dy
| d1, d2 - варианты инкрементов для
. . d2 = 2 * (dy - dx) | прямой Брезенхейма
. . i = 0; x = x1; y = y1
. . Цикл Пока i <= dx
. . . Если ymin(x) = 7777 То | первое обращение: горизонт не
определен
. . . . высветить_пиксель(x, y, upcolor) | лицевым цветом
. . . . ymin(x) = y | первое определение нижней линии
горизонта
. . . . ymax(x) = y | первое определение верхней линии
горизонтта
. . . Иначе Если y < ymin(x) То | точка ниже горизонта
. . . . высветить_пиксель(x, y, upcolor)
. . . . ymin(x)=y | корректировка нижней линии горизонта
. . . . Иначе Если y > ymax(x) То
. . . . . высветить_пиксель(x, y, downcolor)
175
| изнаночным цветом
. . . . . ymax(x) = y | корректировка верхней линии
горизонта
. . . Конец Если
. . . Если d > 0 То | изменяется координата по y на 1
. . . . d = d + d2; y = y + sy
. . . Иначе
. . . . d = d + d1 | координата по y не изменяется.
. . . Конец Если
. . . x = x + sx | шаг по оси x
...i=i+1
. . Конец Цикла
. Иначе | угол наклона прямой >45, оси меняются местами
. . d = 2 * dx - dy; d1 = 2 * dx;
| d1, d2 - варианты инкрементов для
. . d2 := 2 * (dx - dy)
| прямой Брезенхема
. . i = 0; x = x1; y = y1
. . Цикл Пока i <= dy
. . . Если ymin(x) = 7777 То | первое обращение: горизонт не
определен
. . . . высветить_пиксель(x, y, upcolor) | лицевым цветом
. . . . ymin(x) = y | первое определение нижней линии
горизонта
. . . . ymax(x) = y | первое определение верхней линии
горизонта
. . . Иначе Если y < ymin(x) То | точка ниже горизонта
. . . . высветить_пиксель(x, y, upcolor)
. . . . ymin(x)=y | корректировка нижней линии горизонта
. . . . Иначе Если y > ymax(x) То
. . . . . высветить_пиксель(x, y ,downcolor)
| изнаночным цветом
. . . . . ymax(x) = y | корректировка верхней линии
горизонта
. . . Конец Если
. . . Если d > 0 То | изменяется координата по x на 1
. . . . d = d + d2; x = y + sx
. . . Иначе
. . . . d = d + d1 | координата по x не изменяется.
. . . Конец Если
. . . y = y + sy
| шаг по оси y
176
...i=i+1
. . Конец Цикла
. Конец Если
КОНЕЦ модифицированная_прямая_Брезенхейма
Крушель Е.Г.
177
Download