Овај алгоритам се користи за скенирање претварања линије. Развио га је Бресенхам. То је ефикасан метод јер укључује само целобројне операције сабирања, одузимања и множења. Ове операције се могу извести веома брзо тако да се линије могу брзо генерисати.
У овој методи, следећи одабрани пиксел је онај који има најмању удаљеност од праве линије.
јава утил дате
Метода ради на следећи начин:
Претпоставимо пиксел П1'(Икс1',и1'), а затим изаберите следеће пикселе док радимо од маја до ноћи, један по један пиксел положај у хоризонталном правцу према П2'(Икс2',и2').
Једном у пикселу изаберите у било ком кораку
Следећи пиксел је
- Или онај десно од њега (доња граница за линију)
- Један горе десно и горе (горња граница за линију)
Линија је најбоље апроксимирана оним пикселима који падају на најмању удаљеност од путање између П1',П2'.
Да бира следећи између доњег пиксела С и горњег пиксела Т.
Ако је изабран С
Имамо хи+1=ки+1 и ии+1=ии
Ако се изабере Т
Имамо хи+1=ки+1 и ии+1=ии+1
Стварне и координате праве на к = ки+1је
и=мки+1+б
Растојање од С до стварне линије у правцу и
с = и-ии
Растојање од Т до стварне линије у правцу и
т = (ии+1)-и
Сада размотрите разлику између ове 2 вредности удаљености
с - т
када (с-т)<0 ⟹ s < t< p>
Најближи пиксел је С
Када је (с-т) ≧0 ⟹ с Најближи пиксел је Т Ова разлика је Замена м са и увођење варијабле одлуке где је ц= 2△и+△к (2б-1) Можемо написати променљиву одлуке ди+1за следеће оклизнуће Пошто је к_(и+1)=ки+1, имамо Посебни случајеви Ако је изабрани пиксел на горњем пикселу Т (тј., ди≧0)⟹ ии+1=ии+1 Ако је изабрани пиксел на доњем пикселу Т (тј., ди<0)⟹ yи+1=ии Коначно, израчунавамо д1 Пошто мк1+б-ии=0 и м = , имамо 1. Укључује само целобројну аритметику, тако да је једноставна. 2. Избегава генерисање дуплих тачака. 3. Може се имплементирати помоћу хардвера јер не користи множење и дељење. 4. Бржи је у поређењу са ДДА (Дигитал Дифферентиал Анализер) јер не укључује прорачуне са помичним зарезом као ДДА алгоритам. 1. Овај алгоритам је намењен само за основно цртање линија Иницијализација није део Бресенхамовог алгоритма линија. Дакле, да бисте нацртали глатке линије, требало би да погледате другачији алгоритам. Корак 1: Покрените алгоритам Корак 2: Декларисати променљиву к1,Икс2,и1,и2,д,и1,и2,дк,ди Корак 3: Унесите вредност к1,и1,Икс2,и2 Корак 4: Израчунај дк = к2-Икс1 Корак 5: Узмите (к, и) као почетну тачку и ккрајкао највећу могућу вредност х. Корак 6: Генеришите тачку на (к,и) координатама. Корак 7: Проверите да ли је генерисана цела линија. Корак 8: Израчунајте координате следећег пиксела Корак 9: Повећање к = к + 1 Корак 10: Нацртајте тачку најновијих (к, и) координата Корак 11: Идите на корак 7 Корак 12: Крај алгоритма Пример: Почетна и крајња позиција линије су (1, 1) и (8, 5). Пронађите међутачке. Решење: Икс1=1 Излаз:
с-т = (и-ии)-[(ии+1)-и]
= 2и - 2ии -1
ди=△к (с-т)
ди=△к (2 (Икси+1)+2б-2ги-1)
=2△кии-2△и-1△к.2б-2ии△к-△к
ди=2△и.ки-2△к.ии+ц
ди+1=2△и.ки+1-2△к.ии+1+ц
ди+1-ди=2△и.(ки+1-Икси)- 2△к(ии+1-ии)
ди+1+ди=2△и.(ки+1-ки)- 2△к(ии+1-ии)
ди+1=ди+2△и-2△к
ди+1=ди+2△г0)⟹>
д1=△к[2м(к1+1)+2б-2г1-1]
д1=△к[2(мк1+б-и1)+2м-1]
д1=2△и-△кпредност:
Недостатак:
Бресенхамов линијски алгоритам:
Где к1,и1су координате полазне тачке
И к2,и2су координате Завршне тачке
Израчунај ди = и2-и1
Израчунај и1=2*ти
Израчунај и2=2*(ди-дк)
Израчунајте д=и1-дк
Ако је дк<0
Тада је к = к2
и = и2
Икскрај=к1
Ако је дк > 0
Тада је к = к1
и = и1
Икскрај=к20>
Ако је к > = ккрај
Зауставити.
Ако д<0
Тада је д = д + и1
Ако је д ≧ 0
Тада је д = д + и2
Повећај и = и + 10>како претворити стринг у цхар
и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(&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; }
Разликујте ДДА алгоритам и Бресенхамов линијски алгоритам:
ДДА алгоритам Бресенхамов линијски алгоритам 1. ДДА алгоритам користи покретни зарез, тј. реалну аритметику. 1. Бресенхамов линијски алгоритам користи фиксну тачку, тј. целобројну аритметику 2. ДДА алгоритми користе множење и дељење свој рад 2. Брезенхамов линијски алгоритам користи само одузимање и сабирање своје операције 3. ДДА алгоритам је спорији од Бресенхамовог линијског алгоритма у цртању линија јер користи стварну аритметику (операција са плутајућим зарезом) 3. Бресенхамов алгоритам је бржи од ДДА алгоритма у линији јер укључује само сабирање и одузимање у свом прорачуну и користи само целобројну аритметику. 4. ДДА алгоритам није тачан и ефикасан као Бресенхамов линијски алгоритам. 4. Бресенхамов линијски алгоритам је тачнији и ефикаснији у ДДА алгоритму. 5.ДДА алгоритам може да нацрта круг и криве, али није тачан као Бресенхамов линијски алгоритам 5. Бресенхамов линијски алгоритам може нацртати круг и криве тачније од ДДА алгоритма.