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

2. 2. 1. 2. Обобщенный алгоритм Брезенхема вычерчивания отрезков

Когда |k| > 1, у - основное направление и у постоянно изменяется на 1, а изменение ошибки анализируется для принятия решения об изменении координаты х. Когда |k| < 1, основным направлением является х, поэтому х постоянно изменяется на 1, а изменение ошибки анализируется для принятия решения об изменении координаты у.

Выбор постоянно изменяющейся (основной) координаты (на +1 или -1) зависит от октанта (см. рис. 9).

Обобщенный алгоритм Брезенхема на псевдокоде:

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

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

e - ошибка

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

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

sx – знак приращения по x

sy - знак приращения по y

флаг - показывает, произошел обмен основной и дополнительной координаты или нет

врем – временная переменная для обмена

Sign (x) – функция, возвращающая –1,0 или 1 для отрицательного, нулевого и положительного аргумента соответственно.

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

начало

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

x = x1, y = y1

dx = abs (x2-x1), dy = abs (y2-y1)

sx = sign (x2-x1), sy = sign (y2-y1)

обмен значений dx и dy, если y – основное направление

if dy>dx then

врем = dx

dx = dy

dy = врем

флаг = 1

else

флаг = 0

end if

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

e = 2*dy – dx

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

for i = 1 to dx

plot (x,y)

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

if (e>=0) then

if flag = 1 then x = x + sx

else y = y + sy

end if

e = e – 2*dx

конец if

изменение основной координаты

if flag = 1 then y = y + sy

else x = x + sx

конец if

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

e = e + 2*dy

next i

конец

2.2.2. Вычерчивание окружностей

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

Для того чтобы сгенерировать окружность, достаточно нарисовать только восьмую часть окружности, остальные ее части могут быть получены при помощи последовательных зеркальных отражений (см. п. 2). Если построена часть окружности в первом октанте (от 0 до 45 против часовой стрелки), то во втором октанте часть окружности может быть получена зеркальным отражением относительно прямой у = х. В результате первый квадрант окружности будет построен. Если его отразить относительно прямой х = 0, то сгенерируется еще четверть окружности во втором квадранте. Если верхнюю полуокружность отразить относительно прямой у = 0, то в результате получится полная окружность.

Рассмотрим генерацию окружности для 2-ого квадранта. Генерация окружности радиуса R начинается в точке (0, R). Считается, что центр окружности и начальная точка находятся точно в точках растра.

Для любой заданной точки на окружности существует только 3 способа выбрать следующий пиксел, наилучшим образом аппроксимирующий ход окружности: горизонтально вправо (направление mH) , вертикально вниз (направление mV), по диагонали вправо вниз (направление mD) (см. рис. 10).

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

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

Вычисления можно упростить, если заметить, что в окрестности точки (xi, yi) возможны только 5 типов пересечений сетки растра с окружностью:

Разность между квадратами расстояний от центра окружности до диагонального пиксела (xi+1, yi-1) и от центра до точки на окружности равна

Эта разность называетсяошибкой. Если di < 0, то диагональная точка находится внутри окружности, это случаи 1 и 2, т. е. нужно выбирать либо mH либо mD. Для этого проверяется разность квадратов расстояний от окружности до пикселов по горизонтальному и диагональному направлениям:

При s<0 расстояние от окружности до диагонального пиксела больше, чем до горизонтального, поэтому в этом случае выбирается направление mH. При s>0 расстояние до диагонального пиксела меньше, чем до горизонтального, и в этом случае выбирается направление mD. При s=0 расстояния до обоих пикселов одинаково, выбирается направление mH.

В случае 1 верны соотношения:

Поэтому s проще вычислить по формуле:

В случае 2 выполняется

следовательно, s<0, и по тому же критерию, что и для случая 1, выбирается направление mH.

Еслиdi>0, то диагональная точка находится вне окружности, это случаи 3 и 4, и нужно выбирать либо направление mD либо mV. Аналогично предыдущему случаю, проверяя разность между квадратами расстояний от окружности до диагонального и вертикального пикселов, можно получить:

При s1<0 расстояние от окружности до диагонального пиксела меньше, чем до вертикального, поэтому в этом случае выбирается направление mD. При s1>0 расстояние до диагонального пиксела больше, чем до вертикального, и в этом случае выбирается направление mН. При s1=0 расстояния до обоих пикселов одинаково, выбирается направление mD.

Для случая 3 выполняются соотношения:

Следовательно, s1 можно вычислить по формуле:

В случае 4 верно

Следовательно, s1>0, и используя тот же критерий, что и для случая 3, нужно выбрать направление mV.

В случае 5 di=0, диагональный пиксел лежит на окружности, и именно его требуется выбирать.

Сводная таблица выбора пикселов

di<0

di>0

di=0

s<=0

s>0

s<=0

s>0

mH,

(xi+1,yi)

mD,

(xi+1,yi-1)

mD,

(xi+1,yi-1)

mV,

(xi,yi-1)

mD,

(xi+1,yi-1)

Для реализации пошагового алгоритма используются формулы:

шагmH

шагmD

шагmV

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

(0, R) - начальная точка окружности

(х, у) - текущая точка окружности

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

di - ошибка

s1 - разность квадратов расстояний от окружности до горизонтального и диагонального пикселов

s2- разность квадратов расстояний от окружности до диагонального и вертикального пикселов

R - радиус окружности

начало

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

x = 0

y = R

di = 2(1-R)

Предел =0

1 Plot (x, y)

if y<=Предел then 4

выделение случаев 1 или 2,3 или 4,5

if di<0 then 2

if di>0 then 3

if di=0 then 20

определение случая 1 или 2

  1. s1=2di+2y-1

if s1<=0 then 10

if s1>0 then 20

определение случая 3 или 4

3 s2=2di-2x-1

if s2<=0 then 20

if s2>0 then 30

шаг mH

  1. x = x + 1

di = di + 2x + 1

go to 1

шаг mD

  1. x = x + 1

y = y + 1

di = di +2x-2y+2

go to 1

шаг mV

  1. y = y - 1

di = di - 2y + 1

go to 1

4 конец