第四讲基本图形生成.ppt

第四讲基本图形生成

例:用中点画线法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 i xi yi d 1 0 0 1 2 1 0 -3 3 2 1 3 4 3 1 -1 5 4 2 5 0 1 2 3 4 5 3 2 1 第三种算法——Bresenham算法  为了避免做费时的乘除运算和取整运算,Bresenham提出了一种更好的直线生成算法。其基本思想是借助一个决策变量来确定下一个像素点。  首先讨论m=dy/dx,当0≤m≤1且x1x2时(1a象限)的Bresenham算法。   假设直线上第i个象素点坐标已经确定,设为(xi,yi),那么,直线上下一个象素点的可能位置是(xi+1,yi)或(xi+1,yi+1)。(注意m1) 直线Bresenham算法描述 由图中可以知道:在x=xi+1处,直线上点的y值是y=m(xi+1)+b,该点离象素点(xi+1,yi)和象素点(xi+1,yi+1)的距离分别是d1和d2: d1=y-yi=m(xi+1)+b-yi d2=(yi+1)-y=(yi+1)-m(xi+1)-b 两个距离差是 d1-d2=2m(xi+1)-2yi+2b-1 直线Bresenham算法描述 我们来分析公式d1-d2=2m(xi+1)-2yi+2b-1    (1)当此值为正时,d1d2,说明直线上理论点离(xi+1,yi+1)象素较近,下一个象素点应取(xi+1,yi+1)。   (2)当此值为负时,d1d2,说明直线上理论点离(xi+1,yi)象素较近,则下一个象素点应取(xi+1,yi)。   (3)当此值为零时,说明直线上理论点离上、下两个象素点的距离相等,取哪个点都行,假设算法规定这种情况下取(xi+1,yi+1)作为下一个象素点。   因此只要利用(d1-d2)的符号就可以决定下一个象素点的选择。 直线Bresenham算法描述 进一步定义一个新的判别式(决策变量): pi=dx (d1-d2)=2dy·xi-2dx·yi+c(c=2 dy+ dx (2b-1)) dx=(x2-x1)0,因此pi与(d1-d2)有相同的符号; 则此时pi的计算仅包含整数运算;c为常量,可在递推运算中被消去;   经过一系列误差判别变量的递推,得到如下算法表示:   初始     p1=2dy-dx   当pi≥0时: yi+1=yi+1, xi+1=xi+1, pi+1=pi+2(dy-dx)   否则:   yi+1=yi,        xi+1=xi+1,        pi+1=pi+2dy   可以看出,第i+1步的判别变量pi+1仅与第i步的判别变量pi、直线的两个端点坐标分量差dx和dy有关,运算中只含有整数相加和乘2运算,而乘2可利用算术左移一位来完成,因此这个算法速度快并易于硬件实现。 直线Bresenham算法实现 条件:0≤m≤1且x1x2   1、输入线段的两个端点坐标和画线颜色:x0,y0, x1,y1,color;   2、设置象素坐标初值:x=x0,y=y0;   3、设置初始误差判别值:p=2·dy-dx;   4、分别计算:dx=x1-x0、dy=y1-y0;    5、循环实现直线的生成:    for(x=x0;x=x1;x++)    { putpixel(x,y,color) ;     if(p=0)      { y=y+1;       p=p+2·(dy-dx);      }     else      { p=p+2·dy;      }    } Bresenham算法的优点如下: ⒈ 不必计算直线的斜率,因此不做除法。 ⒉ 不用浮点数,只用整数。 ⒊ 只做整数加减运算和乘2运算,而乘2运算可以用移位操作 实现。 Bresenham算法的运算速度很快,并适于用硬件实现。 讨论:以上考虑的是 0<dy<dx 的情况,对于适用所有8个方向的直线的生成算法,则要考虑以判断条件|dx||dy|为分支,并分别将2a、3a象限的直线和3b、4b象限的直线变换到1a、4a和2b、1b象限方向去,以实现程序处理的简洁。 直线Bresenham算法完善 第四讲 基本图形生成 直线的生成算法 圆的生成算法 区域填充算法 裁剪算法 圆的生成算法    这里仅讨论圆心位于坐标原点的圆的扫描转换算法,对于圆心不在原点的圆,可先用平移变换,将它的圆心平移到原点,然

文档评论(0)

1亿VIP精品文档

相关文档