Компьютерная геометрия и графика 7 семестр_ 4.pptx
- Количество слайдов: 39
Компьютерная геометрия и графика Лекция 4 Алгоритмы вычерчивания отрезков и окружностей
План лекции 1. 2. Генерация векторов a) ЦДА (обычный и несимметричный) b) Алгоритм Брезенхема c) Улучшение качества изображения фильтрацией. Генерация окружностей
Генерация векторов Назначение генератора векторов - соединение двух точек изображения отрезком прямой. Основные алгоритмы: два алгоритма ЦДА - цифрового дифференциального анализатора (DDA - Digital Differential Analyzer) для генерации векторов обычный и несимметричный; алгоритм Брезенхема для генерации векторов; алгоритм Брезенхема для генерации ребер заполненного многоугольника с уменьшением ступенчатости.
Генерация векторов Общие требования к изображению отрезка: концы отрезка должны находиться в заданных точках; отрезки должны выглядеть прямыми, яркость вдоль отрезка должна быть постоянной и не зависеть от длины и наклона.
Генерация векторов Точность выполнения условий: концы отрезка в общем случае располагаются на пикселах, лишь наиболее близких к требуемым позициям; отрезок аппроксимируется набором пикселов и лишь в частных случаях они будут выглядеть прямыми; яркость для различных отрезков и даже вдоль отрезка в общем случае различна, так как, например, расстояние между центрами пикселов различно.
Генерация векторов Растровое представление различных векторов.
Генерация векторов Простой пошаговый алгоритм позиция = начало шаг = приращение 1 if позиция - конец < точность then 4 if позиция > конец then 2 if позиция < конец then 3 2 позиция = позиция – шаг go to 1 3 позиция = позиция + шаг go to 1 4 finish
Цифровой дифференциальный анализатор ЦДА формирует дискретную аппроксимацию непрерывного решения дифференциального уравнения d. Y / d. X = Py / Px , Py = Yk - Yn - приращение координат отрезка по оси Y, Px = Xk - Xn - приращение координат отрезка по оси X.
Цифровой дифференциальный анализатор Решение ДУ (рекурентное соотношение для последовательных значений вдоль нужного отрезка ): X 0 = Xn; Xi+1 = Xi + Px/N. Y 0 = Yn; Yi+1 = Yi + Py/N. Xn, Yn и Xk, Yk - концы разлагаемого отрезка, Xi, Yi - начальное значение для очередного шага. Большее из приращений Dx или Dy выбирается в качестве единицы растра (лучше смотрятся), количество узлов аппроксимации берется равным числу пикселов вдоль наибольшего приращения.
Цифровой дифференциальный анализатор Недостатки: точки могут прописываться дважды, что увеличивает время построения. нет предпочтительных направлений из-за независимого вычисления обеих координат, поэтому построенные отрезки кажутся не очень красивыми.
Цифровой дифференциальный анализатор Алгоритм обычного ЦДА для генерации отрезка из (x 1, y 1) в (x 2, y 2): Integer - функция преобразования вещественного числа в целое. Sign - функция, возвращающая -1, 0, 1 для отрицательного, нулевого и положительного аргумента соответственно
Цифровой дифференциальный анализатор if abs(x 2 -x 1)>= abs(y 2 -y 1) then Длина=abs(x 2 -x 1) Else Длина = abs(y 2 - y 1) end if Dx = (x 2 - x 1) / Длина Dy = (y 2 - y 1) / Длина x = x 1 + 0. 5 * Sign(Dx) y = y 1 + 0. 5 * Sign(Dy)
Цифровой дифференциальный анализатор Основной цикл: i =1 while (i <= Длина) Plot (Integer(x), Integer(y)) x = x + Dx y = y + Dy i=i+1 end while finish
Цифровой дифференциальный анализатор Алгоритм несимметричного ЦДА для генерации отрезка из (x 1, y 1) в (x 2, y 2) в первом октанте: Px = x 2 – x 1 Py = y 2 – y 1 Plot (x 1, y 1) while (x 1 < x 2) x 1= x 1 + 1. 0 y 1= y 1 + Py/Px Put. Pixel (x 1, y 1) end while finish
Алгоритм Брезенхема. Алгоритм выбирает оптимальные растровые координаты для представления отрезка. В процессе работы одна из координат - либо x, либо y (в зависиимости от углового коэффициента) - изменяется на единицу. Изменение другой координаты (на 0 или 1) зависит от расстояния между действительным положением отрезка и ближайшими координатами сетки. Такое расстояние мы назовем ошибкой. Алгоритм построен так, что требуется проверить лишь знак этой ошибки.
Алгоритм Брезенхема. Если угловой коэффициент <0, 5, то следующая точка (1, 0), иначе - (1, 1).
Алгоритм Брезенхема. Для принятия решения куда заносить очередной пиксел вводится величина отклонения Е точной позиции от середины между двумя возможными растровыми точками в направлении наименьшей относительной координаты. Знак Е используется как критерий для выбора ближайшей растровой точки. Если Е < 0, то точное Y-значение округляется до последнего меньшего целочисленного значения Y, т. е. Y-координата не меняется по сравнению с предыдущей точкой. В противном случае Y увеличивается на 1.
Алгоритм Брезенхема разложения в растр отрезка для первого октанта: x = x 1 y = y 1 Dx = x 2 – x 1 Dy = y 2 - y 1 е = Dy/Dx - ½ for i = 1 to Dx plot (x, y) while ( e => 0 ) y=y+1 e=e-1 end while x = x + 1 e = e + Dy/Dx next i finish
Алгоритм Брезенхема. Выбор постоянно изменяющейся кооординаты зависит от квадранта и модуля углового коэффициента.
Алгоритм Брезенхема. Обобщенный целочисленный алгоритм Брезенхема квадрантов x = x 1 y = y 1 Dx = abs(x 2 - x 1) Dy = abs(y 2 - y 1) s 1 = Sign(x 2 - x 1) s 2 = Sign(y 2 - y 1)
Алгоритм Брезенхема. обмен значений Dx и Dy в зависимости от углового коэффициента наклона отрезка if Dy < Dx then Врем = Dx Dx = Dy Dy = Врем Обмен = 1 else Обмен = 0 end if e = 2*Dy - Dx
Алгоритм Брезенхема. for i = 1 to Dx Plot(x, y) while(e =>0) if Обмен = 1 then x = x + s 1 else y = y + s 2 end if e = e - 2*Dx end while if Обмен = 1 then y = y + s 2 else x = x + s 1 end if e = e + 2*Dy next i finish
Алгоритм Брезенхема. Способы борьбы со ступенчатостью : увеличение пространственного разрешения за счет усовершенствования аппаратуры, трактовка пиксела не как точки, а как площадки конечного размера, яркость которой зависит от размера площади пиксела, занятой изображением отрезка, "размывание" резкой границы, за счет частичной подсветки пикселов, примыкающих к формируемому отрезку.
Генерация векторов. Способы борьбы со ступенчатостью : увеличение пространственного разрешения за счет усовершенствования аппаратуры, трактовка пиксела не как точки, а как площадки конечного размера, яркость которой зависит от размера площади пиксела, занятой изображением отрезка, "размывание" резкой границы, за счет частичной подсветки пикселов, примыкающих к формируемому отрезку.
Модифицированный алгоритм Брезенхема. Основная идея алгоритма состоит в том, чтобы для ребер многоугольника устанавливать яркость пиксела пропорционально площади пиксела, попавшей внутрь многоугольника.
Модифицированный алгоритм Брезенхема. Алгоритма Брезенхема при 2 уровневом изображении С вычислением интесивности
Модифицированный алгоритм Брезенхема. При построении ребра могут захватываться либо один пиксел, либо два. Если один пиксел, то часть его площади внутри многоугольника dy + t/2. Если два пиксела, то часть площади нижнего пиксела внутри многоугольника равна 1 -[((1 dy)^2)/ 2 t], а верхнего - [((dy - 1 + t)^2)/ 2 t]. Суммарная площадь частей dy + t/2. В алгоритме Брезенхема замена E’=E+(1 -t). E' – значение части площади пиксела, которая находится внутри многоугольника.
Устранение ступенчатости за счет учета площади пикселов, пересекаемых ребром многоугольника.
Улучшение качества изображения фильтрацией Методы, основанные на "размывании" границы: Изображение строится с большим пространственным разрешением, чем позволяет дисплей. Усредняющая маска перемещается по изображению с шагами, равными ее размеру. Усреднении изображения без изменения его разрешения. Усредняющая маска перемещается по изображению с единичными шагами.
Улучшение качества изображения фильтрацией Маски для равномерного усреднения изображения Маски для взвешенного усреднения изображения
Алгоритм Брезенхема для окружности. Окружность с центром в начале координат описывается уравнением: X^2 + Y^2 = R^2. Алгоритм Брезенхема пошагово генерирует очередные точки окружности, выбирая на каждом шаге для занесения пиксела точку растра Pi(Xi, Yi), ближайшую к истинной окружности, так чтобы ошибка: Ei(Pi) = (Xi^2 + Yi^2) – R^2 была минимальной.
Алгоритм Брезенхема для окружности.
Алгоритм Брезенхема для окружности. Алгоритм выбирает пиксел, для которого минимален квадрат расстояния, т. е. минимум из m. H = |(xi + 1)^2 + (yi)^2 –R^2| m. D = |(xi + 1)^2 + (yi -1)^2 –R^2| m. V = |(xi )^2 + (yi -1)^2 –R^2|
Алгоритм Брезенхема для окружности. В окрестности точки (xi, yi, ) возможны только пять типов пересечений окружности и сетки растра.
Алгоритм Брезенхема для окружности. Разность между квадратами расстояний до диагонального пиксела (xi+1, уi-1) и до точки на окружности: Di = (xi + 1)^2 + (yi -1)^2 –R^2. При Di < 0 диагональная точка (xi+1, уi-1) находится внутри окружности, случаи 1 или 2. Для случая 1 проверим разность квадратов расстояний от окружности до пикселов: d=|(xi+1)^2+(yi )^2–R^2|-|(xi +1)^2+(yi-1)^2–R^2| При d <= 0 выбираем m. H в (xi + 1, уi - 1) ; при d > 0 выбираем m. D в (xi + 1, уi - 1). В случае 2 d<0, поэтому выбираем пиксел (xi+1, уi).
Алгоритм Брезенхема для окружности. Если Di > 0, то диагональная точка (xi+1, уi-1) находится вне окружности, случаи 3 и 4. Для случая 3 разность между квадратами расстояний от окружности до диагонального m. D и вертикального m. V пикселов d’=|(xi+1)^2+(yi-1)^2–R^2|-|(xi)^2+(yi-1)^2–R^2| При d' <= 0 выбираем m. D в (xi+1, уi-1); при d' > 0 выбираем m. V в (xi, уi-1). Если Di = 0, то случай 5. Проверка d и d’ дает d>0 и d’<0, что является условием выбора правильного диагонального шага к (xi +1 , уi -1).
Алгоритм Брезенхема для окружности. Di < 0 d <= 0 выбираем пиксел (xi +1 , уi ) - m. H d > 0 выбираем пиксел (xi +1 , уi -1) - m. D Di > 0 d' <= 0 выбираем пиксел (xi +1 , уi -1) - m. D d' > 0 выбираем пиксел (xi , уi -1)- m. V Di = 0 выбираем пиксел (xi +1 , уi -1) - m. D
Алгоритм Брезенхема для генерации окружности в первом квадранте. xi = 0 yi = R Di = 2(1 - R) Предел = 0 1 Plot (xi, yi) if yi <= Предел then 4 if Di < 0 then 2 if Di > 0 then 3 if Di= 0 then 20 2 d = 2 Di + 2 уi - 1 if d <= 0 then 10 if d > 0 then 20
Алгоритм Брезенхема для генерации окружности в первом квадранте. 3 d = 2 Di + 2 хi - 1 if d <= 0 then 20 if d > 0 then 30 10 хi = хi + 1 Di = Di+ 2 хi + 1 gо to 1 20 хi = хi + 1 yi = yi + 1 Di = Di+ 2 хi - 2 уi+ 2 gо to 1 4 finish


