Transcript 中点画线算法
中点画线算法 讲授者:曲 毅 计算机图形学 图形扫描转换 直线扫描转换 中点画线算法 在 纸 上 VS和P (5,3)的直线段 画一条连接点P (1,1) 扫描 转换 0 1 (连续的) 就是要找出显示平面上最佳逼近 理想直线的那些象素的坐标值, 并将这些象素置成所要求的颜色 中点法 (离散的) 在 屏 幕 上 算 法 原 理 条件背景 过点(x0,y0)、(x1, y1)的直线段L的方程为 F(x, y)=ax+by+c=0,其中, a=y0-y1, b=x1-x0, c=x0y1-x1y0 假定直线斜率k在0~1之间(x方向 步进1,求y的取值) 当前象素点为P (xp,yp) 下一个象素点有两种可选择点 Pu(xp+1,yp+1),Pd(xp+1,yp) F(M)>0 Pu(xp+1,yp+1) M(xp+1,yp+0.5) P(xp,yp) Pd(xp+1,yp) Pu与Pd的中点M(xp+1,yp+0.5) 判别方法 F(M)=0 F(M)的符号作为判别的依据 F(M)<0 F(M)<0时,点M在直线下方,取M上方点Pu 为下一个象素点 F(M)>0时,点M在直线上方,取M下方点Pd为下一个象素点 F(M)=0时,点M在直线上,取Pu 或Pd均可,默认取Pd为下一个象素点 算 法 实 现 初始值 xp=x0, yp=y0 判别式 d=F(M)=F(xp+1, yp+0.5)=a(xp+1)+b(yp+0.5)+c 下一像素点 x p 1 x p 1 y p 1 效率分析 yp 1 yp d 0 每一个像素的计算量是4个加法,2个乘法 乘法 注意到 d 0 加法 d是xp, yp的线性函数,可采用增量计算,提高运算效率 算 法 优 化 判别式增量 若当前象素处于d>=0情况,取Pd(xp+1, yp) 要判断下一个象素位置,应计算d= F(M’ ) =F(xp+2, yp+0.5)=a(xp+2)+b(yp+0.5) =d+a 增量为a M ’(xp+2,yp+0.5) Pd(xp+1,yp) M ’(xp+2,yp+1.5) Pu(xp+1,yp+1) 若d<0时,则取象素Pu(xp+1, yp+1) 要判断再下一象素,则要计算 d= F(M’ ) = F(xp+2, yp+1.5)=a(xp+2)+b(yp+1.5)+c =d+a+b 增量为a+b 算 法 优 化 判别式初值 画线从(x0, y0)开始,F(x0, y0)=0, d 的初值 d0=F(x0+1, y0+0.5) =F(x0, y0)+a+0.5b=a+0.5b 效率分析 注意到 整数化改进 浮点数 整数 我们使用的只是d的符号,而且d的增量都是整数,只是初始 值包含小数。因此,我们可以用2d代替d来摆脱浮点数 把初始值和2个增量都扩大2倍 d0=2a+b d增量=2a d增量=2a+2b 算 法 总 结 条件整合 算法流程 初始化a=y0-y1; b=x1-x0 d=2a+b, d1=2a;d2=2(a+b) x=x0;y=y0;画像素(x, y) 起点(x0,y0)、终点(x1, y1) F(x, y)=ax+by+c=0, a=y0-y1, b=x1-x0 d0 2a b x<x1? y p 1 2(a b) d 2a 结束 Y x p 1 x p 1 yp 1 yp N d 0 d 0 d 0 d 0 d<0? N Y x=x+1 y=y+1 d=d+d2 画像素(x, y) x=x+1 d=d+d1 算 法 实 例 用中点画线方法扫描转换连接两点P0(0,0)和P1(5,2)的直线段 初始条件 动画演示 a=y0-y1=-2; b=x1-x0=5; d0=2a+b=1; d1=2a=-4;d2=2(a+b)=6 起始点 终止点 当前像素点 下一个像素点 实现过程 x y d 0 0 1 1 0 -3 2 1 3 3 1 -1 4 2 5 5 2 1 3 2 1 0 1 2 3 4 5 算 法 实 例 用中点画线方法扫描转换连接两点P0(0,0)和P1(5,2)的直线段 初始条件 动画演示 a=y0-y1=-2; b=x1-x0=5; d0=2a+b=1; d1=2a=-4;d2=2(a+b)=6 起始点 终止点 当前像素点 下一个像素点 实现过程 x y d 0 0 1 1 0 -3 2 1 3 3 1 -1 4 2 5 5 2 1 3 2 1 0 1 2 3 4 5 将中点画线法 推广 到 任意斜率 的直线段