光栅图形学之直线段扫描算法(中点画线法)

说明:本文章系作者学习资料整理,不完善的地方请大家指正,谢谢!

摘自《计算机图形学基础教程》清华大学出版社 孙家广 胡事民

 

 

我们知道利用任何画图工具,知道两个点之后,便可以在窗口画出一条直线,其计算机内部原理,便是利用了光栅化。计算机屏幕可以看作是有几行几列的单位正方形组成,在数学中线是没有宽度的。当线与正方形的边有交点时,我们需要判定选取正方形的哪个顶点作为线上的一个点。这便引出了图形扫描转换的算法。

 

中点画线法

我们知道直线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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值