exam05 - MiAneko24/bmstu-cg GitHub Wiki

05. Алгоритмы Брезенхема разложения отрезков в растр. Простой алгоритм Брезенхема. Целочисленный алгоритм Брезенхема. Общий алгоритм Брезенхема.

В алгоритме Брезенхема используется понятие ошибки.
Ошибка - расстояние между действительным положением отрезка и ближайшими координатами сетки.

Проверяют только знак ошибки (это работает быстре). Поэтому, настоящее значение ошибки уменьшают на 0.5. Таким образом, e = m - 0.5, где (m - тангенс угла наклона) для второго пикселя (первый пиксель высвечивается по координатам, соответствующим началу отрезка).

В алгоритме, одна из координат х или у изменяется на 1 (выбирается путем приращения сравнения приращений по модулю, здесь выбирается большее из приращений, см. ниже), а другая на 0 или 1, взависимости от ошибки.

Простой алгоритм Брезенхема

Предназначен для построения отрезков только в октанте. х - единичное приращение, у - меняется на 0 или 1, взависимости от ошибки.

Общий алгоритм Брезенхема

Подходит для любого октанта, благодаря определению разности начальной и конечной точки отрезка.

Δx = sign(хк - хн)
Δy = sign(ук - ун)

Значение другой координаты идеального отрезка определяют как: Y идеальное (i+1) = Y идеальное (i) + m.
Ошибка вычисляется как e = e + m.

Если e < 0, y(i+1) = yi
иначе, y(i+1) = y(i+1) + 1

Так как ошибку вычисляем заранее, то при e >= 0 делаем e = e - 1, т.к. y(i + 1) = y(i) + 1, что не было учтено при подсчёте ошибки.

Псевдокод простого алгоритма

1. Ввод исходных данных (Xн, Yн), (Xк, Yк)
2. X = Xн ; Y = Yн
3. dx = Xк - Xн; dx = Xк - Xн 
4. m = dy / dx; e = m - 0.5
5. Цикл определения отрезка (по i от 1 до dx + 1) 
   5.1. Высвечивание (x, y)
   5.2. Если e >= 0, то 
    1) y = y + 1
    2) e = e - 1 
   5.3. e = e + m
   5.4. Конец цикла
6. Конец

Хоть алгоритм и работает с действительными числами, путем математических преобразований, мы можем получить тот же самый алгоритм, но в целых числах.

e = dy / dx - 0.5  =====>  e = 2dy - dx

Псевдокод общего алгоритма

1. Ввод исходных данных (Xн, Yн), (Xк, Yк)
2. X = Xн ; Y = Yн
3. dx = Xк - Xн; dx = Xк - Xн 
4. Sх = sign(dx); Sy = sign(dy)  
5. dx = |dx|; dy = |dy|
6. Если dx > dy, то обмен = 0, иначе обмен = 1; t = dx; dx = dy; dy = t
7. m = dy / dx; e = m - 0.5 (для челочисленного e = 2dy - dx)
8. Цикл определения отрезка (по i от 1 до dx + 1)
   8.1. Высвечивание T(x, y)
   8.2. Если e >= 0, то 
    1) если обмен = 0, то y = y + sy, иначе x = x + sx
    2) e = e - 1 (для целочисленного e = e - 2dx) 
   8.3. Если обмен = 0, то x = x + sx, иначе y = y + sy
   8.4. e = e + m (для целочисленного e = e + 2dy)
   8.5. Конец цикла
9. Конец

По Курову стр. 7-8

Следующий вопрос: 06. Основные расчетные соотношения и алгоритм Брезенхема для генерации окружности.

Предыдущий вопрос: 04. Требования, предъявляемые к алгоритмам вычерчивания отрезков. Пошаговый алгоритм разложения отрезка в растр. Разложение в растр по методу цифрового дифференциального анализатора.