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

📄 3dgraphics1_toushi.c

📁 计算机图形学
💻 C
📖 第 1 页 / 共 4 页
字号:
        LineDDA(temp,Q,14);
      j++;
      X = A4.x; Y = j;Z = A4.z;
   }

   X = A3.x; Y = A3.y; Z = A3.z;
   i = A3.x;
   while(i<=A2.x)
   {
       Point3D_2D_TouShi(&X,&Y,&Z,d,qx,qy,qz);
      temp.x = X; temp.y = Y;
        MidPointLine(Q,temp,9);
        LineDDA(temp,Q,9);
      i++;
      X = i; Y = A3.y;Z = A3.z;
   }



   X = A1.x; Y = A1.y; Z = A1.z;
   j = A1.y;
   while(j<=A2.y)
   {
       Point3D_2D_TouShi(&X,&Y,&Z,d,qx,qy,qz);
      temp.x = X; temp.y = Y;
         MidPointLine(Q,temp,6);
         LineDDA(temp,Q,6);
      j++;
      X = A1.x; Y = j;Z = A1.z;

   }

   X = A1.x; Y = A1.y; Z = A1.z;
   i = A1.x;
   while(i>=A4.x)
   {
       Point3D_2D_TouShi(&X,&Y,&Z,d,qx,qy,qz);
      temp.x = X; temp.y = Y;
        MidPointLine(Q,temp,12);
        LineDDA(temp,Q,12);
      i--;
      X = i; Y = A1.y; Z = A1.z;

   }


}

/*****************************/
/**                         **/
/**     三棱柱的画法        **/
/**                         **/
/*****************************/
void SLZU3D(Point3D A,int r,int h,int d,float qx,float qy,float qz)
{
   int X,Y,Z,i,j,k;
   Point3D B1,B2,B3,B4,D1,D2,T1,T2;
   Point A1,A2,A3,A4,C1,C2,temp1,temp2;
   B1.x = A.x + h/2.0; B1.y = A.y - r/2.0; B1.z = A.z;
   B2.x = A.x + h/2.0; B2.y = A.y + r/2.0; B2.z = A.z;
   B3.x = A.x - h/2.0; B3.y = A.y + r/2.0; B3.z = A.z;
   B4.x = A.x - h/2.0; B4.y = A.y - r/2.0; B4.z = A.z;
   D1.x = B1.x; D1.y = (B1.y + B2.y)/2.0; D1.z = B1.z - r * 1.0/5.0;
   D2.x = B3.x; D2.y = (B3.y + B4.y)/2.0; D2.z = B2.z - r * 1.0/5.0;


   X = B1.x; Y = B1.y; Z = B1.z;        /* B D为未转化的点,AC为其转化的二维平面点*/
      Point3D_2D_TouShi(&X,&Y,&Z,d,qx,qy,qz);
   A1.x = X; A1.y = Y;

   X = B2.x; Y = B2.y; Z = B2.z;
      Point3D_2D_TouShi(&X,&Y,&Z,d,qx,qy,qz);
   A2.x = X; A2.y = Y;

   X = B3.x; Y = B3.y; Z = B3.z;
      Point3D_2D_TouShi(&X,&Y,&Z,d,qx,qy,qz);
   A3.x = X; A3.y = Y;

    X = B4.x; Y = B4.y; Z = B4.z;
      Point3D_2D_TouShi(&X,&Y,&Z,d,qx,qy,qz);
   A4.x = X; A4.y = Y;

   X = D1.x; Y =D1.y; Z = D1.z;
      Point3D_2D_TouShi(&X,&Y,&Z,d,qx,qy,qz);
   C1.x = X; C1.y = Y;

  X = D2.x; Y =D2.y; Z = D2.z;
      Point3D_2D_TouShi(&X,&Y,&Z,d,qx,qy,qz);
   C2.x = X; C2.y = Y;


  X = B1.x; Y = B1.y; Z = B1.z;
  j = B1.y; i = B1.x;
  while(j<=B2.y)
  {
     while(i>=B4.x)
     {
          Point3D_2D_TouShi(&X,&Y,&Z,d,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;
  }





   T1.x = B2.x; T1.y = B2.y; T1.z = B2.z;
   T2.x = D1.x; T2.y = D1.y; T2.z = D2.z;
   i = B1.x +1;
   while(i>=B3.x)
   {
       X = T1.x; Y = T1.y; Z = T1.z;
        Point3D_2D_TouShi(&X,&Y,&Z,d,qx,qy,qz);
           temp1.x = X; temp1.y = Y;

       X = T2.x; Y = T2.y; Z = T2.z;
        Point3D_2D_TouShi(&X,&Y,&Z,d,qx,qy,qz);
           temp2.x = X; temp2.y = Y;
       LineDDA(temp1,temp2,9);
       LineDDA(temp2,temp1,9);

       i--;

       T1.x = T2.x = i;


   }


   T1.x = B1.x; T1.y = B1.y; T1.z = B1.z;
   T2.x = D1.x; T2.y = D1.y; T2.z = D1.z;
   i = B1.x +1;
   while(i>=B4.x)
   {
       X = T1.x; Y = T1.y; Z = T1.z;
        Point3D_2D_TouShi(&X,&Y,&Z,d,qx,qy,qz);
           temp1.x = X; temp1.y = Y;

       X = T2.x; Y = T2.y; Z = T2.z;
        Point3D_2D_TouShi(&X,&Y,&Z,d,qx,qy,qz);
           temp2.x = X; temp2.y = Y;
      LineDDA(temp1,temp2,14);
      LineDDA(temp2,temp1,14);

       i--;

       T1.x = T2.x = i;


   }






  /* LineDDA(A2,A3,15);

   LineDDA(A4,A1,15);
   LineDDA(C1,A1,14);
   LineDDA(C1,A2,14);
   LineDDA(C2,A3,14);
   LineDDA(C2,A4,14);
   LineDDA(C2,C1,14); */

}


/***************************/
/**                       **/
/**     3D空间矩形面      **/
/**    平行于X-Y平面      **/
/***************************/
void Rect_3D(Point3D A,int a,int b,int color,int d,float qx,float qy,float qz)
{
   int i,j,k,X,Y,Z;
   Point3D B1,B2,B3,B4;

   B1.x = A.x + b/2.0; B1.y = A.y - a/2.0; B1.z = A.z;
   B2.x = A.x + b/2.0; B2.y = A.y + a/2.0; B2.z = A.z;
   B3.x = A.x - b/2.0; B3.y = A.y + a/2.0; B3.z = A.z;
   B4.x = A.x - b/2.0; B4.y = A.y - a/2.0; B4.z = A.z;

   X = B1.x; Y = B1.y; Z = B1.z;
   i = X; j = Y;
   while(j <= B2.y)
   {
      while(i >= B4.x)
      {
         Point3D_2D_TouShi(&X,&Y,&Z,d,qx,qy,qz);
          putpixel(X,Y,color);

         i--;
         X = i; Y = j; Z = B1.z;
      }
      j++;
      X = B1.x; Y = j; Z = B1.z; i = X;
   }

}


/***************************/
/**                       **/
/**     3D空间矩形面      **/
/**     平行于X-Z平面     **/
/***************************/
void Rect_3D_2(Point3D A,int a,int b,int color,int d,float qx,float qy,float qz)
{
   int i,j,k,X,Y,Z;
   Point3D B1,B2,B3,B4;

   B1.x = A.x + a/2.0; B1.y = A.y; B1.z = A.z - b/2.0;
   B2.x = A.x - a/2.0; B2.y = A.y; B2.z = A.z - b/2.0;
   B3.x = A.x - a/2.0; B3.y = A.y; B3.z = A.z + b/2.0;
   B4.x = A.x + a/2.0; B4.y = A.y; B4.z = A.z + b/2.0;

   X = B1.x; Y = B1.y; Z = B1.z;
   i = X; k = Z;
   while(i >= B2.x)
   {
      while(k <= B4.z)
      {
         Point3D_2D_TouShi(&X,&Y,&Z,d,qx,qy,qz);
          putpixel(X,Y,color);

         k++;
         X = i; Y =A.y; Z = k;
      }
      i--;
      X = i; Y = A.y; Z = B1.z; k = Z;
   }

}


/***************************/
/**                       **/
/**      3D空间圆         **/
/**     平行于X-Y平面     **/
/***************************/

/* 3D圆的8对称点的显示 */
void CirclePoints_3D(Point3D A,int x,int y,int color,int d,float qx,float qy,float qz)/* 圆心为A;*/
{
  int X,Y,Z;
  X = x; Y = y; Z = A.z;                /*(x,  y) */
     Point3D_2D_TouShi(&X,&Y,&Z,d,qx,qy,qz);
          putpixel(X,Y,color);
  X = A.x-A.y+y; Y = A.y-A.x+x; Z = A.z;/*(y,  x) */
      Point3D_2D_TouShi(&X,&Y,&Z,d,qx,qy,qz);
          putpixel(X,Y,color);
  X = A.x+A.y-y; Y = A.y-A.x+x; Z = A.z; /*(-y, x) */
      Point3D_2D_TouShi(&X,&Y,&Z,d,qx,qy,qz);
          putpixel(X,Y,color);

  X = 2*A.x-x; Y = y; Z = A.z;          /*(-x, y) */
      Point3D_2D_TouShi(&X,&Y,&Z,d,qx,qy,qz);
          putpixel(X,Y,color);

  X = A.x-A.y+y; Y = A.y+A.x-x; Z = A.z; /*(y, -x) */
      Point3D_2D_TouShi(&X,&Y,&Z,d,qx,qy,qz);
          putpixel(X,Y,color);
  X = x; Y = 2*A.y-y; Z = A.z;          /*(x, -y) */
       Point3D_2D_TouShi(&X,&Y,&Z,d,qx,qy,qz);
          putpixel(X,Y,color);

  X = 2*A.x-x; Y = 2*A.y-y; Z = A.z;    /*(-x,-y) */
       Point3D_2D_TouShi(&X,&Y,&Z,d,qx,qy,qz);
          putpixel(X,Y,color);

  X = A.x+A.y-y; Y = A.y+A.x-x; Z = A.z;/*(-y,-x) */
      Point3D_2D_TouShi(&X,&Y,&Z,d,qx,qy,qz);
          putpixel(X,Y,color);

}

void Yuan_3D(Point3D A,int r,int color,int d,float qx,float qy,float qz)
{

   int x,y,dd,deltaE,deltaSE,x0,y0,X,Y,Z;

   x0 = A.x;
   y0 = A.y;

   x = x0;
   y = y0 + r;
   dd = 5 - 4*r;
   deltaE = 12;
   deltaSE = 20 - 8*r;


   CirclePoints_3D(A,x,y,color,d,qx,qy,qz);


   while((y-y0)>(x-x0))
   {
      if(d<=0)
      {
        dd = dd + deltaE;
        deltaSE=deltaSE + 8;
      }
      else
      {
         dd = dd + deltaSE;
         deltaSE=deltaSE + 16;
         y--;
      }
      deltaE=deltaE + 8;
      x++;
      CirclePoints_3D(A,x,y,color,d,qx,qy,qz);
   }

}

/***************************/
/**                       **/
/**      3D空间圆         **/
/**     平行于X-Z平面     **/
/***************************/

/* 3D圆的8对称点的显示 */
void CirclePoints_3D_2(Point3D A,int x,int z,int color,int d,float qx,float qy,float qz)/* 圆心为A;*/
{
  int X,Y,Z;
  X = x; Y = A.y; Z = z;                         /*(x,  z) */
     Point3D_2D_TouShi(&X,&Y,&Z,d,qx,qy,qz);
          putpixel(X,Y,color);

  X = A.x - A.z + z; Y = A.y; Z = A.z - A.x + x; /*(z,  x) */
      Point3D_2D_TouShi(&X,&Y,&Z,d,qx,qy,qz);
          putpixel(X,Y,color);

  X = A.x + A.z - z; Y = A.y; Z = A.z - A.x + x;/*(-z, x) */
       Point3D_2D_TouShi(&X,&Y,&Z,d,qx,qy,qz);
          putpixel(X,Y,color);

  X = 2 * A.x - x; Y = A.y; Z = z;               /*(-x, z) */
       Point3D_2D_TouShi(&X,&Y,&Z,d,qx,qy,qz);
          putpixel(X,Y,color);

  X = A.x - A.z + z; Y = A.y; Z = A.z + A.x - x; /*(z, -x) */
       Point3D_2D_TouShi(&X,&Y,&Z,d,qx,qy,qz);
          putpixel(X,Y,color);

  X = x; Y = A.y; Z = 2 * A.z - z;               /*(x, -z) */
        Point3D_2D_TouShi(&X,&Y,&Z,d,qx,qy,qz);
          putpixel(X,Y,color);

  X = 2 * A.x - x; Y = A.y; Z = 2 * A.z - z;     /*(-x,-z) */
         Point3D_2D_TouShi(&X,&Y,&Z,d,qx,qy,qz);
          putpixel(X,Y,color);

  X = A.x + A.z - z; Y = A.y; Z = A.z + A.x - x; /*(-z,-x) */
         Point3D_2D_TouShi(&X,&Y,&Z,d,qx,qy,qz);
          putpixel(X,Y,color);



}

void Yuan_3D_2(Point3D A,int r,int color,int d,float qx,float qy,float qz)
{

   int x,z,dd,deltaE,deltaSE,x0,z0,X,Y,Z;

   x0 = A.x;
   z0 = A.z;

   x = x0;
   z = z0 + r;
   dd = 5 - 4*r;
   deltaE = 12;
   deltaSE = 20 - 8*r;


   CirclePoints_3D_2(A,x,z,color,d,qx,qy,qz);


   while((z-z0)>(x-x0))
   {
      if(d<=0)
      {
        dd = dd + deltaE;
        deltaSE=deltaSE + 8;
      }
      else
      {
         dd = dd + deltaSE;
         deltaSE=deltaSE + 16;
         z--;
      }
      deltaE=deltaE + 8;
      x++;
      CirclePoints_3D_2(A,x,z,color,d,qx,qy,qz);
   }

}





/***************************/
/**                       **/
/**   长方体的算法        **/
/**                       **/
/***************************/
void Cft3D(Point3D A,int a,int b,int h,int d,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_TouShi(&X,&Y,&Z,d,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_TouShi(&X,&Y,&Z,d,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_TouShi(&X,&Y,&Z,d,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_A(Point3D A,float q,int d,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;

   setbkcolor(2);

   Q = (3.1415926/180)*q;

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


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

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



   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,d,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,d,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,d,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,d,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,d,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;


    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_TouShi(&X,&Y,&Z,d,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+3500; j = T1.y;
    while(i >=B8.x-3500)
    {
      while(j>=T2.y)
      {
       X = i; Y = j; Z = T1.z;
           Point3D_2D_TouShi(&X,&Y,&Z,d,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+3500; j = T1.y;
    for(k = B5.x+800; k>=B8.x-3500;)
    {
      i = k;
      while(i >=k-60)
      {
        while(j>=T2.y)
        {
           X = i; Y = j; Z = T1.z;
           Point3D_2D_TouShi(&X,&Y,&Z,d,qx,qy,qz);
           putpixel(X,Y,6);
           j--;

        }
         i--;  j = T1.y;

      }

⌨️ 快捷键说明

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