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

📄 3dgraphics7.c

📁 计算机图形学
💻 C
📖 第 1 页 / 共 5 页
字号:
      {
         XuanZhuan3D_RY(&X,&Y,&Z,q,ii,jj,kk,flag);
            Point3D_2D(&X,&Y,&Z,B,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_3DXZ_XuanZhuan(Point3D A,int a,int b,int color,int q,Point3D D,int flag,Point3D B,float qx,float qy,float qz)
{
   int i,j,k,X,Y,Z;
   int ii,jj,kk;
   Point3D B1,B2,B3,B4;

   ii = D.x; jj = D.y; kk = D.z;

   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)
      {
         XuanZhuan3D_RY(&X,&Y,&Z,q,ii,jj,kk,flag);
            Point3D_2D(&X,&Y,&Z,B,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空间矩形面的旋转   **/
/**    平行于Y-Z平面      **/
/***************************/
void Rect_3DYZ_XuanZhuan(Point3D A,int a,int b,int color,int q,Point3D D,int flag,Point3D B,float qx,float qy,float qz)
{
   int i,j,k,X,Y,Z;
   int ii,jj,kk;
   Point3D B1,B2,B3,B4;

   ii = D.x; jj = D.y; kk = D.z;

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

   X = B1.x; Y = B1.y; Z = B1.z;
   j = Y; k = Z;
   while(j <= B2.y)
   {
      while(k <= B4.z)
      {
         XuanZhuan3D_RY(&X,&Y,&Z,q,ii,jj,kk,flag);
            Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
              putpixel(X,Y,color);
         k++;
         X = A.x; Y =j; Z = k;
      }
      j++;
      X = A.x; Y = j; Z = B1.z; k = Z;
   }

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

/* 3D圆的8对称点的显示 */
void CirclePoints_3DXY(Point3D A,int x,int y,int color,Point3D B,float qx,float qy,float qz)/* 圆心为A;*/
{
  int X,Y,Z;
  X = x; Y = y; Z = A.z;                /*(x,  y) */
     Point3D_2D(&X,&Y,&Z,B,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(&X,&Y,&Z,B,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(&X,&Y,&Z,B,qx,qy,qz);
          putpixel(X,Y,color);

  X = 2*A.x-x; Y = y; Z = A.z;          /*(-x, y) */
      Point3D_2D(&X,&Y,&Z,B,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(&X,&Y,&Z,B,qx,qy,qz);
          putpixel(X,Y,color);
  X = x; Y = 2*A.y-y; Z = A.z;          /*(x, -y) */
       Point3D_2D(&X,&Y,&Z,B,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,B,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(&X,&Y,&Z,B,qx,qy,qz);
          putpixel(X,Y,color);

}

void Yuan_3DXY(Point3D A,int r,int color,Point3D B,float qx,float qy,float qz)
{

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

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

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


   CirclePoints_3DXY(A,x,y,color,B,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_3DXY(A,x,y,color,B,qx,qy,qz);
   }

}

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

/* 3D圆的8对称点的显示 */
void CirclePoints_3DXZ(Point3D A,int x,int z,int color,Point3D B,float qx,float qy,float qz)/* 圆心为A;*/
{
  int X,Y,Z;
  X = x; Y = A.y; Z = z;                         /*(x,  z) */
     Point3D_2D(&X,&Y,&Z,B,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(&X,&Y,&Z,B,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(&X,&Y,&Z,B,qx,qy,qz);
          putpixel(X,Y,color);

  X = 2 * A.x - x; Y = A.y; Z = z;               /*(-x, z) */
       Point3D_2D(&X,&Y,&Z,B,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(&X,&Y,&Z,B,qx,qy,qz);
          putpixel(X,Y,color);

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

  X = 2 * A.x - x; Y = A.y; Z = 2 * A.z - z;     /*(-x,-z) */
         Point3D_2D(&X,&Y,&Z,B,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(&X,&Y,&Z,B,qx,qy,qz);
          putpixel(X,Y,color);



}

void Yuan_3DXZ(Point3D A,int r,int color,Point3D B,float qx,float qy,float qz)
{

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

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

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

   CirclePoints_3DXZ(A,x,z,color,B,qx,qy,qz);

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

}

/***************************/
/**                       **/
/**3D平行于X-Y平面的空间圆**/
/**       的旋转          **/
/***************************/
/* 3D圆的8对称点的显示 */
void CirclePoints_3DXY_XuanZhuan(Point3D A,int x,int y,int color,float q,int i,int j,int k,int flag,Point3D B,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,B,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,B,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,B,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,B,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,B,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,B,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,B,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,B,qx,qy,qz);
         putpixel(X,Y,color);
}

void Yuan_3DXY_XuanZhuan(Point3D A,int r,int color,float q,Point3D D,int flag,Point3D B,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_3DXY_XuanZhuan(A,x,y,color,q,i,j,k,flag,B,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_3DXY_XuanZhuan(A,x,y,color,q,i,j,k,flag,B,qx,qy,qz);
   }

}




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

/* 椭圆的4对称点的显示 */
void EllipsePoints_3DXY(Point3D A,int x,int y,int color,Point3D B,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,B,qx,qy,qz);
          putpixel(X,Y,color);

  X = 2 * A.x - x; Y = y; Z = A.z;          /*(-x, y) */
       Point3D_2D(&X,&Y,&Z,B,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,B,qx,qy,qz);
          putpixel(X,Y,color);

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

}


/* 椭圆的中点算法 */
void MidPointEllipse_3DXY(Point3D A,int a,int b,int color,Point3D B,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_3DXY(A,x,y,color,B,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_3DXY(A,x,y,color,B,qx,qy,qz);
  }

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


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

/* 椭圆旋转后的4对称点的显示 */
void EllipsePoints_3DXY_XhuanZhuan(Point3D A,int x,int y,int color,float q,int i,int j,int k,int flag,Point3D B,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,B,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,B,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,B,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,B,qx,qy,qz);
         putpixel(X,Y,color);
}



/* 椭圆的中点算法 */
void MidPointEllipse_3DXY_XhuanZhuan(Point3D A,int a,int b,int color,float q,Point3D D,int flag,Point3D B,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_3DXY_XhuanZhuan(A,x,y,color,q,i,j,k,flag,B,qx,qy,qz);
  while((x - x0)<xP)

⌨️ 快捷键说明

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