
- •Федеральное агентство по образованию
- •А. Ю. Дёмин, а. В. Кудинов
- •Введение
- •Растровая и векторная графика
- •Способы представления изображений в памяти эвм
- •Параметры растровых изображений
- •Представление цвета в компьютере
- •Цветовые модели
- •Системы управления цветом
- •Графические файловые форматы
- •Растровые алгоритмы
- •Алгоритмы растеризации
- •Растровое представление отрезка. Алгоритм Брезенхейма
- •Растровая развёртка окружности
- •Закраска области, заданной цветом границы
- •Заполнение многоугольника
- •Методы устранения ступенчатости
- •Метод увеличения частоты выборки
- •Метод, основанный на использовании полутонов
- •Простейшие методы обработки изображений
- •Яркость и контраст
- •Масштабирование изображения
- •Преобразование поворота
- •Цифровые фильтры изображений
- •Компьютерная геометрия
- •Двумерные преобразования
- •Однородные координаты
- •Двумерное вращение вокруг произвольной оси
- •Трехмерные преобразования и проекции
- •2.Трехмерное изменение масштаба.
- •3. Трехмерный сдвиг
- •4.Трехмерное вращение
- •Проекции
- •Математическое описание плоских геометрических проекций
- •Изображение трехмерных объектов
- •Представление пространственных форм
- •Полигональные сетки
- •Явное задание многоугольников
- •Задание многоугольников с помощью указателей в список вершин
- •Явное задание ребер
- •Удаление невидимых линий и поверхностей
- •Введение
- •Алгоритм плавающего горизонта
- •Алгоритм Робертса
- •Определение нелицевых граней
- •Удаление невидимых ребер
- •Алгоритм, использующий z–буфер
- •Метод трассировки лучей (raycasting)
- •Алгоритмы, использующие список приоритетов
- •Алгоритм Ньюэла-Ньюэла-Санча для случая многоугольников
- •Алгоритм Варнока (Warnock)
- •Алгоритм Вейлера-Азертона (Weiler-Atherton)
- •Методы закраски
- •Диффузное отражение и рассеянный свет
- •Зеркальное отражение
- •Однотонная закраска полигональной сетки
- •Метод Гуро
- •Метод Фонга
- •Поверхности, пропускающие свет
- •Детализация поверхностей
- •Детализация цветом
- •Детализация фактурой
- •Библиотека OpenGl
- •Особенности использования OpenGl в Windows
- •Основные типы данных
- •Рисование геометрических объектов
- •Работа с буферами и задание цвета объектов
- •Задание графических примитивов
- •Рисование точек, линий и многоугольников
- •Преобразование объектов в пространстве
- •Преобразования в пространстве
- •Получение проекций
- •Задание моделей закрашивания
- •Освещение
- •Полупрозрачность. Использование α-канала
- •Наложение текстуры
- •Аппаратные средства машинной графики
- •Устройства ввода
- •Сканеры
- •Основные характеристики
- •Фирмы-производители
- •Дигитайзеры
- •Принцип действия
- •Основные характеристики
- •Фирмы-производители
- •Цифровые фотокамеры
- •Принцип действия
- •Фирмы-производители
- •Практические задания
- •Обработка растровых изображений вAdobePhotoshop
- •Создание векторного рисунка вCorelDraw
- •Преобразования на плоскости
- •Преобразования в пространстве. Проекции
- •БиблиотекаOpenGl
- •Темы рефератов
- •Литература
- •Оглавление
- •1. Растровая и векторная графика 4
- •2. Растровые алгоритмы 26
- •3. Компьютерная геометрия 49
- •8. Аппаратные средства машинной графики 137
- •9. Практические задания 143
Растровая развёртка окружности
Существует несколько очень простых, но не эффективных способов преобразования окружностей в растровую форму. Например, рассмотрим для простоты окружность с центром в начале координат. Ее уравнение записывается как x2 + y2=R2. Решая это уравнение относительноy,получим
y= ±
.
Чтобы изобразить четвертую часть окружности, будем изменять x с единичным шагом от 0 доRи на каждом шаге вычислятьy. Вторым простым методом растровой развертки окружности является использование вычисленийxиyпо формуламx=Rcos α,y=Rsinα при пошаговом изменении угла α от 0до 90.
Для упрощения алгоритма растровой развёртки стандартной окружности можно воспользоваться её симметрией относительно координатных осей и прямых y= ±x; в случае, когда центр окружности не совпадает с началом координат, эти прямые необходимо сдвинуть параллельно так, чтобы они прошли через центр окружности. Тем самым достаточно построить растровое представление для 1/8 части окружности, а все оставшиеся точки получить симметрией (см. рис. 2 .15).
Рис. 2.15. Восьмисторонняя симметрия
Рассмотрим участок
окружности из второго октанта xЄ [0, R/].
Далее опишем алгоритм Брезенхейма для
этого участка окружности.
На каждом шаге алгоритм выбирает точку Pi(xi, yi), которая является ближайшей к истинной окружности. Идея алгоритма заключается в выборе ближайшей точки при помощи управляющих переменных, значения которых можно вычислить в пошаговом режиме с использованием небольшого числа сложений, вычитаний и сдвигов.
Рассмотрим небольшой участок сетки пикселов, а также возможные способы (от A до E) прохождения истинной окружности через сетку (рис. 2 .16).
Предположим, что точка Pi-1 была выбрана как ближайшая к окружности приx=xi-1. Теперь найдем, какая из точек (SiилиTi) расположена ближе к окружности приx=xi-1+ 1.
Рис. 2.16. Варианты прохождения окружности через растровую сетку
Заметим, что ошибка при выборе точки Pi (xi, yi) была равна
D(Pi) = (xi2+ yi2) –R2.
Запишем выражение для ошибок, получаемых при выборе точки SiилиTi:
D(Si) = [(xi-1+ 1)2 + (yi-1)2] – R2;
D(Ti) = [(xi-1+ 1)2 + (yi-1 – 1)2] – R2.
Если | D(Si) | ≥ |D(Ti) |, тоTiближе к реальной окружности, иначе выбираетсяSi.
Введем di= |D(Si) | – |D(Ti) |.
Tiбудет выбираться приdi≥ 0, в противном случае будет устанавливатьсяSi.
Опуская алгебраические преобразования, запишем diиdi+1для разных вариантов выбора точкиSiилиTi.
D1= 3 – 2R.
Если выбирается Si(когдаdi< 0), тоdi+1=di+ 4xi-1+ 6.
Если выбирается Ti(когдаdi≥ 0), тоdi+1=di+ 4 (xi-1–yi-1) + 10.
Существует модификация алгоритма Брезенхейма для эллипса.
Закраска области, заданной цветом границы
Рассмотрим область, ограниченную набором пикселей заданного цвета и точку (x, y), лежащую внутри этой области.
Задача заполнения области заданным цветом в случае, когда эта область не является выпуклой, может оказаться довольно сложной.
Простейший рекурсивный алгоритм:
void PixelFill(int x, int y, int border_color, int color)
{
int c = getpixel(x, y);
if ((c != border_color) && (c != color))
{
putpixel(x, y, color);
PixelFill(x – 1, y, border_color, color);
PixelFill(x + 1, y, border_color, color);
PixelFill(x, y – 1, border_color, color);
PixelFill(x, y + 1, border_color, color);
}
}
Этот алгоритм является слишком неэффективным, так как для всякого уже отрисованного пикселя функция вызывается ещё 4 раза и, кроме того, этот алгоритм требует слишком большого объёма стека из-за большой глубины рекурсии. Поэтому для решения задачи закраски области предпочтительнее алгоритмы, способные обрабатывать сразу целые группы пикселей, т. е. использовать их «связность». Если данный пиксель принадлежит области, то, скорее всего, его ближайшие соседи также принадлежат данной области.
Группой таких пикселов обычно выступает полоса, определяемая правым пикселем. Для хранения правых определяющих пикселов используется стек. Словесно опишем улучшенный алгоритм, использующий когерентность пикселов.
Сначала заполняется горизонтальная полоса пикселов, содержащих начальную точку. Затем, чтобы найти самый правый пиксель каждой строки, справа налево проверяется строка, предыдущая по отношению к только что заполненной полосе. Адреса найденных пикселов заносятся в стек. То же самое выполняется и для строки, следующей и за последней заполненной полосой. Когда строка обработана таким способом, в качестве новой начальной точки используется пиксель, адрес которого берется из стека. Для него повторяется вся описанная процедура. Алгоритм заканчивает свою работу, если стек пуст.