前提:计算机画图只能在整数坐标上画图,即点(x , y)x , y均为整数
首先 说下取值规律:
如图所示
在图中有一个点( 2 , 1.5 )。设实际需要描的点的坐标为(2 , y )
如果1<y≤1.5,则令y=1;
如果1.5<y≤2,则令y=2;
接下来:
这里我取斜率大于0小于1的情况进行具体分析
根据直线表达式,我们可以设该直线为:
ax+by+c=0,令a=y1-y2;b=x2-x1;
令f(x,y)=ax+by+c
则我们可知 : 当x=x1,y=y1时,f(x1,y1)=a*x1+b*y1+c=0
然后取x1下一个位置的中点,即点(x1+1,y1+0.5)
f(x1+1,y1+0.5)
=a(x1+1)+b(y1+0.5)+c
=ax1+by1+c+a+0.5*b
=a+0.5*b
接下来就要进行判断:
(一)当a+0.5*b≥0时,中点在直线的上方,即实际点的纵坐标比中点小,则令该点坐标为( x1+1 , y1 );
下一点的中点坐标为(x1+2,y1+0.5)
f(x1+2,y1+0.5)
=a(x1+2)+b(y1+0.5)+c
=ax1+by1+c+2*a+0.5*b
=(a+0.5*b)+a
(二)当a+0.5*b<0时,中点在直线的下方,即实际点的纵坐标比中点大,则令该点坐标为( x1+1 , y1+1 );
下一点的中点坐标为(x1+2,y1+1.5)
f(x1+2,y1+1.5)
=a(x1+2)+b(y1+1.5)+c
=ax1+by1+c+2*a+1.5*b
=(a+0.5*b)+(a+b)
令d0=a+0.5*b,d1=a,d2=a+b
则有递推式:
if(d0<0){
y++;
d0+=d2;
}else{
d0+=d1;
}
直接看代码吧:
void MainWindow::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event);
QPainter painter(this);
// 设置画笔颜色
painter.setPen(QColor(0,