【文章內(nèi)容簡介】
5 M 1 M 2 P 第二種情況:當(dāng) d0時,取正上方的象素 p2,下一步則應(yīng)在 p4和 p5當(dāng)中選擇, 設(shè)它們的中點(diǎn)為 M2( xp+2, yp+) ,則判斷式 d2為: dk+1=F(M2) =F(xp+2,yp+) =a (xp+2)+b(yp+)+c =a xp+2a +b(yp+)+c =a (xp+1)+a +b(yp+)+c+b = dk+a+b 下一步的判別式為: dk+1 = dk+a+b d的增量為 a+b。 ax+by+c=0 Q P 1 P 2 M P 3 P 4 P 5 M 1 M 2 P 初始值,第一個象素為起點(diǎn)( x0, y0),相應(yīng)的判別式值為 M0, 由于起點(diǎn)( x0, y0)在直線上,故 F( x0, y0) = 0。 推導(dǎo): d0=F(M0) =F(x0+1,y0+) =a (x0+1)+b(y0+)+c =a x0+by0+c +a+ =F (x0, y0)+a+ //∵ 起點(diǎn)必在直線上, ∴ F (x0, y0)=0 = a+ ax+by+c=0 Q P 1 P 2 M P 3 P 4 P 5 M 1 M 2 P 小結(jié) : 1)根據(jù) M選擇 P1與 P2之一: dk=a (xp+1)+b(yp+)+c 2)根據(jù) M1選擇 P3與 P4之一: dk+1= dk+a 3)根據(jù) M2選擇 P4與 P5之一: dk+1 = dk+a+b 4) d 的初始值為: d0=a+ ax+by+c=0 Q P 1 P 2 M P 3 P 4 P 5 M 1 M 2 P 三 進(jìn)一步改進(jìn)算法: 注意到初始值中有浮點(diǎn)運(yùn)算,消除浮點(diǎn)可以進(jìn)一步改進(jìn)算法。 考察判別式 dk,判別使用的僅僅是 dk的符號,且 dk的增量都是整數(shù), 故用 2dk來代替 dk,擺脫小數(shù)(浮點(diǎn)),從而提高速度。 改進(jìn)結(jié)果: (中點(diǎn)畫線法的精髓) d0=2a+b (a=y0y1, b=x1x0) dk+1= dk+2a ( dk》 0)此時取正右方像素 dk+2a+2b ( dk0 ) 此時取右上方像素 ax+by+c=0 Q P 1 P 2 M P 3 P 4 P 5 M 1 M 2 P 學(xué)習(xí)目標(biāo): 1 理解該算法的來龍去脈(上述結(jié)果是怎么得來的)。 2 能夠用上述結(jié)果解題,編程實(shí)現(xiàn)該算法。 四 總結(jié)中點(diǎn)畫線算法: 1 基本思想:通過判斷 dk的值來確定下一個該點(diǎn)亮的像素 2 思路: (1)先求 d0的值 (利用中點(diǎn) M求): d0=2a+b (2)再找到 dk+1與 dk的關(guān)系: dk+1= dk+2a ( dk》 0)此時取正右方像素 dk+2a+2b ( dk0 )此時取右上方像素 ax+by+c=0 Q P 1 P 2 M P 3 P 4 P 5 M 1 M 2 P 五 利用推導(dǎo)結(jié)果編程實(shí)現(xiàn)中點(diǎn)畫線算法: void MidpointLine(x0,y0,x1,y1,color) int x0,y0,x1,y1,color。 { int a,b,delta1,delta2,d,x,y。 a=y0y1。 b=x1x0。 d=2*a+b。 // d為 d0, d=a+, 2d=2a+b, D=2a+b,D=a+a+b delta1=2*a。 // delta1為 d1 delta2=2*(a+b)。 // delta2為 d2 x=x0。 y=y0。 putpixel(x,y,color)。 while(xx1) { if(d0) {x++。y++。d+=delta2。 } else {x++。d+=delta1。 } putpixel(x,y,color)。 } //while } //MidpointLine 六 課后作業(yè)題: 用中點(diǎn)畫線算法掃描轉(zhuǎn)換從像素點(diǎn) (1,1)到 (8,5)線段的 像素位置 3 改進(jìn)的 Bresenham算法 假定直線段的 0≤k≤1 基本原理 : 圖5 8 改進(jìn)的B r e n s e m h a m 算法繪制直線的原理ddddkkkkk??????????????