qgraph.c
来自「redboy for gba 是BPNS为GBA编写的一个小软件。软件的邹形是B」· C语言 代码 · 共 260 行
C
260 行
#include <CsAgb.h>
#include <rb_stdio.h>
#include <timer.h>
#include <rbasic.h>
const u8 cir_dat[]={
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,
0xFD,0xFD,0xFD,0xFD,0xFD,0xFD,0xFD,0xFD,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFB,0xFB,
0xFB,0xFB,0xFB,0xFA,0xFA,0xFA,0xFA,0xFA,0xF9,0xF9,0xF9,0xF9,0xF8,0xF8,0xF8,0xF8,
0xF7,0xF7,0xF7,0xF7,0xF6,0xF6,0xF6,0xF5,0xF5,0xF5,0xF5,0xF4,0xF4,0xF4,0xF3,0xF3,
0xF3,0xF2,0xF2,0xF2,0xF1,0xF1,0xF1,0xF0,0xF0,0xF0,0xEF,0xEF,0xEE,0xEE,0xEE,0xED,
0xED,0xEC,0xEC,0xEC,0xEB,0xEB,0xEA,0xEA,0xE9,0xE9,0xE9,0xE8,0xE8,0xE7,0xE7,0xE6,
0xE6,0xE5,0xE5,0xE4,0xE4,0xE3,0xE3,0xE2,0xE2,0xE1,0xE1,0xE0,0xDF,0xDF,0xDE,0xDE,
0xDD,0xDD,0xDC,0xDB,0xDB,0xDA,0xDA,0xD9,0xD8,0xD8,0xD7,0xD6,0xD6,0xD5,0xD5,0xD4,
0xD3,0xD2,0xD2,0xD1,0xD0,0xD0,0xCF,0xCE,0xCD,0xCD,0xCC,0xCB,0xCA,0xCA,0xC9,0xC8,
0xC7,0xC7,0xC6,0xC5,0xC4,0xC3,0xC2,0xC2,0xC1,0xC0,0xBF,0xBE,0xBD,0xBC,0xBB,0xBA,
0xB9,0xB8,0xB7,0xB7,0xB6,0xB5,0xB4,0xB3,0xB1,0xB0,0xAF,0xAE,0xAD,0xAC,0xAB,0xAA,
0xA9,0xA8,0xA7,0xA5,0xA4,0xA3,0xA2,0xA1,0x9F,0x9E,0x9D,0x9B,0x9A,0x99,0x97,0x96,
0x95,0x93,0x92,0x90,0x8F,0x8E,0x8C,0x8A,0x89,0x87,0x86,0x84,0x82,0x81,0x7F,0x7D,
0x7B,0x7A,0x78,0x76,0x74,0x72,0x70,0x6E,0x6C,0x6A,0x67,0x65,0x63,0x60,0x5E,0x5B,
0x59,0x56,0x53,0x50,0x4D,0x4A,0x46,0x43,0x3F,0x3B,0x37,0x32,0x2D,0x27,0x1F,0x16
};//绘圆数据
void Q_line(u8 xp,u8 yp,u8 len,u16 color)
{
DmaClear(3,color,mVRAM+240*yp+xp,2*len,16);
}
void Q_circle2(u8 xp,u8 yp,u8 b,u8 a,u16 color,u8 mod)//绘椭圆
{
int xsp,ysp,yod=500;
int i;
u16 bg[240];
u16 loc,size;
if (mod)
{
DmaClear(3,color,bg,480,16);
for (i=0;i<256;i++)
{
ysp=(i*b)>>8;
xsp=(cir_dat[i]*a)>>8;
if (ysp==yod) continue;
yod=ysp;
if (yp>=ysp)
{
if (xp<xsp)
{
size=xsp+xp+1;
DmaCopy(2,bg,mVRAM+240*(yp-ysp),2*(size>240?240:size),16);
}
else
{
size=xsp*2+1;
size=size+xp-xsp>240?240-(xp-xsp):size;
DmaCopy(2,bg,mVRAM+240*(yp-ysp)+xp-xsp,2*size,16);
}
}
if (yp+ysp<159)
{
if (xp<xsp)
{
size=xsp+xp+1;
DmaCopy(2,bg,mVRAM+240*(yp+ysp),2*(size>240?240:size),16);
}
else
{
size=xsp*2+1;
size=size+xp-xsp>240?240-(xp-xsp):size;
DmaCopy(2,bg,mVRAM+240*(yp+ysp)+xp-xsp,2*size,16);
}
}
}
}
else
{
for (i=0;i<256;i++)
{
xsp=(cir_dat[i]*a)>>8;
ysp=(i*b)>>8;
if (yp>=ysp && xp+xsp<240) *(mVRAM+240*(yp-ysp)+xp+xsp)=color;
if (yp>=ysp && xp>=xsp) *(mVRAM+240*(yp-ysp)+xp-xsp)=color;
if (ysp+yp<160 && xp+xsp<240) *(mVRAM+240*(yp+ysp)+xp+xsp)=color;
if (yp+ysp<160 && xp>=xsp) *(mVRAM+240*(yp+ysp)+xp-xsp)=color;
}
xsp=(cir_dat[253]*a)>>8;
ysp=(b*253)>>8;
if (xp<xsp)
{
size=xsp+xp+1;
if (yp>=ysp) DmaClear(3,color,mVRAM+240*(yp-ysp),2*(size>240?240:size),16);
if (yp+ysp<160) DmaClear(3,color,mVRAM+240*(yp+ysp),2*(size>240?240:size),16);
}
else
{
size=xsp*2+1;
size=size+xp-xsp>240?240-(xp-xsp):size;
if (yp+ysp<160) DmaClear(3,color,mVRAM+240*(yp+ysp)+xp-xsp,2*size,16);
if (yp>=ysp) DmaClear(3,color,mVRAM+240*(yp-ysp)+xp-xsp,2*size,16);
}
}
}
void Q_circle_3(u8 xp,u8 yp,u8 b,u8 a,u16 color,u8 mod)//绘园
{
u8 xsp[256];
u8 ysp;
int i,j,left,right,loc,step;
//for (i=0;i<256;i++) xp[i]=0;
for (i=255;i>=0;i--)
{
ysp=(i*b)>>8;
xsp[ysp]=(cir_dat[i]*a)>>8;
}
ysp=(255*b)>>8;
for (i=0;i<=ysp;i++)
{
if (i>yp) break;
left=(int)(xp-xsp[i]);
if (left<0) left=0;
right=(int)(xp+xsp[i]);
if (right>239) right=239;
loc=240*(yp-i)+left;
step=right-left+1;
for (j=0;j<step;j++)
{
switch(mod)
{
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++;
}
}
for (i=1;i<=ysp;i++)
{
loc=yp+i;
if (loc>159) break;
left=(int)(xp-xsp[i]);
if (left<0) left=0;
right=(int)(xp+xsp[i]);
if (right>239) right=239;
loc=240*loc+left;
step=right-left+1;
for (j=0;j<step;j++)
{
switch(mod)
{
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++;
}
}
}
void Q_circle(u8 xp,u8 yp,u8 r,u16 color,u8 mod)//绘圆
{
if (mod<2) Q_circle2(xp,yp,r,r,color,mod);
else Q_circle_3(xp,yp,r,r,color,mod);
}
void Q_ellipse(u8 xp,u8 yp,u8 b,u8 a,u16 color,u8 mod)//绘椭圆
{
if (mod<2) Q_circle2(xp,yp,b,a,color,mod);
else Q_circle_3(xp,yp,b,a,color,mod);
}
void Q_box(u8 xp,u8 yp,u8 xp1,u8 yp1,u16 color)//绘矩形
{
u32 i,loc;
u32 size;
if (xp>xp1) {i=xp;xp=xp1;xp1=i;}
if (yp>yp1) {i=yp;yp=yp1;yp1=i;}
if (xp1>239) xp1=239;
if (xp>239) xp=239;
if (yp1>159) yp1=159;
loc=240*yp+xp;
size=(xp1-xp+1)<<1;
for (i=yp;i<=yp1;i++)
{
DmaClear(3,color,mVRAM+loc,size,16);
loc=loc+240;
DmaWait(3);
}
}
void mov_scr(u8 xp,u8 yp,u8 xsp,u8 ysp,u8 step,u8 dre)
{
int i;
u16 size;
u16 *temp;
if (xp>239 || yp>159 || xsp>239 || ysp>159) return;
if (xp>xsp) {i=xp;xp=xsp;xsp=i;}
if (yp>ysp) {i=yp;yp=ysp;ysp=i;}
if (dre==1)//向上移动
{
size=2*(xsp-xp+1);
for (i=0;i<=ysp-yp;i++)
if (yp+i>=step) DmaCopy(2,mVRAM+240*(yp+i)+xp,mVRAM+240*(yp+i-step)+xp,size,16);
}
else if(dre==2)//向下移动
{
if (ysp-yp<step) return;
size=2*(xsp-xp+1);
for(i=ysp;i>=yp;i--)
if (i+step<160) DmaCopy(2,mVRAM+240*i+xp,mVRAM+240*(step+i)+xp,size,16);
}
else if(dre==3)//向左移
{
if (xsp<step) return;
if (xp<step)
{
size=(xsp-step+1)*2;
for (i=yp;i<=ysp;i++)
DmaCopy(2,mVRAM+240*i+step,mVRAM+240*i,size,16);
}
else
{
size=(xsp-xp+1)*2;
for(i=yp;i<=ysp;i++)
DmaCopy(2,mVRAM+240*i+xp,mVRAM+240*i+xp-step,size,16);
}
}
else if(dre==4)//向右移动
{
if (xp+step>239) return;
if (xsp+step>239) size=2*(240-xp-step);
else size=2*(xsp-xp+1);
temp=(u16 *)malloc(size);
if (temp==NULL) return;
for (i=yp;i<=ysp;i++)
{
DmaCopy(2,mVRAM+240*i+xp,temp,size,16);
DmaCopy(3,temp,mVRAM+240*i+xp+step,size,16);
}
free(temp);
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?