- •Компьютерная графика Курс лекций
- •Оглавление
- •Предисловие
- •Лекция 1. Введение
- •1.1. История компьютерной графики
- •1.2.Области применения компьютерной графики
- •1.3. Классификация графических изображений
- •1.4. Виды компьютерной графики
- •1.4.1. Растровая графика
- •1.4.2. Векторная графика
- •1.4.3. Фрактальная графика
- •Лекция 2. Аппаратная база машинной графики
- •2.1. Видеосистема персонального компьютера
- •2.2. Цвет
- •2.3. Форматы графических файлов
- •Лекция 3. Отображение геометрических объектов
- •1. Двумя точками ( а и в ).
- •Лекция 4. Аппарат проецирования
- •4.1. Аксонометрические проекции
- •4.2. Способы преобразования комплексного чертежа
- •Лекция 5. Представление объектов и их машинная генерация
- •5.1. Аффинные преобразования на плоскости
- •5.2. Растровая развертка отрезка
- •3.1 Растровая развертка отрезка
- •5.3. Алгоритм вывода окружности
- •5.4. Кривая Безье
- •5.5. Отсечение отрезка
- •5.6. Закраска области, заданной цветом границы
- •5.7. Удаление невидимых линий и поверхностей
- •Алгоритм робертса
- •Лекция 6. Фрактальная графика
- •6.1. Алгоритм построения фрактала
- •6.2. Природные фракталы
- •6.3. Геометрические фракталы
- •6.4. Алгебраические фракталы
- •6 .5. Стохастические фракталы
- •Лекция 7. Графические редакторы
- •Лекция 8. СЖатие изображений
- •8.1. Необратимое сжатие
- •8.2. Обратимое сжатие
- •8.3. Общие положения алгоритмов сжатия изображений
- •8.4. Алгоритмы архивации без потерь
- •8.5. Алгоритмы архивации с потерями
- •Литература
5.3. Алгоритм вывода окружности
Для вывода контура окружности можно использовать соотношение между координатами X и Y для точек окружности X2 + Y2 = R2 и построить алгоритм прямого вычисления координат. Однако тогда необходимо вычислять квадратный корень, а это в цифровом компьютере выполняется медленно.
Дадим запись инкрементного алгоритма Брезенхейма языком C++:
void Circle(int xc, int ус, int radius)
{
int x, у, dxt; long r2, dst, t, s, e, ca, cd, indx;
r2 = (long)radius*(long)radius;
dst = 4*r2;
dxt = (double)radius/1.414213562373;
t = 0;
s = -4*r2*(long)radius;
e = (-s/2) - 3*r2;
ca = -6*r2;
cd = -10*r2;
x = 0;
у = radius;
//Пиксел (xc, yc+radius);
//Пиксел (xc, ус-radius);
//Пиксел (xc+radius, yc);
//Пиксел (xc-radius, yc);
for (indx = 1; indx <= dxt; indx++)
{
x++;
if (e >= 0) e += t + ca;
else
{
y--;
е += t - s + cd;
s += dst;
}
t -= dst;
//Пиксел (xc+x, yc+y);
//Пиксел (xc+y, yc+x);
//Пиксел (xc+y, yc-x);
//Пиксел (xc+x, yc-y);
//Пиксел (xc-x, yc-y);
//Пиксел (xc-y, yc-x);
//Пиксел (xc-y, yc+x);
//Пиксел (xc-x, yc+y);
}
}
В этом алгоритме использована симметрия окружности — в основном цикле вычисляются координаты точек окружности только для одного октанта и сразу рисуются восемь симметрично расположенных пикселов.
5.4. Кривая Безье
Разработана математиком Пьером Безье. Кривые и поверхности Безье были использованы в 60-х годах компанией "Рено" для компьютерного проектирования формы кузовов автомобилей. В настоящее время они широко используются в компьютерной графике.
Кривые Безье описываются в параметрической форме: х = Px(t), у = Py(t).
Значение t выступает как параметр, которому соответствуют координаты отдельной точки линии. Параметрическая форма описания может быть удобнее для некоторых кривых, чем задание в виде функции у=f(x), поскольку функция f(x) может быть намного сложнее, чем Px(t) и Py(t), кроме того,f(х) может быть неоднозначной.
М
ногочлены
Безье для Рх
и Рy
имеют такой
вид:
где
хi
и уi
- координаты точек-ориентиров Рi,
а величины
- это известные
из комбинаторики,
так называемые
сочетания
(они также
известны как коэффициенты бинома
Ньютона):
Значение т можно рассматривать и как степень полинома, и как значение, которое на I единицу меньше количества точек-ориентиров.
Рассмотрим кривые Безье, классифицируя их по значениям т.
т = 1 (по двум точкам)
Кривая вырождается в отрезок прямой линии, которая определяется конечными точками Р0 и Р1, как показано на рис. 72:
P(t) = (1- t)P0 + t1
т=2 (по трем точкам, рис. 73):
P(t) = (1- t)2P0 + 2t(1- t)P1 + t2P2.
Рис. 72 Рис. 73
m - 3 (по четырем точкам, кубическая, рис 74). Используется довольно часто, в особенности в сплайновых кривых:
P(t) = (1- t)3P0 + 3t(1- t)2P1 + 3 t2(1-t) P2 + t3P3.
Рис. 74
Геометрический алгоритм для кривой Безье
Этот алгоритм позволяет вычислить координаты (х, у) точки кривой Безье по значению параметра t.
1. Каждая сторона контура многоугольника, который проходит по точкам-ориентирам, делится пропорционально значению t.
2. Точки деления соединяются отрезками прямых и образуют новый многоугольник. Количество узлов нового контура на единицу меньше, чем количество узлов предшествующего контура.
3. Стороны нового контура снова делятся пропорционально значению t. И так далее. Это продолжается до тех пор, пока не будет получена единственная точка деления. Эта точка и будет точкой кривой Безье (рис. 75).
Рис. 75
Приведем запись геометрического алгоритма на языке C++:
for (i = 0; i <= m; i++)
R[i] = P[i]; //формируем вспомогательный массив R[ ]
for (j = m; j > 0; j --)
for ( i = 0; i < j; i++)
R[i] = R[i] + t * (R[i+1] - R[i]);
