Реферат
На тему:
«Алгоритм Брезенхема»
Львів-2011
1. Алгоритм Брезенхема
Хоча алгоритм Брезенхема був спочатку розроблений для цифрових графопобудовувачів, однак він в тій же мірі підходить для використання растровими пристроями з ЕПТ. Алгоритм вибирає оптимальні растрові координати для представлення відрізка. У процесі роботи одна з координат – або x, або y (в залежності від кутового коефіцієнта) – змінюється на одиницю. Зміна іншої координати (на 0 чи 1) залежно від відстані між дійсним положенням відрізка і найближчих координат сітки. Таку відстань ми назвемо похибкою.
Алгоритм побудований так, що потрібно перевірити лише знак цієї похибки. На рис. 3.1 це ілюструється для відрізка в першому октанті, тобто для відрізка з кутовим коефіцієнтом, що лежить у діапазоні від 0 до 1. З малюнка можна помітити що, якщо кутовий коефіцієнт відрізка з точки (0,0) більший, ніж 1/2, то перетин з прямою x=1 буде розташований ближче до прямої y=1, ніж до прямої y=0. Отже, точка растра (1,1) краще апроксимує хід відрізка, ніж точка (1,0). Якщо кутовий коефіцієнт менше 1/2, то навпаки. для кутового коефіцієнта, рівного 1/2, немає кращого вибору. У даному випадку алгоритм вибирає точку (1,1).
Основна ідея алгоритму Брезенхема
Не усі відрізки проходять через точки растра. Подібна ситуація ілюструється рис. 3.2, де відрізок з тангенсом кута нахилу 3/8 спочатку проходить через точку растра (0,0) і послідовно перетинає три піксели. Також ілюструється обчислення похибки при представленні відрізка дискретними пікселами.
Графік похибки в алгоритмі Брезенхема
Тому що бажано перевіряти тільки знак похибки, то вона спочатку встановлюється рівною -1/2. Таким чином, якщо кутовий коефіцієнт відрізка дорівнює чи більший 1/2, то величина похибки в наступній точці растра з координатами (1,0) може бути обчислена як
e=e+m
де m – кутовий коефіцієнт. У нашому випадку при початковому значенні похибки -1/2
e=-1/2+3/8=-1/8
Тому що е від’ємне, відрізок пройде нижче середини піксела. Отже, піксел на тому ж самому горизонтальному рівні краще апроксимує положення відрізка, тому в не збільшується. Аналогічно обчислюємо похибку e=-1/8+3/8=1/4 у наступній точці растра (2,0). Тепер е додатне, значить відрізок пройде вище середньої точки. Растровий елемент (2,1) з наступною по величині координатою в краще апроксимує положення відрізка. Отже, у збільшується на 1. Перше ніж розглядати наступний піксел, необхідно відкоректувати похибку відніманням від неї 1. Маємо e=1/4–1=-3/4. Помітимо, що перетин вертикальної прямої x=2 із заданим відрізком лежить на 1/4 нижче прямої у=1. Якщо ж перенести відрізок 1/2 вниз, ми одержимо саме величину -3/4. Продовження обчислень для наступного піксела дає e=-3/4+3/8=-3/8.
Тому що е від’ємне, то y не збільшується. З усього сказаного випливає, що похибка – це інтервал, що відтинається по осі y розглянутим відрізком у кожному растровому елементі (відносно -1/2).
Приведемо алгоритм Брезенхема для першого октанта, тобто для випадку 0£Dy£Dx.
Алгоритм Брезенхема розкладання в растр відрізка для першого октанта передбачається, що кінці відрізка (x1, y1) і (x2, y2) не збігаються.
Integer – функція перетворення в ціле
x, y, Dx, Dy – цілі
е – дійсне
ініціалізація змінних
x=x1
y=y1
Dx=x2-x1
Dy=y2-y1
Ініціалізація з виправленням на половину піксела
е=Dy/Dx-1/2
початок основного циклу
for i=1 to Dx
plot (x, y)
while (e=>0)
y=y+1
e=e-1
end while
x=x+1
e=e+Dy/Dx
next i
finish
Блок-схема алгоритму на рис. 3.3. Приклад наведений нижче.
Приклад 3.1. Алгоритм Брезенхема.
Розглянемо відрізок, проведений із точки (0,0) у точку (5,5). Розклад відрізка в растр по алгоритму Брезенхема приводить до такого результату:
початкові установки
x=0
y=0
Dx=5
Dy=5
е=1–1/2=1/2
Результати роботи покрокового циклу
i | Plot | e | x | y |
1/2 | 0 | 0 | ||
1 | (0,0) | |||
-1/2 | 0 | 1 | ||
1/2 | 1 | 1 | ||
2 | (1,1) | |||
-1/2 | 1 | 2 | ||
1/2 | 2 | 2 | ||
3 | (2,2) | |||
-1/2 | 2 | 3 | ||
1/2 | 3 | 3 | ||
4 | (3,3) | |||
-1/2 | 3 | 4 | ||
1/2 | 4 | 4 | ||
5 | (4,4) | |||
-1/2 | 5 | 5 | ||
1/2 | 5 | 5 |
Блок-схема алгоритму Брезенхема
Результат показаний на рис. 3.4 і збігається з очікуваним. Помітимо, що точка растра з координатами (5,5) не активована. Цю точку можна активувати шляхом зміни циклу for-next на 0 to Dx. Активацію точки (0,0) можна усунути, якщо поставити оператор Plot безпосередньо перед рядком next i.
Результат роботи алгоритму Брезенхема в першому октанті
2. Загальний алгоритм Брезенхема
Щоб реалізація алгоритму Брезенхема була повною необхідно розглянути відрізки у всіх октантах. Модифікацію легко зробити, враховуючи в алгоритмі номер квадранта, в якому лежить відрізок і його кутовий коефіцієнт. Коли абсолютна величина кутового коефіцієнта більше 1, у постійно змінюється на одиницю, а критерій похибки Брезенхема використовується для ухвалення рішення про зміну величини x. Вибір постійно змінюваної координати (на +1 чи -1) залежить від квадранта (рис. 4.1.). Загальний алгоритм може бути оформлений у наступному вигляді:
Узагальнений цілочисельний алгоритм Брезенхема квадрантів передбачається, що кінці відрізка (x1, y1) і (x2, y2) не збігаються усі змінні вважаються цілими Sign – функція, що повертає -1, 0, 1 для від’ємного, нульового і додатнього аргумента відповідно ініціалізація змінних
x=x1
y=y1
Dx=abs (x2-x1)
Dy=abs (y2-y1)
s1=Sign (x2-x1)
s2=Sign (y2-y1)
обмін значень Dx і Dy в залежності від кутового коефіцієнта нахилу відрізка
if Dy<Dx then
Temp=Dx
Dx=Dy
Dy=Temp
Обмін=1
else
Обмін=0
end if
ініціалізація e з виправленням на половину піксела
e=2*Dy-Dx
основний цикл
for i=1 to Dx
Plot (x, y)
while (e=>0)
if Обмін=1 then
x=x+s1
else
y=y+s2
end if
e=e-2*Dx
end while
if Обмін=1 then
y=y+s2
else
x=x+s1
end if
e=e+2*Dy
next i
finish
Розгляд випадків для узагальненого алгоритму Брезенхема
Для ілюстрації розглянемо відрізок із точки (0, 0) у точку (-8, -4).
початкові установки
x=0
y=0
Dx=8
Dy=4
s1=-1
s2=-1
Обмін=0
е=0
Результати роботи покрокового циклу
i | Plot | е | x | y |
0 | 0 | 0 | ||
1 | (0,0) | |||
-16 | 0 | -1 | ||
-8 | -1 | -1 | ||
2 | (-1, – 1) | |||
0 | -2 | -1 | ||
3 | (-2, – 1) | |||
-16 | -2 | -2 | ||
-8 | -3 | -2 | ||
4 | (-3,2) | |||
0 | -4 | -2 | ||
5 | (-4,2) | |||
-16 | -4 | -3 | ||
-8 | -5 | -3 | ||
6 | (-5, – 3) | |||
0 | -6 | -3 | ||
7 | (-6, – 3) | |||
-16 | -6 | -4 | ||
-8 | -7 | -4 | ||
8 | (-7, – 4) | |||
0 | -8 | -4 |
Результат роботи узагальненого алгоритму Брезенхема в третьому квадранті
На рис. 4.2 показаний результат. Порівнюючи з рис. 2.2 бачимо, що результати роботи двох алгоритмів відрізняються.
3. Алгоритм Брезенхема для генерації кола
У растр потрібно розкладати не тільки лінійні, але й інші, більш складні функції. Розкладанню конічних перетинів, тобто кіл, еліпсів, парабол, гіпербол, було присвячено значне число робіт. Найбільша увага, зрозуміло, приділена колу. Один з найбільш ефективних і простих для розуміння алгоритмів генерації кола належить Брезенхему. Для початку відмітимо, що необхідно згенерувати тільки одну восьму частину кола. Інші його частини можуть бути отримані послідовними відображеннями, як це показано на рис. 5.1. Якщо згенерований перший октант (від 0 до 45° проти годинникової стрілки), то другий октант можна отримати дзеркальним відображенням відносно прямої y=х, що дає в сукупності перший квадрант. Перший квадрант відбивається відносно прямої х=0 для отримання відповідної частини кола в другому квадранті. Верхнє півколо відбивається відносно прямої y=0 для завершення побудови. На рис. 5.1 наведені двовимірні матриці відповідних перетворень.
Генерація повного кола з дуги в першому октанті
Для виведення алгоритму розглянемо першу чверть кола з центром у початку координат. Помітимо, що якщо робота алгоритму починається в точці х=0, у=R, то при генерації кола за годинниковою стрілкою в першому квадранті у є монотонно спадною функцією аргумента х (рис. 5.2). Аналогічно, якщо вихідною точкою є у=0, х=R, то при генерації кола проти годинникової стрілки х буде монотонно спадною функцією аргументу у. У нашому випадку вибирається генерація за годинниковою стрілкою з початком у точці х=0, у=R. Передбачається, що центр кола і початкова точка знаходяться точно в точках растра.
Для будь-якої заданої точки на колі при генерації за годинниковою стрілкою існує тільки три можливості вибрати наступний піксел, що щонайкраще наближає коло: горизонтально вправо, по діагоналі вниз і вправо, вертикально вниз. На рис. 5.3 ці напрямки позначені відповідно mH, mD, mV. Алгоритм вибирає піксел, для якого мінімальний квадрат відстані між одним з цих положень і колом, тобто мінімум з
mH=|(xi+1)2+(yi)2-R2|
mD=|(xi+1)2+(yi-1)2-R2|
mV=|(xi)2+(yi-1)2-R2|