Алгоритъм на линията на Bresenham
Този алгоритъм се използва за сканиране, конвертиране на ред. Разработен е от Bresenham. Това е ефективен метод, тъй като включва само цели събиране, изваждане и операции за умножение. Тези операции могат да се извършват много бързо, така че линиите могат да се генерират бързо.
При този метод следващият избран пиксел е този, който има най-малко разстояние от истинската линия.
Методът работи по следния начин:
Да приемем пиксел P 1 '(х 1 ',и 1 '), след това изберете следващите пиксели, докато работим с нашия май до нощта, позиция по един пиксел в хоризонтална посока към P 2 '(х 2 ',и 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 Тази разлика е Замествайки m с Където c= 2△y+△x (2b-1) Можем да напишем променливата за решение d i+1 за следващото приплъзване Тъй като x_(i+1)=x аз +1, имаме Специални случаи Ако избраният пиксел е в горния пиксел T (т.е. d аз ≧0)⟹ и i+1 =г аз +1 Ако избраният пиксел е най-долният пиксел T (т.е. d аз <0)⟹ y i+1=y аз Накрая изчисляваме d 1 Тъй като mx 1 +б-у аз =0 и m = 1. Включва само аритметика с цели числа, така че е проста. 2. Избягва генерирането на дублирани точки. 3. Може да се реализира с помощта на хардуер, защото не използва умножение и деление. 4. Той е по-бърз в сравнение с DDA (цифров диференциален анализатор), тъй като не включва изчисления с плаваща запетая като алгоритъма DDA. 1. Този алгоритъм е предназначен само за базово чертане на линии. Инициализирането не е част от алгоритъма за линии на Bresenham. Така че, за да рисувате гладки линии, трябва да потърсите различен алгоритъм. Етап 1: Стартирайте алгоритъма Стъпка 2: Декларирайте променлива x 1 ,х 2 ,и 1 ,и 2 ,d,i 1 ,i 2 ,dx,dy Стъпка 3: Въведете стойност на x 1 ,и 1 ,х 2 ,и 2 Стъпка 4: Изчислете dx = x 2 -х 1 Стъпка 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
и въвеждане на променлива за решение
д аз =△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
д 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 -и аз )
д i+1 +г аз =2△y.(x аз +1-х аз )- 2△x(y i+1 -и аз )
д i+1 =d аз +2△y-2△x
д i+1 =d аз +2△г 0)⟹>
д 1 =△x[2m(x 1 +1)+2b-2y 1 -1]
д 1 =△x[2(mx 1 +б-у 1 )+2m-1]
, ние имаме
д 1 =2△y-△x Предимство:
Недостатък:
Алгоритъм на линията на Bresenham:
Където x 1 ,и 1 са координатите на началната точка
и х 2 ,и 2 са координатите на крайната точка
Изчислете dy = y 2 -и 1
Изчислете i 1 =2*ти
Изчислете i 2 =2*(dy-dx)
Изчислете d=i 1 -dx
Ако dx <0
Тогава x = x 2
y = y 2
х край =x 1
Ако dx > 0
Тогава x = x 1
y = y 1
х край =x 2 0>
Ако x > = x край
Спри се.
Ако d <0
Тогава d = d + i 1
Ако d ≧ 0
Тогава d = d + i 2
Увеличете y = y + 1 0>
и 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(&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 алгоритъм и алгоритъм на 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.