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

📄 3dgraphics_toushi2.c

📁 计算机图形学
💻 C
📖 第 1 页 / 共 4 页
字号:
       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,dd,qx,qy,qz);
  }
}


/***************************/
/**                       **/
/**   长方体的算法        **/
/**                       **/
/***************************/
void Cft3D(Point3D A,int a,int b,int h,Point3D B,int d,float qx,float qy,float qz)
{

   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;

   if((int)qx%360 < 90 && (int)qx%360 > -90)
      Rect_3DYZ(B1,a,h,12,B,d,qx,qy,qz);

   if((int)(90-qx)%360 < 90 && (int)(90-qx)%360 > -90)
      Rect_3DXZ(B2,b,h,4,B,d,qx,qy,qz);

   if(((int)(180 - abs(qx))%360)<90 && ((int)(180 - abs(qx))%360)>-90)
      Rect_3DYZ(B3,a,h,12,B,d,qx,qy,qz);

   if((int)(90 + qx)%360 <90 && (int)(90 + qx)%360 >-90)
      Rect_3DXZ(B4,b,h,4,B,d,qx,qy,qz);

   if((int)(180 - qz)%360 <90 && (int)(180 - qz)%360 >-90)
      Rect_3DXY(B5,a,b,1,B,d,qx,qy,qz);

   if((int)qz%360 < 90 &&(int)qz%360 >-90)
      Rect_3DXY(B6,a,b,1,B,d,qx,qy,qz);
}

/***************************/
/**                       **/
/**   长方体的旋转        **/
/**                       **/
/***************************/
void Cft3D_XuanZhuan(Point3D A,int a,int b,int h,float q,Point3D D,int flag,Point3D B,int d,float qx,float qy,float qz)
{

   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;


   if(flag == 3)
       qx = qx - q;

   if((int)qx%360 < 90 && (int)qx%360 > -90)
      Rect_3DYZ_XuanZhuan(B1,a,b,12,q,D,flag,B,d,qx,qy,qz);

   if((int)(90-qx)%360 < 90 && (int)(90-qx)%360 > -90)
      Rect_3DXZ_XuanZhuan(B2,a,b,9,q,D,flag,B,d,qx,qy,qz);

   if(((int)(180 - abs(qx))%360)<90 && ((int)(180 - abs(qx))%360)>-90)
      Rect_3DYZ_XuanZhuan(B3,a,b,12,q,D,flag,B,d,qx,qy,qz);

   if((int)(90 + qx)%360 <90 && (int)(90 + qx)%360 >-90)
     Rect_3DYZ_XuanZhuan(B4,a,b,9,q,D,flag,B,d,qx,qy,qz);

   if((int)(180 - qz)%360 <90 && (int)(180 - qz)%360 >-90)
      Rect_3DYZ_XuanZhuan(B5,a,b,4,q,D,flag,B,d,qx,qy,qz);

   if((int)qz%360 < 90 &&(int)qz%360 >-90)
     Rect_3DYZ_XuanZhuan(B6,a,b,4,q,D,flag,B,d,qx,qy,qz);
}


/***************************/
/**                       **/
/**    圆柱的算法         **/
/**                       **/
/***************************/
void YuanZhu3D(Point3D A,int r,int h,Point3D B,int d,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,3,B,d,qx,qy,qz);
     T.z++;
   }

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

/***************************/
/**            **/
/**       3D综合画面      **/
/**                       **/
/***************************/
void My3DGraphics_A(Point3D A,Point3D BB,int d,float qx,float qy,float qz) /* 观察方向为(qx,qy,qz)*/
{
   int a,b,h,L;
   Point3D B,C;
   setbkcolor(2);

   a = 350;
   b = 250;
   h = 350;

   B.x = A.x; B.y = A.y; B.z = A.z - h/2.0;
   Rect_3DXY(B,a + 200,b + 200,8,BB,d,qx,qy,qz); /* 地基 */

   B.x = A.x + a/2.0 + 400; B.y = A.y; B.z = A.z - h/2.0; /* 公路 */
   Rect_3DXY(B,6000,400,7,BB,d,qx,qy,qz);

   C.x = B.x; C.y = B.y - 3000; C.z = B.z;
   while(C.y <= B.y + 3000)
   {
      Rect_3DXY(C,60,20,6,BB,d,qx,qy,qz);
      C.y = C.y + 100;
   }

   B.x = A.x + a/2.0 + 80; B.y = A.y; B.z = A.z - h/2.0;
   C.x = B.x + 90; C.y = B.y; C.z = B.z;
   while(C.x>=B.x)
   {
      Rect_3DXY(C,60,20,6,BB,d,qx,qy,qz);
      C.x = C.x - 30;
   }


   Cft3D(A,a,b,h,BB,d,qx,qy,qz); /* 长方体 */

   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,d,qx,qy,qz);

   B.x = A.x + b/2.0 + a/12.0; B.y = A.y - a/6.0; B.z = A.z - h/4.0;
   Cft3D(B,5,a/6.0,h/2.0,BB,d,qx,qy,qz);

   B.x = A.x + b/2.0 + a/12.0; B.y = A.y + a/6.0; B.z = A.z - h/4.0;
   Cft3D(B,5,a/6.0,h/2.0,BB,d,qx,qy,qz);

   B.x = A.x; B.y = A.y + a/2.0; B.z = A.z; /* 画窗 */
   Rect_3DXZ(B,b/2.0,h/4.0,15,BB,d,qx,qy,qz);

   Rect_3DXZ(B,5,a/2.0,4,BB,d,qx,qy,qz); /* 竖线 */

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

   B.x = A.x; B.y = A.y; B.z = A.z + h/2.0;/* 房顶 */
   Rect_3DXY(B,a + 100,b + 100,8,BB,d,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;
   L = (b/2.0 + 50) * 2.0/sqrt(3);
   Rect_3DYZ_XuanZhuan(B,a + 100,L,9,70,C,2,BB,d,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;
   L = (b/2.0 + 50) * 2.0/sqrt(3);
   Rect_3DYZ_XuanZhuan(B,a + 100,L,14,-70,C,2,BB,d,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)
   {
     Cft3D_XuanZhuan(B,5,5,d,70,C,2,BB,d,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)
   {
     Cft3D_XuanZhuan(B,5,5,d,-70,C,2,BB,d,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,d,qx,qy,qz);



}


void My3DGraphics_B(Point3D A,Point3D B,int d,float qx,float qy,float qz)
{
   int X,Y,Z;
   CFT Cft1,Cft2,Cft3,Cft4,Cft5,Cft6;
   Point3D D1,D2,T;
   Point B1,B2;
   int a,b,i,j,k;

   setbkcolor(2);


   a = 400; b = 800;

   Rect_3DXY(A,a,b,15,B,d,qx,qy,qz);
   Rect_3DXY(A,a - 10,b - 10,6,B,d,qx,qy,qz);

   D2.x = A.x; D2.y = A.y + a/2.0 + 65; D2.z = A.z;  /*凳子下的地板*/
   Rect_3DXY(D2,90,250,8,B,d,qx,qy,qz);

                                                              /*  画凳子 */
   D2.x = A.x + 75; D2.y = A.y + a/2.0 + 50; D2.z = A.z + 20;  /* 四个脚 */
   Cft3D(D2,10,10,30,B,d,qx,qy,qz);

   D2.x = A.x + 75; D2.y = A.y + a/2.0 + 80; D2.z = A.z + 20;
   Cft3D(D2,10,10,30,B,d,qx,qy,qz);

   D2.x = A.x - 75; D2.y = A.y + a/2.0 + 50; D2.z = A.z + 20;
   Cft3D(D2,10,10,30,B,d,qx,qy,qz);

   D2.x = A.x - 75; D2.y = A.y + a/2.0 + 80; D2.z = A.z + 20;
   Cft3D(D2,10,10,30,B,d,qx,qy,qz);

   D2.x = A.x - 75; D2.y = A.y + a/2.0 + 65; D2.z = A.z + 30;  /*上面的条木*/
   Cft3D(D2,60,10,10,B,d,qx,qy,qz);

   D2.x = A.x + 75; D2.y = A.y + a/2.0 + 65; D2.z = A.z + 30;
   Cft3D(D2,60,10,10,B,d,qx,qy,qz);

   D2.x = A.x; D2.y = A.y + a/2.0 + 40; D2.z = A.z + 30;
   Cft3D(D2,5,190,5,B,d,qx,qy,qz);

   D2.x = A.x; D2.y = A.y + a/2.0 + 55; D2.z = A.z + 30;
   Cft3D(D2,5,190,5,B,d,qx,qy,qz);

   D2.x = A.x; D2.y = A.y + a/2.0 + 70; D2.z = A.z + 30;
   Cft3D(D2,5,190,5,B,d,qx,qy,qz);

   D2.x = A.x; D2.y = A.y + a/2.0 + 85; D2.z = A.z + 30;
   Cft3D(D2,5,190,5,B,d,qx,qy,qz);

   D2.x = A.x; D2.y = A.y + a/2.0 + 100; D2.z = A.z + 30;
   Cft3D(D2,5,190,5,B,d,qx,qy,qz);

   Rect_3DXY(A,a,5,15,B,d,qx,qy,qz); /* 中间的一条横线*/

   k = 80;

   while(k>=75)  /* 中间的圆 */
   {
     Yuan_3DXY(A,k,15,B,d,qx,qy,qz);
     k--;
   }

   D2.x = A.x + b/4.0; D2.y = A.y; D2.z = A.z;/* 篮筐1下的的三分线及其斜线 */
   k = 70;
   while(k>=65)
   {
      Yuan_3DXY(D2,k,15,B,d,qx,qy,qz);
      k--;
   }
   D2.x = A.x + b/4.0 + 35; D2.y = A.y; D2.z = A.z;
   Rect_3DXY(D2,200,70,6,B,d,qx,qy,qz);

   D2.x = A.x + 3 * b/8.0; D2.y = A.y - 85; D2.z = A.z;  /* 斜线 */
   Rect_3DXY_XuanZhuan(D2,5,b/4.0 + 6,15,-10,D2,3,B,d,qx,qy,qz);


   D2.x = A.x + 3 * b/8.0; D2.y = A.y + 85; D2.z = A.z;  /* 斜线 */
   Rect_3DXY_XuanZhuan(D2,5,b/4.0 + 6,15,10,D2,3,B,d,qx,qy,qz);



   D2.x = A.x + b/4.0; D2.y = A.y; D2.z = A.z;  /* 篮筐1下的圆 */
   k = 50;
   while(k>=45)
   {
      Yuan_3DXY(D2,k,15,B,d,qx,qy,qz);
      k--;
   }
   Rect_3DXY(D2,100,5,15,B,d,qx,qy,qz);


   D2.x = A.x - b/4.0; D2.y = A.y; D2.z = A.z;/* 篮筐2下的的三分线及其斜线 */
   k = 70;
   while(k>=65)
   {
      Yuan_3DXY(D2,k,15,B,d,qx,qy,qz);
      k--;
   }
   D2.x = A.x - b/4.0 - 35; D2.y = A.y; D2.z = A.z;
   Rect_3DXY(D2,200,70,6,B,d,qx,qy,qz);

   D2.x = A.x - 3 * b/8.0; D2.y = A.y - 85; D2.z = A.z;  /* 斜线 */
   Rect_3DXY_XuanZhuan(D2,5,b/4.0 + 6,15,10,D2,3,B,d,qx,qy,qz);


   D2.x = A.x - 3 * b/8.0; D2.y = A.y + 85; D2.z = A.z;  /* 斜线 */
   Rect_3DXY_XuanZhuan(D2,5,b/4.0 + 6,15,-10,D2,3,B,d,qx,qy,qz);


   D2.x = A.x - b/4.0; D2.y = A.y; D2.z = A.z;  /* 篮筐2下的圆*/
   k = 50;
   while(k>=45)
   {
      Yuan_3DXY(D2,k,15,B,d,qx,qy,qz);
      k--;
   }
   Rect_3DXY(D2,100,5,15,B,d,qx,qy,qz);

    Cft4.A.x = A.x - b/2.0 + 30;            /*篮板2的支架*/
    Cft4.A.y = A.y;
    Cft4.A.z = A.z + 105;
    Cft4.a = 10;
    Cft4.b = 10;
    Cft4.h = 200;
    Cft3D(Cft4.A,Cft4.a,Cft4.b,Cft4.h,B,d,qx,qy,qz);

    Cft2.A.x = A.x - b/2.0 + 40;   /* 篮板2 */
    Cft2.A.y = A.y;
    Cft2.A.z = A.z + 200;
    Cft2.a = 80;
    Cft2.b = 10;
    Cft2.h = 80;
    Cft3D(Cft2.A,Cft2.a,Cft2.b,Cft2.h,B,d,qx,qy,qz);


    Cft1.A.x = A.x - b/2.0 + 50;     /* 篮框2处接柱1 */
    Cft1.A.y = A.y;
    Cft1.A.z = A.z + 210;
    Cft1.a = 10;
    Cft1.b = 15;
    Cft1.h = 10;
    Cft3D(Cft1.A,Cft1.a,Cft1.b,Cft1.h,B,d,qx,qy,qz);



   D1.x = A.x - b/2.0 + 80; D1.y = A.y; D1.z = A.z + 205; /* 篮筐2 */
   k = 20;
   while(k>=17)
   {
      Yuan_3DXY(D1,k,14,B,d,qx,qy,qz);
      k--;
   }

   D1.x = A.x + b/2.0 - 80; D1.y = A.y; D1.z = A.z + 200;
   k = 20;
   while(k>=17)        /* 篮筐1 */
   {
      Yuan_3DXY(D1,k,14,B,d,qx,qy,qz);
      k--;
   }


    Cft1.A.x = D1.x + 30;     /* 篮框1处接柱1 */
    Cft1.A.y = D1.y;
    Cft1.A.z = D1.z+5;
    Cft1.a = 10;
    Cft1.b = 15;
    Cft1.h = 10;
    Cft3D(Cft1.A,Cft1.a,Cft1.b,Cft1.h,B,d,qx,qy,qz);


    Cft2.A.x = D1.x + 40;   /* 篮板1 */
    Cft2.A.y = D1.y;
    Cft2.A.z = D1.z;
    Cft2.a = 80;
    Cft2.b = 10;
    Cft2.h = 80;
    Cft3D(Cft2.A,Cft2.a,Cft2.b,Cft2.h,B,d,qx,qy,qz);

    Cft3.A.x = D1.x + 50;    /* 篮板1的支架 */
    Cft3.A.y = D1.y;
    Cft3.A.z = D1.z - 100;
    Cft3.a = 10;
    Cft3.b = 10;
    Cft3.h = 200;
    Cft3D(Cft3.A,Cft3.a,Cft3.b,Cft3.h,B,d,qx,qy,qz);

}



/***************************/
/****                   ****/
/****   图形显示函数    ****/
/****                   ****/
/***************************/

/** 显示一条直线 **/
void Show_L(Line L)
{
   LineDDA(L.A,L.B,L.color);
}

/** 显示一个圆     **/


void Show_C(Yuan C)
{
   MidPointCircle_3((C.o),C.r,C.color);
}

/** 显示一个椭圆 **/
void Show_E(TuoYuan E)
{
  MidPointEllipse(E.o,E.a,E.b,E.color);
}

/** 显示一个球 **/
void Show_Q(Qiu Q)
{
    QiuEC(Q.o,Q.r,Q.color);
}

/** 显示一个矩形 **/
void Show_R(Rect R)
{
   Rectangle(R.LeftTop,R.RightDown,R.color);
}

/** 显示一个3D矩形面  **/
Show3D_R(Rect3D R,Point3D B,int d,float qx,float qy,float qz)
{
   Rect_3DXY(R.A,R.a,R.b,R.color,B,d,qx,qy,qz);

}

/* 显示一个长方体*/
void Show3D_Cft(CFT C,Point3D B,int d,float qx,float qy,float qz)/* 观察方向为(qx,qy,qz)   */
{
   Cft3D(C.A,C.a,C.b,C.h,B,d,qx,qy,qz);
}


/** 显示一个四棱锥*
void Show3D_S(SLZ S,float qx,float qy,float qz)
{
    Slz3D(S.A,S.h,S.r,qx,qy,qz);
}*/

/** 显示一个三棱柱*
void Show3D_SLZU(SLZU Sz,float qx,float qy,float qz)
{
   SLZU3D(Sz.A,Sz.r,Sz.h,qx,qy,qz);
}*/

main()
{
  int i;
  float k,h;

  Point PointA,PointB;
  Point * P;
  Line L1,L2;
  Yuan C1,C2;
  TuoYuan E1,E2,E3,E4;
  Qiu Q1,Q2,Q3;
  Rect R1,R2;

  Point3D D1,D2,D3;
  CFT Cft1,Cft2;
  SLZ S1,S2;
  SLZU Sz1,Sz2;


  int graphdriver = DETECT,graphmode;
  initgraph(&graphdriver,&graphmode,"");



  PointA.x = 550,PointA.y = 100;PointB.x = 100,PointB.y = 100;

  L1.A = PointA;
  L1.B = PointB;
  L1.color = 2;

   /* Show_L(L1);
MidPointLine(L1.A,L1.B,15);*/


  C1.o.x = 300;
  C1.o.y = 300;
  C1.r = 60;
  C1.color = 11;
  C1.color = 4;

    /*Show_C(C1);*/ 
    PointA.x = 300;
    PointA.y = 240;
    k = 0.001;
       while(0)
       {
         C1.color = 0;
         MidPointCircle_CuoQie(C1,PointA,k - 0.001,0);
         C1.color = 4;
         MidPointCircle_CuoQie(C1,PointA,k,0);
         k = k + 0.001;
       }

  E1.o.x = 250;
  E1.o.y = 250;
  E1.a = 60; E1.b = 30;
  E1.color = 11;
    /* Show_E(E1);*/


  E2.o.x = 380;
  E2.o.y = 250;
  E2.a = 60; E2.b = 30;
  E2.color = 11;
      /* Show_E(E2);  */


  E3.o.x = 315;
  E3.o.y = 180;
  E3.a = 30; E3.b = 60;
  E3.color = 11;
      /* Show_E(E3); */

  E4.o.x = 315;
  E4.o.y = 320;
  E4.a = 30; E4.b = 60;
  E4.color = 11;
      /* Show_E(E4);

  PointA.x = 315;
  PointA.y = 248;

  R1.LeftTop.x = 313;
  R1.LeftTop.y = 248;
  R1.RightDown.x = 319;
  R1.RightDown.y = 450;
  R1.color = 2;
    Show_R(R1);*/

      k = 1;
      while(0)
      {
         E1.color = 0;
         E2.color = 0;
         E3.color = 0;
         E4.color = 0;
         MidPointEllipse_XuanZhuan(E1,PointA,k-1);
         MidPointEllipse_XuanZhuan(E2,PointA,k-1);
         MidPointEllipse_XuanZhuan(E3,PointA,k-1);
         MidPointEllipse_XuanZhuan(E4,PointA,k-1);
         Show_R(R1);
         E1.color = 11;
         E2.color = 11;
         E3.color = 11;
         E4.color = 11;
         MidPointEllipse_XuanZhuan(E1,PointA,k);
         MidPointEllipse_XuanZhuan(E2,PointA,k);
         MidPointEllipse_XuanZhuan(E3,PointA,k);
         MidPointEllipse_XuanZhuan(E4,PointA,k);
         k = k + 1;
      }
     PointB.x =190 ;
     PointB.y = 250;
        E1.color = 4;
      /*   MidPointEllipse_FangSuo(E1,PointB,2,2);
       MidPointEllipse_PinYi(E1,150,0);*/




  Q1.o.x = 500;
  Q1.o.y = 400;
  Q1.r = 60;
  Q1.color = 11;

  /*  Show_Q(Q1);

  R1.LeftTop.x = 50;
  R1.LeftTop.y = 150;
  R1.RightDown.x = 300;
  R1.RightDown.y = 200;
  R1.color = 11;
    Show_R(R1);

    Rectangle_XuanZhuan(R1,32);




  S1.A.x = 350;
  S1.A.y = 250;
  S1.A.z = 100;
  S1.r = 400;
  S1.h = 100;

  Show3D_S(S1,45,45,60);*/

  D1.x = 100;
  D1.y = 400;
  D1.z = -150;

 /* Cft3D(D1,200,300,100,45,45,45);*/

/*My3DGraphics_A(D1,D1,800,65,25,70);*/

  D2.x = 250;
  D2.y = 300;
  D2.z = -150;

/* My3DGraphics_B(D2,D2,1500,45,45,65);*/ 


/* My3DGraphics_C(D1,40,50,70);*/

/*  My3DGraphics_D(D1,45,45,45);  */

  getch();


  closegraph();
}


⌨️ 快捷键说明

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