Алгоритъм на линията на Bresenham

Алгоритъм на линията на Bresenham

Този алгоритъм се използва за сканиране, конвертиране на ред. Разработен е от Bresenham. Това е ефективен метод, тъй като включва само цели събиране, изваждане и операции за умножение. Тези операции могат да се извършват много бързо, така че линиите могат да се генерират бързо.

При този метод следващият избран пиксел е този, който има най-малко разстояние от истинската линия.

Методът работи по следния начин:

Да приемем пиксел P 1 '(х 1 ',и 1 '), след това изберете следващите пиксели, докато работим с нашия май до нощта, позиция по един пиксел в хоризонтална посока към P 2 '(х 2 ',и 2 ').

Веднъж влязъл пиксел, изберете всяка стъпка

Следващият пиксел е

  1. Или този отдясно (долната граница за линията)
  2. Едната е отгоре надясно и нагоре (горна граница за линията)

Линията се апроксимира най-добре от онези пиксели, които попадат на най-малко разстояние от пътя между P 1 ',P 2 '.

Брезенхам

Избира следващия между долния пиксел S и горния пиксел T.
Ако е избран S
Имаме х i+1 =x аз +1 и г i+1 аз
Ако е избрано T
Имаме х i+1 =x аз +1 и г i+1 аз +1

Действителните y координати на линията при x = x i+1 е
y=mx i+1

Брезенхам

Разстоянието от S до действителната линия в посока y
s = y-y аз

Разстоянието от Т до действителната линия в посока у
t = (y аз +1)-y

Сега помислете за разликата между тези 2 стойности на разстоянието
s - t

когато (т-т) <0 ⟹ s < t < p>

Най-близкият пиксел е S

Когато (s-t) ≧0 ⟹ s

Най-близкият пиксел е T

Тази разлика е
s-t = (y-yi)-[(yi+1)-y]
= 2y - 2yi -1

Брезенхам

Замествайки m с Брезенхами въвеждане на променлива за решение
д аз =△x (s-t)
д аз =△x (2 Брезенхамаз +1)+2b-2y аз -1)
=2△xy аз -2△y-1△x.2b-2y аз △x-△x
д аз =2△y.x аз -2△x.y аз +c

Където c= 2△y+△x (2b-1)

Можем да напишем променливата за решение d i+1 за следващото приплъзване
д i+1 =2△y.x i+1 -2△x.y i+1 +c
д i+1 аз =2△y.(x i+1 аз )- 2△x(y i+1 аз )

Тъй като x_(i+1)=x аз +1, имаме
д i+1 аз =2△y.(x аз +1-х аз )- 2△x(y i+1 аз )

Специални случаи

Ако избраният пиксел е в горния пиксел T (т.е. d аз ≧0)⟹ и i+1 аз +1
д i+1 =d аз +2△y-2△x

Ако избраният пиксел е най-долният пиксел T (т.е. d аз <0)⟹ y i+1=y аз
д i+1 =d аз +2△г

Накрая изчисляваме d 1
д 1 =△x[2m(x 1 +1)+2b-2y 1 -1]
д 1 =△x[2(mx 1 +б-у 1 )+2m-1]

Тъй като mx 1 +б-у аз =0 и m = , ние имаме
д 1 =2△y-△x

Предимство:

1. Включва само аритметика с цели числа, така че е проста.

2. Избягва генерирането на дублирани точки.

3. Може да се реализира с помощта на хардуер, защото не използва умножение и деление.

4. Той е по-бърз в сравнение с DDA (цифров диференциален анализатор), тъй като не включва изчисления с плаваща запетая като алгоритъма DDA.

Недостатък:

1. Този алгоритъм е предназначен само за базово чертане на линии. Инициализирането не е част от алгоритъма за линии на Bresenham. Така че, за да рисувате гладки линии, трябва да потърсите различен алгоритъм.

Алгоритъм на линията на Bresenham:

Етап 1: Стартирайте алгоритъма

Стъпка 2: Декларирайте променлива x 1 2 1 2 ,d,i 1 ,i 2 ,dx,dy

Стъпка 3: Въведете стойност на x 1 1 2 2
Където x 1 1 са координатите на началната точка
и х 2 2 са координатите на крайната точка

Стъпка 4: Изчислете dx = x 2 1
Изчислете dy = y 2 1
Изчислете i 1 =2*ти
Изчислете i 2 =2*(dy-dx)
Изчислете d=i 1 -dx

Стъпка 5: Разгледайте (x, y) като начална точка и x край като максимална възможна стойност на x.
Ако dx <0
Тогава x = x 2
y = y 2
х край =x 1
Ако dx > 0
Тогава x = x 1
y = y 1
х край =x 2

Стъпка 6: Генериране на точка при (x,y) координати.

Стъпка 7: Проверете дали е генериран цял ред.
Ако x > = x край
Спри се.

Стъпка 8: Изчислете координатите на следващия пиксел
Ако d <0
Тогава d = d + i 1
Ако d ≧ 0
Тогава d = d + i 2
Увеличете 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= x 2 1 =8-1=7
вие=г 2 1 =5-1=4
аз 1 =2* ∆y=2*4=8
аз 2 =2*(∆y-∆x)=2*(4-7)=-6
d = I 1 -∆x=8-7=1

х и d=d+I 1 или аз 2
1 1 d+I 2 =1+(-6)=-5
2 2 d+I 1 =-5+8=3
3 2 d+I 2 =3+(-6)=-3
4 3 d+I 1 =-3+8=5
5 3 d+I 2 =5+(-6)=-1
6 4 d+I 1 =-1+8=7
7 4 d+I 2 =7+(-6)=1
8 5

Програма за прилагане на алгоритъма за чертане на линия на Bresenham:

 #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 алгоритъм и алгоритъм на Bresenham's Line:

DDA алгоритъм Алгоритъм на линията на Bresenham
1. Алгоритъмът DDA използва плаваща запетая, т.е. реална аритметика. 1. Алгоритъмът на Bresenham Line използва фиксирана точка, т.е. целочислена аритметика
2. Алгоритмите на DDA използват умножение и деление 2. Алгоритъмът на линията на Bresenham използва само изваждане и събиране
3. Алгоритъмът DDA е по-бавен от алгоритъма за линии на Bresenham при чертане на линии, защото използва реална аритметика (операция с плаваща запетая) 3. Алгоритъмът на Bresenham е по-бърз от алгоритъма DDA в линията, защото включва само събиране и изваждане в изчислението си и използва само аритметика с цели числа.
4. DDA алгоритъмът не е точен и ефективен като линейния алгоритъм на Bresenham. 4. Линейният алгоритъм на Bresenham е по-точен и ефективен при DDA алгоритъма.
5. Алгоритъмът DDA може да рисува кръгове и криви, но не е точен като алгоритъма за линии на Bresenham 5. Алгоритъмът на Bresenham Line може да начертае кръг и криви с по-голяма точност от алгоритъма DDA.