אלגוריתם הקו של ברסנהאם

אלגוריתם הקו של ברסנהאם

אלגוריתם זה משמש לסריקה להמרת קו. זה פותח על ידי Bresenham. זוהי שיטה יעילה מכיוון שהיא כוללת רק פעולות חיבור, חיסורים וכפל שלמים. פעולות אלו יכולות להתבצע במהירות רבה כך שניתן ליצור קווים במהירות.

בשיטה זו, הפיקסל הבא שנבחר הוא זה שיש לו את המרחק הקטן ביותר מהקו האמיתי.

השיטה פועלת באופן הבא:

נניח פיקסל P 1 '(איקס 1 ',ו 1 '), ולאחר מכן בחר פיקסלים עוקבים תוך כדי עבודה עד הלילה, מיקום פיקסל אחד בכל פעם בכיוון האופקי לכיוון P 2 '(איקס 2 ',ו 2 ').

פעם אחת פיקסל בבחירה בכל שלב

הפיקסל הבא הוא

  1. או זה שמימין לו (גבול תחתון לקו)
  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

ההבדל הזה הוא
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

כאשר c= 2△y+△x (2b-1)

נוכל לכתוב את משתנה ההחלטה ד i+1 להחלקה הבאה
ד 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 אני )

מאז x_(i+1)=x אני +1, יש לנו
ד i+1 +d אני =2△y.(x אני +1-x אני )- 2△x(y i+1 אני )

מקרים מיוחדים

אם הפיקסל שנבחר נמצא בפיקסל העליון T (כלומר, ד אני ≧0)⟹ ו i+1 =y אני +1
ד i+1 אני +2△y-2△x

אם הפיקסל שנבחר נמצא בפיקסל התחתון T (כלומר, ד אני <0)⟹ y i+1=y אני
ד i+1 אני +2△y

לבסוף, אנו מחשבים את ד 1
ד 1 =△x[2m(x 1 +1)+2b-2y 1 -1]
ד 1 =△x[2(mx 1 +b-y 1 )+2m-1]

מאז mx 1 +b-y אני =0 ו-m = , יש לנו
ד 1 =2△y-△x

יתרון:

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
איפה x 1 1 הן קואורדינטות של נקודת ההתחלה
וגם x 2 2 הן קואורדינטות של נקודת הסיום

שלב 4: חשב את dx = x 2 -איקס 1
חשב dy = y 2 1
חשב את i 1 =2*אתה
חשב את i 2 =2*(dy-dx)
חשב את d=i 1 -dx

שלב 5: שקול (x, y) כנקודת התחלה ו-x סוֹף כערך מקסימלי אפשרי של x.
אם dx <0
ואז x = x 2
y = y 2
איקס סוֹף =x 1
אם dx > 0
ואז x = x 1
y = y 1
איקס סוֹף =x 2

שלב 6: צור נקודה בקואורדינטות (x,y).

שלב 7: בדוק אם הקו שלם נוצר.
אם x > = x סוֹף
תפסיק.

שלב 8: חשב את הקואורדינטות של הפיקסל הבא
אם ד <0
ואז d = d + i 1
אם d ≧ 0
ואז d = d + i 2
הגדל את y = y + 1

שלב 9: הגדל את x = x + 1

שלב 10: צייר נקודה עם הקואורדינטות האחרונות (x, y).

שלב 11: עבור לשלב 7

שלב 12: סוף האלגוריתם

דוגמא: מיקום ההתחלה והסיום של הקו הם (1, 1) ו- (8, 5). מצא נקודות ביניים.

פִּתָרוֹן: איקס 1 =1
ו 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(&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; }  

תְפוּקָה:


הבדיל בין אלגוריתם 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.