logo

Алгоритм лінії Брезенхема

Цей алгоритм використовується для скан-конвертування рядка. Він був розроблений Bresenham. Це ефективний метод, оскільки він включає лише цілочисельні операції додавання, віднімання та множення. Ці операції можна виконувати дуже швидко, тому лінії можна швидко генерувати.

У цьому методі вибирається наступний піксель, який має найменшу відстань від справжньої лінії.

Метод працює наступним чином:

Припустимо піксель P1'(x1', і1'), а потім виберіть наступні пікселі, коли ми працюємо з травнем до ночі, по одному пікселю за раз у горизонтальному напрямку до P2'(x2', і2').

python або

Після пікселя виберіть будь-який крок

Наступний піксель

  1. Або праворуч (нижня межа рядка)
  2. Один зверху праворуч і вгору (верхня межа лінії)

Лінія найкраще апроксимується тими пікселями, які знаходяться на найменшій відстані від шляху між 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

Ця різниця є
s-t = (y-yi)-[(yi+1)-y]
= 2y - 2yi -1

Брезенхем

Замінивши m на Брезенхемі введення змінної рішення
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

Де c= 2△y+△x (2b-1)

алгоритм будки

Ми можемо записати змінну рішення di+1для наступного ковзання
di+1=2△y.xi+1-2△x.yi+1+c
di+1i=2△y.(xi+1-xi)- 2△x(yi+1i)

Оскільки x_(i+1)=xi+1, маємо
di+1+di=2△y.(xi+1-хi)- 2△x(yi+1i)

Особливі випадки

Якщо вибраний піксель знаходиться у верхньому пікселі T (тобто di≧0)⟹ іi+1=yi+1
di+1=di+2△y-2△x

Якщо вибраний піксель знаходиться в нижньому пікселі T (тобто di<0)⟹ yi+1=yi
di+1=di+2△р

Нарешті обчислюємо d1
d1=△x[2m(x1+1)+2b-2y1-1]
d1=△x[2(mx1+б-у1)+2m-1]

Оскільки mx1+б-уi=0 і m = , ми маємо
d1=2△y-△x

Перевага:

1. Він включає лише цілу арифметику, тому він простий.

2. Це дозволяє уникнути генерації повторюваних точок.

3. Його можна реалізувати за допомогою апаратних засобів, оскільки він не використовує множення та ділення.

4. Він швидший порівняно з DDA (цифровим диференціальним аналізатором), оскільки він не включає обчислення з плаваючою комою, як алгоритм DDA.

Недолік:

1. Цей алгоритм призначений лише для базового малювання ліній. Ініціалізація не є частиною алгоритму ліній Брезенхема. Отже, щоб малювати плавні лінії, вам слід розглянути інший алгоритм.

Алгоритм лінії Брезенхема:

Крок 1: Алгоритм запуску

Крок 2: Оголосити змінну x1,x212,d,i1,i2,dx,dy

крок 3: Введіть значення x11,x22
Де x11- це координати початкової точки
І х22– координати Кінцевої точки

крок 4: Обчисліть dx = x2-x1
Обчисліть dy = y21
Обчисліть i1=2*ти
Обчисліть i2=2*(dy-dx)
Обчисліть d=i1-dx

перетворення nfa в dfa

крок 5: Розглянемо (x, y) як початкову точку та xкінецьяк максимально можливе значення x.
Якщо dx<0
Тоді x = x2
y = y2
хкінець=x1
Якщо dx > 0
Тоді x = x1
y = y1
хкінець=x2

in.next java

крок 6: Згенеруйте точку за координатами (x,y).

Крок 7: Перевірте, чи згенеровано весь рядок.
Якщо x > = xкінець
СТІЙ.

Крок 8: Обчисліть координати наступного пікселя
Якщо d<0
Тоді d = d + i1
Якщо d ≧ 0
Тоді d = d + i2
Приріст y = y + 1

Крок 9: Приріст x = x + 1

крок 10: Намалюйте точку з останніми (x, y) координатами

Крок 11: Перейдіть до кроку 7

Крок 12: Кінець алгоритму

приклад: Початкова та кінцева позиція рядка: (1, 1) і (8, 5). Знайти проміжні точки.

рішення: х1=1
і1=1
х2=8
і2=5
dx= x2-x1=8-1=7
ти=у21=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(&amp;gdriver, &amp;gmode, &apos;c:\turboc3\bgi&apos;); printf(&apos;Enter co-ordinates of first point: &apos;); scanf(&apos;%d%d&apos;, &amp;x0, &amp;y0); printf(&apos;Enter co-ordinates of second point: &apos;); scanf(&apos;%d%d&apos;, &amp;x1, &amp;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.