- •Томск 2004
- •1.Введение
- •1.1.Способы представления изображений в памяти эвм
- •1.2.Классификация программного обеспечения компьютерной графики
- •Параметры растровых изображений
- •1.3.Представление цвета в компьютере
- •1.3.1.Цветовые модели
- •1.3.2.Системы управления цветом
- •1.4.Графические файловые форматы
- •По типу хранимой графической информации:
- •2.Растровые алгоритмы
- •2.1.Алгоритмы растеризации
- •2.1.1.Растровое представление отрезка. Алгоритм Брезенхейма
- •2.1.2.Растровая развёртка окружности
- •2.1.3.Закраска области, заданной цветом границы
- •2.1.4.Заполнение многоугольника
- •2.2.Методы устранения ступенчатости
- •2.2.1.Метод увеличения частоты выборки
- •2.2.2.Метод, основанный на использовании полутонов
- •2.3.Простейшие методы обработки изображений
- •2.3.1.Яркость и контраст
- •2.3.2.Масштабирование изображения
- •2.3.3.Преобразование поворота
- •2.3.4.Цифровые фильтры изображений
- •3.Компьютерная геометрия
- •3.1.Двумерные преобразования
- •3.1.1.Однородные координаты
- •3.1.2.Двумерное вращение вокруг произвольной оси
- •3.2.Трехмерные преобразования и проекции
- •3.3.Проекции
- •3.4.Математическое описание плоских геометрических проекций
- •3.5.Изображение трехмерных объектов
- •4.Представление пространственных форм
- •4.1.Полигональные сетки
- •4.1.1.Явное задание многоугольников
- •4.1.2.Задание многоугольников с помощью указателей в список вершин
- •4.1.3.Явное задание ребер
- •4.2.Введение
- •4.3.Алгоритм плавающего горизонта
- •4.4.Алгоритм Робертса
- •4.4.1.Определение нелицевых граней
- •4.4.2.Удаление невидимых ребер
- •4.5.Алгоритм, использующий z буфер
- •4.6.Метод трассировки лучей (ray casting)
- •4.7.Алгоритмы, использующие список приоритетов
- •4.7.1.Алгоритм Ньюэла-Ньюэла-Санча для случая многоугольников
- •4.8.Алгоритм Варнока (Warnock)
- •4.9.Алгоритм Вейлера-Азертона (Weiler-Atherton)
- •5.Методы закраски
- •5.1.Диффузное отражение и рассеянный свет
- •5.2.Зеркальное отражение
- •5.3.Однотонная закраска полигональной сетки
- •5.4.Метод Гуро
- •5.5.Метод Фонга
- •5.6.Тени
- •5.7.Поверхности, пропускающие свет
- •5.8.Детализация поверхностей
- •5.8.1.Детализация цветом
- •5.8.2.Детализация фактурой
- •6.Библиотека OpenGl
- •6.1.Особенности использования OpenGl в Windows
- •6.2.Основные типы данных
- •6.3.Рисование геометрических объектов
- •6.3.1.Работа с буферами и задание цвета объектов
- •6.3.2.Задание графических примитивов
- •6.3.3.Рисование точек, линий и многоугольников
- •6.4.Преобразование объектов в пространстве, камеры
- •6.4.1.Преобразования в пространстве
- •6.4.2.Получение проекций
- •6.5.Задание моделей закрашивания
- •6.6.Освещение
- •6.7.Полупрозрачность. Использование α-канала
- •6.8.Наложение текстуры
- •7.Аппаратные средства машинной графики
- •7.1.Устройства ввода
- •7.1.1.Сканеры
- •Принцип действия и виды сканеров
- •Основные характеристики
- •Фирмы-производители
- •7.1.2.Дигитайзеры
- •Принцип действия
- •Основные характеристики
- •Фирмы-производители
- •7.1.3.Цифровые фотокамеры
- •Принцип действия
- •Фирмы-производители
- •8.Литература
- •9.Содержание
- •1. Введение 3
- •2. Растровые алгоритмы 27
- •3. Компьютерная геометрия 52
- •4. Представление пространственных форм 83
- •5. Методы закраски 114
- •6. Библиотека OpenGl 124
- •7. Аппаратные средства машинной графики 141
- •8. Литература 147
- •9. Содержание 149
2.1.2.Растровая развёртка окружности
Существует несколько очень простых, но не эффективных способов преобразования окружностей в растровую форму. Например, рассмотрим для простоты окружность с центром в начале координат. Ее уравнение записывается как x2 + y2 = R2. Решая это уравнение относительно y, получим
y = ±
Чтобы изобразить четвертую часть окружности будем изменять x с единичным шагом от 0 до R и на каждом шаге вычислять y. Вторым простым методом растровой развертки окружности является использование вычислений x и y по формулам x = R cos α, y = R sin α, при пошаговом изменении угла α от 00 до 900.
Для упрощения алгоритма растровой развёртки стандартной окружности можно воспользоваться её симметрией относительно координатных осей и прямых y = ± x в случае, когда центр окружности не совпадает с началом координат, эти прямые необходимо сдвинуть параллельно так, чтобы они прошли через центр окружности. Тем самым достаточно построить растровое представление для 1/8 части окружности, а все оставшиеся точки получить симметрией (рис. 2.5).
Рис. 2.14 Восьмисторонняя симметрия
Рассмотрим участок окружности из второго октанта x Є [0, R/ ]. Далее опишем алгоритм Брезенхейма для этого участка окружности.
На каждом шаге алгоритм выбирает точку Pi (xi, yi), которая является ближайшей к истинной окружности. Идея алгоритма заключается в выборе ближайшей точки при помощи управляющих переменных, значения которых можно вычислить в пошаговом режиме с использованием небольшого числа сложений, вычитаний и сдвигов.
Рассмотрим небольшой участок сетки пикселов, а также возможные способы (от A до E) прохождения истинной окружности через сетку (Рис. 2.6).
Предположим, что точка Pi-1 была выбрана как ближайшая к окружности при x = xi-1. Теперь найдем, какая из точек Si или Ti расположена ближе к окружности при x = xi-1 + 1.
Рис. 2.15 Варианты прохождения окружности через растровую сетку
Заметим, что ошибка при выборе точки 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 – 2 R
Если выбирается Si (когда di < 0), то di+1 = di + 4 xi-1 + 6
Если выбирается Ti (когда di ≥ 0), то di+1 = di + 4 (xi-1 – yi-1) + 10
Существует модификация алгоритма Брезенхейма для эллипса.
static int xCenter;
static int yCenter;
static void circlePoints (int x, int y, int color )
{
putpixel ( xCenter + x, yCenter + y, color);
putpixel ( xCenter + y, yCenter + x, color);
putpixel ( xCenter + y, yCenter - x, color);
putpixel ( xCenter + x, yCenter - y, color);
putpixel ( xCenter - x, yCenter - y, color);
putpixel ( xCenter - y, yCenter - x, color);
putpixel ( xCenter - y, yCenter + x, color);
putpixel ( xCenter - x, yCenter + y, color);
}
void circle2 (int xc, int yc, int r,int color )
{
int x=0;
int y=r;
int d=1-r;
int delta1=3;
int delta2 = -2*r + 5;
xCenter=xc;
yCenter=yc;
circlePoints(x,y,color);
while (y>x)
{
if(d<0)
{
d+=delta1;
delta1 += 2;
delta2 += 2;
x++;
}
else
{
d+=delta2;
delta1 += 2;
delta2 += 4;
x++;
y--;
}
//delta2 = -2*r + 5;
circlePoints ( x, y, color );
}
}