在上半部分,法向量的y分量大 在下半部分,法向量的x分量大 法向量 M 两分量相等 上半部分 下半部分 M2 在当前中点处,法向量(2b2(Xp+1),2a2(Yp-0.5)的y分量比x分量大 即:b2(Xp+1)<a2(Yp-0.5),而在下一中点,不等式改变方 向,则说明椭圆弧从上部分转入下部分 北大计算机系多媒体与人机交互
北大计算机系多媒体与人机交互 21 在上半部分,法向量的y分量大 在下半部分,法向量的x分量大 上半部分 下半部分 法向量 M1 两分量相等 M2 在当前中点处,法向量( 2b 2 (Xp+1) ,2a 2 (Yp-0.5))的y分量比x分量大, 即: b 2 (Xp+1) < a 2 (Yp-0.5), 而在下一中点,不等式改变方 向,则说明椭圆弧从上部分转入下部分
椭圆的中点画法 ·与圆弧中点算法类似:确定一个象素后, 接着在两个候选象素的中点计算一个判 别式的值,由判别式的符号确定更近的 先讨论椭圆弧的上部分 (Xp,Yp)中点(Xp+1,Yp.0.5) d=F(Xp+1,Yp-0.5)=b2Xp+1)2+a2Yp-0.5)2-a2b2 北大计算机系多媒体与人机交互 22
北大计算机系多媒体与人机交互 22 椭圆的中点画法 • 与圆弧中点算法类似:确定一个象素后, 接着在两个候选象素的中点计算一个判 别式的值,由判别式的符号确定更近的 点 先讨论椭圆弧的上部分 (Xp,Yp)中点(Xp+1,Yp-0.5) d1=F(Xp+1,Yp-0.5)= b 2(Xp+1) 2+a2(Yp-0.5) 2 -a 2b 2
根据d1的符号来决定下一像素是取正右方的那个, 还是右上方的那个。 若d1<0,中点在椭圆内,取正右方象素,判别 式更新为: d'=F(CXp+2,Yp-0.5=d1+b2(2Xp+3) d的增量为b2(2Xp+3) 当d1≥0,中点在椭圆外,取右下方象素,更新判 别式: dl'=F(Xp+2,Yp-15)=d1+b2(2Xp+3)+a2(-2Yp+2) d1的增量为b2(2Xp+3)+a21(2Yp+2) 北大计算机系多媒体与人机交互 23
北大计算机系多媒体与人机交互 23 根据d1的符号来决定下一像素是取正右方的那个, 还是右上方的那个。 • 若d1<0,中点在椭圆内,取正右方象素,判别 式更新为: d1'=F(Xp+2,Yp-0.5)=d1+b2 (2Xp+3) d1的增量为b 2 (2Xp+3) • 当d1≥0,中点在椭圆外,取右下方象素,更新判 别式: d1'=F(Xp+2,Yp-1.5)=d1+b2 (2Xp+3)+a2 (-2Yp+2) d1的增量为b 2 (2Xp+3)+a2 (-2Yp+2)
d1的初始条件 椭圆弧起点为O,b),第一个中点为(1,b-0.5) 初始判别式:d10=F(1,b-0.5)b*b+a*a(-b+0.25) 转入下一部分,下一象素可能是一正下方或右 下方,此时判别式要初始化。 d2=F(Xp+0.5,Yp-1)=b2Xp+0.5)2+a2Yp-1)2-a2b2 若d2<0,则d2′=F(Xp+1.5,Yp2)=d2+b2(2Xp+2)+a(-2Yp+3) 若d2>=0,则d2′=F(Xp+05,Y-2)=d2+21(Yp+3) 下半部分弧的终止条件为y=0 北大计算机系多媒体与人机交互 24
北大计算机系多媒体与人机交互 24 • d1的初始条件: 椭圆弧起点为(0,b),第一个中点为(1,b-0.5) 初始判别式:d10=F(1,b-0.5)=b*b+a*a(-b+0.25) • 转入下一部分,下一象素可能是一正下方或右 下方,此时判别式要初始化。 d2 = F(Xp+0.5,Yp-1) = b2(Xp+0.5)2+a2(Yp-1)2 -a 2b 2 若d2<0,则d2’= F(Xp+1.5,Yp-2) = d2 + b2 (2Xp+2)+a2 (-2Yp+3) 若d2>=0,则d2’= F(Xp+0.5,Yp-2) = d2 + a2 (-2Yp+3) 下半部分弧的终止条件为y = 0
程序: Midpointellipe(ab, color Int a.b. color i int x,y; float dl, d2 x=0;y=b; d1=b*b+a*a*(-b+0.25) putpixel(x, y, color) Whle(b*b*(x+1)<a*a*(y-0.5) {{if(dl<0) d1+=b*b*(2*x+3);x++;} else{dl+=(b*b*(2*x+3)+a*a*(-2*y+2)) x++;y-;} putpixel(x, y, color) }∥上部分 d2=sqr(*(x+0.5))+sqr(a(y-1))-sqr(a*b); while(y >0) if(d2<0){d2+=b*b*(2*x+2)+a*a*(2*y+3) 北大 系多媒体与人机交互 else{d2+=a*a*(-2*y+3);y-;}
北大计算机系多媒体与人机交互 25 程序:MidpointEllipe(a,b, color) int a,b,color; { int x,y; float d1,d2; x = 0; y = b; d1 = b*b +a*a*(-b+0.25); putpixel(x,y,color); while( b*b*(x+1) < a*a*(y-0.5)) { { if (d1<0) d1 +=b*b*(2*x+3); x++; } else { d1 +=(b*b*(2*x+3)+a*a*(-2*y+2)) x++; y--; } putpixel(x,y,color); }//上部分 d2 = sqr(b*(x+0.5)) +sqr(a*(y-1)) – sqr(a*b); while(y >0) { if (d2 <0) { d2 +=b*b*(2*x+2)+a*a*(-2*y+3); x++; y--;} else {d2 += a*a*(-2*y+3); y--; } putpixel(x,y,color); }