Автор работы: Пользователь скрыл имя, 08 Декабря 2013 в 13:49, лабораторная работа
Цель работы: реализация алгоритмов построения отрезков по методу цифрового дифференциального анализатора (ЦДА), алгоритмов Брезенхема (действительного, целочисленного, оптимизированного и с устранением ступенчатости) и Ву, исследование их характеристик и сравнение полученных результатов.
МИНОБРНАУКИ РОССИИ
Федеральное
государственное бюджетное
Юго-Западный государственный университет
Кафедра ПО ВТ
Лабораторная работа №1
по дисциплине «Компьютерная графика»
Реализация алгоритмов построения отрезков
с помощью различных алгоритмов.
Выполнил:
ст.гр. ПО-01 Данилов Д.Э.
Проверил:
Курск, 2013 г.
Цель работы: реализация алгоритмов построения отрезков по методу цифрового дифференциального анализатора (ЦДА), алгоритмов Брезенхема (действительного, целочисленного, оптимизированного и с устранением ступенчатости) и Ву, исследование их характеристик и сравнение полученных результатов.
Теоретическая часть.
Алгоритм вычерчивания отрезков - по методу цифрового дифференциального анализатора - использует достаточно общий принцип, известный в математике: изучение какого-либо явления на основе дифференциального уравнения или системы таких уравнений, описывающей это явление.
Поскольку прямая линия на плоскости описывается уравнением вида
ax + by + c = 0,
где a,b,c - коэффициенты этого уравнения, то производная dy/dx является постоянной.
Заменив
дифференциалы конечными
, (1)
где x1,y1 и x2,y2 - координаты начальной и конечной точек отрезка.
Ордината очередного пиксела yi+1 может быть вычислена по известной ординате предыдущего пиксела yi следующим образом:
yi+1 = yi + Dy
Подставляя Dy из (1), получим
. (2)
В качестве единицы растра выбирается большее из приращений (Dх или Dy), соответственно идем вдоль оси Х или оси У.
Алгоритм по пунктам:
L:=|x2-x1|, если |x2-x1|≥|у2-у1|
L:=|у2-у1|, если |x2-x1|≤|у2-у1|
dy=(y2-y1)/L
y:=y1+0.5*singn(dy)
до L+1, шаг 1
инициализация пикселя с координатами E(x);E(y)
x:=x+dx; y:=y+dx
end
Работа алгоритма Брезенхема основывается на использовании понятия ошибка. Ошибкой называется расстояние между действительным положением отрезка и ближайшим пикселом сетки растра, который аппроксимирует отрезок на очередном шаге.
0.5 £ Dy/Dx £ 1 (f ³ 0)
0 £ Dy/Dx < 0.5 (f < 0)
Ошибка на очередном шаге вычисляется как
fi+1=yi+1-yi+1=yi+m-yi+1=fi+m (если yi+1=yi) (4)
В зависимости от полученного значения ошибки выбирается пиксел с той же ординатой (при f<0) или пиксел с ординатой, на единицу большей, чем у предыдущего пиксела (при f³0).
Поскольку предварительное значение ошибки вычисляется заранее, то есть f+m вычислено на предыдущем шаге, то во втором случае останется только вычесть единицу из значения ошибки:
f=f-1.
Алгоритм Брезенхема, работающий с действительными величинами, можно записать в следующем виде:
1.Ввод исходных данных xн,yн,x
2.Проверка вырожденности
3.Вычисление приращений dx=xк-
4.Вычисление шага изменения каждой координаты пиксела:
hX=Sign(dx), hY=Sign(dy).
5.Вычисление модулей
dx=abs(dx), dy=abs(dy)
6.Вычисление модуля тангенса угла наклона отрезка:
m=dy/dx.
7.Анализ вычисленного значения m и обмен местами dx и dy при m>1:
если m>1, то выполнить
W=dx, dx=dy, dy=W, m=1/m, flag=1;
иначе flag=0 (flag - флаг, определяющий факт обмена местами координат).
8.Инициализация начального
f=m-0,5
9.Инициализация начальных
x=xн, y=yн
10.Цикл от i=1 до i=dx+1 с шагом 1:
Высвечивание точки с
Вычисление координат и ошибки для следующего пиксела:
Если f³0, то если flag=1, то x=x+hX
корректировка ошибки f=f-1
Если f<0, то если flag=1, то y=y+hY
Вычисление ошибки f=f+m.
11.Конец.
Алгоритм Брезенхема в том виде, как он представлен выше, требует использования арифметики с плавающей точкой и деления(для вычисления углового коэффициента и оценки ошибки). Быстродействие алгоритма можно увеличить, если использовать только целочисленную арифметику и исключить деление. Для этого выражение для инициализации ошибки запишем в виде: f= DY/DX-1/2 и, умножив обе части этого равенства на 2DX, получим:
2DXf=2DY-DX.
Обозначив f1=2DX f, окончательно получим:
f1=2DY-DX
Тогда подсчет нового значения ошибки в п.10 «действительного» алгоритма будет производиться по формулам:
f1=f1+2DY и f1=f1-2DX.
Идея оптимизации (алгоритм с переменной длиной отрезков) – это движение с каждой итерацией по неосновной оси и проверка текущего отклонения по основной оси (рис.3.).
Рассмотрим работу оптимизированного алгоритма Брезенхема на примере. Построим линию в 35 пикселей по X и 10 пикселей по Y. Наклон линии находится в пределах 1/3-1/4, т.е. составляющие линию ряды точек (подотрезки) будут состоять из 3 или 4 пикселей.
Итак, известно как определить две возможные длины подотрезков, составляющих общую линию. Но как определить, какой именно подотрезок будет иметь какую длину?
Рис. 4. Алгоритм с переменной длиной отрезков
Сначала на каждый шаг по неосновной оси ставится, по меньшей мере, три пикселя вдоль основной. После этого рассчитывается ошибка отклонения на каждом шаге вычисляется как сумма предыдущей ошибки и значения выражения mod(Dx/Dy)/Dy (где mod(35/10)=5 - остаток от деления):
f = f + mod(Dx/Dy)/Dy.
Решение о том, ставить ли дополнительный пиксель или нет, принимается на основе анализа целой части полученной суммы: пиксель ставится если полученное значение больше или равно единицы и при этом из ошибки вычитается 1. Для рассмотренного примера подотрезки длиной 3 и 4 будут появляться строго друг за другом.
Принципиально
устранить ступенчатость (лестничный
эффект) невозможно. Однако применением
специальных методов можно
При наличии
нескольких оттенков цвета внешний
вид отрезка улучшается путем
размывания его краев. Для этого
интенсивность пиксела
Отрезок, тангенс угла наклона m которого лежит в диапазоне 0<m<1 может при данном значении абсциссы пересечь один или два пиксела (см. рис.5).
Рис. 5. Алгоритм Брезенхема, учитывающий площадь части пиксела для устранения ступенчатости
В первом случае искомая площадь находится как сумма площадей прямоугольника S1 и треугольника S2:
S=S1+S2=yi*1+1*m/2=yi+m/2,
где yi- расстояние между нижней левой вершиной пиксела и точкой пересечения отрезка с левой границей пиксела.
Если отрезок пересекает два пиксела, то площадь части нижнего пиксела (S4) может быть найдена как разность площади всего пиксела и площади треугольника S3:
где 1-yi - длина одного катета, (1-yi)/m - длина другого катета.
Площадь S5 части верхнего пиксела - треугольника равна
Практика показывает, что учет площади S5 позволяет более реалистично представить отрезок, поэтому найдем сумму площадей S4 и S5:
S=S4+S5=yi+m/2.
Таким образом,
в обоих случаях площадь
В качестве ошибки в данном алгоритме принимается часть площади пиксела, находящаяся под отрезком, то есть yi+m/2. Вычислим значение ошибки при переходе к соседнему пикселу. Если ордината соседнего пиксела не увеличивается, то площадь, находящаяся под отрезком, увеличивается на величину площади прямоугольника со сторонами 1 и m, то есть f=f+m.
Если же ордината соседнего пиксела увеличивается на единицу, то вычисленная доля площади пиксела будет содержать и площадь пиксела, через который отрезок не проходит, следовательно, необходимо вычесть величину площади пиксела, то есть единицу:
f=f+m-1.
Поскольку доля площади не может быть отрицательной величиной, то по сравнению с ранее рассмотренными алгоритмами Брезенхема необходимо скорректировать величину ошибки, прибавив к ней величину W=1-m. При этом начальное значение ошибки будет равно f=m-0.5+1-m=0.5, а значение ошибки будет лежать в диапазоне 0<f<1.
Первый
пиксел отрезка будет, таким образом,
всегда высвечиваться интенсивностью,
равной половине максимальной. Для
более реалистичного
Можно сразу получить не дробное значение максимальной интенсивности, а ее непосредственное значение, если умножить на максимальное количество уровней интенсивности следующие величины: тангенс угла наклона m, коэффициент W, ошибку f.
Общий алгоритм Брезенхема с устранением ступенчатости может быть записан следующим образом:
1. Ввод исходных данных xн,yн,xк,yк (координаты концов отрезка), I - количество уровней интенсивности.
2. Проверка
вырожденности отрезка. Если
3. Вычисление приращений dx=xк-xн и dy=yк-yн.
4. Вычисление
шага изменения каждой
hX=sign(dx), hY=sign(dy).
5. Вычисление модулей приращения координат:
dx=abs(dx), dy=abs(dy).
6. Вычисление модуля тангенса угла наклона
m=dy/dx.
7. Анализ вычисленного значения m и обмен местами dx и dy при m>1:
если m>1, то выполнить
p=dx; dx=dy; dy=p; m=1/m; flag=1;
если m<1, то flag=0.
(flag - флаг, определяющий факт обмена местами координат).
8. Инициализация начального значения ошибки f=I/2.
9. Инициализация начальных значений координат текущего пиксела:
x=xн, y=yн.
10. Вычисление
скорректированного значения
11. Высвечивание пиксела с координатами (x,y) интенсивностью E(f).
Если f³0, то если flag=1, то x=x+hX
корректировка ошибки f=f-1
Вычисление ошибки f=f+m.
12. Цикл от i=1 до i=dx с шагом 1:
Если f<W, то
если flag=0, то x=x+hX;
если flag=1, то y=y+hY;
f=f+m.
Если f>W, то если flag=1, то x=x+hX,
Высвечивание пиксела с координатами (x,y) интенсивностью E(f).
13. Конец.
Данный алгоритм, как и в предыдущем случае, можно тем же приемом преобразовать к целочисленному виду. Умножив на 2DX, получим измененные выражения для вычисления ошибки f1:
начальное значение ошибки f1=DX1,
а текущее значение будет вычисляться как f1=f1+2DY или f1=f1-2DX1+2DY1, где DX1= DX*I и DY1= DY*I.
Информация о работе Реализация алгоритмов построения отрезков с помощью различных алгоритмов