扫描转换直线段 d的初始值 d0=F(X0+1,Y0+0.5)=F(X0,Y0)+a+0.5 因(X0,Y0)在直线上,F(X0,Y0)=0,所以, d0=a+0.5b d的增量都是整数,只有初始值包含小数, 可以用2d代替d,2a改写成a+a 算法中只有整数变量,不含乘除法,可用 硬件实现 北大计算机系多媒体与人机交互
北大计算机系多媒体与人机交互 11 • d的初始值 • d0=F(X0+1,Y0+0.5)=F(X0,Y0)+a+0.5 • 因(X0,Y0)在直线上,F(X0,Y0)=0,所以, d0=a+0.5b • d的增量都是整数,只有初始值包含小数, 可以用2d代替d, 2a改写成a+a。 • 算法中只有整数变量,不含乘除法,可用 硬件实现。 扫描转换直线段
程序 Midpointline(]o, yo, xl, yl, color nt Xo, yU, xl,y l, col int a,b, dl, d2, 2, x,y a=y0-y1;b=x1-x0;d=2*a+b; dl=2*a;d2=2*(a+b) X=XO PutPixel(x y, color) while(x<xl) i if (d<o {x++;y++;d+=d2;} else i x++ d+=d1 PutPixel(x,y, color) 北大计算机系多媒体与人机交互 12
北大计算机系多媒体与人机交互 12 程序 Midpointline(x0,y0,x1,y1,color) int x0,y0,x1,y1,color; { int a,b,d1,d2,2,x,y; a = y0-y1; b = x1 – x0; d = 2 * a +b; d1 = 2*a; d2 = 2*(a+b); x = x0; y = y0; PutPixel(x,y,color); while (x<x1) { if (d<0) { x++; y++; d +=d2;} else { x++; d +=d1;} PutPixel(x,y,color); } }
扫描转换圆弧 处理对象:圆心在原点的圆弧 圆的八对称性 X, y (x,y) 北大计算机系多媒体与人机交互 13
北大计算机系多媒体与人机交互 13 扫描转换圆弧 • 处理对象:圆心在原点的圆弧 • 圆的八对称性
两种直接离散方法: 离散点 利用隐函数方程x2+y2=R2 离散角度:利用参数方程/x=Rw R2-x2)取整(x rsin e (round (r cos 0), round ( rsin 8)) 开根,三角函数运算,计算量大,不可 取 北大计算机系多媒体与人机交互
北大计算机系多媒体与人机交互 14 • 两种直接离散方法: 离散点: 离散角度: • 开根,三角函数运算,计算量大,不可 取。 ( , ) ) , 2 2 2 2 2 i i i i i r x y R x x y x y R ( , 利用隐函数方程 = − ⎯取整 ⎯→ + = ( ( cos ), ( sin )) sin cos i R i round R round y R x R = = 利用参数方程
扫描转换圆弧 圆弧的正负划分性 F(x,y)=x2+y2-R2=0 y 圆弧外的点:F(X,Y)>0 F(x,y)>0 圆弧内的点:F(X,Y)<0 F(x,y)<0 F(x,y)=0 北大计算机系多媒体与人机交互 15
北大计算机系多媒体与人机交互 15 扫描转换圆弧 • 圆弧的正负划分性 ( , ) 0 2 2 2 F x y = x + y − R = 圆弧外的点:F(X,Y)>0 圆弧内的点:F(X,Y)<0