像素方式画直线-布兰森汉姆算法画线

像素方式画直线-布兰森汉姆算法画线(纯C实现DrawLine)
2011-03-07 16:32

范一/

int Draw_Line(int x1, int y1, // 起始点
              int x2, int y2, // 终点
              unsigned char color, // 颜色像素
              unsigned char *vb_start, int lpitch) // video buffer and memory pitch
{
    // this function draws a line from xo,yo to x1,y1 using differential error
    // terms (based on Bresenahams work)
   
    int dx, // difference in x's
        dy, // difference in y's
        dx2, // dx,dy * 2
        dy2,
        x_inc, // amount in pixel space to move during drawing
        y_inc, // amount in pixel space to move during drawing
        error, // the discriminant i.e. error i.e. decision variable
        index; // used for looping
   
    // pre-compute first pixel address in video buffer
    vb_start = vb_start + x1 + y1 * lpitch;
   
    // compute horizontal and vertical deltas
    dx = x2-x1;
    dy = y2-y1;
   
    // test which direction the line is going in i.e. slope angle
    if (dx>=0)
    {
        x_inc = 1;
       
    } // end if line is moving right
    else
    {
        x_inc = -1;
        dx = -dx; // need absolute value
       
    } // end else moving left
   
    // test y component of slope
   
    if (dy>=0)
    {
        y_inc = lpitch;
    } // end if line is moving down
    else
    {
        y_inc = -lpitch;
        dy = -dy; // need absolute value
       
    } // end else moving up
   
    // compute (dx,dy) * 2
    dx2 = dx << 1;
    dy2 = dy << 1;
   
    // now based on which delta is greater we can draw the line
    if (dx > dy)     //斜率小于1的情况
    {
        // initialize error term
        error = dy2 - dx;
       
        // draw the line
        for (index=0; index <= dx; index++)
        {
            // set the pixel
            *vb_start = color;
           
            // test if error has overflowed
            if (error >= 0)
            {
                error -= dx2;   
                // move to next line
                vb_start += y_inc;
               
            }    
            // adjust the error term
            error += dy2   
            // move to the next pixel
            vb_start += x_inc;
        }
    }
    else   //斜率大于等于1的情况
    {
        // initialize error term
        error = dx2 - dy;
       
        for (index=0; index <= dy; index++)
        { <

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值