Смекни!
smekni.com

Алгоритм Брезенхема (стр. 2 из 2)

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

Di=(xi+1)2+(yi-1)2-R2

Як і в алгоритмі Брезенхема для відрізка, для вибору відповідного піксела бажано використовувати тільки знак похибки, а не її величину.

При Di<0 діагональна точка (xi+1, уi-1) знаходиться всередині реального кола, тобто це випадки 1 або 2 на рис. 5.4. Ясно, що в цій ситуації варто вибрати або піксел (xi+1, уi), тобто mH, або піксел (xi+1, уi-1), тобто mD. Для цього спочатку розглянемо випадок 1 і перевіримо різницю квадратів відстаней від кола до пікселів у горизонтальному і діагональному напрямках:


d=|(xi+1)2+(yi)2-R2|-|(xi+1)2+(yi-1)2-R2|

При d<0 відстань від кола до діагонального піксела більша, ніж до горизонтального. Навпаки, якщо d>0, відстань до горизонтального піксела більша. Таким чином,

при d<=0 вибираємо mH (xi+1, уi)

при d>0 вибираємо mD (xi+1, уi-1)

При d=0, коли відстань від кола до обох пікселів однакова, вибираємо горизонтальний крок.

Кількість обчислень, необхідних для оцінки величини d, можна скоротити, якщо помітити, що у випадку 1

(xi+1)2+(yi)2-R2>=0

(xi+1)2+(yi-1)2-R2<0

тому що діагональний піксел (xi+1, уi-1) завжди лежить всередині кола, а горизонтальний (xi+1, уi) –поза ним. Таким чином, d можна обчислити за формулою

d=(xi+1)2+(yi)2-R2+(xi+1)2+(yi-1)2-R2

Доповнення до повного квадрата члена (yi)2 за допомогою додавання і віднімання – 2yi+1 дає

d=2 [(xi+1)2+(yi-1)2-R2]+2yi-1

У квадратних дужках стоїть по визначенню Di і його підстановка

d=2 (Di+yi)1


значно спрощує вираз.

Розглянемо випадок 2 на рис. 5.4 і помітимо, що тут повинен бути обраним горизонтальний піксел (xi+1, уi), тому що у є монотонно спадною функцією. Перевірка компонентів d показує, що

(xi+1)2+(yi)2-R2<0

(xi+1)2+(yi-1)2-R2<0

оскільки у випадку 2 горизонтальний (xi+1, уi) і діагональний (xi+1, уi-1) піксели лежать усередині кола. Отже, d<0, і при використанні того ж самого критерію, що й у випадку 1, вибирається піксел (xi+1, уi).

Якщо Di>0, то діагональна точка (xi+1, уi-1) знаходиться поза колом, тобто це випадки 3 і 4 на рис. 5.4. У даній ситуації ясно, що потрібно вибрати піксел (xi+1, уi-1), або (xi, уi -1). Аналогічно розгляду попереднього випадку критерій вибору можна отримати, розглядаючи спочатку випадок 3 і перевіряючи різницю між квадратами відстаней від кола до діагонального mD і вертикального mV пікселів, тобто

d'=|(xi+1)2+(yi-1)2-R2|-|(xi)2+(yi-1)2-R2|.

При d'<0 відстань від кола до вертикального піксела (xi, уi -1) більша і варто вибрати діагональний крок до піксела (xi+1, уi-1). Навпаки, у випадку d'>0 відстань від кола до діагонального піксела більша і варто вибрати вертикальний рух до піксела (xi, уi-1). Таким чином, при d'<=0 вибираємо mD (xi+1, уi-1), при d'>0 вибираємо mV (xi, уi-1).

Тут для випадку d'=0, тобто коли відстані рівні, обраний діагональний крок.

Перевірка компонентів d' показує, що

(xi)2+(yi-1)2-R2>=0

(xi+1)2+(yi-1)2-R2<0

оскільки для випадку 3 діагональний піксел (xi+1, уi-1) знаходиться поза колом, тоді як вертикальний піксел (xi, уi-1) лежить всередині кола. Це дозволяє записати d' у вигляді

d'=(xi+1)2+(yi-1)2-R2+(xi)2+(yi-1)2-R2

Доповнення до повного квадрата члена (xi)2 за допомогою додавання і віднімання 2xi+1 дає

d'=2 [(xi+1)2+(yi-1)2-R2]-2xi-1

Використання визначення Di приводить вираз до вигляду

d'=2 (Di-xi) – 1

Тепер, розглядаючи випадок 4, знову зауважимо, що варто вибрати вертикальний піксел (xi, уi-1), тому що y є монотонно спадною функцією від х.

Перевірка компонентів d' для випадку 4 показує, що

(xi+1)2+(yi-1)2-R2>0

(xi)2+(yi-1)2-R2>0

Оскільки обидва піксели знаходяться поза колом. Отже, d'>0 і при використанні критерію, розробленого для випадку 3, відбувається вірний вибір mV.

Залишилося перевірити тільки випадок 5 на рис. 5.4, який зустрічається, коли діагональний піксел (xi+1, уi-1) лежить на колі, тобто Di=0. Перевірка компонентів d показує, що

(xi+1)2+(yi)2-R2>0

(xi+1)2+(yi-1)2-R2=0

Отже, d>0 і вибирається діагональний піксел (xi+1, уi-1). Аналогічним чином оцінюємо компоненти d':

(xi+1)2+(yi-1)2-R2=0

(xi+1)2+(yi-1)2-R2<0

і d'<0, що є умовою вибору правильного діагонального кроку до (xi+1, уi-1). Таким чином, випадок Di=0 підлягає тому ж критерію, що і випадок Di<0 чи Di>0. Підіб'ємо підсумок отриманих результатів:

Di<0

d<=0вибираємо піксел (xi+1, уi) – mH

d>0 вибираємо піксел (xi+1, уi-1)mD

Di>0

d'<=0 вибираємо піксел (xi+1, уi-1) – mD

d'>0 вибираємо піксел (xi, уi-1) – mV

Di=0 вибираємо піксел (xi+1, уi-1) – mD

Легко розробити прості рекурентні співвідношення для реалізації покрокового алгоритму. Спочатку розглянемо горизонтальний крок mH до піксела (xi+1, уi). Позначимо це нове положення піксела як (i+1). Тоді координати нового піксела і значення Di рівні

xi+1=xi+1

yi+1=yi

Di+1=(xi+1+1)2+(yi+1-1)2-R2=Di+2xi+1+1

Аналогічно координати нового піксела і значення Di для кроку mD до піксела (xi+1, уi-1) такі:

xi+1=xi+1

yi+1=yi-1

Di+1=Di+2xi+1-2yi+1+2

Те ж саме для кроку mVдо (xi, уi-1)

xi+1=xi

yi+1=yi-1

Di+1=Di-2yi+1+1

Реалізація алгоритму Брезенхема на псевдокоді для кола наводиться нижче.

Покроковий алгоритм Брезенхема для генерації кола в першому квадранті усі змінні – цілі ініціалізація змінних

xi=0

yi=R

Di=2 (1-R)

Межа=0

1 Plot (xi, yi)

if yi<=Межа then 4

Виділеннявипадку 1 чи 2, 4 чи 5, чи 3

if Di<0 then 2

if Di>0 then 3

if Di=0 then 20

визначення випадку 1 чи 2

2d=2Di+2уi-1

if d<=0 then 10

if d>0 then 20

визначення випадку 4 чи 5

3d=2Di+2хi-1

if d<=0 then 20

if d>0 then 30

виконання кроків

крок до m

10хii+1

Di=Di+2хi+1

gо to 1

крокm

20хii+1

yi=yi+1

Di=Di+2хi-2уi+2

gо to 1

4 finish

Змінна межі встановлюється в нуль для закінчення роботи алгоритму на горизонтальній осі, в результаті генерується коло у першому квадранті. Якщо необхідний лише один з октантів, то другий октант можна отримати за допомогою установки Межа=Integer (R/sqrt(2)), а перший – за допомогою відображення другого октанта відносно прямої у=х (рис. 5.1). Блок-схема алгоритму показана на рис. 5.5.

Блок-схема покрокового алгоритму Брезенхема для генерації кола в першому квадранті


Розглянемо коло радіусом 8 з центром в початку координат. Генерується тільки перший квадрант.

x=0

y=8

=2 (1–8)=-14

Межа=0

Покрокове виконання основного циклу

1 Plot (0,8)

yi>Межа (продовжувати)

Di<0 go to 2

2d=2 (-14)+2 (8) – 1=-13<0 go to 10

10x=0+1=1

Di=-14+2+1=-11

go to 1

1 Plot (1,8)

yi>Межа (продовжувати)

Di<0 go to 2

2d=2 (-11)+2 (8) – 1=-7<0 go to 10

10x=1+1=1

Di=-11+2 (2)+1=-6

go to 1

1 Plot (2,8)

Результати всіх послідовних проходів алгоритму зведені в таблицю. Список пікселів обраних алгоритмів складається з (0,8), (1,8), (2,8), (3,7), (4,7), (5,6), (6,5), (7,4), (7,3), (8,2), (8,1), (8,0).


Plot Di d d' x y
-14 0 8
(0,8)
-11 -13 0 8
(1,8)
-6 -7 2 8
(2,8)
-12 3 3 7
(3,7)
-3 11 4 7
(4,7)
1 5 6 5
(6,5)
9 -11 7 4
(7,4)
18 -7 8 2
(8,2)
17 19 8 1
(8,1)
18 17 8 0
(8,0)

Результати показані на рис. 5.6. разом з реальним колом. Алгоритм легко узагальнюється для інших квадрантів чи дуг кіл.

алгоритм генерація коло брезенхем


Результати роботи покрокового алгоритму Брезенхема генерації кола