说明:本文章系作者学习资料整理,不完善的地方请大家指正,谢谢!
摘自《计算机图形学基础教程》清华大学出版社 孙家广 胡事民
我们知道利用任何画图工具,知道两个点之后,便可以在窗口画出一条直线,其计算机内部原理,便是利用了光栅化。计算机屏幕可以看作是有几行几列的单位正方形组成,在数学中线是没有宽度的。当线与正方形的边有交点时,我们需要判定选取正方形的哪个顶点作为线上的一个点。这便引出了图形扫描转换的算法。
中点画线法
我们知道直线y=k*x+b 可以写成y-k*x-b=0的形式;进而写成函数F(x,y)=y-k*x-b;注意在此我们要使得y的系数一定为正,这和我们以下讨论的直线和点的位置关系息息相关。只有y的系数是正的时候,以下关系式才成立;如果y的系数是负的话,下面的关系式是相反的;
当点在直线上方时,点的坐标带入函数,F(x,y)>0;
当点在直线下方时,点的坐标带入函数,F(x,y)<0;
当点在直线上时,点的坐标带入函数,F(x,y)=0;
已知点P1(x0,y0),P(x1,y1)并且都是整数坐标对。令dx=x1-x0; dy=y1-y0 ; 并且x1>x0恒成立,那么dx恒大于0; 且k=dy/dx;方程y-k*x-b=0改写成y-(dy/dx)*x-b=0;
最终函数F(x,y)=y*dx-x*dy-B;其中B=b*dx;
我们讨论
(1)0<k<=1的情况
沿着x轴的方向,x的值每次加一个单位,我们需要判断的就是纵坐标是加1还是保持原值。我们判断的依据是,当中点(直线与小正方形边点的交点所在边的中点)与直线的关系,通过上面讨论的关系式进行判断。
我们知道点(x0,y0)在直线上,带入函数,函数值等于0;我们将中点(x0+1,y0+0.5)带入函数F(x,y)中,
F(x0+1,y0+0.5)=(y0+0.5)*dx-(x0+1)*dy-B=F(x0,y0)+0.5*dx-dy;其中F(x0,y0)=0;
由于浮点数的出现会导致运算量的增大,我们令d=2*F(x,y),所以d0=dx-2*dy;
当d0>0时,中点在直线的上方,我们选取中点下方的整数坐标对,即点(x0+1,y0),也就是x++,而y的值不变。我们继续判断下一个中点(x0+2,y0+0.5),带入函数,d=2*F(x0+2,y0+0.5)=d0+(-2*dy);
其中d1=-2*dy看作是增量;
当d0<=0时,中点在直线的下方,我们选取中点上方的整数坐标对,即点(x0+1,y0+1);也就是x++,y++。我们继续判断下一个中点(x0+2,y0+1.5),带入函数,d=2*F(x0+2,y0+0.5)=d0+2*(dx-dy)
其中d2=2*(dx-dy)看作是增量;
(2)0>k>=-1的情况
此时,情况有所不同,当沿着x轴,横坐标加单位1时,纵坐标在递减;所以d0=-dx-2*dy;
当d0>0时,中点在直线上方,取中点下方的点,即x++,y- -; d1=-2*(dx+dy);
当d0<=0时,中点在直线下方,取中点上方的点,即x++,纵坐标的值保持不变; d2=-2*dy;
(3)k>1的情况
此时,我们需要沿着y轴的方向,纵坐标加单位1,而横坐标在递增;我们需要判断的就是横坐标是加1还是保持原值。我们判断的依据是,当中点(直线与小正方形边点的交点所在边的中点)与直线的关系,通过上面讨论的关系式进行判断。
我们知道点(x0,y0)在直线上,带入函数,函数值等于0;我们将中点(x0+0.5,y0+1)带入函数F(x,y)中,
F(x0+0.5,y0+1)=(y0+1)*dx-(x0+0.5)*dy-B=F(x0,y0)+dx-0.5*dy;其中F(x0,y0)=0;
由于浮点数的出现会导致运算量的增大,我们令d=2*F(x,y),所以d0=2*dx-dy;
当d0>0时,中点在直线的上方,我们选取中点右方的整数坐标对,即点(x0+1,y0+1),也就是x++,y++。我们继续判断下一个中点(x0+1.5,y0+2),带入函数,d=2*F(x0+1.5,y0+2)=d0+2*(dx-dy); 其中d1=2*(dx-dy)看作是增量;
当d0<=0时,中点在直线的下方,我们选取中点左方的整数坐标对,即点(x0,y0+1),也就是y++,横坐标保持不变。我们继续判断下一个中点(x0+0.5,y0+2),带入函数,d=2*F(x0+0.5,y0+2)=d0+2*dx;
其中d2=2*dx看作是增量;
(4)k<-1的情况
此时,当沿着y轴,纵坐标减去单位1,而横坐标递增。所以d0=-2*dx-dy;
当d0>0时,中点在直线上方,取中点左方的点,即y- -,而横坐标的值保持不变;增量d1=-2*dx;
当d0<=0时,中点在直线下方,取中点右方的点,即y- -,x++;增量d2= -2*(dx+dy);