#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <error.h>
#include <unistd.h>
#include <sys/mman.h>
#include <linux/input.h>
#include<stdlib.h>
#include <string.h>
int lcd_fd = -1; //帧缓冲文件描述符
int * plcd = NULL; //帧缓冲设备
int r=10;//半径
int sj[][4]; //保存数据 x,y,color ,r
static int color=0x000000; //笔刷颜色
int color2 = 0xffffff; //背景颜色
static int fg=0,fj=0; //静态变量:fg:0:首页;1:画图;2:设置 ;fj:0初始未保存 1:已保存
static int k=0; //存放保存坐标
/*函数声明*/
void show_bmp(char *bmp_name);
//屏幕初始化
void CH_init()
{
int fd = open("/dev/fb0",O_RDWR);
if(fd==-1)
{
perror("open pingmv shibai");
}
lcd_fd = fd;
plcd = mmap(NULL,800*480*4,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);//映射到屏幕
}
//画点函数
void draw_point(int x0, int y0, int color)
{
if (x0 >= 0 && x0 < 800&&y0 >= 0 && y0 < 480 )
{
*(plcd + y0 * 800 + x0) = color;
}
}
//画圆
void draw_circle(int x0,int y0,int r,int color)
{
int a,b;
int di;
a=0;b=r;
di=3-(r<<1); //判断下个点位置的标志
while(a<=b)
{
int i = a,p = b;
while(i>0){
draw_point(x0+b,y0-i,color);
draw_point(x0-i,y0+b,color);
i--;
}
while(p>0){
draw_point(x0-a,y0-p,color);
draw_point(x0-p,y0-a,color);
draw_point(x0+a,y0-p,color);
draw_point(x0-p,y0+a,color);
draw_point(x0+a,y0+p,color);
draw_point(x0+p,y0+a,color);
p--;
}
a++;
//Bresenham算法画圆
if(di<0)di +=4*a+6;
else
{
di+=10+4*(a-b);
b--;
}
}
draw_point(x0,y0,color); //圆心坐标
}//白屏(背景)
//画线
//-----------画线。参数:起始坐标,终点坐标,颜色--------
void draw_line(int x1,int y1,int x2,int y2,int color)
{
int dx,dy,e;
dx=x2-x1;
dy=y2-y1;
if(dx>=0)
{
if(dy >= 0) // dy>=0
{
if(dx>=dy) // 1/8 octant
{
e=dy-dx/2;
while(x1<=x2)
{
draw_circle(x1,y1,r,color);
if(e>0){y1+=1;e-=dx;}
x1+=1;
e+=dy;
}
}
else // 2/8 octant
{
e=dx-dy/2;
while(y1<=y2)
{
draw_circle(x1,y1,r,color);
if(e>0){x1+=1;e-=dy;}
y1+=1;
e+=dx;
}
}
}
else // dy<0
{
dy=-dy; // dy=abs(dy)
if(dx>=dy) // 8/8 octant
{
e=dy-dx/2;
while(x1<=x2)
{
draw_circle(x1,y1,r,color);
if(e>0){y1-=1;e-=dx;}
x1+=1;
e+=dy;
}
}
else // 7/8 octant
{
e=dx-dy/2;
while(y1>=y2)
{
draw_circle(x1,y1,r,color);
if(e>0){x1+=1;e-=dy;}
y1-=1;
e+=dx;
}
}
}
}
else //dx<0
{
dx=-dx; //dx=abs(dx)
if(dy >= 0) // dy>=0
{
if(dx>=dy) // 4/8 octant
{
e=dy-dx/2;
while(x1>=x2)
{
draw_circle(x1,y1,r,color);
if(e>0){y1+=1;e-=dx;}
x1-=1;
e+=dy;
}
}
else // 3/8 octant
{
e=dx-dy/2;
while(y1<=y2)
{
draw_circle(x1,y1,r,color);
if(e>0){x1-=1;e-=dy;}
y1+=1;
e+=dx;
}
}
}
else // dy<0
{
dy=-dy; // dy=abs(dy)
if(dx>=dy) // 5/8 octant
{
e=dy-dx/2;
while(x1>=x2)
{
draw_circle(x1,y1,r,color);
if(e>0){y1-=1;e-=dx;}
x1-=1;
e+=dy;
}
}
else // 6/8 octant
{
e=dx-dy/2;
while(y1>=y2)
{
draw_circle(x1,y1,r,color);
if(e>0){x1-=1;e-=dy;}
y1-=1;
e+=dx;
}
}
}
}
}
//画线2
void draw_line2(int x1,int y1,int x2,int y2,int r2,int color)
{
int dx,dy,e;
dx=x2-x1;
dy=y2-y1;
if(dx>=0)
{
if(dy >= 0) // dy>=0
{
if(dx>=dy) // 1/8 octant
{
e=dy-dx/2;
while(x1<=x2)
{
draw_circle(x1,y1,r2,color);
if(e>0){y1+=1;e-=dx;}
x1+=1;
e+=dy;
}
}
else // 2/8 octant
{
e=dx-dy/2;
while(y1<=y2)
{
draw_circle(x1,y1,r2,color);
if(e>0){x1+=1;e-=dy;}
y1+=1;
e+=dx;
}
}
}
else // dy<0
{
dy=-dy; // dy=abs(dy)
if(dx>=dy) // 8/8 octant
{
e=dy-dx/2;
while(x1<=x2)
{
draw_circle(x1,y1,r2,color);
if(e>0){y1-=1;e-=dx;}
x1+=1;
e+=dy;
}
}
else // 7/8 octant
{
e=dx-dy/2;
while(y1>=y2)
{
draw_circle(x1,y1,r2,color);
if(e>0){x1+=1;e-=dy;}
y1-=1;
e+=dx;
}
}
}
}
else //dx<0
{
dx=-dx; //dx=abs(dx)
if(dy >= 0) // dy>=0
{
if(dx>=dy) // 4/8 octant
{
e=dy-dx/2;
while(x1>=x2)
{
draw_circle(x1,y1,r2,color);
if(e>0){y1+=1;e-=dx;}
x1-=1;
e+=dy;
}
}
else // 3/8 octant
{
e=dx-dy/2;
while(y1<=y2)
{
draw_circle(x1,y1,r2,color);
if(e>0){x1-=1;e-=dy;}
y1+=1;
e+=dx;
}
}
}
else // dy<0
{
dy=-dy; // dy=abs(dy)
if(dx>=dy) // 5/8 octant
{
e=dy-dx/2;
while(x1>=x2)
{
draw_circle(x1,y1,r2,color);
if(e>0){y1-=1;e-=dx;}
x1-=1;
e+=dy;
}
}
else // 6/8 octant
{
e=dx-dy/2;
while(y1>=y2)
{
draw_circle(x1,y1,r2,color);
if(e>0){x1-=1;e-=dy;}
y1-=1;
e+=dx;
}
}
}
}
}
//背景填色
void chushihua()
{
if(fg==
评论0