logo

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

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

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

јава утил дате

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

Претпоставимо пиксел П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,Икс212,д,и12,дк,ди

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

Корак 4: Израчунај дк = к2-Икс1
Израчунај ди = и21
Израчунај и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
ти=и21=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. Бресенхамов линијски алгоритам може нацртати круг и криве тачније од ДДА алгоритма.