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

📄 3dgraphics7.c

📁 计算机图形学
💻 C
📖 第 1 页 / 共 5 页
字号:
  {
    if(d<=0)
       d = d + 4 * squrareb * (2 * (x - x0) + 3);
    else
       {
         d = d + 4 * squrareb * (2 * (x - x0) + 3)-8 * squrarea * ((y - y0) - 1);
         y--;
       }
    x++;
    EllipsePoints_3DXY_XhuanZhuan(A,x,y,color,q,i,j,k,flag,B,qx,qy,qz);
  }

  /* 生成下半部椭圆*/
  x = x0 + a;
  y = y0;
  d = 4 * (squrarea - squrareb * a) + squrareb;
  EllipsePoints_3DXY_XhuanZhuan(A,x,y,color,q,i,j,k,flag,B,qx,qy,qz);
  while((y-y0) < yP)
  {
    if(d<=0)
       d = d + 4 * squrarea * (2 * (y - y0) + 3);
    else
       {
         d = d + 4 * squrarea * (2 * (y - y0) + 3)-8 * squrareb * ((x - x0) - 1);
         x--;
       }
     y++;
   EllipsePoints_3DXY_XhuanZhuan(A,x,y,color,q,i,j,k,flag,B,qx,qy,qz);
  }
}
/***************************/
/**                       **/
/**    圆柱的算法         **/
/**                       **/
/***************************/
void YuanZhu3D(Point3D A,int r,int h,Point3D B,float qx,float qy,float qz)
{
   Point3D T;
   T.x = A.x; T.y = A.y; T.z = A.z -h/2.0;
   while(T.z <= A.z + h/2.0)
   {
     Yuan_3DXY(T,r,6,B,qx,qy,qz);
     T.z++;
   }

   while(r>=0)
   {
      Yuan_3DXY(T,r,2,B,qx,qy,qz);
      r--;
   }
}

/******************************************/
/**                                      **/
/**   长方体的算法(包含隐藏面的消隐算法) **/
/**                                      **/
/******************************************/
void Cft3D(Point3D A,int a,int b,int h,Point3D B,float qx,float qy,float qz)
{
   int X,Y,Z,i,j;
   Point3D B1,B2,B3,B4,B5,B6;
   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);
             break;

    case'2': Rect_3DXZ(B2,b,h,12,B,qx,qy,qz);
             break;

    case'3': Rect_3DYZ(B3,a,h,4,B,qx,qy,qz);
             break;

    case'4': Rect_3DXZ(B4,b,h,12,B,qx,qy,qz);
             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 Cft3D_XuanZhuan(Point3D A,int a,int b,int h,float q,Point3D D,int flag,Point3D B,float qx,float qy,float qz)
{
   int X,Y,Z,i,j;
   Depth dp[6],temp;
   Point3D B1,B2,B3,B4,B5,B6;

   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;
   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 = '1'; dp[0].d = Z;          /*第 1 面的深度*/

    X = B2.x; Y = B2.y; Z = B2.z;
    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 = '2'; dp[1].d = Z;          /*第 2 面的深度*/

    X = B3.x; Y = B3.y; Z = B3.z;
    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 = '3'; dp[2].d = Z;          /*第 3 面的深度*/


   X = B4.x; Y = B4.y; Z = B4.z;
   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 = '4'; dp[3].d = Z;          /*第 4 面的深度*/


   X = B5.x; Y = B5.y; Z = B5.z;
   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 = '5'; dp[4].d = Z;          /*第 5 面的深度*/

   X = B6.x; Y = B6.y; Z = B6.z;
   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 = '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_XuanZhuan(B1,a,h,4,q,D,flag,B,qx,qy,qz);
               break;

      case'2': Rect_3DXZ_XuanZhuan(B2,b,h,12,q,D,flag,B,qx,qy,qz);
               break;

      case'3': Rect_3DYZ_XuanZhuan(B3,a,h,4,q,D,flag,B,qx,qy,qz);
               break;

      case'4': Rect_3DXZ_XuanZhuan(B4,b,h,12,q,D,flag,B,qx,qy,qz);
               break;

      case'5': Rect_3DXY_XuanZhuan(B5,a,b,1,q,D,flag,B,qx,qy,qz);
               break;

      case'6': Rect_3DXY_XuanZhuan(B6,a,b,1,q,D,flag,B,qx,qy,qz);
               break;
     }
  }
}

/***************************************/
/***                                 ***/
/***      常见的实物实体画法         ***/
/***                                 ***/
/***************************************/


/*****************************/
/**    栏杆(平行于X轴)      **/
/*****************************/
void LanGan_X(Point3D A,int L,int h,Point3D BB,float qx,float qy,float qz)
{
  int X,Y,Z,i,j;
  Point3D B;
  Depth dp[7],temp;

  X = A.x - L/2.0; Y = A.y; Z = A.z;    /*五条竖线的深度*/
     Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
  dp[0].s = 'A'; dp[0].d = Z;

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

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

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

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

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


  case'A': B.x = A.x - L/2.0; B.y = A.y; B.z = A.z;  /*四条竖线*/
           Cft3D(B,15,15,h + 40,BB,qx,qy,qz);
           break;

  case'B': B.x = A.x - L/2.0 + L/4.0; B.y = A.y; B.z = A.z;
           Cft3D(B,15,15,h - 15,BB,qx,qy,qz);
           break;

  case'C': B.x = A.x - L/2.0 + L/2.0; B.y = A.y; B.z = A.z;
           Cft3D(B,15,15,h - 15,BB,qx,qy,qz);
           break;

  case'D': B.x = A.x - L/2.0 + 3*L/4.0; B.y = A.y; B.z = A.z;
           Cft3D(B,15,15,h - 15,BB,qx,qy,qz);
           break;

  case'E': B.x = A.x - L/2.0 + L; B.y = A.y; B.z = A.z;
           Cft3D(B,15,15,h + 40,BB,qx,qy,qz);
           break;


   }
  }

  B.x = A.x; B.y = A.y; B.z = A.z + h/2.0;        /*两条横线*/
           Cft3D(B,15,L - 15,15,BB,qx,qy,qz);


  B.x = A.x; B.y = A.y; B.z = A.z - h/2.0;
           Cft3D(B,15,L - 15,15,BB,qx,qy,qz);

}

/*****************************/
/**    栏杆(平行于Y轴)      **/
/*****************************/
void LanGan_Y(Point3D A,int L,int h,Point3D BB,float qx,float qy,float qz)
{
  int X,Y,Z,i,j;
  Point3D B;
  Depth dp[7],temp;

  X = A.x - L/2.0; Y = A.y; Z = A.z;    /*五条竖线的深度*/
     Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
  dp[0].s = 'A'; dp[0].d = Z;

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

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

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

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


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


  case'A': B.x = A.x; B.y = A.y - L/2.0; B.z = A.z;  /*四条竖线*/
           Cft3D(B,15,15,h +40,BB,qx,qy,qz);
           break;

  case'B': B.x = A.x; B.y = A.y - L/2.0 + L/4.0; B.z = A.z;
           Cft3D(B,15,15,h - 15,BB,qx,qy,qz);
           break;

  case'C': B.x = A.x ; B.y = A.y- L/2.0 + L/2.0; B.z = A.z;
           Cft3D(B,15,15,h - 15,BB,qx,qy,qz);
           break;

  case'D': B.x = A.x ; B.y = A.y- L/2.0 + 3*L/4.0; B.z = A.z;
           Cft3D(B,15,15,h - 15,BB,qx,qy,qz);
           break;

  case'E': B.x = A.x ; B.y = A.y- L/2.0 + L; B.z = A.z;
           Cft3D(B,15,15,h + 40,BB,qx,qy,qz);
           break;


   }
  }
    B.x = A.x; B.y = A.y; B.z = A.z + h/2.0;
           Cft3D(B,L - 15,15,15,BB,qx,qy,qz);


    B.x = A.x; B.y = A.y; B.z = A.z - h/2.0;
           Cft3D(B,L - 15,15,15,BB,qx,qy,qz);


}





/*****************************/
/**          树             **/
/*****************************/
void Shu(Point3D A,int r,Point3D BB,float qx,float qy,float qz)
{
   int k;
   Point3D B;
   B.x = A.x + r; B.y = A.y; B.z = A.z;
   k=0;
   while(k<360)
   {
     Rect_3DXY_XuanZhuan(B,40,20,7,k,A,3,BB,qx,qy,qz);
     k = k+30;
   }

   B.x = A.x; B.y = A.y; B.z = A.z + 50; /* 树干 */
   YuanZhu3D(B,15,100,BB,qx,qy,qz);

   B.x = A.x; B.y = A.y; B.z = A.z + 15;
   k = 15;
   while(B.z>=A.z)
   {
       if((int)B.z%2==0)
          Yuan_3DXY(B,k,2,BB,qx,qy,qz);
       else
          Yuan_3DXY(B,k,4,BB,qx,qy,qz);
       B.z--;
       k = k + 1;
   }



   B.x = A.x; B.y = A.y; B.z = A.z + 100; /*树叶*/
   k=80;
   while(k>=0)
   {
       Yuan_3DXY(B,k--,8,BB,qx,qy,qz);
   }

   k=100;            /*树叶1*/
   while(k>=0)
   {
      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--;

   }

   B.x = A.x; B.y = A.y; B.z = A.z + 200;
   k=80;
   while(k>=0)
   {
       Yuan_3DXY(B,k--,8,BB,qx,qy,qz);
   }

   k=80;            /*树叶2*/
   while(k>=0)

⌨️ 快捷键说明

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