1、1.直线扫描算法,3 种原理、代码(1)DDA 扫描线算法原理: y= - ,y0 xykx/1yx 时,让 x 从 变化,每点递增1到1, iiii ,当|k|1 时,x 每增加 1,y 最多增加 1当|k|1 时,必须把 x 互换,y 每增加 1,x相应加 1/k伪代码:;);,5.0int(,(;/ydk,xfloat inclr)it ,int (DALeV100110kcolrrwpelf(2)中点画线法 为 下 一 像 素, 约 定 取当 为 下 一 像 素 ;点 ) 上 方 , 取( 在时 ,为 下 一 像 素 ; 当取 点 ) 下 方 ,(在当 )(直 线 120101d,)5
2、.(),)PQLMdcybxaFdcxPLpp acyxFxpp增 量 为位 置 时 , 应 计 算判 断 下 一 像 素 的, 则 取 正 右 方 像 素若 ,)5.0,2(,(11 badcyxyPppp增 量 为的 位 置 , 应 计 算 要 判 断 下 一 像 素)( 则 取 正 右 方 像 素若 ,)5.1()25.1,.,2伪代码: );,(,;)0();,(*2;2,;,baint olr)it ,int Le(Mv12101110colryxdrawpielsdifxhlecolrydrwpbadxy(3)Bresenham 算法直线的起始点为像素忠心,误差项=0,x 下标每增
3、加 1,d 的值相应递增直线0d斜率 k,即 0.5 时,直k当,线与 列垂直网格的交点最接近当前i像素的右上方像素,该像素在 y 方向增加 1,)( ,y同时作为下一次计算新基点,因此 d 值相应减去 1,而当 dXR) c |=RIGHT;if (yYB) c |=BOTTOM;if (yYT) c |=TOP;void CS_LineClip(x1,y1,x2,y2,XL,XR,YB,YT) int code1, code2, code ;code1 = encode(x1,y1) ;code2 = encode(x2,y2) ;while (code1 !=0 | code2 !=0)
4、 if (code1 if (code1 !=0) code =code1 ;else code=code2 ;if(LEFTy=y1+(y2-y1)*(XL-x1)/(x2-x1);else if(RIGHTy=y1+(y2-y1)*(XR-x1)/(x2-x1);else if(BOTTOMx=x1+(x2-x1)*(YB-y1)/(y2-y1);else if(TOP x=x1+(x2-x1)*(YT-y1)/(y2-y1);if (code = code1) x1=x ; y1=y ; code1=encode(x,y) ; else x2=x ; y2=y ; code2=encode(x,y) ; displayline(x1,y1,x2,y2) ;直线裁剪方法:Cohen-Sutherland 法,中点分割法,梁友栋-Barskey 裁剪算法