中点画线算法(Midpoint Line Drawing Algorithm)是通过在每列像素中确定与理想直线最靠近的像素来进行扫描转换的。
步骤实现 斜率: 0<=k<=1
直线端点:(x1,y1),(x2,y2)
1) 初始化。令 a=y1-y2, b=x2-x1, d=2*a+b, deta1=2*a, deta2=2*(a+b), x=x1, y=y1.
2) 用颜色color画像素(x,y)。
3) 判断x是否小于x2。如果x
代码实现(基于VC 6.0) 斜率: 任意
1 #define ROUND(a) ((int)(a+0.5)) 2 /* 中点直线生成算法 */ 3 void CDrawDC::LineMP(int x1, int y1, int x2, int y2, COLORREF color) 4 { 5 int a,b,x,y,d,da1,da2; 6 7 if(x1<x2 && y1<y2){ 8 a=y1-y2; 9 b=x2-x1; 10 x=x1,y=y1; 11 d=2*a+b; 12 da1=2*a; 13 da2=2*(a+b); 14 15 SetPixel(ROUND(x),ROUND(y),color); 16 for(;x<x2;){ 17 if(d<0){ 18 x++; 19 y++; 20 d+=da2; 21 }else{ 22 x++; 23 d+=da1; 24 } 25 SetPixel(ROUND(x),ROUND(y),color); 26 } 27 }else if(x1>x2 && y1>y2){ 28 a=y2-y1; 29 b=x1-x2; 30 x=x2,y=y2; 31 d=2*a+b; 32 da1=2*a; 33 da2=2*(a+b); 34 35 SetPixel(ROUND(x),ROUND(y),color); 36 for(;x<x1;){ 37 if(d<0){ 38 x++; 39 y++; 40 d+=da2; 41 }else{ 42 x++; 43 d+=da1; 44 } 45 SetPixel(ROUND(x),ROUND(y),color); 46 } 47 }else if(x1>x2 && y1<y2){ 48 a=-y2; 49 b=x1-x2; 50 x=0,y=0; 51 d=2*a+b; 52 da1=2*a; 53 da2=2*(a+b); 54 55 SetPixel(ROUND(x1-x),ROUND(y+y1),color); 56 for(;x<b;){ 57 if(d<0){ 58 x++; 59 y++; 60 d+=da2; 61 }else{ 62 x++; 63 d+=da1; 64 } 65 SetPixel(ROUND(x1-x),ROUND(y+y1),color); 66 } 67 }else if(x1<x2 && y1>y2){ 68 a=-y1; 69 b=x2-x1; 70 x=0,y=0; 71 d=2*a+b; 72 da1=2*a; 73 da2=2*(a+b); 74 75 SetPixel(ROUND(x2-x),ROUND(y+y2),color); 76 for(;x<b;){ 77 if(d<0){ 78 x++; 79 y++; 80 d=d+da2; 81 }else{ 82 x++; 83 d+=da1; 84 } 85 SetPixel(ROUND(x2-x),ROUND(y+y2),color); 86 } 87 } 88 }
参考来源: 《计算机图形学实用教程(第三版)· 苏小红 编著》