Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпоры по компьютерной графике [по вопросам].doc
Скачиваний:
84
Добавлен:
02.05.2014
Размер:
783.36 Кб
Скачать

18. Растровое представление отрезка: постановка задачи, простейший алгоритм, алгоритм цда.

"дискретная плоскость" – множество всех точек с целочисленными координатами на обычной плоскости. Дискретную плоскость часто называют целочисленной решеткой. Нельзя провести непрерывный отрезок прямой линии из одной точки экрана в другую. Можно только подсветить ближайшие к прямой пикселы. Процесс определения пикселов, наилучшим образом аппроксимирующих заданный отрезок, называется разложением отрезка в растр.

Отрезки должны удовлетворять следующим требованиям:

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

  2. Яркость вдоль отрезка должна быть постоянной и не зависеть от длины и наклона.

  3. Алгоритмы рисования должны быть простыми , т.е. отрезок “рисоваться” должен быстро.

При достаточно высоком разрешении дисплея можно получить приемлемую аппроксимацию прямой линии.

Следует отметить, что постоянная яркость будет у горизонтальных, вертикальных отрезков и под углом 450, причем у отрезков под углом 450 яркость будет меньше чем у вертикальных и горизонтальных отрезков.

Рассмотрим задачу построения растрового изображения отрезка, соединяющего точки (x1, y1) и (x2, y2). Для простоты будем считать, что 0y2-y1x2-x1. Тогда отрезок описывается следующим уравнением:

или у = kx+b .

Основной недостаток алгоритма - использование вещественных вычислений для работы на целочисленной решетке.

Другим простейшим алгоритмом разложения отрезка в растр является алгоритм, построенный по методу цифрового дифференциального анализатора (ЦДА).

Данный алгоритм пригоден для проведения отрезков во всех квадрантах декартовой системы координат.

1) Осуществляется аппроксимация длины отрезка (float len)

2) Полагаем большее из приращений Dy или Dx равным единице растра

3) Округляем величины, а не отбрасываем дробную часть

4) Начало основного цикла

i=1;

while (i<= Len)

{ PutPixel (Int(x), Int(y), Color);

x = x + Dx;

y = y + Dy;

i = i + 1;}

Недостатки алгоритма разложения отрезка в растр, основанного на методе ЦДА:

  1. Использует вещественную арифметику, что приводит к значительным затратам вычислительных ресурсов.

  2. Может быть активизирован пиксел, стоящий за концом отрезка, и если рисуется ломаная, то данный пиксел будет высвечиваться 2 раза.

  3. Результат работы алгоритма зависит от ориентации отрезка, т.е. точность на концевых точках отрезка ухудшается.

19. Растровое представление отрезка: постановка задачи, алгоритм Брезенхейма.

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

Идея алгоритма состоит в том, что в процессе построения отрезка одна из координат - либо “х”, либо “y” (в зависимости от углового коэффициента) - изменяется на единицу. Изменение другой координаты (либо на нуль, либо на единицу) зависит от расстояния между “теоретическим” положением отрезка и ближайшими координатами сетки (такое расстояние в алгоритме называется “ошибкой”).

При построении растрового изображения отрезка всегда выбирается ближайший по вертикали пиксел. При этом из двух точек А и В выбирается та, которая ближе к исходной прямой (в данном случае выбирается точка А, так

как а < b).

При совмещении начала координат с одним из концов отрезка, имеем три возможные оси симметрии, и достаточно рассмотреть половину одного квадранта, например ту, для которой dx >= dy >= 0.

Уравнение прямой, описывающее отрезок:

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

Пусть E = y*dx - x*dy. (1)

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

Движение A: увеличение x

x = x + 1; в результате согласно (1) ошибка уменьшается на величину dy:

E = E - dy;

Движение B: увеличение x и y

x = x + 1;

y = y + 1;

приводит в соответствии с (1) к возрастанию E на величину (dx - dy), имеющую положительное значение в рассматриваемой половине квадранта:

E = E + dx - dy;

исходя из этих соображений, построен итерационный алгоритм минимизации ошибки, при котором на каждом шаге выбирается соответствующее движение:

Этот алгоритм имеет два недостатка:

  1. первое движение выбирается произвольно

  2. ошибка изменяется от dx-dy до -dy и случайным образом большинство точек может расположиться выше или ниже истинного отрезка.

Обе проблемы отпадают, если центрировать функцию ошибки относительно нуля, начиная с величины (dy -dx/2):

E = dy - dx/2.