Бресенхамов линијски алгоритам

Бресенхамов линијски алгоритам

Овај алгоритам се користи за скенирање претварања линије. Развио га је Бресенхам. То је ефикасан метод јер укључује само целобројне операције сабирања, одузимања и множења. Ове операције се могу извести веома брзо тако да се линије могу брзо генерисати.

У овој методи, следећи одабрани пиксел је онај који има најмању удаљеност од праве линије.

Метода ради на следећи начин:

Претпоставимо пиксел П 1 '(Икс 1 ',и 1 '), а затим изаберите следеће пикселе док радимо од маја до ноћи, један по један пиксел положај у хоризонталном правцу према П 2 '(Икс 2 ',и 2 ').

Једном у пикселу изаберите у било ком кораку

Следећи пиксел је

  1. Или онај десно од њега (доња граница за линију)
  2. Један горе десно и горе (горња граница за линију)

Линија је најбоље апроксимирана оним пикселима који падају на најмању удаљеност од путање између П 1 ',П 2 '.

Бресенхам

Да бира следећи између доњег пиксела С и горњег пиксела Т.
Ако је изабран С
Имамо х и+1 и +1 и и и+1 и
Ако се изабере Т
Имамо х и+1 и +1 и и и+1 и +1

Стварне и координате праве на к = к и+1 је
и=мк и+1

Бресенхам

Растојање од С до стварне линије у правцу и
с = и-и и

Растојање од Т до стварне линије у правцу и
т = (и и +1)-и

Сада размотрите разлику између ове 2 вредности удаљености
с - т

када (с-т) <0 ⟹ s < t < p>

Најближи пиксел је С

Када је (с-т) ≧0 ⟹ с

Најближи пиксел је Т

Ова разлика је
с-т = (и-ии)-[(ии+1)-и]
= 2и - 2ии -1

Бресенхам

Замена м са Бресенхами увођење варијабле одлуке
д и =△к (с-т)
д и =△к (2 Бресенхам(Икс и +1)+2б-2г и -1)
=2△ки и -2△и-1△к.2б-2и и △к-△к
д и =2△и.к и -2△к.и и

где је ц= 2△и+△к (2б-1)

Можемо написати променљиву одлуке д и+1 за следеће оклизнуће
д и+1 =2△и.к и+1 -2△к.и и+1
д и+1 и =2△и.(к и+1 -Икс и )- 2△к(и и+1 и )

Пошто је к_(и+1)=к и +1, имамо
д и+1 и =2△и.(к и +1-к и )- 2△к(и и+1 и )

Посебни случајеви

Ако је изабрани пиксел на горњем пикселу Т (тј., д и ≧0)⟹ и и+1 и +1
д и+1 и +2△и-2△к

Ако је изабрани пиксел на доњем пикселу Т (тј., д и <0)⟹ y и+1=и и
д и+1 и +2△г

Коначно, израчунавамо д 1
д 1 =△к[2м(к 1 +1)+2б-2г 1 -1]
д 1 =△к[2(мк 1 +б-и 1 )+2м-1]

Пошто мк 1 +б-и и =0 и м = , имамо
д 1 =2△и-△к

предност:

1. Укључује само целобројну аритметику, тако да је једноставна.

2. Избегава генерисање дуплих тачака.

3. Може се имплементирати помоћу хардвера јер не користи множење и дељење.

4. Бржи је у поређењу са ДДА (Дигитал Дифферентиал Анализер) јер не укључује прорачуне са помичним зарезом као ДДА алгоритам.

Недостатак:

1. Овај алгоритам је намењен само за основно цртање линија Иницијализација није део Бресенхамовог алгоритма линија. Дакле, да бисте нацртали глатке линије, требало би да погледате другачији алгоритам.

Бресенхамов линијски алгоритам:

Корак 1: Покрените алгоритам

Корак 2: Декларисати променљиву к 1 ,Икс 2 1 2 ,д,и 1 2 ,дк,ди

Корак 3: Унесите вредност к 1 1 ,Икс 2 2
Где к 1 1 су координате полазне тачке
И к 2 2 су координате Завршне тачке

Корак 4: Израчунај дк = к 2 -Икс 1
Израчунај ди = и 2 1
Израчунај и 1 =2*ти
Израчунај и 2 =2*(ди-дк)
Израчунајте д=и 1 -дк

Корак 5: Узмите (к, и) као почетну тачку и к крај као највећу могућу вредност х.
Ако је дк <0
Тада је к = к 2
и = и 2
Икс крај 1
Ако је дк > 0
Тада је к = к 1
и = и 1
Икс крај 2

Корак 6: Генеришите тачку на (к,и) координатама.

Корак 7: Проверите да ли је генерисана цела линија.
Ако је к > = к крај
Зауставити.

Корак 8: Израчунајте координате следећег пиксела
Ако д <0
Тада је д = д + и 1
Ако је д ≧ 0
Тада је д = д + и 2
Повећај и = и + 1

Корак 9: Повећање к = к + 1

Корак 10: Нацртајте тачку најновијих (к, и) координата

Корак 11: Идите на корак 7

Корак 12: Крај алгоритма

Пример: Почетна и крајња позиција линије су (1, 1) и (8, 5). Пронађите међутачке.

Решење: Икс 1 =1
и 1 =1
Икс 2 =8
и 2 =5
дк= к 2 -Икс 1 =8-1=7
ти=и 2 1 =5-1=4
И 1 =2* ∆и=2*4=8
И 2 =2*(∆и-∆к)=2*(4-7)=-6
д = И 1 -∆к=8-7=1

Икс и д=д+И 1 или ја 2
1 1 д+И 2 =1+(-6)=-5
2 2 д+И 1 =-5+8=3
3 2 д+И 2 =3+(-6)=-3
4 3 д+И 1 =-3+8=5
5 3 д+И 2 =5+(-6)=-1
6 4 д+И 1 =-1+8=7
7 4 д+И 2 =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; }  

Излаз:


Разликујте ДДА алгоритам и Бресенхамов линијски алгоритам:

ДДА алгоритам Бресенхамов линијски алгоритам
1. ДДА алгоритам користи покретни зарез, тј. реалну аритметику. 1. Бресенхамов линијски алгоритам користи фиксну тачку, тј. целобројну аритметику
2. ДДА алгоритми користе множење и дељење свој рад 2. Брезенхамов линијски алгоритам користи само одузимање и сабирање своје операције
3. ДДА алгоритам је спорији од Бресенхамовог линијског алгоритма у цртању линија јер користи стварну аритметику (операција са плутајућим зарезом) 3. Бресенхамов алгоритам је бржи од ДДА алгоритма у линији јер укључује само сабирање и одузимање у свом прорачуну и користи само целобројну аритметику.
4. ДДА алгоритам није тачан и ефикасан као Бресенхамов линијски алгоритам. 4. Бресенхамов линијски алгоритам је тачнији и ефикаснији у ДДА алгоритму.
5.ДДА алгоритам може да нацрта круг и криве, али није тачан као Бресенхамов линијски алгоритам 5. Бресенхамов линијски алгоритам може нацртати круг и криве тачније од ДДА алгоритма.