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

📄 3dgraphics7.c

📁 计算机图形学
💻 C
📖 第 1 页 / 共 5 页
字号:
   {
      if(k%2==0)
        Yuan_3DXY(B,k,3,BB,qx,qy,qz);
      else
          Yuan_3DXY(B,k,4,BB,qx,qy,qz);

      B.z = B.z + 2;
      k--;

   }


}



/*****************************/
/**          凳子           **/
/*****************************/
void DengZi_XuanZuan(Point3D A,int a,int b,int h,float q,Point3D DD,int flag,Point3D B,float qx,float qy,float qz)
{
   int X,Y,Z,i,j;
   Point3D D;
   Depth dp[12],temp;
                                              /* 深度初始化*/
   X =  A.x - b/2.0; Y = A.y - a/2.0; Z = A.z + h/2.0;
   XuanZhuan3D_RY(&X,&Y,&Z,q,DD.x,DD.y,DD.z,flag);
      Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
   dp[0].s = 'A'; dp[0].d = Z;


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

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


   X =  A.x + b/2.0; Y = A.y + a/2.0; Z = A.z + h/2.0;
   XuanZhuan3D_RY(&X,&Y,&Z,q,DD.x,DD.y,DD.z,flag);
      Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
   dp[3].s = 'D'; dp[3].d = Z;

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

   X =  A.x + b/2.0; Y = A.y; Z = A.z + h/2.0;
   XuanZhuan3D_RY(&X,&Y,&Z,q,DD.x,DD.y,DD.z,flag);
      Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
   dp[5].s = 'F'; dp[5].d = Z;

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

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

   X = A.x; Y = A.y - a/2.0 + 2*a/5.0; Z = A.z + h;
   XuanZhuan3D_RY(&X,&Y,&Z,q,DD.x,DD.y,DD.z,flag);
        Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
   dp[8].s = 'J'; dp[8].d = Z;

   X = A.x; Y = A.y - a/2.0 + 3*a/5.0; Z = A.z + h;
   XuanZhuan3D_RY(&X,&Y,&Z,q,DD.x,DD.y,DD.z,flag);
        Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
   dp[9].s = 'K'; dp[9].d = Z;

   X = A.x; Y = A.y - a/2.0 + 4*a/5.0; Z = A.z + h;
   XuanZhuan3D_RY(&X,&Y,&Z,q,DD.x,DD.y,DD.z,flag);
        Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
   dp[10].s = 'L'; dp[10].d = Z;

   X = A.x; Y = A.y - a/2.0 + a; Z = A.z + h;
   XuanZhuan3D_RY(&X,&Y,&Z,q,DD.x,DD.y,DD.z,flag);
        Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
   dp[11].s = 'M'; dp[11].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 <= 11)      /*画家算法*/
  {
    switch(dp[i++].s)
    {
    case 'A': D.x = A.x - b/2.0; D.y = A.y - a/2.0; D.z = A.z + h/2.0;  /* 四个脚 */
              Cft3D_XuanZhuan(D,20,20,h+20,q,DD,flag,B,qx,qy,qz);
              break;


    case 'B': D.x = A.x - b/2.0; D.y = A.y + a/2.0; D.z = A.z + h/2.0;
              Cft3D_XuanZhuan(D,20,20,h+20,q,DD,flag,B,qx,qy,qz);
              break;

    case 'C': D.x = A.x + b/2.0; D.y = A.y - a/2.0; D.z = A.z + h/2.0;
              Cft3D_XuanZhuan(D,20,20,h+20,q,DD,flag,B,qx,qy,qz);
              break;


    case 'D': D.x = A.x + b/2.0; D.y = A.y + a/2.0; D.z = A.z + h/2.0;
              Cft3D_XuanZhuan(D,20,20,h+20,q,DD,flag,B,qx,qy,qz);
              break;


    case 'E': D.x = A.x - b/2.0; D.y = A.y; D.z = A.z + h;  /*上面的条木*/
              Cft3D_XuanZhuan(D,a+20,10,10,q,DD,flag,B,qx,qy,qz);
              break;


    case 'F': D.x = A.x + b/2.0; D.y = A.y; D.z = A.z + h;
              Cft3D_XuanZhuan(D,a+20,10,10,q,DD,flag,B,qx,qy,qz);
              break;

    case 'H': D.x = A.x; D.y = A.y - a/2.0; D.z = A.z + h;
              Cft3D_XuanZhuan(D,10,b+20,10,q,DD,flag,B,qx,qy,qz);
              break;

    case 'I': D.x = A.x; D.y = A.y - a/2.0 + a/5.0; D.z = A.z + h;
              Cft3D_XuanZhuan(D,10,b+20,10,q,DD,flag,B,qx,qy,qz);
              break;


    case 'J': D.x = A.x; D.y = A.y - a/2.0 + 2*a/5.0; D.z = A.z + h;
              Cft3D_XuanZhuan(D,10,b+20,10,q,DD,flag,B,qx,qy,qz);
              break;


    case 'K': D.x = A.x; D.y = A.y - a/2.0 + 3*a/5.0; D.z = A.z + h;
              Cft3D_XuanZhuan(D,10,b+20,10,q,DD,flag,B,qx,qy,qz);
              break;

    case 'L': D.x = A.x; D.y = A.y - a/2.0 + 4*a/5.0; D.z = A.z + h;
              Cft3D_XuanZhuan(D,10,b+20,10,q,DD,flag,B,qx,qy,qz);
              break;

    case 'M': D.x = A.x; D.y = A.y - a/2.0 + a; D.z = A.z + h;
              Cft3D_XuanZhuan(D,10,b+20,10,q,DD,flag,B,qx,qy,qz);
              break;

    }
  }
}

/*****************************/
/**    梯子或球场看台       **/
/*****************************/

void TiZi_Y_XuanZhuan(Point3D A,int a,int b,int h,int dd,float q,Point3D D,int flag,Point3D BB,float qx,float qy,float qz)/*0度时平行于负Y轴的梯子,A为直角的中心点*/
{
   int X,Y,Z,k,d,i,j,max;
   Point3D B;
   Depth dp[15],temp;
   k = (float)h/dd; /*台阶个数*/
   d = ((float)a)/((float)k); /*每个梯阶的宽度*/


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


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

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


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

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

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

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

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

   X =  A.x; Y = A.y - a/2.0 - 8*d; Z = A.z + h/2.0;
   XuanZhuan3D_RY(&X,&Y,&Z,q,D.x,D.y,D.z,flag);
        Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
   dp[8].s = 'J'; dp[8].d = Z;

   X =  A.x; Y = A.y - a/2.0 - 9*d; Z = A.z + h/2.0;
   XuanZhuan3D_RY(&X,&Y,&Z,q,D.x,D.y,D.z,flag);
        Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
   dp[9].s = 'K'; dp[9].d = Z;

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

   X =  A.x; Y = A.y - a/2.0 - 11*d; Z = A.z + h/2.0;
   XuanZhuan3D_RY(&X,&Y,&Z,q,D.x,D.y,D.z,flag);
        Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
   dp[11].s = 'M'; dp[11].d = Z;


   for(i = 0; i <=k-2; i++)                 /*  深度排序  */
   {
      for(j = i+1;j<=k-1;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 <= k-1)      /*画家算法*/
  {
    switch(dp[i++].s)
    {
       case'A': B.x = A.x; B.y = A.y - (float)d/2.0; B.z = A.z + h/2.0;
                Cft3D_XuanZhuan(B,d,b,h,q,D,flag,BB,qx,qy,qz);
                break;

       case'B': B.x = A.x; B.y = A.y - (float)d/2.0 - d; B.z = A.z + h/2.0 - dd/2.0;
                Cft3D_XuanZhuan(B,d,b,h-dd,q,D,flag,BB,qx,qy,qz);
                break;

       case'C': B.x = A.x; B.y = A.y - (float)d/2.0 - 2*d; B.z = A.z + h/2.0 - dd;
                Cft3D_XuanZhuan(B,d,b,h-2*dd,q,D,flag,BB,qx,qy,qz);
                break;
       case'D': B.x = A.x; B.y = A.y - (float)d/2.0 - 3*d; B.z = A.z + h/2.0 - 3*dd/2.0;
                Cft3D_XuanZhuan(B,d,b,h-3*dd,q,D,flag,BB,qx,qy,qz);
                break;
       case'E': B.x = A.x; B.y = A.y - (float)d/2.0 - 4*d; B.z = A.z + h/2.0 - 2*dd;
                Cft3D_XuanZhuan(B,d,b,h-4*dd,q,A,flag,BB,qx,qy,qz);
                break;

       case'F': B.x = A.x; B.y = A.y - (float)d/2.0 - 5*d; B.z = A.z + h/2.0 - 5*dd/2.0;
                Cft3D_XuanZhuan(B,d,b,h-5*dd,q,D,flag,BB,qx,qy,qz);
                break;

       case'H': B.x = A.x; B.y = A.y - (float)d/2.0 - 6*d; B.z = A.z + h/2.0 - 3*dd;
                Cft3D_XuanZhuan(B,d,b,h-6*dd,q,D,flag,BB,qx,qy,qz);
                break;

       case'I': B.x = A.x; B.y = A.y - (float)d/2.0 - 7*d; B.z = A.z + h/2.0 - 7*dd/2.0;
                Cft3D_XuanZhuan(B,d,b,h-7*dd,q,D,flag,BB,qx,qy,qz);
                break;

       case'J': B.x = A.x; B.y = A.y - (float)d/2.0 - 8*d; B.z = A.z + h/2.0 - 4*dd;
                Cft3D_XuanZhuan(B,d,b,h-8*dd,q,D,flag,BB,qx,qy,qz);
                break;

       case'K': B.x = A.x; B.y = A.y - (float)d/2.0 - 9*d; B.z = A.z + h/2.0 - 9*dd/2.0;
                Cft3D_XuanZhuan(B,d,b,h-9*dd,q,D,flag,BB,qx,qy,qz);
                break;

       case'L': B.x = A.x; B.y = A.y - (float)d/2.0 - 10*d; B.z = A.z + h/2.0 - 10*dd;
                Cft3D_XuanZhuan(B,d,b,h-10*dd,q,D,flag,BB,qx,qy,qz);
                break;

       case'M': B.x = A.x; B.y = A.y - (float)d/2.0 - 11*d; B.z = A.z + h/2.0 - 11*dd/2.0;
                Cft3D_XuanZhuan(B,d,b,h-11*dd,q,D,flag,BB,qx,qy,qz);
                break;
    }
  }

}


/*****************************/
/**          墙壁           **/
/*****************************/
void QiangBi(Point3D A,int a,int b,int h,Point3D B,float qx,float qy,float qz)
{
   int X,Y,Z,i,j,m,n,p;
   Point3D B1,B2,B3,B4,B5,B6,C;
   Depth dp[6],temp;

   B1.x = A.x + b/2.0; B1.y = A.y;         B1.z = A.z;

   B2.x = A.x;         B2.y = A.y + a/2.0; B2.z = A.z;

   B3.x = A.x - b/2.0; B3.y = A.y;         B3.z = A.z;

   B4.x = A.x;         B4.y = A.y - a/2.0; B4.z = A.z;

   B5.x = A.x;         B5.y = A.y;         B5.z = A.z - h/2.0;

   B6.x = A.x;         B6.y = A.y;         B6.z = A.z + h/2.0;

                                    /*深度信息初始化*/
   X = B1.x; Y = B1.y; Z = B1.z;
        Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
   dp[0].s = '1'; dp[0].d = Z;          /*第 1 面的深度*/

    X = B2.x; Y = B2.y; Z = B2.z;
        Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
   dp[1].s = '2'; dp[1].d = Z;          /*第 2 面的深度*/

    X = B3.x; Y = B3.y; Z = B3.z;
        Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
   dp[2].s = '3'; dp[2].d = Z;          /*第 3 面的深度*/


   X = B4.x; Y = B4.y; Z = B4.z;
        Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
   dp[3].s = '4'; dp[3].d = Z;          /*第 4 面的深度*/


   X = B5.x; Y = B5.y; Z = B5.z;
        Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
   dp[4].s = '5'; dp[4].d = Z;          /*第 5 面的深度*/

   X = B6.x; Y = B6.y; Z = B6.z;
        Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
   dp[5].s = '6'; dp[5].d = Z;          /*第 6 面的深度*/

    for(i = 0; i <=4; i++)                 /*  深度排序  */
   {
      for(j = i+1;j<=5;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 <= 5)      /*画家算法*/
  {
    switch(dp[i++].s)
    {


    case'1': Rect_3DYZ(B1,a,h,4,B,qx,qy,qz);
             C.x = B1.x; C.y = B1.y; C.z = B1.z + h/2.0 - 1;
             while(C.z>=B1.z - h/2.0 + 1)
             {
               Rect_3DYZ(C,a,2,7,B,qx,qy,qz);
               C.z = C.z - 20;

             }

             C.x = B1.x; C.y = B1.y - a/2.0 + 1; C.z = B1.z + h/2.0 - 10;
             m = 0;
             while(C.y<=B1.y + a/2.0 - 1)
             {
               if(m%2==0)
               C.z = C.z - 20;
               while(C.z>=B1.z - h/2.0 + 10)
               {
                 Rect_3DYZ(C,2,20,7,B,qx,qy,qz);
                 C.z = C.z - 40;

               }
               C.y = C.y + 20; C.z = B.z + h/2.0 - 10; m++;
             }

             break;

    case'2': Rect_3DXZ(B2,b,h,12,B,qx,qy,qz);
             C.x = B2.x; C.y = B2.y; C.z = B2.z + h/2.0 - 1;
             while(C.z>=B.z - h/2.0 + 1)
             {
               Rect_3DXZ(C,b,2,7,B,qx,qy,qz);
               C.z = C.z - 20;

             }
             C.x = B2.x+ b/2.0 - 1; C.y = B2.y ; C.z = B.z + h/2.0 - 10;
             m = 0;
             while(C.x>=B2.x - b/2.0 + 1)
             {
               if(m%2==0)
               C.z = C.z - 20;
               while(C.z>=B.z - h/2.0 + 10)
               {
                 Rect_3DYZ(C,2,20,7,B,qx,qy,qz);
                 C.z = C.z - 40;

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

    case'3': Rect_3DYZ(B3,a,h,4,B,qx,qy,qz);
             C.x = B3.x; C.y = B3.y; C.z = B3.z + h/2.0 - 1;
             while(C.z>=B3.z - h/2.0 + 1)
             {
               Rect_3DYZ(C,a,2,7,B,qx,qy,qz);
               C.z = C.z - 20;

             }

             C.x = B3.x; C.y = B3.y - a/2.0 + 1; C.z = B3.z + h/2.0 - 10;
             m = 0;
             while(C.y<=B3.y + a/2.0 - 1)
             {
               if(m%2==0)
               C.z = C.z - 20;
               while(C.z>=B3.z - h/2.0 + 10)
               {
                 Rect_3DYZ(C,2,20,7,B,qx,qy,qz);
                 C.z = C.z - 40;

               }
               C.y = C.y + 20; C.z = B3.z + h/2.0 - 10; m++;
             }


             break;

    case'4': Rect_3DXZ(B4,b,h,12,B,qx,qy,qz);
              C.x = B4.x; C.y = B4.y; C.z = B4.z + h/2.0 - 1;
             while(C.z>=B4.z - h/2.0 + 1)
             {
               Rect_3DXZ(C,b,2,7,B,qx,qy,qz);
               C.z = C.z - 20;

             }
             C.x = B4.x+ b/2.0 - 1; C.y = B4.y ; C.z = B4.z + h/2.0 - 10;
             m = 0;
             while(C.x>=B4.x - b/2.0 + 1)
             {
               if(m%2==0)
               C.z = C.z - 20;
               while(C.z>=B4.z - h/2.0 + 10)
               {
                 Rect_3DYZ(C,2,20,7,B,qx,qy,qz);
                 C.z = C.z - 40;

⌨️ 快捷键说明

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