Алгоритм Брезенхема вычерчивания отрезков для первого октанта

Алгоритм Брезенхема выбирает оптимальные растровые координаты для представления отрезка. В процессе построения отрезка одна из координат (х или у, в зависимости от углового коэффициента отрезка) на каждом шаге алгоритма изменяется на 1. Эта координата является основной координатой. Изменение другой координаты (на 0 или на 1) зависит от расстояния между действительным положением отрезка и ближайшими координатами сетки (это - дополнительная координата). Такое расстояние называется ошибкой.

Рассмотрим рисование отрезка на рис. 8 для первого октанта, т. е. для отрезка с коэффициентом наклона k 0 < k < 1. Если отрезок, выходящий из точки (0, 0), имеет k > 1/2, то точка его пересечения с прямой х = 1 будет расположена ближе к прямой у = 1, чем к прямой у = 0. Поэтому точка растра (1, 1) лучше аппроксимирует ход отрезка. Если же k < 1/2, то лучше аппроксимирует ход отрезка точка (0, 0). Для k = 1/2 предпочтительного выбора нет, алгоритм выбирает точку (1, 1).

Удобнее подобрать такое значение ошибки, чтобы в алгоритме достаточно было проверить лишь знак ошибки, а не ее значение. Так как проверяется только знак ошибки, то ошибка первоначально устанавливается равной -1/2. И величина ошибки в следующей точке растра может быть вычислена как e = e + k. Если е < 0, то нужно зажигать пиксел на том же горизонтальном уровне, что и предыдущий, т. е. дополнительная координата не изменяется. Если е > 0, то отрезок пройдет выше уровня 1/2, значит, дополнительную координату нужно увеличить на 1. При этом необходимо откорректировать ошибку вычитанием из нее 1. Таким образом, ошибка - это интервал, отсекаемый по оси у отрезком в каждом растровом элементе относительно -1/2.

Алгоритм Брезенхема для первого октанта на псевдокоде:

(x1,y1) – начальная точка

(x2, y2) – конечная точка

e - ошибка

dx – приращение по координате x

dy – приращение по координате y

Plot (x, y) – процедура “подсвечивания” пиксела с координатами (x,y)

начало

инициализация переменных

x = x1

y = y1

dx = x2 - x1

dy = y2 - y1

инициализация ошибки

e = dy/dx - 1/2

основной цикл

for i = 1 to dx

Plot (x, y)

if e>=0 then

y = y + 1 изменение дополнительной координаты

e = e - 1 коррекция ошибки

конец if

x = x + 1 изменение основной координаты

e = e + dy/dx накопление ошибки

конец

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

Инициализация ошибки Коррекция ошибки Накопление ошибки
   

Чтобы алгоритм был полным, необходимо его распространить на все квадранты, что и осуществляет обобщенный алгоритм Брезенхема.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: