打印

关于点阵液晶画线的算法

[复制链接]
2266|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
btiger2000|  楼主 | 2008-7-21 10:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
void Line(unsigned char s_x,unsigned char s_y,unsigned char e_x,unsigned char e_y) 
{
    char Offset_x,Offset_y,Offset_k = 0; 
    char Err_d = 1; 
    if(s_y>e_y) 
    {
        Offset_x = s_x; 
        s_x = e_x; 
        e_x = Offset_x; 
        Offset_x = s_y; 
    }
    Offset_x = e_x-s_x; 
    Offset_y = e_y-s_y; 
    Write_Dot_LCD(s_x,s_y,BMP_Color); 
    if(Offset_x<=0) 
    {
        Offset_x = s_x-e_x; 
        Err_d = -1; 
    }
    if(Offset_x>Offset_y) 
    {
        Offset_k += Offset_y;                             //
        while(s_x!=e_x)                             //
        {                                    //
            if(Offset_k>0)                             //
            {                                //
                s_y+=1;                            //
                Offset_k += (Offset_y-Offset_x);             //
            }
            else Offset_k += Offset_y;                    //  
            s_x+=Err_d;                             //
            if(s_x>Dis_X_MAX||s_y>Dis_Y_MAX) break; 
            Write_Dot_LCD/*Writ_Dot*/(s_x,s_y,BMP_Color); 
        }
    }
    else
    {
        Offset_k += Offset_x;                             //
        while(s_y!=e_y)                             //
        {    
            if(Offset_k>0)                             //
            {                                //
                s_x+=1;                            //
                Offset_k += (Offset_x-Offset_y);             //
            }                                //
            else Offset_k += Offset_x;                      //
            s_y+=Err_d; 
            if(s_x>Dis_X_MAX||s_y>Dis_Y_MAX) break; 
            Write_Dot_LCD/*Writ_Dot*/(s_x,s_y,BMP_Color); 
        }
    }
}

我一直都用 y=ax+b的算法,看到代码中有注释的部分,直线的算法,不太明白,哪位高手能给指点一二?谢谢了!

相关帖子

沙发
btiger2000|  楼主 | 2008-7-21 11:58 | 只看该作者

顶一下!!

使用特权

评论回复
板凳
huangqi412| | 2008-7-21 14:25 | 只看该作者

先标记

使用特权

评论回复
地板
btiger2000|  楼主 | 2008-7-22 13:04 | 只看该作者

没人知道?还是大虾都忙呢!没空啊?

使用特权

评论回复
5
lianshumou| | 2008-7-22 14:12 | 只看该作者

差分误差逼近!

//****************************************************************************************************
// 画直线子程序  void W_Line(int s_x,int s_y,int e_x,int e_y,int Mode)
// 设计者: 牟联树
// 描  述: 以s_x,s_y为起点,e_x,e_y为终点画一直线.
//         Mode=0:画直线,Mode=1:画虚线
// 日  期: 2003.11.22
// 版本号: 1.0
//****************************************************************************************************
void W_line(int s_x,int s_y,int e_x,int e_y,int Mode)
{  
    int Err=0,D_x,D_y;
    if(e_y<s_y)
    {
       D_x = e_x;
       e_x = s_x;s_x = D_x;
       D_x = e_y;
       e_y = s_y;s_y = D_x;
    } 
    Writ_Dot(s_x,s_y,Mode);
    D_x = e_x - s_x;
    D_y = e_y - s_y;
    if(D_x>0)
    { 
        if(D_x>=D_y)
        {                               //0=<K<=1
             while(s_x!=e_x)
             {
                if(Err>=0)
                {
                    s_y+=1;
                    Err+=(D_y-D_x);
                }
                else Err+=D_y;
                s_x+=1;
                Writ_Dot(s_x,s_y,Mode);
             }
        }
        else
        {                          //K>1
             while(s_y!=e_y)
             {
                 if(Err>0)
                 {
                     s_x+=1;
                     Err+=(D_x-D_y);
                 }
                 else Err+=D_x;
                 s_y+=1;
                 Writ_Dot(s_x,s_y,Mode);
             }
        }
    }
    else 
    {
        D_x = s_x - e_x;
        if(D_x>=D_y)
        {                                //-1=<K<0
            while(s_x!=e_x)
            {
               if(Err>=0)
               {
                  s_y+=1;
                  Err+=(D_y-D_x);
               }
               else Err+=D_y;
               s_x-=1;
               Writ_Dot(s_x,s_y,Mode);
            }   
        }
        else
        {                               //K< -1 
            while(s_y!=e_y)
            {
               if(Err<=0) Err+=D_x;
               else
               {
                  s_x-=1;
                  Err+=(D_x-D_y);
               }
               s_y+=1;
               Writ_Dot(s_x,s_y,Mode);
            }
        }    
    }     
}

使用特权

评论回复
6
btiger2000|  楼主 | 2008-7-22 16:13 | 只看该作者

能具体解释一下么? 谢谢!

使用特权

评论回复
7
lianshumou| | 2008-7-22 17:06 | 只看该作者

原理还是基于直线方程

首先程序会算出这条直线在液晶上的起点和中点之间的x和y的变化量
而后根据直线的斜率分为四种情况分别画图.

在画图时会按X轴或是Y轴上的增量来选取循环计算参考,那个增量大选那个.

Dx>Dy的情况: (x,y)=(xs+x,ys+(Dy/Dx)*x)  这个公式取导就是  (Dy/Dx)*dX  这里dX = 1;   因为 Dy <= Dx  所以你算x要加几次1后y加1就可以了!

使用特权

评论回复
8
btiger2000|  楼主 | 2008-7-22 22:07 | 只看该作者

多谢了!我再研究一下!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

80

主题

1177

帖子

6

粉丝