《c_画直线和圆》由会员分享,可在线阅读,更多相关《c_画直线和圆(20页珍藏版)》请在金锄头文库上搜索。
1、画直线和圆直线的扫描转换: 确定最佳逼近于该直线的一组象 素,并且按扫描线顺序,对这些象素进行写操作。三个常用算法: 数值微分法(DDA) 中点画线法 Bresenham算法。基本思想已知过端点P0 (x0, y0), P1(x1, y1)的直线段L:y=k*x+b 直线斜率为 从x的左端点x0开始,向x右端点步进。 步长=1(个象素),计算相应的y坐标y=k*x+B; 取象素点(x, round(y)作为当前点的坐标。计算yi+1= k*xi+1+B = k1*xi+B+k*x= yi+k*x 当x =1;yi+1 = yi+k 即:当x每递增1,y递增k(即直线斜率); 注意上述分析的算法
2、仅适用于k 1的情形。在这种情况下 ,x每增加1,y最多增加1。 当 k 1时,必须把x,y地位互换。例:画直线段p(0,0)-P1(5,2)x int(y+0.5) y+0.5000100.4+0.5210.8+0.5311.2+0.5421.6+0.5522.0+0.5注:网格点表示象素void DDALine(int x0,int y0,int x1,int y1,int color) int x; float dx, dy, y, k; dx, = x1-x0, dy=y1-y0; k=dy/dx, y=y0; for (x=x0; xx1, x+) drawpixel (x, int
3、(y+0.5), color); y=y+k; 基本思想当前象素点为(xp, yp) 。下一个象素点为P1或P2。 设M=(xp+1, yp+0.5),为p1与p2 之中点,Q为理想直线与x=xp+1 垂线的交点。将Q与M的y坐标进 行比较。 当M在Q的下方,则P2 应为下一个象素点; M在Q的上方,应取P1为下一点。构造判别式: d=F(M)=F(xp+1,yp+0.5)=a*(xp+1)+b*(yp+0.5)+c 其中a=y0-y1, b=x1-x0, c=x0*y1-x1*y0 (d就是M和Q的距离)当d0,M在L(Q点)上方,取右方P1为下一个象素; 当d=0,选P1或P2均可,约定取
4、P1为下一个象素;d是xp, yp的线性函数,因此可采用增量计算,提高运算效率。若当前象素处于d0情况,则取正右方象素P1(xp+1, yp);要判下一个象素位置,应计算d1=F(xp+2, yp+0.5)=a(xp+2)+b(yp+0.5)=d+a; 增量为a。即平齐选d1。若d=0, 则应取P2为下一象素,而且下一象素的判别式为第 一个象素是(0,R),判别式d的初始值为为了进一步提高算法的效率,可以将上面的算法中的浮点数改写成整 数,将乘法运算改成加法运算,即仅用整数实现中点画圆法。使用e=d-0.25代替d;e0=1-R。MidPointCircle(int r int color) int x,y;float d;x=0; y=r; d=1.25-r;circlepoints (x,y,color); /显示圆弧上的八个对称点while(x=y)if(d0) d+=2*x+3; else d+=2*(x-y)+5; y-; x+; circlepoints (x,y,color);