图形学算法--DDA画直线

  这学期刚刚接触图形学,发现图形学中涉及到了很多的算法,需要一一调理清楚,因此为了方便自的复习和学习,决定每学一个算法,就写下来,巩固一下学习的成果。
  众所周知,屏幕的显示其实就是一个一个像素点,就是一个很大的矩阵,我们在这样的大矩阵中填入颜色信息,就形成了我们看到的图像。
  我们这次要画的是直线,就是在给定初始点和终点的情况下,计算出直线上的像素点,然后在这些像素点上填上颜色,把直线画出来。

  我们首先要看的是DDA算法:

  

  如图所示,从起点逐步计算每个相邻点的坐标,具体做法是:
  1、计算出最大的位移方向,就是比较 、 的绝对值大小,选择大的方向作为增量方向,该方向上每步增量为1或-1。( \Delta x,\Delta y =终点-起点)
  2、根据1中的计算结果,我们能够得出在最大位移方向上需要增量多少次,即n=floor(max(\Delta x,\Delta y))。则另外一个方向上的增量为 或 (注意,这里是实数的除法,需要保留小数)
  3、根据两个方向上的增量,从初始起点开始,画出直线。

  在VC++6.0中的源码:

void Line::DrawPic(CDC *pDC)
{
    int DeltaX,DeltaY;
    int n;
    //x、y方向上的增量值
    double xinc,yinc;
    //计算DeltaX和DeltaY
    DeltaX = pe.x-ps.x;
    DeltaY = pe.y-ps.y;
    //判断哪个方向是最大位移方向
    if (abs(DeltaX) > abs(DeltaY))
    {
        //取出长度
        n = abs(DeltaX);
        //确定最大位移方向上的增量+1或-1
        if(DeltaX > 0)
        {xinc=1;}
        else
        {xinc=-1;}
        //计算另一个方向上的增量
        yinc =(double) DeltaY / n;
    }
    else
    {
        //取出长度
        n = abs(DeltaY);
        //确定最大位移方向上的增量+1或-1
        if(DeltaY > 0)
        {yinc=1;}
        else
        {yinc=-1;}
        //计算另一个方向上的增量
        xinc =(double) DeltaX / n;
    }
    //开始画图
    double x = ps.x;
    double y = ps.y;
    for(int i = 0;i < n;++i)
    {
        //填充像素块
        pDC->SetPixel(x,y,RGB(0,0,0));
        //每一步增量
        x += xinc;
        y += yinc;
    }
}

作者博客:http://www.flyaway-blog.com/%E5%9B%BE%E5%BD%A2%E5%AD%A6%E7%AE%97%E6%B3%95-dda%E7%94%BB%E7%9B%B4%E7%BA%BF.html

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值