⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 graph.c

📁 redboy for gba 是BPNS为GBA编写的一个小软件。软件的邹形是BASIC高级语言解释执行器。几经修改和扩展
💻 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 + -