Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Задание к лабе #1 / kg_lr01 / Методичка к ЛР1.doc
Скачиваний:
23
Добавлен:
04.04.2013
Размер:
896 Кб
Скачать

2.2. Разложение в растр

2.2.1 Вычерчивание отрезков

Экран растрового графического устройства можно рассматривать как матрицу пикселов, каждый из которых может быть подсвечен. Поэтому задача непосредственного проведения отрезка из одной точки в другую представляет особый интерес для компьютерной графики. Процесс определения пикселов, которые лучше всего аппроксимируют данный отрезок, называется разложением в растр. Для горизонтальных, вертикальных и наклоненных под углом 45 отрезков выбор пикселов не представляет сложности. При другой ориентации отрезка выбрать пикселы сложнее (см. рис.7):

Требования, предъявляемые к отрезкам:

Отрезки должны выглядеть прямыми, начинаться и заканчиваться в заданных точках, иметь постоянную яркость вдоль всего отрезка, не зависящую от его длины и наклона. Алгоритм рисования должен быть быстрым.

Этим требованиям удовлетворяет алгоритм Брезенхема разложения отрезка в растр.

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

Алгоритм Брезенхема выбирает оптимальные растровые координаты для представления отрезка. В процессе построения отрезка одна из координат (х или у, в зависимости от углового коэффициента отрезка) на каждом шаге алгоритма изменяется на 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 накопление ошибки

конец

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

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

Коррекция ошибки

Накопление ошибки

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