Цей алгоритм використовується для скан-конвертування рядка. Він був розроблений Bresenham. Це ефективний метод, оскільки він включає лише цілочисельні операції додавання, віднімання та множення. Ці операції можна виконувати дуже швидко, тому лінії можна швидко генерувати.
У цьому методі вибирається наступний піксель, який має найменшу відстань від справжньої лінії.
Метод працює наступним чином:
Припустимо піксель P1'(x1', і1'), а потім виберіть наступні пікселі, коли ми працюємо з травнем до ночі, по одному пікселю за раз у горизонтальному напрямку до P2'(x2', і2').
python або
Після пікселя виберіть будь-який крок
Наступний піксель
- Або праворуч (нижня межа рядка)
- Один зверху праворуч і вгору (верхня межа лінії)
Лінія найкраще апроксимується тими пікселями, які знаходяться на найменшій відстані від шляху між P1',П2'.
Вибирає наступний між нижнім пікселем S і верхнім пікселем T.
Якщо вибрано S
Маємо хi+1=xi+1 і уi+1=yi
Якщо вибрано T
Маємо хi+1=xi+1 і уi+1=yi+1
Фактичні координати y лінії при x = xi+1є
y=mxi+1+б
Відстань від S до фактичної лінії в напрямку y
s = y-yi
Відстань від T до фактичної лінії в напрямку y
t = (уi+1)-у
Тепер розглянемо різницю між цими двома значеннями відстані
s - t
Коли (s-t)<0 ⟹ s < t< p>
Найближчим пікселем є S
Коли (s-t) ≧0 ⟹ s Найближчим пікселем є T Ця різниця є Замінивши m на і введення змінної рішення Де c= 2△y+△x (2b-1) Ми можемо записати змінну рішення di+1для наступного ковзання Оскільки x_(i+1)=xi+1, маємо Особливі випадки Якщо вибраний піксель знаходиться у верхньому пікселі T (тобто di≧0)⟹ іi+1=yi+1 Якщо вибраний піксель знаходиться в нижньому пікселі T (тобто di<0)⟹ yi+1=yi Нарешті обчислюємо d1 Оскільки mx1+б-уi=0 і m = , ми маємо 1. Він включає лише цілу арифметику, тому він простий. 2. Це дозволяє уникнути генерації повторюваних точок. 3. Його можна реалізувати за допомогою апаратних засобів, оскільки він не використовує множення та ділення. 4. Він швидший порівняно з DDA (цифровим диференціальним аналізатором), оскільки він не включає обчислення з плаваючою комою, як алгоритм DDA. 1. Цей алгоритм призначений лише для базового малювання ліній. Ініціалізація не є частиною алгоритму ліній Брезенхема. Отже, щоб малювати плавні лінії, вам слід розглянути інший алгоритм. Крок 1: Алгоритм запуску Крок 2: Оголосити змінну x1,x2,і1,і2,d,i1,i2,dx,dy крок 3: Введіть значення x1,і1,x2,і2 крок 4: Обчисліть dx = x2-x1 крок 5: Розглянемо (x, y) як початкову точку та xкінецьяк максимально можливе значення x. крок 6: Згенеруйте точку за координатами (x,y). Крок 7: Перевірте, чи згенеровано весь рядок. Крок 8: Обчисліть координати наступного пікселя Крок 9: Приріст x = x + 1 крок 10: Намалюйте точку з останніми (x, y) координатами Крок 11: Перейдіть до кроку 7 Крок 12: Кінець алгоритму приклад: Початкова та кінцева позиція рядка: (1, 1) і (8, 5). Знайти проміжні точки. рішення: х1=1 Вихід:
s-t = (y-yi)-[(yi+1)-y]
= 2y - 2yi -1
di=△x (s-t)
di=△x (2 (хi+1)+2b-2yi-1)
=2△xyi-2△y-1△x.2b-2yi△x-△x
di=2△y.xi-2△x.yi+cалгоритм будки
di+1=2△y.xi+1-2△x.yi+1+c
di+1-дi=2△y.(xi+1-xi)- 2△x(yi+1-іi)
di+1+di=2△y.(xi+1-хi)- 2△x(yi+1-іi)
di+1=di+2△y-2△x
di+1=di+2△р0)⟹>
d1=△x[2m(x1+1)+2b-2y1-1]
d1=△x[2(mx1+б-у1)+2m-1]
d1=2△y-△xПеревага:
Недолік:
Алгоритм лінії Брезенхема:
Де x1,і1- це координати початкової точки
І х2,і2– координати Кінцевої точки
Обчисліть dy = y2-і1
Обчисліть i1=2*ти
Обчисліть i2=2*(dy-dx)
Обчисліть d=i1-dxперетворення nfa в dfa
Якщо dx<0
Тоді x = x2
y = y2
хкінець=x1
Якщо dx > 0
Тоді x = x1
y = y1
хкінець=x20>in.next java
Якщо x > = xкінець
СТІЙ.
Якщо d<0
Тоді d = d + i1
Якщо d ≧ 0
Тоді d = d + i2
Приріст y = y + 10>
і1=1
х2=8
і2=5
dx= x2-x1=8-1=7
ти=у2-і1=5-1=4
я1=2* ∆y=2*4=8
я2=2*(∆y-∆x)=2*(4-7)=-6
d = I1-∆x=8-7=1
х і d=d+I1або я2 1 1 d+I2=1+(-6)=-5 2 2 d+I1=-5+8=3 3 2 d+I2=3+(-6)=-3 4 3 d+I1=-3+8=5 5 3 d+I2=5+(-6)=-1 6 4 d+I1=-1+8=7 7 4 d+I2=7+(-6)=1 8 5 Програма для реалізації алгоритму малювання ліній Брезенхема:
#include #include void drawline(int x0, int y0, int x1, int y1) { int dx, dy, p, x, y; dx=x1-x0; dy=y1-y0; x=x0; y=y0; p=2*dy-dx; while(x=0) { putpixel(x,y,7); y=y+1; p=p+2*dy-2*dx; } else { putpixel(x,y,7); p=p+2*dy;} x=x+1; } } int main() { int gdriver=DETECT, gmode, error, x0, y0, x1, y1; initgraph(&gdriver, &gmode, 'c:\turboc3\bgi'); printf('Enter co-ordinates of first point: '); scanf('%d%d', &x0, &y0); printf('Enter co-ordinates of second point: '); scanf('%d%d', &x1, &y1); drawline(x0, y0, x1, y1); return 0; }
Розрізняйте алгоритм DDA та алгоритм лінії Брезенхама:
Алгоритм DDA Алгоритм лінії Брезенхема 1. Алгоритм DDA використовує плаваючу кому, тобто дійсну арифметику. 1. Лінійний алгоритм Брезенхема використовує фіксовану точку, тобто цілу арифметику 2. Алгоритми DDA використовують операції множення та ділення 2. Лінійний алгоритм Брезенхема використовує лише операції віднімання та додавання 3. Алгоритм DDA є повільнішим, ніж алгоритм ліній Брезенхама, у малюванні ліній, оскільки він використовує реальну арифметику (операція з плаваючою комою) 3. Алгоритм Брезенхема є швидшим, ніж алгоритм DDA, тому що він передбачає лише додавання та віднімання під час обчислення та використовує лише цілу арифметику. 4. Алгоритм DDA не є точним і ефективним, ніж лінійний алгоритм Брезенхема. 4. Лінійний алгоритм Брезенхема є більш точним і ефективним у порівнянні з алгоритмом DDA. 5. Алгоритм DDA може малювати кола та криві, але не є точним, ніж алгоритм ліній Брезенхема 5. Алгоритм ліній Брезенхема може малювати кола та криві з більшою точністю, ніж алгоритм DDA.