
- •Понятие компьютерной графики. Задачи. Основные понятия и определения.
- •Основные направления машинной и компьютерной графики. Деловая графика. Основные направления компьютерной графики
- •Деловая графика
- •Виды компьютерной графики. Растровая графика. Векторная графика. Достоинства и недостатки.
- •Фрактальная графика.
- •Классы программ для работы с растровой графикой. Средства создания и обработки изображений.
- •Разрешение изображения и его размер.
- •Понятие растра. Методы растрирования
- •Rt (Rational-Tangent)-растрирование (растрирование по методу рациональных тангенсов)
- •Суперячейки
- •Растрирование по методу иррациональных тангенсов
- •Частотно-модулированное растрирование
- •Основы теории цвета. Цвет в машинной графике.
- •Основы теории цвета
- •У всех своя правда
- •Излучаемый и отражаемый свет
- •Цветное зрение
- •Метамерия цвета
- •Цветовая температура
- •Цветовая и яркостная адаптация зрения
- •Аддитивная цветовая модель rgb.
- •Числовое представление
- •Субтрактивная цветовая модель cmyk.
- •Преобразование между моделями rgb и cmyk.
- •Цветовая модель hsv.
- •Цветовая модель Lab.
- •Кодирование цвета.
- •Палитра.
- •Палитровые видеорежимы
- •Сравнение с HighColor и TrueColor
- •Индексные палитры.
- •Фиксированная палитра.
- •Безопасная палитра.
- •Алгоритмы вывода графических примитивов. Прямое вычисление координат.
- •Инкрементные алгоритмы. Алгоритм Брезенхэма вывода прямой линии.
- •Джойстики
- •Трекболл (trackball)
- •Тачпад (touchpad) и трекпоинт (trackpoint)
- •Сканеры
- •Дигитайзеры
- •Цифровая фотокамера
- •Принтеры
- •Устройства ввода. Основные характеристики.
- •Устройства ввода графической информации
- •Устройства ввода звуковой информации
- •Устройства ввода текстовой информации
- •Устройства вывода. Основные характеристики.
- •Устройства для вывода визуальной информации
- •Устройства для вывода звуковой информации
- •Устройства для вывода прочей информации
- •Основные геометрические характеристики растра.
- •Принципы формирования изображения на экране.
- •Вертикальная развертка и двойная буферизация.
- •Архитектура современных видеосистем. Видеопамять.
- •Архитектура современных видеосистем. Графический процессор.
- •Архитектура современных видеосистем. Локальная шина.
- •Графические видеорежимы. Эволюция видеоадаптеров.
- •Стандартные графические режимы:
- •Современные стандарты и интерфейсы программирования компьютерной графики.
- •Форматы графических файлов.
- •Векторные форматы
- •Растровые форматы
- •Методы 3d моделирования.
- •Поверхностный метод 3d моделирования.
- •Твердотельный тип 3d моделирования.
- •Алгоритмы вывода графических примитивов. Прямое вычисление координат. Построение линий, окружностей, эллипсов
- •Алгоритм Брезенхэма вывода окружности.
- •Фрактальная графика. Основные характеристики.
- •Программные средства для работы с фрактальной графикой.
- •Понятие фрактала. Фрактал Мандельброта.
- •Площадные фракталы
- •Фракталы на основе метода ifs
- •Свойства фракталов.
Безопасная палитра.
Термин безопасная палитра используют в Web-графике. Поскольку скорость передачи данных в Интернете пока оставляет желать лучшего, для оформления Web-страниц не применяют графику, имеющую кодирование цвета выше 8-разрядного. При этом возникает проблема, связанная с тем, что создатель Web-страницы не имеет ни малейшего понятия о том, на какой модели компьютера и под управлением каких программ будет просматриваться его произведение. Он не уверен, не превратится ли его "зеленая елка" в красную или оранжевую на экранах пользователей. В связи с этим было принято следующее решение. Все наиболее популярные программы для просмотра Web-страниц (броузеры) заранее настроены на некоторую одну фиксированную палитру. Если разработчик Web-страницы при создании иллюстраций будет применять только эту палитру, то он может быть уверен, что пользователи всего мира увидят рисунок правильно. В этой палитре не 256 цветов, как можно было бы предположить, а лишь 216. Это связано с тем, что не все компьютеры, подключенные к Интернету способны воспроизводить 256 цветов. Такая палитра, жестко определяющая индексы для кодирования 216 цветов, называется безопасной палитрой.
Алгоритмы вывода графических примитивов. Прямое вычисление координат.
Алгоритмы вывода прямой линии: Рассмотрим растровые алгоритмы для отрезков прямой линии. Предположим, что заданы координаты (x 1 ,y 1 - х2,у2) концов отрезка прямой. Для вывода линии необходимо закрасить в определенный цвет все пикселы вдоль линии. Для того чтобы закрасить каждый пиксел, необходимо знать его координаты.
Наиболее просто нарисовать отрезок горизонтальной линии:
Вычисление текущих координат пиксела здесь выполняется как приращение по х (необходимо, чтобы х1 <-х2), а вывод пиксела обеспечивается функцией Пиксел(). Поскольку в языке С, C++ для названия функции нельзя использовать кириллицу, то будем дальше использовать ее как комментарий.
Аналогично рисуется отрезок вертикали:
Как видим, в цикле выполняются простейшие операции над целыми числами — приращение на единицу и проверка на "< =". Поэтому операция рисования отрезка выполняется быстро и просто. Ее используют как базовую операцию для других операций, например, в алгоритмах заполнения плоскости полигонов.
Можно поставить такой вопрос: какая линия рисуется быстрее — горизонталь или вертикаль? На первый взгляд — одинаково быстро. Если учитывать только математические аспекты, то скорость должна быть одной и той же при одинаковой длине линий, поскольку в обоих случаях выполняется равное количество идентичных операций. Однако если кроме расчета координат анализировать также вывод пикселов, то могут быть отличия. В растровых системах рисование пиксела обычно означает запись одного или нескольких бит в память, где сохраняется растр. И здесь уже не все равно — по строкам или по столбцам заполняется растр. Необходимо учитывать логическую организацию памяти компьютера, в которой хранятся, биты или байты растра.
Даже для компьютеров одного типа (например, персональных компьютеров) для различных поколений процессоров и памяти скорость записи по соседним адресам может существенно отличаться от скорости записи по не соседним адресам [40]. В особенности это заметно, когда для растра используется виртуальная память с сохранением отдельных страниц на диске и (или) в оперативной памяти (RAM). При работе графических программ в среде операционной системы Windows часто случается так, что горизонтали рисуются быстрее вертикалей, поскольку в страницах памяти хранятся соседние байты. А может быть, что RAM достаточно, но скорости рисования все же различны.
Например, если используется черно-белый растр в формате один бит на пиксел, то для вертикали битовая маска одинакова для всех пикселов линии, а для горизонтали маску нужно изменять на каждом шаге. Здесь необходимо заметить, что рисование черно-белых горизонталей можно существенно ускорить, если записывать сразу восемь соседних пикселов — байт в памяти.
Горизонтали и вертикали представляют собой частный случай линий. Рассмотрим линию общего вида. Для нее также необходимо вычислять координат каждого пиксела. Известно несколько методов расчетов координат точек линии.
Прямое вычисление координат
Пусть заданы координаты конечных точек отрезка прямой. Найдем координаты точки внутри отрезка (рис. 3.1).
В зависимости от угла наклона прямой выполняется цикл по оси х или по у
(рис. 3.2).
Приведем пример записи этого алгоритма на компьютерном языке программирования С, C++. Для сокращения текста рассмотрим фрагмент программы, где выполняется цикл по оси х, причем х1 <х2:
Здесь все операции выполняются над целыми числами. Двойные скобки необходимы для того, чтобы деление выполнялось после умножения. Недостатки такой программы — в цикле выполняется много лишних операций, присутствуют операции деления и умножения. Это обуславливает малую скорость работы. Относительно лишних операций в цикле. Можно вынести вычисление (у2 - у 1)/(х2 – х1) из цикла, поскольку это значение не изменяется. Однако для этого уже необходимо использовать операции с плавающей точкой:
Поскольку мы решили использовать операции с плавающей точкой, то попробуем еще уменьшить количество операций в цикле. Если раскрыть скобки в выражении у = у1 + (х – х1)-к; то получим у = у1 + х.к- х1 .к. Здесь значение (yl – х1.к) является константой— эти операции также вынесем из тела цикла.
В цикле выполняются только две арифметические операции и преобразование х из целого в форму с плавающей точкой.
Если рассматривать цикл вычисления у, по соответствующим значениям хi = х1, х1 +1, ... , х2 как итеративный процесс, то можно поставить такой вопрос: чему равна разность (уi+1 — уi)1 Она равна уi+1 —уi = xl + (хi+1—xl)k-xl- (xi – х1) к = (хi+1 – xi) к = к; поскольку xi+1 – xi =1. Разность (yi+1 – уi) — константа, равная к. Исходя из этого, можно построить цикл таким образом:
В теле цикла есть только одна операция для вычисления координаты у (если не учитывать <= и ++).
Если сравнивать последний вариант с предыдущим, то последний лучше по быстродействию. Также существенно отличаются способы вычисления координаты у. В последнем варианте значение у вычисляется прибавлением приращения к на каждом шаге, и на последнем шаге цикла (когда х=х2) должно стать у=у2. Исходя из чисто математических соображений здесь все корректно, однако необходимо учесть, что в компьютере дробные числа представляются в формате с плавающей точкой не точно. Кроме погрешности представления чисел существует ошибка выполнения арифметических операций с плавающей точкой. Ошибка зависит от разрядности мантисс, и самая малая — для long double, но все равно не нулевая. С каждым шагом цикла ошибки накапливаются, и может так произойти, что у не равно у2 на последнем шаге. Это необходимо учитывать при использовании алгоритма.
Положительные черты прямого вычисления координат:
1. Простота, ясность построения алгоритма.
2. Возможность работы с нецелыми значениями координат отрезка.
Недостатки:
1. Использование операций с плавающей точкой или целочисленных операций умножения и деления обуславливает малую скорость. Однако это зависит от процессора и для различных типов компьютеров может быть по-разному. В современных компьютерах, в которых процессоры используют эффективные способы ускорения (например, конвейер арифметических операций с плавающей точкой), время выполнения целочисленных операций уже не намного меньше. Для старых компьютеров разница могла быть в десятки раз, поэтому и старались разрабатывать алгоритмы только на основе целочисленных операций.
2. При вычислении координат путем добавления приращений может накапливаться ошибка вычислений координат.
Последнюю разновидность прямого вычисления координат, рассмотренную здесь, можно было бы назвать "инкрементной". Но такое название получили алгоритмы другого типа.