资源描述:
《计算机图形学算法汇总》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、直线的扫描转换数值微分法(DDA)DDA画线算法程序voidDDALine(intx0,inty0,intx1,inty1,intcolor){intx;floatdx,dy,y,k;dx=x1-x0;dy=y1-y0;k=dy/dx;y=y0;for(x=x0;x2、k
3、≤1的情形。在这种情况下,x每增加1,y最多增加1。当
4、k
5、>1时,必须把x,y地位互换,y每增加
6、1,x相应增加1/k。在这个算法中,y与k必须用浮点数表示,而且每一步都要对y进行四舍五入后取整,这使得它不利于硬件实现。中点画线法中点画线算法程序:voidMidpointLine(intx0,inty0,intx1,inty1,intcolor){inta,b,d1,d2,d,x,y;a=y0-y1;b=x1-x0;d=2*a+b;d1=2*a;d2=2*(a+b);x=x0;y=y0;drawpixel(x,y,color);while(x7、ixel(x,y,color);}/*while*/}/*midPointLine*/Bresenham画线算法算法步骤:1.输入直线的两端点P0(x0,y0)和P1(x1,y1)。2.计算初始值△x、△y、d=0、x=x0、y=y0。3.绘制点(x,y)。4.d更新为d+k,判断d的符号。若d>0.5,则(x,y)更新为(x+1,y+1),同时将d更新为d-1;否则(x,y)更新为(x+1,y)。5.当直线没有画完时,重复步骤3和4。否则结束。算法步骤:1.输入直线的两端点P0(x0,y0)和P1(x1,y1)。2.计算初始值△x、△y、e
8、=-△x、x=x0、y=y0。3.绘制点(x,y)。4.e更新为e+2△y,判断e的符号。若e>0,则(x,y)更新为(x+1,y+1),同时将e更新为e-2△x;否则(x,y)更新为(x+1,y)。5.当直线没有画完时,重复步骤3和4。否则结束。voidBresenhamline(intx0,inty0,intx1,inty1,intcolor){intx,y,dx,dy;floatk,e;dx=x1-x0;dy=y1-y0;k=dy/dx;e=-0.5;x=x0;y=y0;for(i=0;i9、olor);x=x+1;e=e+k;if(e³0){y++;e=e-1;}}}中点画圆算法:MidPointCircle(intrintcolor){intx,y;floatd;x=0;y=r;d=1.25-r;drawpixel(x,y,color);while(x<=y){if(d<0)d+=2*x+3;else{d+=2*(x-y)+5;y--;}x++;drawpixel(x,y,color);}}扫描转换多边形多边形的扫描转换扫描线算法voidpolyfill(polygon,color)intcolor;多边形polygon;{f
10、or(各条扫描线i){初始化新边表头指针NET[i];把ymin=i的边放进边表NET[i];}y=最低扫描线号;初始化活性边表AET为空;for(各条扫描线i){把新边表NET[i]中的边结点用插入排序法插入AET表,使之按x坐标递增顺序排列;遍历AET表,把配对交点区间(左闭右开)上的象素(x,y),用drawpixel(x,y,color)改写象素颜色值;遍历AET表,把ymax=i的结点从AET表中删除,并把ymax>i结点的x值递增Dx;若允许多边形的边自相交,则用冒泡排序法对AET表重新排序;}}/*polyfill*/边界标志算
11、法:voidedgemark_fill(polydef,color)多边形定义polydef;intcolor;{对多边形polydef每条边进行直线扫描转换;inside=FALSE;for(每条与多边形polydef相交的扫描线y)for(扫描线上每个象素x){if(象素x被打上边标志)inside=!(inside);if(inside!=FALSE)drawpixel(x,y,color);elsedrawpixel(x,y,background);}}