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

📄 3dgraphics7.c

📁 计算机图形学
💻 C
📖 第 1 页 / 共 5 页
字号:

               }
               C.x = C.x - 20; C.z = B4.z + h/2.0 - 10; m++;
             }

             break;

    case'5': Rect_3DXY(B5,a,b,1,B,qx,qy,qz);
             break;

    case'6': Rect_3DXY(B6,a,b,1,B,qx,qy,qz);
             break;
    }
  }
}

/*****************************/
/**          房子           **/
/*****************************/
void FangZi(Point3D A,int a,int b,int h,Point3D BB,float qx,float qy,float qz)
{
   int X,Y,Z,i,j,d;
   Point3D B,C;
   Depth dp[9],temp;

   X = A.x; Y = A.y; Z = A.z;         /*深度信息初始化*/
    Point3D_2D(&X,&Y,&Z,BB,qx,qy,qz);
   dp[0].s = 'A'; dp[0].d = Z;        /* 长方体的深度*/

   X = A.x + b/2.0 + 30; Y = A.y; Z = A.z;
     Point3D_2D(&X,&Y,&Z,BB,qx,qy,qz);
   dp[1].s = 'B'; dp[1].d = Z;        /*门框的深度*/

   X = A.x + b/2.0 + a/12.0 + 60; Y = A.y - a/6.0; Z = A.z;
     Point3D_2D(&X,&Y,&Z,BB,qx,qy,qz);
   dp[2].s = 'C'; dp[2].d = Z;        /*门1的深度*/

   X = A.x + b/2.0 + a/12.0 + 60; Y = A.y + a/6.0; Z = A.z;
      Point3D_2D(&X,&Y,&Z,BB,qx,qy,qz);
   dp[3].s = 'D'; dp[3].d = Z;        /*门2的深度*/

   X = A.x; Y = A.y + a/2.0; Z = A.z;
      Point3D_2D(&X,&Y,&Z,BB,qx,qy,qz);
   dp[4].s = 'E'; dp[4].d = Z;       /* 窗框1的深度 */

   X = A.x; Y = A.y + a/2.0 + 25; Z = A.z - h/8.0;
       Point3D_2D(&X,&Y,&Z,BB,qx,qy,qz);
   dp[5].s = 'F'; dp[5].d = Z;       /* 窗台1的深度 */

   X = A.x; Y = A.y - a/2.0; Z = A.z;
       Point3D_2D(&X,&Y,&Z,BB,qx,qy,qz);
   dp[6].s = 'H'; dp[6].d = Z;       /* 窗框2的深度 */

   X = A.x; Y = A.y - a/2.0 - 25; Z = A.z - h/8.0;
       Point3D_2D(&X,&Y,&Z,BB,qx,qy,qz);
   dp[7].s = 'I'; dp[7].d = Z;         /* 窗台2的深度 */

   X = A.x; Y = A.y; Z = A.z + h/2.0;
       Point3D_2D(&X,&Y,&Z,BB,qx,qy,qz);
   dp[8].s = 'J'; dp[8].d = Z;         /*房顶的深度*/

    for(i = 0; i <=8; i++)                 /*  深度排序  */
   {
      for(j = i+1;j<=9;j++)
      {
         if(dp[i].d>dp[j].d)
         {
           temp.s = dp[i].s; temp.d = dp[i].d;
           dp[i].s = dp[j].s; dp[i].d = dp[j].d;
           dp[j].s = temp.s; dp[j].d = temp.d;
         }
      }
   }

  i = 0;
  while(i <= 9)      /*画家算法*/
  {
    switch(dp[i++].s)
    {

       case'A': Cft3D(A,a,b,h,BB,qx,qy,qz); /* 长方体 */
                break;

       case'B': B.x = A.x + b/2.0; B.y = A.y; B.z = A.z - h/4.0; /* 画框 */
                Rect_3DYZ(B,a/3.0,h/2.0,15,BB,qx,qy,qz);
                break;

       case'C': B.x = A.x + b/2.0 + a/12.0; B.y = A.y - a/6.0; B.z = A.z - h/4.0; /* 画门1*/
                C.x = A.x + b/2.0; C.y = B.y; C.z = B.z;
                Cft3D_XuanZhuan(B,5,a/6.0,h/2.0,0,C,3,BB,qx,qy,qz);
                break;

       case'D': B.x = A.x + b/2.0 + a/12.0; B.y = A.y + a/6.0; B.z = A.z - h/4.0;  /* 画门2*/
                C.x = A.x + b/2.0; C.y = B.y; C.z = B.z;
                Cft3D_XuanZhuan(B,5,a/6.0,h/2.0,0,C,3,BB,qx,qy,qz);
                break;

       case'E': B.x = A.x; B.y = A.y + a/2.0; B.z = A.z; /* 画窗框1 */
                Rect_3DXZ(B,b/2.0,h/4.0,15,BB,qx,qy,qz);
                Rect_3DXZ(B,5,h/4.0,12,BB,qx,qy,qz); /* 竖线 */
                break;

       case'F': B.x = A.x; B.y = A.y + a/2.0 + 25; B.z = A.z - h/8.0; /* 窗台1*/
                Cft3D(B,50,b/2.0,5,BB,qx,qy,qz);
                break;

       case'H': B.x = A.x; B.y = A.y - a/2.0; B.z = A.z; /* 画窗框2 */
                Rect_3DXZ(B,b/2.0,h/4.0,15,BB,qx,qy,qz);
                Rect_3DXZ(B,5,h/4.0,12,BB,qx,qy,qz); /* 竖线 */
                break;

       case'I': B.x = A.x; B.y = A.y - a/2.0 - 25; B.z = A.z - h/8.0; /* 窗台2*/
                Cft3D(B,50,b/2.0,5,BB,qx,qy,qz);
                break;

       case'J':  B.x = A.x; B.y = A.y; B.z = A.z + h/2.0;/* 房顶 */
                 Rect_3DXY(B,a + 100,b + 100,8,BB,qx,qy,qz);

                 B.x = A.x - b/2.0 - 50; B.y = A.y; B.z = A.z + h/2.0 + (b+100)/4.0;
                 C.x = B.x; C.y = B.y; C.z = A.z + h/2.0;
                 d = (b/2.0 + 50) * 2.0/sqrt(3);
                 Rect_3DYZ_XuanZhuan(B,a + 100,d,9,70,C,2,BB,qx,qy,qz);

                 B.x = A.x + b/2.0 + 50; B.y = A.y; B.z = A.z + h/2.0 + (b+100)/4.0;
                 C.x = B.x; C.y = B.y; C.z = A.z + h/2.0;
                 d = (b/2.0 + 50) * 2.0/sqrt(3);
                 Rect_3DYZ_XuanZhuan(B,a + 100,d,9,-70,C,2,BB,qx,qy,qz);

                                                           /* 瓦*/
                 B.x = A.x - b/2.0 - 50; B.y = A.y - a/2.0 - 50; B.z = A.z + h/2.0 + (b+100)/4.0;
                 C.x = B.x; C.y = B.y; C.z = A.z + h/2.0;
                 while(B.y <= A.y + a/2.0 + 50)
                {
                 Rect_3DYZ_XuanZhuan(B,5,d,12,70,C,2,BB,qx,qy,qz);
                 B.y = B.y + 40;
                 C.y = C.y + 40;

                 }

                  B.x = A.x + b/2.0 + 50; B.y = A.y - a/2.0 - 50; B.z = A.z + h/2.0 + (b+100)/4.0;
                  C.x = B.x; C.y = B.y; C.z = A.z + h/2.0;
                  while(B.y <= A.y + a/2.0 + 50)
                    {
                    Rect_3DYZ_XuanZhuan(B,5,d,12,-70,C,2,BB,qx,qy,qz);
                    B.y = B.y + 40;
                    C.y = C.y + 40;

                    }
                                                       /* 屋脊 */
                  B.x = A.x; B.y = A.y; B.z = A.z + h/2.0 + 45;
                  Cft3D(B,a + 100,10,10,BB,qx,qy,qz);
                  break;
        }
    }

}


/*****************************/
/**          篮球架         **/
/*****************************/
void LanQiuJia1(Point3D A,int h,Point3D B,float qx,float qy,float qz)
{
  int i,j,k,X,Y,Z;
  Point3D T,C;
  Depth dp[13],temp;
  Cft3D(A,100,100,50,B,qx,qy,qz); /*底台*/

  X = A.x; Y = A.y; Z = A.z + h/2.0 - 50;
      Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
  dp[0].s = 'A'; dp[0].d = Z;

  X = A.x + 50; Y = A.y; Z = A.z + h/2.0;
      Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
  dp[1].s = 'B'; dp[1].d = Z;

  X = A.x + 100; Y = A.y - 10; Z = A.z + h/2.0;
      Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
  dp[2].s = 'C'; dp[2].d = Z;

  X = A.x + 100; Y = A.y + 10; Z = A.z + h/2.0;
      Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
  dp[3].s = 'D'; dp[3].d = Z;

  X = A.x + 100; Y = A.y + 10; Z = A.z + h/2.0;
      Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
  dp[4].s = 'E'; dp[4].d = Z;

  X = A.x + 100; Y = A.y - 10; Z = A.z + h/2.0;
      Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
  dp[5].s = 'F'; dp[5].d = Z;

  X = A.x + 25; Y = A.y; Z = A.z + h/2.0;
       Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
  dp[6].s = 'H'; dp[6].d = Z;

  X = A.x + 150; Y = A.y; Z = A.z + h/2.0;
       Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
  dp[7].s = 'I'; dp[7].d = Z;

  X = A.x + 150 + 17; Y = A.y - 5; Z = A.z + h/2.0;
      Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
  dp[8].s = 'J'; dp[8].d = Z;

  X = A.x + 150 + 17; Y = A.y + 5; Z = A.z + h/2.0;
      Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
  dp[9].s = 'K'; dp[9].d = Z;

  X = A.x + 150 + 45; Y = A.y; Z = A.z + h/2.0 - 100;
      Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
  dp[10].s = 'M'; dp[10].d = Z;

  X = A.x + 150 + 45; Y = A.y; Z = A.z + h/2.0;
     Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
  dp[11].s = 'N'; dp[11].d = Z;

  X = A.x + 150 + 7; Y = A.y; Z = A.z + h/2.0;
     Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
  dp[12].s = 'O'; dp[12].d = Z;


   for(i = 0; i <=11; i++)                 /*  深度排序  */
   {
      for(j = i+1;j<=12;j++)
      {
         if(dp[i].d>dp[j].d)
         {
           temp.s = dp[i].s; temp.d = dp[i].d;
           dp[i].s = dp[j].s; dp[i].d = dp[j].d;
           dp[j].s = temp.s; dp[j].d = temp.d;
         }
      }
   }

  i = 0;
  while(i <= 12)      /*画家算法*/
  {
    switch(dp[i++].s)
    {

 case'A': T.x = A.x; T.y = A.y; T.z = A.z + h/2.0;     /*支架*/
          Cft3D(T,15,15,h - 50,B,qx,qy,qz);
          break;


 case'B': T.x = A.x + 50; T.y = A.y; T.z = A.z + h + 25;          /*3个横木*/
          Cft3D(T,120,15,15,B,qx,qy,qz);
          break;

 case'C': T.x = A.x + 100; T.y = A.y - 50; T.z = A.z + h + 20;
          Cft3D(T,15,100,15,B,qx,qy,qz);
          break;

 case'D': T.x = A.x + 100; T.y = A.y + 50; T.z = A.z + h + 20;
          Cft3D(T,15,100,15,B,qx,qy,qz);
          break;

 case'E': T.x = A.x + 100; T.y = A.y + 50; T.z = A.z + h + 20;  /*斜木*/
          C.x = A.x + 50; C.y = T.y; C.z = T.z;
          Cft3D_XuanZhuan(T,15,100,15,-30,C,2,B,qx,qy,qz);
           break;


 case'F': T.x = A.x + 100; T.y = A.y - 50; T.z = A.z + h + 20;
          C.x = A.x + 50; C.y = T.y; C.z = T.z;
          Cft3D_XuanZhuan(T,15,100,15,-30,C,2,B,qx,qy,qz);
          break;

 case'H': T.x = A.x + 25; T.y = A.y; T.z = A.z + h; /*中间的斜木*/
          Cft3D_XuanZhuan(T,15,80,15,-45,T,2,B,qx,qy,qz);
           break;

 case'I': T.x = A.x + 150; T.y = A.y; T.z = A.z + h + 50; /*篮板*/
          Cft3D(T,150,15,150,B,qx,qy,qz);
           break;


 case'J': T.x = A.x + 150 + 17; T.y = A.y - 10; T.z = A.z + h;   /*接木*/
          Cft3D(T,5,20,5,B,qx,qy,qz);

 case'K': T.x = A.x + 150 + 17; T.y = A.y + 10; T.z = A.z + h;
          Cft3D(T,5,20,5,B,qx,qy,qz);
          break;


 case'M': T.x = A.x + 150 + 45; T.y = A.y; T.z = A.z + h;   /*篮网*/
          C.x = T.x + 15; C.y = T.y; C.z = T.z - 20;
          k = 0;
           while(k<360)
            {
             Rect_3DYZ_XuanZhuan(C,1,30,7,k,T,3,B,qx,qy,qz);
             k = k + 30;
            }

            while(T.z>A.z + h - 30)
            {
             Yuan_3DXY(T,20,7,B,qx,qy,qz);
             T.z = T.z - 4;

            }
            break;

 case'N':
         T.x = A.x + 150 + 45; T.y = A.y; T.z = A.z + h;      /*篮框*/
         k = 20;
         while(k>=17)
          {
           Yuan_3DXY(T,k,1,B,qx,qy,qz);
           k--;
          }
          break;



 case'O': T.x = A.x + 150 + 7; T.y = A.y; T.z = A.z + h + 50;  /*大正方框*/
          Rect_3DYZ(T,150,150,15,B,qx,qy,qz);
          Rect_3DYZ(T,140,140,4,B,qx,qy,qz);
          T.x = A.x + 150 + 7; T.y = A.y; T.z = A.z + h + 30; /*小正方框*/
          Rect_3DYZ(T,50,50,15,B,qx,qy,qz);
          Rect_3DYZ(T,40,40,4,B,qx,qy,qz);
          break;
      }

 }
}

void LanQiuJia2(Point3D A,int h,Point3D B,float qx,float qy,float qz)
{
  int i,j,k,X,Y,Z;
  Point3D T,C;
  Depth dp[13],temp;
  Cft3D(A,100,100,50,B,qx,qy,qz); /*底台*/

  X = A.x; Y = A.y; Z = A.z + h/2.0;
      Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
  dp[0].s = 'A'; dp[0].d = Z;

  X = A.x - 50; Y = A.y; Z = A.z + h/2.0 - 50;
      Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
  dp[1].s = 'B'; dp[1].d = Z;

  X = A.x - 100; Y = A.y - 10; Z = A.z + h/2.0;
      Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
  dp[2].s = 'C'; dp[2].d = Z;

  X = A.x - 100; Y = A.y + 10; Z = A.z + h/2.0;
      Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
  dp[3].s = 'D'; dp[3].d = Z;

  X = A.x - 100; Y = A.y + 10; Z = A.z + h/2.0;
      Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
  dp[4].s = 'E'; dp[4].d = Z;

  X = A.x - 100; Y = A.y - 10; Z = A.z + h/2.0;
      Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
  dp[5].s = 'F'; dp[5].d = Z;

  X = A.x - 25; Y = A.y; Z = A.z + h/2.0;
       Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
  dp[6].s = 'H'; dp[6].d = Z;

  X = A.x - 150; Y = A.y; Z = A.z + h/2.0;
       Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
  dp[7].s = 'I'; dp[7].d = Z;

  X = A.x - 150 - 17; Y = A.y - 5; Z = A.z + h/2.0;
      Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
  dp[8].s = 'J'; dp[8].d = Z;

  X = A.x - 150 - 17; Y = A.y + 5; Z = A.z + h/2.0;
      Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
  dp[9].s = 'K'; dp[9].d = Z;

  X = A.x - 150 - 45; Y = A.y; Z = A.z + h/2.0 - 100;
      Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
  dp[10].s = 'M'; dp[10].d = Z;

  X = A.x - 150 - 45; Y = A.y; Z = A.z + h/2.0;
     Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
  dp[11].s = 'N'; dp[11].d = Z;

  X = A.x - 150 - 7; Y = A.y; Z = A.z + h/2.0;
     Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
  dp[12].s = 'O'; dp[12].d = Z;


   for(i = 0; i <=11; i++)                 /*  深度排序  */
   {
      for(j = i+1;j<=12;j++)
      {
         if(dp[i].d>dp[j].d)
         {
           temp.s = dp[i].s; temp.d = dp[i].d;
           dp[i].s = dp[j].s; dp[i].d = dp[j].d;
           dp[j].s = temp.s; dp[j].d = temp.d;
         }
      }
   }

  i = 0;
  while(i <= 12)      /*画家算法*/
  {
    switch(dp[i++].s)
    {

 case'A': T.x = A.x; T.y = A.y; T.z = A.z + h/2.0;     /*支架*/
          Cft3D(T,15,15,h - 50,B,qx,qy,qz);
          break;


 case'B': T.x = A.x - 50; T.y = A.y; T.z = A.z + h + 25;          /*3个横木*/
          Cft3D(T,120,15,15,B,qx,qy,qz);
          break;

 case'C': T.x = A.x - 100; T.y = A.y - 50; T.z = A.z + h + 20;
          Cft3D(T,15,100,15,B,qx,qy,qz);
          break;

 case'D': T.x = A.x - 100; T.y = A.y + 50; T.z = A.z + h + 20;
          Cft3D(T,15,100,15,B,qx,qy,qz);
          break;

 case'E': T.x = A.x - 100; T.y = A.y + 50; T.z = A.z + h + 20;  /*斜木*/
          C.x = A.x - 50; C.y = T.y; C.z = T.z;
          Cft3D_XuanZhuan(T,15,100,15,30,C,2,B,qx,qy,qz);
           break;


 case'F': T.x = A.x - 100; T.y = A.y - 50; T.z = A.z + h + 20;
          C.x = A.x - 50; C.y = T.y; C.z = T.z;
          Cft3D_XuanZhuan(T,15,100,15,30,C,2,B,qx,qy,qz);
          break;

 case'H': T.x = A.x - 25; T.y = A.y; T.z = A.z + h; /*中间的斜木*/
          Cft3D_XuanZhuan(T,15,80,15,45,T,2,B,qx,qy,qz);
           break;

 case'I': T.x = A.x - 150; T.y = A.y; T.z = A.z + h + 50; /*篮板*/
          Cft3D(T,150,15,150,B,qx,qy,qz);
           break;


 case'J': T.x = A.x - 150 - 17; T.y = A.y - 10; T.z = A.z + h;   /*接木*/
          Cft3D(T,5,20,5,B,qx,qy,qz);

 case'K': T.x = A.x - 150 - 17; T.y = A.y + 10; T.z = A.z + h;
          Cft3D(T,5,20,5,B,qx,qy,qz);
          break;


 case'M': T.x = A.x - 150 - 45; T.y = A.y; T.z = A.z + h;   /*篮网*/
          C.x = T.x - 15; C.y = T.y; C.z = T.z - 20;
          k = 0;
           while(k<360)
            {
             Rect_3DYZ_XuanZhuan(C,1,30,7,k,T,3,B,qx,qy,qz);
             k = k + 30;
            }

            while(T.z>A.z + h - 30)
            {
             Yuan_3DXY(T,20,7,B,qx,qy,qz);
             T.z = T.z - 4;

            }
            break;

 case'N':
         T.x = A.x - 150 - 45; T.y = A.y; T.z = A.z + h;      /*篮框*/
         k = 20;
         while(k>=17)
          {
           Yuan_3DXY(T,k,1,B,qx,qy,qz);
           k--;

⌨️ 快捷键说明

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