📄 graph.c
字号:
#include <CsAgb.h>
#include <Qgraph.h>
#define mVRAM (u16 *) 0x06000000
typedef struct
{
u8 xp;
u8 yp;
} point;
//几何图形庫
void r_draw(u8 xp,u8 yp,u16 color,u8 mod)//描点
{
u32 loc;
if (xp>239) return;
if (yp>159) return;
loc=240*yp+xp;
switch (mod)
{
case 0:
case 1:
*(mVRAM+loc)=color;
break;
case 2:
*(mVRAM+loc)=*(mVRAM+loc)&color;
break;
case 3:
*(mVRAM+loc)=*(mVRAM+loc)|color;
break;
case 4:
*(mVRAM+loc)=*(mVRAM+loc)^color;
break;
case 5:
*(mVRAM+loc)=~*(mVRAM+loc);
}
}
void r_line(u8 xp,u8 yp,u8 xsp,u8 ysp,u16 color,u8 mod)//直线
{
int dx,dy;
int i,xd,yd,e;
xd=(xsp>xp)?1:-1;
yd=(ysp>yp)?1:-1;
if (xsp==xp) xd=0;
if (ysp==yp) yd=0;
dx=(int)xsp-(int)xp;
dy=(int)ysp-(int)yp;
dx=abs(dx)+1;
dy=abs(dy)+1;
if (dx>dy)//k<1
{
e=0-dx;
for(i=0;i<dx;i++)
{
r_draw(xp,yp,color,mod);
xp+=xd;
e+=(dy<<1);
if (e>=0) {yp+=yd;e-=(dx<<1);}
}
}
else
{
e=0-dy;
for (i=0;i<dy;i++)
{
r_draw(xp,yp,color,mod);
yp+=yd;
e+=(dx<<1);
if (e>=0) {xp+=xd;e-=(dy<<1);}
}
}
}
void r_box(u8 xp,u8 yp,u8 xsp,u8 ysp,u16 color,u8 mod)
//矩形(mod=0矩形框 mod=1 实矩形)
{
int i,j;
u8 temp;
u32 loc;
if (xp>239 || xsp>239) return;
if (yp>159 || ysp>159) return;
if (xsp<xp)
{
temp=xp;
xp=xsp;
xsp=temp;
}
if (ysp<yp)
{
temp=yp;
yp=ysp;
ysp=temp;
}
if (mod==0)
{
r_line(xp,yp,xp,ysp,color,0);
r_line(xsp,yp,xsp,ysp,color,0);
r_line(xp,yp,xsp,yp,color,0);
r_line(xp,ysp,xsp,ysp,color,0);
return;
}
if (mod==1) {Q_box(xp,yp,xsp,ysp,color);return;}
loc=240*yp;
if (mod==2)
for (i=yp;i<=ysp;i++)
{
for (j=xp;j<=xsp;j++) *(mVRAM+loc+j)&=color;
loc+=240;
}
else if(mod==3)
for (i=yp;i<=ysp;i++)
{
for (j=xp;j<=xsp;j++) *(mVRAM+loc+j)|=color;
loc+=240;
}
else if(mod==4)
for (i=yp;i<=ysp;i++)
{
for (j=xp;j<=xsp;j++) *(mVRAM+loc+j)^=color;
loc+=240;
}
else if(mod==5)
for (i=yp;i<=ysp;i++)
{
for (j=xp;j<=xsp;j++) *(mVRAM+loc+j)=~*(mVRAM+loc+j);
loc+=240;
}
}
void r_circle(u8 xp,u8 yp,u8 r,u16 color,u8 mod)
{
Q_circle2(xp,yp,r,r,color,mod);
}
void r_triangle1(u8 xp1,u8 yp1,u8 xp2,u8 yp2,u8 xp3,u8 yp3,u16 color,u8 mod)
{
r_line(xp1,yp1,xp2,yp2,color,mod);
r_line(xp2,yp2,xp3,yp3,color,mod);
r_line(xp3,yp3,xp1,yp1,color,mod);
}
void line_point(u8 xp,u8 yp,u8 xsp,u8 ysp,point *sv)
{
u8 temp;
int i,count=1;
float k;
if (xp==xsp) {sv[0].xp=0;return;}
if (xp>xsp)
{
temp=xp;
xp=xsp;
xsp=temp;
temp=yp;
yp=ysp;
ysp=temp;
}
k=(float)(ysp-yp)/(xsp-xp);
for (i=xp;i<=xsp;i++)
{
sv[count].xp=i;
sv[count].yp=yp+k*(i-xp);
count++;
if (count>240) break;
}
sv[0].xp=count-1;
}
void r_triangle(u8 xp1,u8 yp1,u8 xp2,u8 yp2,u8 xp3,u8 yp3,u16 color,u8 mod)
{
u8 yp[240];
u8 ysp[240];
u8 temp;
int i,j,loc;
point sv[241];
if (mod==0) {r_triangle1(xp1,yp1,xp2,yp2,xp3,yp3,color,0);return;}
for (i=0;i<240;i++)
{
yp[i]=240;
ysp[i]=240;
}
line_point(xp1,yp1,xp2,yp2,sv);
for (i=1;i<=sv[0].xp;i++) yp[sv[i].xp]=sv[i].yp;
line_point(xp2,yp2,xp3,yp3,sv);
for (i=1;i<=sv[0].xp;i++) ysp[sv[i].xp]=sv[i].yp;
line_point(xp1,yp1,xp3,yp3,sv);
for (i=1;i<=sv[0].xp;i++)
{
if (yp[sv[i].xp]==240) yp[sv[i].xp]=sv[i].yp;
else if (yp[sv[i].xp]!=sv[i].yp || ysp[sv[i].xp]==240) ysp[sv[i].xp]=sv[i].yp;
}
for (i=0;i<240;i++)
{
if (yp[i]==240) continue;
if (yp[i]>ysp[i]) {temp=yp[i];yp[i]=ysp[i];ysp[i]=temp;}
loc=yp[i]*240+i;
for (j=yp[i];j<=ysp[i];j++)
{
switch (mod)
{
case 1:
*(mVRAM+loc)=color;
break;
case 2:
*(mVRAM+loc)&=color;
break;
case 3:
*(mVRAM+loc)|=color;
break;
case 4:
*(mVRAM+loc)^=color;
break;
case 5:
*(mVRAM+loc)=~*(mVRAM+loc);
break;
default:
break;
}
loc+=240;
}
}
}
void quadrangle_1(u8 xp1,u8 yp1,u8 xp2,u8 yp2,u8 xp3,u8 yp3,u8 xp4,u8 yp4,u16 color)
{
r_line(xp1,yp1,xp2,yp2,color,0);
r_line(xp2,yp2,xp3,yp3,color,0);
r_line(xp3,yp3,xp4,yp4,color,0);
r_line(xp4,yp4,xp1,yp1,color,0);
}
void quadrangle(u8 xp1,u8 yp1,u8 xp2,u8 yp2,u8 xp3,u8 yp3,u8 xp4,u8 yp4,u16 color,u8 mod)
{
u8 yp[240];
u8 ysp[240];
u8 temp;
int i,j,loc;
point sv[241];
if (mod==0) {quadrangle_1(xp1,yp1,xp2,yp2,xp3,yp3,xp4,yp4,color);return;}
for (i=0;i<240;i++)
{
yp[i]=240;
ysp[i]=240;
}
line_point(xp1,yp1,xp2,yp2,sv);
for (i=1;i<=sv[0].xp;i++) yp[sv[i].xp]=sv[i].yp;
line_point(xp2,yp2,xp3,yp3,sv);
for (i=1;i<=sv[0].xp;i++) ysp[sv[i].xp]=sv[i].yp;
line_point(xp3,yp3,xp4,yp4,sv);
for (i=1;i<=sv[0].xp;i++)
{
if (yp[sv[i].xp]==240) yp[sv[i].xp]=sv[i].yp;
else if (yp[sv[i].xp]!=sv[i].yp || ysp[sv[i].xp]==240) ysp[sv[i].xp]=sv[i].yp;
}
line_point(xp1,yp1,xp4,yp4,sv);
for (i=1;i<=sv[0].xp;i++)
{
if (yp[sv[i].xp]==240) yp[sv[i].xp]=sv[i].yp;
else if (yp[sv[i].xp]!=sv[i].yp || ysp[sv[i].xp]==240) ysp[sv[i].xp]=sv[i].yp;
}
for (i=0;i<240;i++)
{
if (yp[i]==240) continue;
if (yp[i]>ysp[i]) {temp=yp[i];yp[i]=ysp[i];ysp[i]=temp;}
loc=yp[i]*240+i;
for (j=yp[i];j<=ysp[i];j++)
{
switch (mod)
{
case 1:
*(mVRAM+loc)=color;
break;
case 2:
*(mVRAM+loc)&=color;
break;
case 3:
*(mVRAM+loc)|=color;
break;
case 4:
*(mVRAM+loc)^=color;
break;
case 5:
*(mVRAM+loc)=~*(mVRAM+loc);
break;
default:
break;
}
loc+=240;
}
}
}
void MCircle(int r,u16 color)
{
int x=0,y=r,e=1-r;
*(mVRAM+240*y+x)=color;
while (x<y)
{
if (e<0) {e+=2*x+3;x++;}
else
{
e+=2*(x-y)+5;
x++;
y--;
}
*(mVRAM+240*y+x)=color;
}
}
void gtest()
{
Q_box(0,0,239,159,0);
MCircle(50,RGB(30,30,30));
r_circle(120,80,50,RGB(30,30,30),0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -