אלגוריתם הקו של ברסנהאם
אלגוריתם זה משמש לסריקה להמרת קו. זה פותח על ידי Bresenham. זוהי שיטה יעילה מכיוון שהיא כוללת רק פעולות חיבור, חיסורים וכפל שלמים. פעולות אלו יכולות להתבצע במהירות רבה כך שניתן ליצור קווים במהירות.
בשיטה זו, הפיקסל הבא שנבחר הוא זה שיש לו את המרחק הקטן ביותר מהקו האמיתי.
השיטה פועלת באופן הבא:
נניח פיקסל P 1 '(איקס 1 ',ו 1 '), ולאחר מכן בחר פיקסלים עוקבים תוך כדי עבודה עד הלילה, מיקום פיקסל אחד בכל פעם בכיוון האופקי לכיוון P 2 '(איקס 2 ',ו 2 ').
פעם אחת פיקסל בבחירה בכל שלב
הפיקסל הבא הוא
- או זה שמימין לו (גבול תחתון לקו)
- אחד למעלה מימין ומעלה (גבול עליון לקו)
הקו מוערך בצורה הטובה ביותר לפי אותם פיקסלים הנופלים במרחק הקטן ביותר מהנתיב בין P 1 ',פ 2 '.
כדי לבחור את הבא בין הפיקסל התחתון S לפיקסל העליון T.
אם נבחר S
יש לנו x i+1 =x אני +1 ו-y i+1 =y אני
אם נבחר T
יש לנו x i+1 =x אני +1 ו-y i+1 =y אני +1
קואורדינטות ה-y בפועל של הישר ב-x = x i+1 הוא
y=mx i+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)⟹ y i+1=y אני לבסוף, אנו מחשבים את ד 1 מאז mx 1 +b-y אני =0 ו-m = 1. זה כולל רק אריתמטיקה של מספרים שלמים, אז זה פשוט. 2. זה מונע יצירת נקודות כפולות. 3. ניתן ליישם אותו באמצעות חומרה כי הוא אינו משתמש בכפל וחילוק. 4. זה מהיר יותר בהשוואה ל-DDA (Digital Differential Analyzer) מכיוון שהוא לא כולל חישובי נקודה צפה כמו אלגוריתם DDA. 1. אלגוריתם זה מיועד לשרטוט קווים בסיסי בלבד האתחול אינו חלק מאלגוריתם הקו של ברסנהאם. אז כדי לצייר קווים חלקים, כדאי שתרצה לבדוק אלגוריתם אחר. שלב 1: התחל אלגוריתם שלב 2: הכרזה על משתנה x 1 ,איקס 2 ,ו 1 ,ו 2 ,ד,י 1 ,אני 2 ,dx,dy שלב 3: הזן את הערך של x 1 ,ו 1 ,איקס 2 ,ו 2 שלב 4: חשב את dx = x 2 -איקס 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.x i+1 -2△x.y i+1 +c
ד i+1 -ד אני =2△y.(x i+1 -איקס אני )- 2△x(y i+1 -ו אני )
ד i+1 +d אני =2△y.(x אני +1-x אני )- 2△x(y i+1 -ו אני )
ד i+1 =ד אני +2△y-2△x
ד i+1 =ד אני +2△y 0)⟹>
ד 1 =△x[2m(x 1 +1)+2b-2y 1 -1]
ד 1 =△x[2(mx 1 +b-y 1 )+2m-1]
, יש לנו
ד 1 =2△y-△x יתרון:
חִסָרוֹן:
אלגוריתם הקו של ברסנהאם:
איפה x 1 ,ו 1 הן קואורדינטות של נקודת ההתחלה
וגם x 2 ,ו 2 הן קואורדינטות של נקודת הסיום
חשב dy = y 2 -ו 1
חשב את i 1 =2*אתה
חשב את i 2 =2*(dy-dx)
חשב את d=i 1 -dx
אם dx <0
ואז x = x 2
y = y 2
איקס סוֹף =x 1
אם dx > 0
ואז x = x 1
y = y 1
איקס סוֹף =x 2 0>
אם x > = x סוֹף
תפסיק.
אם ד <0
ואז d = d + i 1
אם d ≧ 0
ואז d = d + i 2
הגדל את y = y + 1 0>
ו 1 =1
איקס 2 =8
ו 2 =5
dx= x 2 -איקס 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+I 1 או אני 2 1 1 d+I 2 =1+(-6)=-5 2 2 d+I 1 =-5+8=3 3 2 d+I 2 =3+(-6)=-3 4 3 d+I 1 =-3+8=5 5 3 d+I 2 =5+(-6)=-1 6 4 d+I 1 =-1+8=7 7 4 d+I 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; }
הבדיל בין אלגוריתם 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.