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

📄 graph.c

📁 可以在嵌入式应用中
💻 C
字号:
#include <CsAgb.h>
#define mVRAM (u16 *) 0x06000000
//几何图形庫
void r_draw(u8 xp,u8 yp,u16 color,u8 mod)//描点
{
   u32 loc;
   xp=xp%240;
   yp=yp%160;
   loc=240*yp+xp;
   if (mod<2) *(mVRAM+loc)=color;
   else if(mod==2) *(mVRAM+loc)=*(mVRAM+loc)&color;
   else if(mod==3) *(mVRAM+loc)=*(mVRAM+loc)|color;
   else if(mod==4) *(mVRAM+loc)=*(mVRAM+loc)^color;
   else if(mod==5) *(mVRAM+loc)=~*(mVRAM+loc);
}

void r_dline(u8 xp,u8 yp,u8 len,u16 color,u8 der,u8 mod)//水平与竖直方向上的直线
{
   u8 i;
   u32 loc;
   if (der)
   {
      for (i=0;i<len;i++)
      {
         loc=240*((yp+i)%160)+xp;
         if (mod<2) *(mVRAM+loc)=color;
         else if(mod==2) *(mVRAM+loc)=*(mVRAM+loc)&color;
         else if(mod==3) *(mVRAM+loc)=*(mVRAM+loc)|color;
         else if(mod==4) *(mVRAM+loc)=*(mVRAM+loc)^color;
         else if(mod==5) *(mVRAM+loc)=~*(mVRAM+loc);
      }
   }
   else
   {
      for (i=0;i<len;i++)
      {
         loc=yp*240+(xp+i)%240;
         if (mod<2) *(mVRAM+loc)=color;
         else if(mod==2) *(mVRAM+loc)=*(mVRAM+loc)&color;
         else if(mod==3) *(mVRAM+loc)=*(mVRAM+loc)|color;
         else if(mod==4) *(mVRAM+loc)=*(mVRAM+loc)^color;
         else if(mod==5) *(mVRAM+loc)=~*(mVRAM+loc);
      }
   }
}

void r_line(u8 xp,u8 yp,u8 xsp,u8 ysp,u16 color,u8 mod)//直线
{
   float k;
   u8 i=xp;
   u8 xd=(xsp>xp?1:-1);
   if (xp==xsp)
   {
      if (ysp<yp) r_dline(xp,ysp,yp-ysp,color,1,mod);
      else r_dline(xp,yp,ysp-yp,color,1,mod);
      return;
   }
   if (yp==ysp)
   {
      if (xsp<xp) r_dline(xsp,yp,xp-xsp,color,0,mod);
      else r_dline(xp,yp,xsp-xp,color,0,mod);
      return;
   }
   k=(float)(ysp-yp)/(xsp-xp);
   if (abs(k)<1.0)
   {
      while (i!=xsp)
      {
         r_draw(i,yp+(i-xp)*k,color,mod);
         i+=xd;
      }
   }
   else
   {
      k=(float)(xsp-xp)/(ysp-yp);
      xd=(ysp>yp?1:-1);
      i=yp;
      while (i!=ysp)
      {
         r_draw(xp+(i-yp)*k,i,color,mod);
         i+=xd;
      }
   }
}

void r_box(u8 xp,u8 yp,u8 xsp,u8 ysp,u16 color,u8 mod)
//矩形(mod=0矩形框 mod=1 实矩形)
{
   u8 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_dline(xp,yp,xsp-xp+1,color,0,0);
      r_dline(xp,yp,ysp-yp+1,color,1,0);
      r_dline(xp,ysp,xsp-xp+1,color,0,0);
      r_dline(xsp,yp,ysp-yp+1,color,1,0);
      return;
   }
   for (i=yp;i<=ysp;i++)
   for (j=xp;j<=xsp;j++)
   {
      loc=i*240+j;
      if (mod==1) *(mVRAM+loc)=color;
      else if(mod==2) *(mVRAM+loc)=*(mVRAM+loc)&color;
      else if(mod==3) *(mVRAM+loc)=*(mVRAM+loc)|color;
      else if(mod==4) *(mVRAM+loc)=*(mVRAM+loc)^color;
      else if(mod==5) *(mVRAM+loc)=~*(mVRAM+loc);
   }
}

void r_circle(u8 xp,u8 yp,u8 r,u16 color,u8 mod)
{
   u8 i;
   if (mod)
   {
      for (i=1;i<r;i++) CS_Circle(&gScreen,xp,yp,i,color);
   }
   CS_Circle(&gScreen,xp,yp,r,color);
}

void r_triangle(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);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -