Този алгоритъм се използва за сканиране, конвертиране на ред. Разработен е от Bresenham. Това е ефективен метод, тъй като включва само цели събиране, изваждане и операции за умножение. Тези операции могат да се извършват много бързо, така че линиите могат да се генерират бързо.
При този метод следващият избран пиксел е този, който има най-малко разстояние от истинската линия.
Методът работи по следния начин:
Да приемем пиксел P1'(х1',и1'), след това изберете следващите пиксели, докато работим с нашия май до нощта, позиция по един пиксел в хоризонтална посока към P2'(х2',и2').
Веднъж влязъл пиксел, изберете всяка стъпка
Следващият пиксел е
- Или този отдясно (долната граница за линията)
- Едната е отгоре надясно и нагоре (горна граница за линията)
Линията се апроксимира най-добре от онези пиксели, които попадат на най-малко разстояние от пътя между P1',P2'.
Избира следващия между долния пиксел S и горния пиксел T.
Ако е избран S
Имаме хi+1=xаз+1 и гi+1=газ
Ако е избрано T
Имаме хi+1=xаз+1 и гi+1=газ+1
Действителните y координати на линията при x = xi+1е
y=mxi+1+б
Разстоянието от S до действителната линия в посока y
s = y-yаз
замяна на метод в java
Разстоянието от Т до действителната линия в посока у
t = (yаз+1)-y
Сега помислете за разликата между тези 2 стойности на разстоянието
s - t
Актьор Реха
когато (т-т)<0 ⟹ s < t< p>
Най-близкият пиксел е S
Когато (s-t) ≧0 ⟹ s Най-близкият пиксел е T Тази разлика е Замествайки m с и въвеждане на променлива за решение Където c= 2△y+△x (2b-1) Можем да напишем променливата за решение di+1за следващото приплъзване Тъй като x_(i+1)=xаз+1, имаме Специални случаи Ако избраният пиксел е в горния пиксел T (т.е. dаз≧0)⟹ иi+1=газ+1 Ако избраният пиксел е най-долният пиксел T (т.е. dаз<0)⟹ yi+1=yаз Накрая изчисляваме d1 Тъй като mx1+б-уаз=0 и m = , ние имаме 1. Включва само аритметика с цели числа, така че е проста. 2. Избягва генерирането на дублирани точки. 3. Може да се реализира с помощта на хардуер, защото не използва умножение и деление. 4. Той е по-бърз в сравнение с DDA (цифров диференциален анализатор), тъй като не включва изчисления с плаваща запетая като алгоритъма DDA. 1. Този алгоритъм е предназначен само за базово чертане на линии. Инициализирането не е част от алгоритъма за линии на Bresenham. Така че, за да рисувате гладки линии, трябва да потърсите различен алгоритъм. Етап 1: Стартирайте алгоритъма Стъпка 2: Декларирайте променлива x1,х2,и1,и2,d,i1,i2,dx,dy Стъпка 3: Въведете стойност на x1,и1,х2,и2 Стъпка 4: Изчислете dx = x2-х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.xi+1-2△x.yi+1+c
дi+1-даз=2△y.(xi+1-хаз)- 2△x(yi+1-иаз)
дi+1+газ=2△y.(xаз+1-хаз)- 2△x(yi+1-иаз)
дi+1=dаз+2△y-2△x
дi+1=dаз+2△г0)⟹>
д1=△x[2m(x1+1)+2b-2y1-1]
д1=△x[2(mx1+б-у1)+2m-1]
д1=2△y-△xПредимство:
Недостатък:
заместване от низ в java
Алгоритъм на линията на Bresenham:
Където x1,и1са координатите на началната точка
и х2,и2са координатите на крайната точка
Изчислете dy = y2-и1
Изчислете i1=2*ти
Изчислете i2=2*(dy-dx)
Изчислете d=i1-dx
Ако dx<0
Тогава x = x2
y = y2
хкрай=x1
Ако dx > 0
Тогава x = x1
y = y1
хкрай=x20>ctc пълна форма
Ако x > = xкрай
Спри се.
Ако d<0
Тогава d = d + i1
Ако d ≧ 0
Тогава d = d + i2
Увеличете y = y + 10>
и1=1
х2=8
и2=5
dx= x2-х1=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 Програма за прилагане на алгоритъма за чертане на линия на 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.