3dgraphics-xiaoying.c

来自「在TC20环境下实现消影的生成程序」· C语言 代码 · 共 3,015 行 · 第 1/5 页

C
3,015
字号
         putpixel(X,Y,color);

  X = 2*A.x-x; Y = 2*A.y-y; Z = A.z;    /*(-x,-y) */
       XuanZhuan3D_RY(&X,&Y,&Z,q,i,j,k,flag);
      Point3D_2D(&X,&Y,&Z,qx,qy,qz);
         putpixel(X,Y,color);

  X = A.x+A.y-y; Y = A.y+A.x-x; Z = A.z;/*(-y,-x) */
      XuanZhuan3D_RY(&X,&Y,&Z,q,i,j,k,flag);
      Point3D_2D(&X,&Y,&Z,qx,qy,qz);
         putpixel(X,Y,color);
}

void Yuan_3D_XuanZhuan(Point3D A,int r,int color,float q,Point3D D,int flag,float qx,float qy,float qz)
{

   int x,y,d,deltaE,deltaSE,x0,y0,X,Y,Z,i,j,k;

   i = D.x; j = D.y; k = D.z;

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

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


   CirclePoints_3D_XuanZhuan(A,x,y,color,q,i,j,k,flag,qx,qy,qz);


   while((y-y0)>(x-x0))
   {
      if(d<=0)
      {
        d = d + deltaE;
        deltaSE=deltaSE + 8;
      }
      else
      {
         d = d + deltaSE;
         deltaSE=deltaSE + 16;
         y--;
      }
      deltaE=deltaE + 8;
      x++;
      CirclePoints_3D_XuanZhuan(A,x,y,color,q,i,j,k,flag,qx,qy,qz);
   }

}




/***************************/
/*                         */
/*  3D空间椭圆的中点算法   */
/*     平行于X - Y         */
/***************************/

/* 椭圆的4对称点的显示 */
void EllipsePoints_3D(Point3D A,int x,int y,int color,float qx,float qy,float qz) /*椭圆的中心为:(x0,y0)*/
{
  int X,Y,Z;
  X = x; Y = y; Z = A.z;                    /*(x,  y) */
      Point3D_2D(&X,&Y,&Z,qx,qy,qz);
          putpixel(X,Y,color);

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

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

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

}


/* 椭圆的中点算法 */
void MidPointEllipse_3D(Point3D A,int a,int b,int color,float qx,float qy,float qz)
{
  int x,y,xP,yP,x0,y0;
  float d,squrarea,squrareb;
   x0 = A.x;
   y0 = A.y;


  squrarea = a * a;
  squrareb = b * b;

  /*计算分解点P*/
  xP = (int)(0.5 + squrarea/sqrt(squrarea + squrareb));
  yP = (int)(0.5 + squrareb/sqrt(squrarea + squrareb));

 /* 生成上半部椭圆*/
  x = x0;
  y = y0 + b;
  d = 4 * (squrareb - squrarea * b) + squrarea;
  EllipsePoints_3D(A,x,y,color,qx,qy,qz);
  while((x - x0)<xP)
  {
    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_3D(A,x,y,color,qx,qy,qz);
  }

  /* 生成下半部椭圆*/
  x = x0 + a;
  y = y0;
  d = 4 * (squrarea - squrareb * a) + squrareb;
  EllipsePoints_3D(A,x,y,color,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_3D(A,x,y,color,qx,qy,qz);
  }
}


/***************************/
/*                         */
/*    3D空间椭圆的旋转     */
/*                         */
/***************************/

/* 椭圆旋转后的4对称点的显示 */
void EllipsePoints_3D_XhuanZhuan(Point3D A,int x,int y,int color,float q,int i,int j,int k,int flag,float qx,float qy,float qz) /*椭圆的中心为:A*/
{
  int X,Y,Z;
  X = x; Y = y; Z = A.z;                    /*(x,  y) */
     XuanZhuan3D_RY(&X,&Y,&Z,q,i,j,k,flag);
      Point3D_2D(&X,&Y,&Z,qx,qy,qz);
         putpixel(X,Y,color);


  X = 2 * A.x - x; Y = y; Z = A.z;          /*(-x, y) */
       XuanZhuan3D_RY(&X,&Y,&Z,q,i,j,k,flag);
         Point3D_2D(&X,&Y,&Z,qx,qy,qz);
         putpixel(X,Y,color);

  X = 2 * A.x - x; Y = 2 * A.y - y; Z = A.z;/*(-x,-y) */
       XuanZhuan3D_RY(&X,&Y,&Z,q,i,j,k,flag);
         Point3D_2D(&X,&Y,&Z,qx,qy,qz);
         putpixel(X,Y,color);
  X = x; Y = 2 * A.y - y; Z = A.z;          /*(x, -y) */
        XuanZhuan3D_RY(&X,&Y,&Z,q,i,j,k,flag);
          Point3D_2D(&X,&Y,&Z,qx,qy,qz);
         putpixel(X,Y,color);
}



/* 椭圆的中点算法 */
void MidPointEllipse_3D_XhuanZhuan(Point3D A,int a,int b,int color,float q,Point3D D,int flag,float qx,float qy,float qz) /* 绕通过 D 点直线的旋转 */
{
  int x,y,xP,yP,x0,y0,i,j,k;
  float d,squrarea,squrareb;
   x0 = A.x;
   y0 = A.y;
   i = D.x; j = D.y; k = D.z;

  squrarea = a * a;
  squrareb = b * b;

  /*计算分解点P*/
  xP = (int)(0.5 + squrarea/sqrt(squrarea + squrareb));
  yP = (int)(0.5 + squrareb/sqrt(squrarea + squrareb));

 /* 生成上半部椭圆*/
  x = x0;
  y = y0 + b;
  d = 4 * (squrareb - squrarea * b) + squrarea;
  EllipsePoints_3D(A,x,y,color,qx,qy,qz);
  while((x - x0)<xP)
  {
    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_3D_XhuanZhuan(A,x,y,color,q,i,j,k,flag,qx,qy,qz);
  }

  /* 生成下半部椭圆*/
  x = x0 + a;
  y = y0;
  d = 4 * (squrarea - squrareb * a) + squrareb;
  EllipsePoints_3D_XhuanZhuan(A,x,y,color,q,i,j,k,flag,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_3D_XhuanZhuan(A,x,y,color,q,i,j,k,flag,qx,qy,qz);
  }
}

/***************************/
/**                       **/
/**   长方体的算法        **/
/**                       **/
/***************************/
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;
    }
}


/******************/
/******      ******/
/*       花       */
/******      ******/
/******************/

void flower(Point3D A,int h,int r,float qx,float qy,float qz)  /* 画花 */
{
   int i;
   Point3D B1,B2,B3,B4,B5;

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


    i = 0;         /*花梗*/
   while(i<=h)
   {
     Yuan_3D(B1,3,2,qx,qy,qz);
     B1.x = A.x; B1.y = A.y; B1.z = A.z + i;
     i++;

   }


   B3.x = A.x - (r/2.0) * sqrt(2)/2.0; B3.y = A.y + (r/2.0) * sqrt(2)/2.0; B3.z = A.z;
   i = 0;
   while(i<=r/2.0)      /* 绿叶3*/
   {
      Yuan_3D(B3,i,2,qx,qy,qz);
      i++;
   }

   B4.x = A.x - (r/2.0) * sqrt(2)/2.0; B4.y = A.y - (r/2.0) * sqrt(2)/2.0; B4.z = A.z;
   i = 0;
   while(i<=r/2.0)      /* 绿叶4*/
   {
      Yuan_3D(B4,i,2,qx,qy,qz);
      i++;
   }

   B5.x = A.x + (r/2.0) * sqrt(2)/2.0; B5.y = A.y - (r/2.0) * sqrt(2)/2.0; B5.z = A.z;
   i = 0;
   while(i<=r/2.0)      /* 绿叶5*/
   {
      Yuan_3D(B5,i,2,qx,qy,qz);
      i++;
   }

    B2.x = A.x + (r/2.0) * sqrt(2)/2.0; B2.y = A.y + (r/2.0) * sqrt(2)/2.0; B2.z = A.z;
   i = 0;
   while(i<=r/2.0)      /* 绿叶2*/
   {
      Yuan_3D(B2,i,2,qx,qy,qz);
      i++;
   }


   B3.x = A.x - r/2.0; B3.y = A.y; B3.z = A.z;  /*花叶3*/
   i = 0;
   while(i<=r/2.0)
   {
     Yuan_3D_XuanZhuan(B3,i/2.0,4,-45,A,2,qx,qy,qz);
     i++;
   }



   B2.x = A.x; B2.y = A.y + r/2.0; B2.z = A.z; /*花叶2*/
   i = 0;
   while(i<=r/2.0)
   {
     Yuan_3D_XuanZhuan(B2,i/2.0,4,-45,A,1,qx,qy,qz);
     i++;
   }


   B4.x = A.x; B4.y = A.y - r/2.0; B4.z = A.z;/*花叶4*/

   i = 0;
   while(i<=r/2.0)
   {
     Yuan_3D_XuanZhuan(B4,i/2.0,4,45,A,1,qx,qy,qz);
     i++;
   }

   B5.x = A.x + r/2.0; B5.y =A.y; B5.z = A.z; /*花叶5*/
   i = 0;
   while(i<=r/2.0)
   {
     Yuan_3D_XuanZhuan(B5,i/2.0,4,45,A,2,qx,qy,qz);
     i++;
   }

   i = 0;
   while(i<=r/5.0)      /* 花心*/
   {
      Yuan_3D(A,i,14,qx,qy,qz);
      i++;
   }




}


/***************************/
/**            **/
/**       3D综合画面      **/
/**                       **/
/***************************/
void My3DGraphics_A(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;

   setbkcolor(2);

   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;




 /* 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;




   /* 画亭子*/


    C1.x = B8.x-350; C1.y = B5.y + 150; C1.z = A.z + 150;

    Rect_3D(C1,200,200,8,qx,qy,qz);

    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++;

⌨️ 快捷键说明

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