- •Московский государственный институт электроники и математики (Технический университет)
- •"Преобразования на плоскости. Вычерчивание линий и окружностей"
- •2. 1. Преобразования на плоскости (2d преобразования)
- •2.2. Разложение в растр
- •2.2.1 Вычерчивание отрезков
- •2.2.1.1. Алгоритм Брезенхема вычерчивания отрезков для первого октанта.
- •2. 2. 1. 2. Обобщенный алгоритм Брезенхема вычерчивания отрезков
- •2.2.2. Вычерчивание окружностей
- •3. Практическая часть
- •4. Требования к отчету
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 накопление ошибки
конец
Быстродействие алгоритма можно увеличить, если использовать только целочисленную арифметику. Поскольку важен лишь знак ошибки, то можно сделать преобразование Тогда инициализация, коррекция, накопление ошибки будет выглядеть следующим образом:
Инициализация ошибки |
Коррекция ошибки |
Накопление ошибки |
|
|
Чтобы алгоритм был полным, необходимо его распространить на все квадранты, что и осуществляет обобщенный алгоритм Брезенхема.