OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 12690|回复: 3

有效率的画斜线算法

[复制链接]

38

主题

527

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1424
金钱
1424
注册时间
2011-11-27
在线时间
122 小时
发表于 2012-5-16 10:05:50 | 显示全部楼层 |阅读模式
今天看邱毅凌老师的书,提到一个有效率的画斜线的算法,在这分享一下。
该算法完全没有用到乘法和除法,效能相当好,而且画出的斜线不会用锯齿状,这个算法基本与机器无法,系统只要提供画点函数draw_pixel(int x,int y,int nColor)即可。
void draw_line(int x1, int y1, int x2, int y2,int nColor)
{
    int i, deltax, deltay, numpixels, d, dinc1, dinc2,

      x, xinc1, xinc2, y, yinc1, yinc2;
    // Calculate delta-x and delta-y for initialization
    if(x2-x1 < 0)
                 deltax = x1-x2 ;
    else        deltax = x2-x1 ;
    if(y2-y1 < 0)
                 deltay = y1-y2 ;
    else        deltay = y2-y1 ;

        // Initialize all vars based on which is the independent variable
        //
        if(deltax >= deltay)
        {
            //x is independent variable
            //
            numpixels = deltax + 1;
            d = (2 * deltay) - deltax;
            dinc1 = deltay << 1;
            dinc2 = (deltay - deltax) << 1;
            xinc1 = 1;
            xinc2 = 1;
            yinc1 = 0;
            yinc2 = 1;
        }
       else
        {

            // y is independent variable
            //
            numpixels = deltay + 1;
            d = (2 * deltax) - deltay;
            dinc1 = deltax << 1;
            dinc2 = (deltax - deltay) << 1;
            xinc1 = 0;
            xinc2 = 1;
            yinc1 = 1;
            yinc2 = 1;
        }
        // Make sure x and y move in the right directions
        //
        if(x1 > x2)
        {
           xinc1 = - xinc1;
           xinc2 = - xinc2;
        }
        if(y1 > y2)
        {
           yinc1 = - yinc1;
           yinc2 = - yinc2;
        }

        // Start drawing at <x1, y1>
        //
        x = x1;
        y = y1;
        // Draw the pixels
       //
       for(i= 1; i< numpixels;i++)
        {
                 // 画点
                draw_pixel(x, y, nColor);
                if (d < 0)
                {
                    d = d + dinc1;
                    x = x + xinc1;
                    y = y + yinc1;
                }
                else
                {
                    d = d + dinc2;
                    x = x + xinc2;
                    y = y + yinc2;
                }
        }
}

 

永远保持一颗学习的心态。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

100

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
278
金钱
278
注册时间
2012-4-15
在线时间
0 小时
发表于 2012-5-16 10:22:25 | 显示全部楼层
我认为一般像这样画圆,画线,画椭圆,画曲线有没有锯齿主要和液晶分辨率有关。差别只是效率高低。现在大部分用的都是类似bresenham算法,我看楼主的也应该属于这一算法。并且板子上带的画圆函数在画小半径圆时太准确,在堪误贴里有改正方法。
喜欢单片机,没什么道理,就像爱吃水煮鱼,对味而已。
回复 支持 反对

使用道具 举报

38

主题

527

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1424
金钱
1424
注册时间
2011-11-27
在线时间
122 小时
 楼主| 发表于 2012-5-16 10:24:58 | 显示全部楼层
回复【2楼】爱吃水煮鱼:
我认为一般像这样画圆,画线,画椭圆,画曲线有没有锯齿主要和液晶分辨率有关。差别只是效率高低。现在大部分用的都是类似bresenham算法,我看楼主的也应该属于这一算法。并且板子上带的画圆函数在画小半径圆时太准确,在堪误贴里有改正方法。
---------------------------------
嗯 去看看
永远保持一颗学习的心态。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-5-16 13:03:11 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-25 23:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表