中点画线法

在这里插入图片描述
此方法利用了直线方程的一般式
假设直线方程为:f(x,y)=ax+by+c;
(1) f(x,y)=0, 点在直线上面
(2) f(x,y)>0, 点在直线上方
(3) f(x,y)<0, 点在直线下方

构造判别式: d=f(m)=f(xp+1,yp+0.5)=a(xp+1)+b(yp+0.5)+c
由d来判断点在直线的上方还是下方。

当d<0, m在直线(Q点)下方,焦点Q 更靠近P2 取p2;
当d>0, m在直线(Q点)上方,焦点Q 更靠近P1 取p1;
当d=0, P1,p2都可以取;
(1)d>=0, p1(xp+1,py);
d1=f(xp+1+1,yp+0.5);
d1=a(xp+2)+b(yp+0.5)+c;
d1=axp+2a+byp+b+c;
d1=d+a;

(2)d<0, p2(xp+1,yp+1);
d2=f(xp+1+1,yp+1.5)
d2=a(xp+2)+b(yp+1.5)+c
d2=axp+2a+byp+b+c
d2=d+a+b

d的初始值 d0=f(x0+1,y0+0.5)=a(x0+1)+b(y0+0.5)+c
d0=f(x0,y0)+a+0.5b
d0=a+0.5b

由于有浮点出现,不满足高质量直线的要求
改进:将2d 代替d 来摆脱小数,提高效率。
即 d0=2a+b;
1.输入直线的两端点p0(x0,y0)和p1(x1,y1).
2.计算初始值a=y0-y1, b=x1-x0,d=2a+b; x=x0,y=y0,
d1=2a, d2=2(a+b)

代码

void line(int x0,int y0,int x1,int y1)
{
		int x,y,d0,d1,d2,a,b;
		y=y0;
		a=y0-y1;
		b=x1-x0;
		d0=2*a+b;  //初始增量
		d1=2*a;  //d>=0 的增量(2*d1-2*d0)
		d2=2*(a+b);//d<0 的增量(2*d2-2*d0)
		for(x=x0;x<=x1;x++)
		{
				pDC->(x,y,RGB());
				if(d0<0){
					y++;
				}
				else{
				d0=d0+d1;
				}
		}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值