打印

为什么我的LCD画线函数占那么大空间

[复制链接]
2355|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
nicker88|  楼主 | 2010-11-19 18:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
void draw_line(unsigned char X2,unsigned char Y2,unsigned char X4,unsigned char Y4,unsigned char op) //op=0时画线,=1是擦线
{
/*****DDA数值微分算法*****/
int x;
unsigned char y;
if(X2!=X4)    //画斜线
{
  float dx,dy,y,k;
  dx=X4-X2;dy=Y4-Y2;
  k=dy/dx;y=Y2;
  for(x=X2;x<X4;x++)
   {
    draw_pix((unsigned char)x, (unsigned char)(y+0.5),op);
    y=y+k;
   }
}
else      //画下垂线
{
  if(Y2>Y4)
   {
    for(y=Y4;y<Y2+1;y++)
     draw_pix(X2,y,op);
   }
  else
   {
    for(y=Y2;y<Y4+1;y++)
    draw_pix(X2,y,op);
   }
}

本科生在公司实习,代码太大要压缩,不然塞不进去。
这个是直接从网上荡下来的,在8位单片机里占了1k多空间,比其他的函数大好多。想请问能怎么改进才小一点???
还有跟类型有关吗?那几个float影响的是时间复杂度还是空间复杂度?我试了int型,好像没变化。。。

相关帖子

沙发
hgjinwei| | 2010-11-19 18:24 | 只看该作者
/*
*****************************************************************************************************
*
* Description   : 绘制一条普通直线
*
* Arguments     : x0,y0 - 直线坐标点1
*                 x1,y1 - 直线坐标点2
*                 col   - 直线颜色  
*
* Returns       : 1 - 未绘制完
*                 0 - 绘制完成  
*
* Note          :
*
*****************************************************************************************************
*/
#define swap(typ,a,b)   do{typ swp = a; a = b; b = swp;}while(0)
typedef uint8   LCD_COL;                    /* 颜色变量                                             */
typedef uint8   LCD_COO;                    /* 坐标变量                                             */
uint8 GUI_putLine(LCD_COO x0,LCD_COO y0,LCD_COO x1,LCD_COO y1,LCD_COL col)
{
    sint8   dp;
    uint8   db;
    LCD_COO dx,dy;

    if(x0 > x1){
        swap(LCD_COO,x0,x1);
        swap(LCD_COO,y0,y1);
    }

    if(y0 > y1){
        dy = y0 - y1;
                dp = -1;
    }else{
        dy = y1 - y0;
                dp = 1;
    }

    db = 0;
        dx = x1-x0;

    do{
        db += dy;
        do{
            if(db > dx){      
                                y0 +=  dp;
                                db -= (dx+1);
                        }
                        if(1 == LCD_putPixel(x0,y0,col)){
                return(1);
            }
        }while(db > dx);
    }while(++x0 <= x1);

    return(0);
}


提供一个纯粹整数处理的,以前测试过可行,后来不知有没有改过。

使用特权

评论回复
板凳
nicker88|  楼主 | 2010-11-19 18:31 | 只看该作者
不是能不能实现的问题,我的那个是能实现的,就是太大了,画圆画矩形只要0.5K,但是线要1k???

使用特权

评论回复
地板
nicker88|  楼主 | 2010-11-24 22:26 | 只看该作者
直接用Breshenham

使用特权

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

本版积分规则

0

主题

98

帖子

1

粉丝