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

📄 3dgraphics2.c

📁 计算机图形学
💻 C
📖 第 1 页 / 共 3 页
字号:
/**                       **/
/**   长方体的算法        **/
/**                       **/
/***************************/
void Cft3D(Point3D A,int a,int b,int h,float qx,float qy,float qz)
{
    int x,y,z,X,Y,Z,i,j,k;
   Point3D B1,B2,B3,B4,B5,B6,B7,B8,T1,T2;
   Point3D C1,C2,C3,C4;
   Point A1,A2,A3,A4,A5,A6,A7,A8,temp1,temp2;

   x = A.x;
   y = A.y;
   z = A.z;

   B1.x = x + b/2.0; B1.y = y - a/2.0; B1.z = z - h/2.0;   /*长方体的八个顶点*/
   B2.x = x + b/2.0; B2.y = y + a/2.0; B2.z = z - h/2.0;
   B3.x = x - b/2.0; B3.y = y + a/2.0; B3.z = z - h/2.0;
   B4.x = x - b/2.0; B4.y = y - a/2.0; B4.z = z - h/2.0;


   B5.x = x + b/2.0; B5.y = y - a/2.0; B5.z = z + h/2.0;
   B6.x = x + b/2.0; B6.y = y + a/2.0; B6.z = z + h/2.0;
   B7.x = x - b/2.0; B7.y = y + a/2.0; B7.z = z + h/2.0;
   B8.x = x - b/2.0; B8.y = y - a/2.0; B8.z = z + h/2.0;


    X = B1.x; Y = B1.y; Z = B1.z;        /* 长方体 */

   i = X; j = Y;

   while(j <= B2.y)
   {
      while(i >= B4.x)
     {
      Point3D_2D(&X,&Y,&Z,qx,qy,qz);
          putpixel(X,Y,12);
      i--;
      X = i; Y = j; Z = B1.z;
      }
      j++;
      X = B1.x; Y = j; Z = B1.z;i = X;
    }


    X = B1.x; Y = B1.y; Z = B1.z;
    i = X; k = Z;
    while(i>=B4.x)
    {
       while(k <= B5.z)
       {
          Point3D_2D(&X,&Y,&Z,qx,qy,qz);
          putpixel(X,Y,9);
          k++;
          X = i;Y = B1.y;Z = k;
       }
       i--;
       X = i; Y = B1.y;Z = B1.z;k = Z;
    }


     X = B1.x; Y = B1.y; Z = B1.z;
     j = Y;  k = Z;
    while(j <= B2.y)
    {
       while(k<=B5.z)
       {
          Point3D_2D(&X,&Y,&Z,qx,qy,qz);
          putpixel(X,Y,4);
          k++;
          X = B1.x;Y = j;Z = k;
       }
       j++;
       X = B1.x; Y = j;Z = B1.z; k = Z;
    }
}

/***************************/
/**            **/
/**       3D综合画面      **/
/**                       **/
/***************************/
void My3DGraphics(Point3D A,float q,float qx,float qy,float qz) /* 观察方向为(qx,qy,qz)*/
{
   int a,b,h,r;
   int x,y,z,X,Y,Z,i,j,k;
   Point3D B1,B2,B3,B4,B5,B6,B7,B8,T1,T2;
   Point3D C1,C2,C3,C4;
   Point A1,A2,A3,A4,A5,A6,A7,A8,temp1,temp2;
   CFT Cft1,Cft2,Cft3,Cft4;
   float Q;
   Q = (3.1415926/180)*q;

   a = 100;
   b = 300;
   h = 200;


   x = A.x;
   y = A.y;
   z = A.z;

   C1.x = x + 15 * a; C1.y = y - 15 * a; C1.z = z + 0.5 * h;
   C2.x = x + 15 * a; C2.y = y + 15 * a; C2.z = z + 0.5 * h;
   C3.x = x - 15 * a; C3.y = y + 15 * a; C3.z = z + 0.5 * h;
   C4.x = x - 15 * a; C4.y = y - 15 * a; C4.z = z + 0.5 * h;

   X = C1.x; Y = C1.y; Z = C1.z; /* 绿色的地面 */
   i = C1.x;  j = C1.y;
   while(j<=C2.y)
   {
      while(i>=C4.x)
      {

        Point3D_2D(&X,&Y,&Z,qx,qy,qz);
        putpixel(X,Y,2);
        i--;
        X = i; Y = j; Z = C1.z;
      }
      j++;
      X = C1.x; Y = j; Z = C1.z; i = X;
   }




 /* C1.x = x + r/2.0; C1.y = y - r/2.0 + tan(Q)*(5.0/2.0)*r; C1.z = z + 1.5 * r; 光照阴影
    C2.x = x + r/2.0; C2.y = y + r/2.0 + tan(Q)*(5.0/2.0)*r; C2.z = z + 1.5 * r;
    C3.x = x - r/2.0; C3.y = y + r/2.0 + tan(Q)*(5.0/2.0)*r; C3.z = z + 1.5 * r;
    C4.x = x - r/2.0; C4.y = y - r/2.0 + tan(Q)*(5.0/2.0)*r; C4.z = z + 1.5 * r;

   X = C1.x; Y = C1.y; Z = C1.z;
   i = C1.x;  j = C1.y;
  while(j<=C2.y)
   {
      while(i>=C4.x)
      {

        Point3D_2D(&X,&Y,&Z,qx,qy,qz);
        putpixel(X,Y,8);
        i--;
        X = i; Y = j; Z = C1.z;
      }
      j++;
      X = C1.x; Y = j; Z = C1.z; i = X;
   }  */



   B1.x = x + b/2.0; B1.y = y - a/2.0; B1.z = z - h/2.0;   /*长方体的八个顶点*/
   B2.x = x + b/2.0; B2.y = y + a/2.0; B2.z = z - h/2.0;
   B3.x = x - b/2.0; B3.y = y + a/2.0; B3.z = z - h/2.0;
   B4.x = x - b/2.0; B4.y = y - a/2.0; B4.z = z - h/2.0;


   B5.x = x + b/2.0; B5.y = y - a/2.0; B5.z = z + h/2.0;
   B6.x = x + b/2.0; B6.y = y + a/2.0; B6.z = z + h/2.0;
   B7.x = x - b/2.0; B7.y = y + a/2.0; B7.z = z + h/2.0;
   B8.x = x - b/2.0; B8.y = y - a/2.0; B8.z = z + h/2.0;

   /* 画亭子*/



    Cft4.A.x = B8.x-400;
    Cft4.A.y = B5.y+100;
    Cft4.A.z = B5.z;
    Cft4.a = 5;
    Cft4.b = 5;
    Cft4.h = 100;
    Cft3D(Cft4.A,Cft4.a,Cft4.b,Cft4.h,qx,qy,qz);

    Cft3.A.x = B8.x-400;
    Cft3.A.y = B5.y+200;
    Cft3.A.z = B5.z;
    Cft3.a = 5;
    Cft3.b = 5;
    Cft3.h = 100;
    Cft3D(Cft3.A,Cft3.a,Cft3.b,Cft3.h,qx,qy,qz);



    Cft1.A.x = B8.x-300;
    Cft1.A.y = B5.y+100;
    Cft1.A.z = B5.z;
    Cft1.a = 5;
    Cft1.b = 5;
    Cft1.h = 100;
    Cft3D(Cft1.A,Cft1.a,Cft1.b,Cft1.h,qx,qy,qz);



    Cft2.A.x = B8.x-300;
    Cft2.A.y = B5.y+200;
    Cft2.A.z = B5.z;
    Cft2.a = 5;
    Cft2.b = 5;
    Cft2.h = 100;
    Cft3D(Cft2.A,Cft2.a,Cft2.b,Cft2.h,qx,qy,qz);


    T1.x = (Cft1.A.x + Cft4.A.x)/2.0; T1.y = (Cft1.A.y + Cft2.A.y)/2.0; T1.z = B5.z - 50;

    Slz3D(T1,50,150,qx,qy,qz);  /*  四棱椎*/



   C1.x = B5.x + 100; C1.y = B5.y - 100; C1.z = B5.z;       /*地基*/
   C2.x = B6.x + 100; C2.y = B6.y + 100; C2.z = B6.z;
   C3.x = B7.x - 100; C3.y = B7.y + 100; C3.z = B7.z;
   C4.x = B8.x - 100; C4.y = B8.y - 100; C4.z = B8.z;

   X = C1.x; Y = C1.y; Z = C1.z;
   i = X; j = Y;
   while(j<=C2.y)
   {
      while(i>=C4.x)
      {
         Point3D_2D(&X,&Y,&Z,qx,qy,qz);
         putpixel(X,Y,8);
         i--;
         X = i;Y = j;Z = C1.z;
      }
      j++;
      X = C1.x; Y = j;Z = C1.z; i = X;
   }





   X = B1.x; Y = B1.y; Z = B1.z;        /* 长方体 */

   i = X; j = Y;

   while(j <= B2.y)
   {
      while(i >= B4.x)
     {
      Point3D_2D(&X,&Y,&Z,qx,qy,qz);
          putpixel(X,Y,8);
      i--;
      X = i; Y = j; Z = B1.z;
      }
      j++;
      X = B1.x; Y = j; Z = B1.z;i = X;
    }


    X = B1.x; Y = B1.y; Z = B1.z;
    i = X; k = Z;
    while(i>=B4.x)
    {
       while(k <= B5.z)
       {
          Point3D_2D(&X,&Y,&Z,qx,qy,qz);
          putpixel(X,Y,6);
          k++;
          X = i;Y = B1.y;Z = k;
       }
       i--;
       X = i; Y = B1.y;Z = B1.z;k = Z;
    }


     X = B1.x; Y = B1.y; Z = B1.z;
     j = Y;  k = Z;
    while(j <= B2.y)
    {
       while(k<=B5.z)
       {
          Point3D_2D(&X,&Y,&Z,qx,qy,qz);
          putpixel(X,Y,3);
          k++;
          X = B1.x;Y = j;Z = k;
       }
       j++;
       X = B1.x; Y = j;Z = B1.z; k = Z;
    }


    X = B5.x; Y = (B5.y+B6.y)/2.0 + 30; Z = (B5.z + B1.z)/2.0 + 30;/* 画窗*/
    j = Y; k = Z;
    while(j>=((B5.y + B6.y)/2.0 - 30))
    {
       while(k >= (B5.z + B1.z)/2.0 - 30)
       {
          Point3D_2D(&X,&Y,&Z,qx,qy,qz);
          putpixel(X,Y,15);
          k--;
          X = B1.x;Y = j;Z = k;
       }
       j--;
       X = B5.x; Y = j;Z = (B5.z + B1.z)/2.0 + 30;k = Z;
    }



    X = B5.x; Y = (B5.y+B6.y)/2.0+30; Z = (B5.z + B1.z)/2.0 + 30;/* 窗框 */
    k = Z;                                                    /* 三条竖线*/
    while(k>=(B5.z + B1.z)/2.0 - 30)
    {
        Point3D_2D(&X,&Y,&Z,qx,qy,qz);
         putpixel(X,Y,4);
         k--;
         X = B5.x; Y = (B5.y+B6.y)/2.0+30; Z = k;
    }


    X = B5.x; Y = (B5.y+B6.y)/2.0; Z = (B5.z + B1.z)/2.0 + 30;
    k = Z;
    while(k>=(B5.z + B1.z)/2.0 - 30)
    {
        Point3D_2D(&X,&Y,&Z,qx,qy,qz);
         putpixel(X,Y,4);
         k--;
         X = B5.x; Y = (B5.y+B6.y)/2.0; Z = k;
    }


    X = B5.x; Y = (B5.y+B6.y)/2.0-30; Z = (B5.z + B1.z)/2.0 + 30;
    k = Z;
    while(k>=(B5.z + B1.z)/2.0 - 30)
    {
        Point3D_2D(&X,&Y,&Z,qx,qy,qz);
         putpixel(X,Y,4);
         k--;
         X = B5.x; Y = (B5.y+B6.y)/2.0-30; Z = k;
    }


    X = B5.x; Y = (B5.y+B6.y)/2.0 + 30; Z = (B5.z + B1.z)/2.0+30; /* 框的两条横线*/
    j = Y;
    while(j>=(B5.y+B6.y)/2.0 - 30)
    {
        Point3D_2D(&X,&Y,&Z,qx,qy,qz);
         putpixel(X,Y,4);
         j--;
         X = B5.x; Y = j; Z = (B5.z + B1.z)/2.0+30;
    }

    X = B5.x; Y = (B5.y+B6.y)/2.0 + 30; Z = (B5.z + B1.z)/2.0-30;
    j = Y;
    while(j>=(B5.y+B6.y)/2.0 - 30)
    {
        Point3D_2D(&X,&Y,&Z,qx,qy,qz);
         putpixel(X,Y,4);
         j--;
         X = B5.x; Y = j; Z = (B5.z + B1.z)/2.0-30;
    }




    Cft1.A.x = B5.x+15;       /* 窗的台板 */
    Cft1.A.y = (B5.y+B6.y)/2.0;
    Cft1.A.z = ((B5.z + B1.z)/2.0) + 30;
    Cft1.a = 60;
    Cft1.b = 30;
    Cft1.h = 5;
    Cft3D(Cft1.A,Cft1.a,Cft1.b,Cft1.h,qx,qy,qz);





    X = (B5.x + B8.x)/2.0 + 50; Y = B5.y; Z = B5.z;/*  画门*/
    i = X; k = Z;
    while(i>=((B5.x + B8.x)/2.0 - 50))
    {
       while(k >= B5.z - 100)
       {
          Point3D_2D(&X,&Y,&Z,qx,qy,qz);
          putpixel(X,Y,15);
          k--;
          X = i;Y = B5.y;Z = k;
       }
       i--;
       X = i; Y = B5.y;Z = B5.z;k = Z;
    }


    Cft1.A.x = (B5.x + B8.x)/2.0 + 50;
    Cft1.A.y = B5.y-25;
    Cft1.A.z = B5.z-50;
    Cft1.a = 50;
    Cft1.b = 5;
    Cft1.h = 100;
    Cft3D(Cft1.A,Cft1.a,Cft1.b,Cft1.h,qx,qy,qz);

    Cft1.A.x = (B5.x + B8.x)/2.0 - 50;
    Cft1.A.y = B5.y-25;
    Cft1.A.z = B5.z-50;
    Cft1.a = 50;
    Cft1.b = 5;
    Cft1.h = 100;
    Cft3D(Cft1.A,Cft1.a,Cft1.b,Cft1.h,qx,qy,qz);





    T1.x = ((B5.x + B8.x)/2.0 - 50);T1.y = B5.y;T1.z = B5.z; /*画路1*/
    T2.x = ((B5.x + B8.x)/2.0 + 50);T2.y = B5.y;T2.z = B5.z;
    i = T1.x; j = B5.y-100;
    while(j > B5.y-160)
    {
      while(i<=T2.x)
      {
       X = i; Y = j; Z = T1.z;
           Point3D_2D(&X,&Y,&Z,qx,qy,qz);
           putpixel(X,Y,7);
       i++;

       }
       j--;  i = T1.x;

    }


    T1.x = ((B5.x + B8.x)/2.0 + 50);T1.y = B5.y-160;T1.z = B5.z; /*画路2*/
    T2.x = ((B5.x + B8.x)/2.0 + 50);T2.y = B5.y-660;T2.z = B5.z;
    i = B5.x+800; j = T1.y;
    while(i >=B8.x-800)
    {
      while(j>=T2.y)
      {
       X = i; Y = j; Z = T1.z;
           Point3D_2D(&X,&Y,&Z,qx,qy,qz);
           putpixel(X,Y,7);
       j--;

       }
       i--;  j = T1.y;

    }

    T1.x = ((B5.x + B8.x)/2.0 + 50);T1.y = B5.y-400;T1.z = B5.z; /*对路2的美化*/
    T2.x = ((B5.x + B8.x)/2.0 + 50);T2.y = B5.y-420;T2.z = B5.z;
    i = B5.x+800; j = T1.y;
    for(k = B5.x+800; k>=B8.x-800;)
    {
      i = k;
      while(i >=k-60)
      {
        while(j>=T2.y)
        {
           X = i; Y = j; Z = T1.z;
           Point3D_2D(&X,&Y,&Z,qx,qy,qz);
           putpixel(X,Y,6);
           j--;

        }
         i--;  j = T1.y;

      }
      k = k - 100;

    }


    Cft1.A.x = B1.x-10;                     /*   柱子*/
    Cft1.A.y = C1.y+20;
    Cft1.A.z = C1.z - h/2.0;
    Cft1.a = 15;
    Cft1.b = 15;
    Cft1.h = h;
    Cft3D(Cft1.A,Cft1.a,Cft1.b,Cft1.h,qx,qy,qz);

    Cft1.A.x = B4.x+10;                     /*   柱子*/
    Cft1.A.y = C4.y+20;
    Cft1.A.z = C4.z - h/2.0;
    Cft1.a = 15;
    Cft1.b = 15;
    Cft1.h = h;
    Cft3D(Cft1.A,Cft1.a,Cft1.b,Cft1.h,qx,qy,qz);




    T1.x = A.x; T1.y = A.y-40; T1.z = A.z - h/2.0;

    r = a +250;

    SLZU3D(T1,r,b+100,qx,qy,qz);  /* 房顶,三棱柱 */


    Cft1.A.x = A.x;                     /*   屋脊 */
    Cft1.A.y = A.y-40;
    Cft1.A.z = A.z - h/2.0-r*(1.0/5.0);
    Cft1.a = 10;
    Cft1.b = b + 100;
    Cft1.h = 10;
    Cft3D(Cft1.A,Cft1.a,Cft1.b,Cft1.h,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);
}

/* 显示一个长方体*/
void Show3D_Cft(CFT C,float qx,float qy,float qz)/* 观察方向为(qx,qy,qz)   */
{
   Cft3D(C.A,C.a,C.b,C.h,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 = 350;
  D1.y = 250;
  D1.z = 300;

  My3DGraphics(D1,-15,40,50,60);




  getch();


  closegraph();
}


⌨️ 快捷键说明

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