walnutcy

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

0
阅读(3405)

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

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

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

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);
}