原创 用VC模拟一个点阵屏 续 --画矢量图 (原创)

2008-12-10 21:56 6220 10 13 分类: MCU/ 嵌入式

在上一讲,我们建立了一个外部环境,并提供了一个屏幕缓冲区,及一个更新屏的接口,这里就加以利用,做做我们想要的东西。


有了屏幕缓冲区,我们就可以在缓冲区随意画我们想的图形了,如矢量图,字库等。


先秀一下我做的东西,转载请注明出处: 青藤门客播报站


点击看大图


要想画矢量图,就需要一个最基本的函数:画点,完整代码如下,


void LCD_PutPixel(int x,int y,char value)
{


 if (x >= LCD_X_MAX)  return ;
 if (y >= LCD_Y_MAX)  return ;


 if (value == 1)
 {
  value = 1<<(7 - x&0x07);
  x = x>>3;
  panelLCDBuffer[y][x] |= value;
 }
 else
 {
  value = 1<<(7 - x&0x07);
  x = x>>3;
  panelLCDBuffer[y][x] &= ~value;
 }
}

画矢量圆,完整代码如下,需要调用math函数。


int LCD_Circle(int x,int y,int r,char flag)
{
 int f,g,x1,y1,i,k;
 if(((x-r)<0)||((x+r)>=LCD_X_MAX)) return(0);
 if(((y-r)<0)||((y+r)>LCD_Y_MAX)) return(0);
 k=(int)((double)(r)/sqrt(2.0)+0.5)-1;
 f=1;
 g=2*(1-r);
 x1=0;
 y1=r;
 for(i=0;i<k+1;++i)
 {
  LCD_PutPixel(x+x1,y+y1,flag);
  LCD_PutPixel(x+y1,y+x1,flag);
  LCD_PutPixel(x-x1,y+y1,flag);
  LCD_PutPixel(x-y1,y+x1,flag);
  LCD_PutPixel(x+x1,y-y1,flag);
  LCD_PutPixel(x+y1,y-x1,flag);
  LCD_PutPixel(x-x1,y-y1,flag);
  LCD_PutPixel(x-y1,y-x1,flag);


  x1=x1+1;
  if((abs(f))>=(abs(g)))
  {
   --y1;
   f=(int)(g+2*x1+3);
   g=(int)(f-2*y1-1);
  }else
  {
   f=(int)(f+2*x1+3);
   g=(int)(f-2*y1+1);
  };
 }
 if(flag)
 {
  LCD_PutPixel(x,y+r,flag);
  LCD_PutPixel(x+r,y,flag);
  LCD_PutPixel(x-r,y,flag);
  LCD_PutPixel(x,y-r,flag);
 }


 return(1);
}


画线函数:


int LCD_Line(int x1,int y1,int x2,int y2,char flag)
{
 double t,x,y,temx,temy;
 int i,L1,L2,k1,k2,LL;


 k1=x2-x1;
 k2=y2-y1;
 L1=abs(k1);
 L2=abs(k2);


 if(!L1 && !L2){
  return 0;
 }


 if(L1>L2)
 {
  t=1.0/(double)L1;
  LL=L1;
 }
 else
 {
  t=1.0/(double)L2;
  LL=L2;
 }


 temx=t*k1;
 temy=t*k2;
 x=x1;
 y=y1;
 for(i=0;i<LL;++i)
 {
  LCD_PutPixel((int)(x),(int)(y),flag);
  x=x+temx;
  y=y+temy;
 }
 return(1);
}


画矩形函数完整代码:


int LCD_Rectangle(int x1,int y1,int x2,int y2,char flag)
{
 if((x1>x2)||(y1>y2))        return(0);
 LCD_Line(x1,y1,x2,y1,flag);
 LCD_Line(x1,y1,x1,y2,flag);
 LCD_Line(x1,y2,x2+1,y2,flag);
 LCD_Line(x2,y1,x2,y2,flag);
 return(1);
}



 

PARTNER CONTENT

文章评论3条评论)

登录后参与讨论

用户1766088 2016-4-12 09:43

评论是对思考最好的总结…

用户377235 2013-4-7 13:58

值得参考!!

用户398703 2010-6-12 18:33

你好 这个程序可以发源码给我吗 我的邮箱:guochuanzhi2001@163.com谢谢!在做图片急用。

xucun915_925777961 2009-9-4 11:38

不错呀,加油!
相关推荐阅读
walnutcy_696810119 2012-11-21 08:37
Linux下使用smartCOM调试串口
在Windows下的串口调试一直使用sscom,在Linux下只找到一个cutecom,用了几次,很不喜欢,就着手开发了一款自己的串口调试工具,smartCOM。 smartCOM介绍:http...
walnutcy_696810119 2012-03-29 18:12
【博客大赛】原创--测量基础:什么是测量
写在正文之前: 适逢EDNChina搞活动,而我本人也算在测量业工作,就一起作下笔记吧。若有错误,请大家一起斧正。笔者写本文一方面是梳理知识,另一方面也希望与大家探讨有关测量的知识、应用等,希...
walnutcy_696810119 2011-12-20 18:29
GLONASS 15年来,首次实现24颗星在轨可用
  EDN的博客改版后,不太好用,在SINA重开一个,不过重点改为关注GNSS行业新闻 http://blog.sina.com.cn/s/blog_7420cd1701012en9....
walnutcy_696810119 2011-12-20 17:49
逆向工程第一步:通信协议分析
工程中常有这样的事,想分析下其他知名公司产品中的通信协议,以便生产设计兼容产品。 1) 逆向工程,首先要了解产品,知己知彼,百战不怠;     去年受命想仿一款GARMIN的导航盒,但无法...
walnutcy_696810119 2011-11-14 11:30
通用代码调试方法 (Keil, VCC)
调试代码一般需要定位问题,这里给出一个解决方案, 一般的编译器均支持这些宏指令。   #define DEBUG_WALT_1113     1 extern void log_t...
EE直播间
更多
我要评论
3
10
关闭 站长推荐上一条 /3 下一条