אלגוריתם זה משמש לסריקה להמרת קו. זה פותח על ידי Bresenham. זוהי שיטה יעילה מכיוון שהיא כוללת רק פעולות חיבור, חיסורים וכפל שלמים. פעולות אלו יכולות להתבצע במהירות רבה כך שניתן ליצור קווים במהירות.
בשיטה זו, הפיקסל הבא שנבחר הוא זה שיש לו את המרחק הקטן ביותר מהקו האמיתי.
השיטה פועלת באופן הבא:
נניח פיקסל P1'(איקס1',ו1'), ולאחר מכן בחר פיקסלים עוקבים תוך כדי עבודה עד הלילה, מיקום פיקסל אחד בכל פעם בכיוון האופקי לכיוון P2'(איקס2',ו2').
פעם אחת פיקסל בבחירה בכל שלב
הפיקסל הבא הוא
- או זה שמימין לו (גבול תחתון לקו)
- אחד למעלה מימין ומעלה (גבול עליון לקו)
הקו מוערך בצורה הטובה ביותר לפי אותם פיקסלים הנופלים במרחק הקטן ביותר מהנתיב בין P1',פ2'.
כדי לבחור את הבא בין הפיקסל התחתון S לפיקסל העליון T.
אם נבחר S
יש לנו xi+1=xאני+1 ו-yi+1=yאני
אם נבחר T
יש לנו xi+1=xאני+1 ו-yi+1=yאני+1
קואורדינטות ה-y בפועל של הישר ב-x = xi+1הוא
y=mxi+1+ב
המרחק מ-S לקו האמיתי בכיוון y
s = y-yאני
המרחק מ-T לקו האמיתי בכיוון y
t = (יאני+1)-y
כעת שקול את ההבדל בין 2 ערכי המרחק הללו
רחוב
מתי (s-t)<0 ⟹ s < t< p>
הפיקסל הקרוב ביותר הוא S
כאשר (s-t) ≧0 ⟹ s הפיקסל הקרוב ביותר הוא T ההבדל הזה הוא מחליף מ על ידי והכנסת משתנה החלטה כאשר c= 2△y+△x (2b-1) נוכל לכתוב את משתנה ההחלטה דi+1להחלקה הבאה מאז x_(i+1)=xאני+1, יש לנו מקרים מיוחדים אם הפיקסל שנבחר נמצא בפיקסל העליון T (כלומר, דאני≧0)⟹ וi+1=yאני+1 אם הפיקסל שנבחר נמצא בפיקסל התחתון T (כלומר, דאני<0)⟹ yi+1=yאני לבסוף, אנו מחשבים את ד1 מאז mx1+b-yאני=0 ו-m = , יש לנו 1. זה כולל רק אריתמטיקה של מספרים שלמים, אז זה פשוט. 2. זה מונע יצירת נקודות כפולות. 3. ניתן ליישם אותו באמצעות חומרה כי הוא אינו משתמש בכפל וחילוק. 4. זה מהיר יותר בהשוואה ל-DDA (Digital Differential Analyzer) מכיוון שהוא לא כולל חישובי נקודה צפה כמו אלגוריתם DDA. 1. אלגוריתם זה מיועד לשרטוט קווים בסיסי בלבד האתחול אינו חלק מאלגוריתם הקו של ברסנהאם. אז כדי לצייר קווים חלקים, כדאי שתרצה לבדוק אלגוריתם אחר. שלב 1: התחל אלגוריתם שלב 2: הכרזה על משתנה x1,איקס2,ו1,ו2,ד,י1,אני2,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+dאני=2△y.(xאני+1-xאני)- 2△x(yi+1-ואני)
דi+1=דאני+2△y-2△x
דi+1=דאני+2△y0)⟹>
ד1=△x[2m(x1+1)+2b-2y1-1]
ד1=△x[2(mx1+b-y1)+2m-1]
ד1=2△y-△xיתרון:
חִסָרוֹן:
אלגוריתם הקו של ברסנהאם:
איפה x1,ו1הן קואורדינטות של נקודת ההתחלה
וגם x2,ו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>
אם x > = xסוֹף
תפסיק.
אם ד<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
ד = אני1-∆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 תוכנית ליישום אלגוריתם ציור קווים של ברסנהאם:
#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:
אלגוריתם DDA אלגוריתם הקו של ברסנהאם 1. אלגוריתם DDA משתמש בנקודה צפה, כלומר, אריתמטיקה אמיתית. 1. אלגוריתם הקו של ברסנהאם משתמש בנקודה קבועה, כלומר, אריתמטיקה שלמה 2. אלגוריתמי DDA משתמש בכפל וחילוק בפעולתו 2. אלגוריתם הקו של ברסנהאם משתמש רק בחיסור וחיבור בפעולתו 3. אלגוריתם DDA הוא לאט לאט מאלגוריתם הקו של ברסנהאם בשרטוט קו מכיוון שהוא משתמש באריתמטיקה אמיתית (פעולת נקודה צפה) 3. האלגוריתם של ברסנהאם מהיר יותר מאלגוריתם DDA בשורה מכיוון שהוא כולל רק חיבור וחיסור בחישוב שלו ומשתמש רק באריתמטיקה של מספרים שלמים. 4. אלגוריתם DDA אינו מדויק ויעיל כמו אלגוריתם הקו של Bresenham. 4. אלגוריתם הקו של Bresenham מדויק ויעיל יותר באלגוריתם DDA. 5. אלגוריתם DDA יכול לצייר עיגולים ועיקולים אך אינם מדויקים כמו אלגוריתם הקו של Bresenham 5. אלגוריתם הקו של Bresenham יכול לצייר עיגולים ועיקולים עם אלגוריתם מדויק יותר מאלגוריתם DDA.
תור עדיפות