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

📄 xuanzhuandewujiaoxing.c

📁 计算机图形学
💻 C
字号:
 #define pi 3.141592
#define MAX(a,b) (a>b)? a:b
#define MIN(a,b) (a<b)? a:b
#include "graphics.h"
#include "math.h"
struct edge {
        int ymax;
        float x;
        float  delat;
        struct edge * pedge; };

struct point{
            float x;
            int y;} ;
            
struct point pot[20];
struct et {  struct edge * pedge;
             int n;};

struct edge g_aet[20];
struct edge   dge[20];
struct et   g_et[20];
struct point point1,point2;    


int ZUO(float x)
{ if((int)x==x)
   return (int)x;
  return (int)x+1;
}
int YOU(float x)
{ if((int)x==x)
   return (int)x-1;
   return (int)x;
}

int k=400,l=0;
int o=0;

void init()
{int i;
for(i=0;i<=19;i++)
   {  g_aet[i].ymax=0; g_aet[i].x=0; g_aet[i].delat=0;
      g_aet[i].pedge=0;
      g_et[i].pedge=0;g_et[i].n=0;
      dge[i].ymax=0;
      dge[i].x=0;
      dge[i].delat=0;
      dge[i].pedge=0;
      pot[i].x=0;
      pot[i].y=0;}
}

void draw(int color,int x,int y)
{      

   int i,t,j,a,c,p,z; float b;
   struct edge temp;


  /**/for(i=k;i<=l;i++)
    {

        a=0;

         for(t=0;t<=19;t++)
           { if(g_et[t].n==i) break;}

        for(j=0;j<=19;j++)
           { if(g_aet[j].ymax==0) break;}


        if(t!=20){ g_aet[j].ymax=g_et[t].pedge->ymax;
                  g_aet[j].x=g_et[t].pedge->x;
                  g_aet[j].delat=g_et[t].pedge->delat;




            if(g_et[t].pedge->pedge!=0)
              {
                    g_aet[j+1].ymax=g_et[t].pedge->pedge->ymax;
                  g_aet[j+1].x=g_et[t].pedge->pedge->x;
                  g_aet[j+1].delat=g_et[t].pedge->pedge->delat;

            if(g_et[t].pedge->pedge->pedge!=0)
            {
                  g_aet[j+2].ymax=g_et[t].pedge->pedge->pedge->ymax;
                  g_aet[j+2].x=g_et[t].pedge->pedge->pedge->x;
                  g_aet[j+2].delat=g_et[t].pedge->pedge->pedge->delat;
            if(g_et[t].pedge->pedge->pedge->pedge!=0)
            {
                  g_aet[j+3].ymax=g_et[t].pedge->pedge->pedge->pedge->ymax;
                  g_aet[j+3].x=g_et[t].pedge->pedge->pedge->pedge->x;
                  g_aet[j+3].delat=g_et[t].pedge->pedge->pedge->pedge->delat;   }

             }
             }
            }

        for(j=0;j<=19;j++)
           { if(g_aet[j].ymax==0) break; }
               j--;

         for(t=0;t<=j;t++)

         {  for(z=0;z<=j-1;z++)

           {
            if(g_aet[z].x>g_aet[z+1].x)

             { temp.ymax=g_aet[z].ymax;
              temp.x=g_aet[z].x;
              temp.delat=g_aet[z].delat;
              g_aet[z].ymax=g_aet[z+1].ymax;
              g_aet[z].x=g_aet[z+1].x;
              g_aet[z].delat=g_aet[z+1].delat;
              g_aet[z+1].ymax=temp.ymax;
              g_aet[z+1].x=temp.x;
              g_aet[z+1].delat=temp.delat;
              }
             }
            }



         for(j=0;j<=19;j++)
           { if(g_aet[j].ymax==0) break; }
               j--;
     for(p=0;p<=j;p++)
       { a++;
         if(a%2!=0)b=g_aet[p].x;
         else
         {

           for(c=ZUO(b);c<=YOU(g_aet[p].x);c++)

          putpixel(c+x,i+y,color);}


       }

      for(t=0;t<=j;t++)
       {  if(g_aet[t].ymax==(i+1))
           {  g_aet[t].ymax=0;
           g_aet[t].x=0;
           g_aet[t].delat=0;
          }
         g_aet[t].x+=g_aet[t].delat;
       }



        for(t=0;t<=j;t++)

         {  for(z=0;z<=j-1;z++)

           {
            if(g_aet[z].x<g_aet[z+1].x)

             { temp.ymax=g_aet[z].ymax;
              temp.x=g_aet[z].x;
              temp.delat=g_aet[z].delat;
              g_aet[z].ymax=g_aet[z+1].ymax;
              g_aet[z].x=g_aet[z+1].x;
              g_aet[z].delat=g_aet[z+1].delat;
              g_aet[z+1].ymax=temp.ymax;
              g_aet[z+1].x=temp.x;
              g_aet[z+1].delat=temp.delat;
              }
             }
            }
}
}


void generate(struct point * pot)
{

int i,y,n=1,m,q,p,h;float x;

 for(h=0;h<=19;h++)
   { if(pot[h].x==0) break;}
         h--;

for(i=0;i<=h;i++)
  {

  if(n==1)
   {   point2.x=point1.x=pot[0].x;
       point2.y=point1.y=pot[0].y;
       n++;
   }
         else{     x=pot[i].x;
                y=pot[i].y;


      if(point1.y==y)   { n++; point1.x=x;  point1.y=y;  continue;}

        m=MIN(point1.y,y);

       if(x==point1.x)
             { dge[i-1].delat=0;
               dge[i-1].ymax=MAX(point1.y,y);
               dge[i-1].x=x;
               dge[i-1].pedge=0;

             for(q=0;q<=19;q++)
               { if(g_et[q].n==m) break;}
               if(q==20)
               {

               g_et[i-1].pedge=&dge[i-1];

               g_et[i-1].n=m;

               }
              else
                  {
                   if(g_et[q].pedge->pedge==0)
                          {g_et[q].pedge->pedge=&dge[i-1];
                          g_et[i-1].n=0;}
                   else
                    {  if(g_et[q].pedge->pedge->pedge==0)
                          {g_et[q].pedge->pedge->pedge=&dge[i-1];
                          g_et[i-1].n=0;}

                       else  {
                               { if(g_et[q].pedge->pedge->pedge->pedge==0)
                                  { g_et[q].pedge->pedge->pedge->pedge=&dge[i-1];

                                   g_et[i-1].n=0;}}
                          }}}}
            else
              {

               dge[i-1].delat=(float)(x-point1.x)/(y-point1.y);
               dge[i-1].ymax=MAX(point1.y,y);
               if(point1.y>y) dge[i-1].x=x;
               else {dge[i-1].x=point1.x; }
               dge[i-1].pedge=0;


               for(q=0;q<=19;q++)
               { if(g_et[q].n==m) break;}


                if(q==20)

                   {  g_et[i-1].pedge=&dge[i-1];
                      g_et[i-1].n=m;
                   }


                 else
                  {
                   if(g_et[q].pedge->pedge==0)
                          {g_et[q].pedge->pedge=&dge[i-1];
                          g_et[i-1].n=0;}
                   else
                    { if(g_et[q].pedge->pedge->pedge==0)
                          {g_et[q].pedge->pedge->pedge=&dge[i-1];
                          g_et[i-1].n=0;}

                       else  { { if(g_et[q].pedge->pedge->pedge->pedge==0)
                                    {
                                    g_et[q].pedge->pedge->pedge->pedge= &dge[i-1];

                                     g_et[i-1].n=0;}

                                   }
                       }
                      }
                    }
                 }

          p=MAX(point1.y,y);
          k=MIN(k,m);l=MAX(l,p);
            point1.x=x;
            point1.y=y;

             n++;}

 }
 if(point1.y==point2.y) return;
          else 
          {if(point2.x==point1.x){
           dge[i-1].delat=0;
           dge[i-1].ymax=MAX(point1.y,point2.y);
           dge[i-1].x=point2.x;}
            else 
            { dge[i-1].ymax=MAX(point1.y,point2.y);
             if(point1.y>point2.y) dge[i-1].x=point2.x;
             else {dge[i-1].x=point1.x;}
             dge[i-1].delat=(float)(point2.x-point1.x)/(point2.y-point1.y);
             }
          }


      m=MIN(point1.y,point2.y);
      k=MIN(k,m); l=MAX(l,dge[i-1].ymax);

      for(q=0;q<=19;q++)
               { if(g_et[q].n==m) break;}


                if(q==20)

                   {  g_et[i-1].pedge=&dge[i-1];
                      g_et[i-1].n=m;
                   }


                 else
                  {
                   if(g_et[q].pedge->pedge==0)
                          {g_et[q].pedge->pedge=&dge[i-1];
                          g_et[i-1].n=0;}
                   else
                    {
                     if(g_et[q].pedge->pedge->pedge==0)
                          {g_et[q].pedge->pedge->pedge=&dge[i-1];
                          g_et[i-1].n=0;}

                     else { if(g_et[q].pedge->pedge->pedge->pedge==0)

                       {g_et[q].pedge->pedge->pedge->pedge= &dge[i-1];

                        g_et[i-1].n=0;
                        }
                       }
                    }
                    }


}
void wujiaoxing1(int color,int x,int y)
{
   int i,n=1;

  init();
 for(i=0;i<=9;i++)
  {
   if(n==1)
   {   pot[0].x=50*cos(i*pi/5+o)+200;
       pot[0].y=50*sin(i*pi/5+o)+200;
       n++;
   }
   else
    { if(n%2==0)
           {     pot[i].x=20*cos(i*pi/5+o)+200;
                 pot[i].y=20*sin(i*pi/5+o)+200;
           }
       else
        {    pot[i].x=50*cos(i*pi/5+o)+200;
             pot[i].y=50*sin(i*pi/5+o)+200;
        }
        n++;
       }
}

  generate(pot);
  draw(color,x,y);
}
void fangzi(int color,int x,int y)
{ int i;
   init();
   pot[0].x=225;
   pot[0].y=50;
   pot[1].x=225;
   pot[1].y=80;
   pot[2].x=250;
   pot[2].y=80;
   pot[3].x=200;
   pot[3].y=110;
   pot[4].x=150;
   pot[4].y=80;
   pot[5].x=175;
   pot[5].y=80;
   pot[6].x=175;
   pot[6].y=50;
 generate(pot);draw(color,x,y);
    /*for(i=0;i<=9;i++)


{  printf("%d  %f   %f\n",dge[i].ymax,dge[i].x,dge[i].delat);

      printf("%d\n",g_et[i].n);}*/

}

void che(int color,int x,int y)
{ int i;


   init();
   pot[0].x=5;
   pot[0].y=5;
   pot[1].x=105;
   pot[1].y=5;
   pot[2].x=105;
   pot[2].y=15;
   pot[3].x=75;
   pot[3].y=25;
   pot[4].x=65;
   pot[4].y=35;
   pot[5].x=55;
   pot[5].y=35;
   pot[6].x=45;
   pot[6].y=25;
   pot[7].x=5;
   pot[7].y=15;
generate(pot);draw(color,x,y);

}

void jian(int color,int x,int y)
{ int i;


   init();
   pot[0].x=5;    pot[10].x=5;pot[10].y=15;

    pot[0].y=5;    pot[7].x=5;pot[7].y=15;
   pot[1].x=105;
   pot[1].y=5;     pot[7].x=5;pot[7].y=15;
   pot[2].x=105;
   pot[2].y=15;
   pot[3].x=75;
   pot[3].y=25;
   pot[4].x=65;
   pot[4].y=35;
   pot[5].x=55;
   pot[5].y=35;
   pot[6].x=45;
   pot[6].y=25;
   pot[7].x=5;
   pot[7].y=15;
   pot[8].x=5;
   pot[8].y=15;
   pot[9].x=5;
   pot[9].y=15;
generate(pot);draw(color,x,y);

}void shan(int color, int x ,int y)
{ int i;


   init();
   pot[0].x=50;
   pot[0].y=50;
   pot[1].x=100;
   pot[1].y=100;
   pot[2].x=150;
   pot[2].y=50;
   pot[3].x=200;
   pot[3].y=100;
   pot[4].x=250;
   pot[4].y=50;

  generate(pot);draw(color,x,y);
 }


void wujiaoxing2(int color,int x,int y)
{
   int i,n=1;

  init();
 for(i=0;i<=19;i++)
  {
   if(n==1)
   {   pot[0].x=50*cos(i*pi/5+o)+300;
       pot[0].y=50*sin(i*pi/5+o)+300;
       n++;
   }
   else
    { if(n%2==0)
           {     pot[i].x=20*cos(i*pi/10+o)+300;
                 pot[i].y=20*sin(i*pi/10+o)+300;
           }
       else
        {    pot[i].x=50*cos(i*pi/10+o)+300;
             pot[i].y=50*sin(i*pi/10+o)+300;
        }
        n++;
       }
}

 generate(pot);
  draw(color,x,y);
}

void wujiaoxing3(int color,int x,int y)
{
   int i,n=1;

  init();
 for(i=0;i<=9;i++)
  {
   if(n==1)
   {   pot[0].x=130;
       pot[0].y=200;
       n++;
   }
   else
    { if(n%2==0)
           {     pot[i].x=40*cos(i*pi/5)+100;
                 pot[i].y=40*sin(i*pi/5)+200;
           }
       else
        {    pot[i].x=100*cos(i*pi/5)+100;
             pot[i].y=100*sin(i*pi/5)+200;
        }
        n++;
       }
}
 generate(pot);
  draw(color,x,y);
}

void liubianxing(int color,int x,int y)
{
   int i;

   init();
 for(i=0;i<=5;i++)
  {     pot[i].x=30*cos(o+i*pi/3)+450;
        pot[i].y=30*sin(o+i*pi/3)+250;}

  generate(pot);
  draw(color,x,y);
}
void shibianxing(int color,int x,int y)
{
   int i;

   init();
 for(i=0;i<=11;i++)
  {     pot[i].x=30*cos(i*pi/5)+550;
        pot[i].y=30*sin(i*pi/5)+400;}

  generate(pot);
  draw(color,x,y);
}

void main()
{  int a=1;


int driver=DETECT,mode; int i,x=100,y=0;
 registerbgidriver(EGAVGA_driver);
 initgraph(&driver,&mode,"\\tc");
initgraph(&driver,&mode,"\\tc");


che(3,0,200);shan(3,0,50);
wujiaoxing2(4,0,0); wujiaoxing2(2,250,-140);
while(!kbhit())

{

y=y-10;
x=x+10;o=o+30;


fangzi(5,x,0);

    fangzi(0,x,0);
shibianxing(6,y,0);  shibianxing(0,y,0);

liubianxing(1,0,0); liubianxing(0,0,0);



wujiaoxing1(2,0,0);  wujiaoxing1(0,0,0);

delay(1000);

}
getch();

closegraph();
}


⌨️ 快捷键说明

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