walnutcy

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

0
阅读(3385)

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

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

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

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

Baidu
map