logo

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

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

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

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

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

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

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

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

ההבדל הזה הוא
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.xi+1-2△x.yi+1+c
דi+1אני=2△y.(xi+1-איקסאני)- 2△x(yi+1אני)

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

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

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

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

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

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

יתרון:

1. זה כולל רק אריתמטיקה של מספרים שלמים, אז זה פשוט.

2. זה מונע יצירת נקודות כפולות.

3. ניתן ליישם אותו באמצעות חומרה כי הוא אינו משתמש בכפל וחילוק.

4. זה מהיר יותר בהשוואה ל-DDA (Digital Differential Analyzer) מכיוון שהוא לא כולל חישובי נקודה צפה כמו אלגוריתם DDA.

חִסָרוֹן:

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

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

שלב 1: התחל אלגוריתם

שלב 2: הכרזה על משתנה x1,איקס212,ד,י1,אני2,dx,dy

שלב 3: הזן את הערך של x11,איקס22
איפה x11הן קואורדינטות של נקודת ההתחלה
וגם x22הן קואורדינטות של נקודת הסיום

שלב 4: חשב את dx = x2-איקס1
חשב dy = y21
חשב את i1=2*אתה
חשב את i2=2*(dy-dx)
חשב את d=i1-dx

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

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

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

שלב 8: חשב את הקואורדינטות של הפיקסל הבא
אם ד<0
ואז d = d + i1
אם d ≧ 0
ואז d = d + i2
הגדל את 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= x2-איקס1=8-1=7
אתה=י21=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(&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.

תור עדיפות