Різниця між квадратами відстаней від центра кола до діагонального піксела (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хi=хi+1
Di=Di+2хi+1
gо to 1
крокm
20хi=хi+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. разом з реальним колом. Алгоритм легко узагальнюється для інших квадрантів чи дуг кіл.
алгоритм генерація коло брезенхем
Результати роботи покрокового алгоритму Брезенхема генерації кола