数学上的直线是没有宽度、由无数个点构成的集合,显然,光栅显示器只能近地似显示直线。当我们对直线进行光栅化时,需要在显示器有限个象素中,确定最佳逼近该直线的一组象素,并且按扫描线顺序,对这些象素进行写操作,这个过程称为用显示器绘制直线或 直线的扫描转换 。 一、数值微分(DDA)算法 1、算法原理 根据直线方程y=kx+b,由两个直线的端点(x0,y)(x1y1)可求得斜率k。可以将变量x设定初值为x0,y初值y0。每次x步进1,同时使y步进k,可获得表示直线的所有近似的结果集。 2、算法实现 //数值微分法 void DrawLine(CDC * pDC,int x0,int y0,int x1,int y1,COLORREF color) { int x; float y,k; k = (float)(y1-y0)/(x1-x0); y = (float)y0; for (x=x0;x<x1;x++) //每次x步进1 { y += k; //每次y增量为k pDC->SetPixel(x, (int)(y+0.5), color); //每次对y的值四舍五入 } } 3、补充 这个算法只适合|k|<=1的情况。在|k|>1时,必须交换x和y的位置,y每增加1,x增加1/k。 在这个算法中,y和k必须用浮点数来表示,每一步都要对y进行四舍五入后取整,不利于机器实现 二、中点划线法