详解Bresenham算法原理(2)

本文介绍了一种绘制直线的算法实现,详细解释了如何根据两点坐标计算出直线上的像素点,并填充到缓冲区中。该算法区分了斜率的绝对值小于等于1和大于1两种情况,分别采用不同的增量方式来提高效率。

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

图片图片图片

 

下而实现的代码

 

/// <summary>
        /// 没有剪切的版本
        /// </summary>
        private void GetLine(CPoint P0, CPoint P1, 
            ref Color[] buffer, int width, int height)
        { 
            CPoint ptExtra = P1 - P0;
            int dx = ptExtra.X, dy = ptExtra.Y;
            int yStep = 1, xStep = 1;
            if (dx < 0) { dx = -dx; xStep = -1; }
            if (dy < 0) { dy = -dy; yStep = -1; }
            int dx2 = dx << 1;
            int dy2 = dy << 1;
            
            //int yStart = P0.Y, yEnd = P1.Y,
            //    xStart = P0.X, xEnd = P1.X;
            int xi = 0, yi = 0;
            int x = P0.X, y = P0.Y;
            //int ix = xStart, iy = yStart;
            
            int index = 0;

            if (dx >= dy)
            {//0 <= 斜率的绝对值 < 1,以x为增量
                int error = -dx;
                //if (dy > 0) { yStep = 1; }
                //else { yStep = -1; }
                //yStep = dy > 0 ? 1 : -1;
                for (xi = 0; xi <= dx; xi++)
                {
                    index = x + y * width;
                    buffer[index] = this.Color;
                    error += dy2;
                    if (error >= 0)
                    {
                        y += yStep;
                        error -= dx2;
                    }
                    x += xStep;
                }
            }
            else
            {//斜率的绝对值 >= 1,以y为增量
                int error = -dy;
                for (yi = 0; yi <= dy; yi++)
                {
                    index = x + y * width;
                    buffer[index] = this.Color;
                    error += dx2;
                    if (error >= 0)
                    {
                        x += xStep;
                        error -= dy2;
                    }
                    y += yStep;
                }
            }
        }


 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值