logo

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

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

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

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

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

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

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

  1. Или този отдясно (долната граница за линията)
  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

Тази разлика е
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)

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

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

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

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

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

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

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

Предимство:

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

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

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

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

Недостатък:

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

заместване от низ в java

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

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

Стъпка 2: Декларирайте променлива x1212,d,i1,i2,dx,dy

Стъпка 3: Въведете стойност на x1122
Където x11са координатите на началната точка
и х22са координатите на крайната точка

Стъпка 4: Изчислете dx = x21
Изчислете dy = y21
Изчислете i1=2*ти
Изчислете i2=2*(dy-dx)
Изчислете d=i1-dx

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

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

ctc пълна форма

Стъпка 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= x21=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

Програма за прилагане на алгоритъма за чертане на линия на 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.