画线算法-Bresenham算法

本文深入探讨了Bresenham算法在直线绘制中的应用,详细解析了算法原理及其实现过程,尤其关注斜率小于1的情况,并展示了如何在OpenGL中实现该算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载学习:https://blog.youkuaiyun.com/hyman_c/article/details/53432852

在学习ros navigation模块的move_base在base_local_planner中的voxel_grid_model中关于VoxelGridModel::lineCost函数使用

故特此引用.

Bresenhan算法将坐标系分割成棋盘形状,每个像素占有一个棋格,当我们进行采样时(直线斜率小于1),如下图所示,假设给定绘图的起始点为(10,11),那么绘制下一个采样点的坐标必然是从(11,11)和(11,12)中选择一个。如果把这种情况一般化,对于绘制直线的起始点是(Xk,Yk),那么其下一个采样点必然是(Xk+1,Yk)或者(Xk+1,Yk+1)中的一个。

  想要得到3.16表达式,需要将yk=m*xk+b带入3.14中,而且应该注意△y和△x都是常量,△y为给定的起始点和终点的纵坐标差的绝对值,△x为给定的起始点和终点的横坐标的差的绝对值。

void lineBresenham(int x0,int y0,int xEnd,int yEnd)
{
    int x,y;
    int dx=fabs(xEnd-x0),dy=fabs(yEnd-y0);
    int p=2*dy-dx;
    int twody=2*dy,twodysubdx=2*(dy-dx);
    
    if(x0>xEnd)
    {
        x=xEnd;
        y=yEnd;
        xEnd=x0;
        yEnd=y0;
    }
    else
    {
        x=x0;
        y=y0;
    }
    SetPixel(x,y);
    while (x<xEnd)
    {
        x++;
        if(p<0)
        {
            p+=twody;
        }
        else
        {
            y++;
            p+=twodysubdx;
        }
        SetPixel(x,y);
    }
}


  这是当直线的斜率小于1的情况,当斜率大于1时,只需交换x和y的计算规则,沿着y方向单位步长移动,来计算x的值即可。Opengl中绘制效果:

 
 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值