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

📄 3dgraphics1.c

📁 计算机图形学
💻 C
📖 第 1 页 / 共 3 页
字号:
   d = 5 - 4*radius;
   deltaE = 12;
   deltaSE = 20 - 8*radius;
   CirclePoints(x0,y0,x,y,color);
   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(x0,y0,x,y,color);
   }

}



/***********************/
/*   椭圆的中点算法    */
/***********************/


/* 椭圆的4对称点的显示 */
void EllipsePoints(int x0,int y0,int x,int y,int color) /*椭圆的中心为:(x0,y0)*/
{
  putpixel(x,y,color);              /*(x,  y) */
  putpixel(2*x0-x,y,color);         /*(-x, y) */
  putpixel(2*x0-x,2*y0-y,color);    /*(-x,-y) */
  putpixel(x,2*y0-y,color);         /*(x, -y) */
}


/* 椭圆的中点算法 */
void MidPointEllipse(Point Q,int a,int b,int color)
{
  int x,y,xP,yP,x0,y0;
  float d,squrarea,squrareb;
   x0 = Q.x;
   y0 = Q.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(x0,y0,x,y,color);
  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(x0,y0,x,y,color);
  }

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


/***********************/
/*     矩形的算法      */
/***********************/
void Rectangle(Point LeftTop,Point RightDown,int color)
{
  int x1,y1,x2,y2,x,y;
  x1 = LeftTop.x;
  x2 = RightDown.x;
  y1 = LeftTop.y;
  y2 = RightDown.y;
  x = x1;
  while(x<=x2)
  {
    putpixel(x,y1,color);
    putpixel(x,y2,color);
    x++;
  }

  y = y1;
  while(y<=y2)
  {
     putpixel(x1,y,color);
     putpixel(x2,y,color);
     y++;
  }

}


/*************************/
/******   网格球     *****/
/*************************/

void QiuEC(Point o,int r,int color) /*  球心为(x,y) */
{
  float i,X,Y,ra,rb;
  int k,x,y;
  x = o.x;
  y = o.y;
  MidPointEllipse(o,r,15,color);
  MidPointCircle_1(o,r,color);
  for(i=1;i<=(r/5);i++)
  {

     MidPointEllipse(o,5*i,r,color);

  }
  k = (int)(r/4);
  for(i=1;i<4;i++)
  {
     o.y = y-(4-i)*k;
     MidPointEllipse(o,sqrt(2*r*(k*i)-k*i*k*i),i*4,color);
     o.y = y+(4-i)*k;
     MidPointEllipse(o,sqrt(2*r*(k*i)-k*i*k*i),i*4,color);
  }
}

/***************************/
/**            **/
/**      长方体的算法     **/
/**                       **/
/***************************/
void Cft3D(Point3D A,int a,int b,int h,float q,float qx,float qy,float qz) /* 观察方向为(qx,qy,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;
   float Q;
   Q = (3.1415926/180)*q;


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

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

   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;



   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; 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; /* 窗的台板*/
    j = Y; i = X;
    while(j>=((B5.y + B6.y)/2.0 - 30))
    {
       while(i <= B5.x + 35 )
       {
          Point3D_2D(&X,&Y,&Z,qx,qy,qz);
          putpixel(X,Y,6);
          i++;
          X =i;Y = j; Z = (B5.z + B1.z)/2.0 + 30;
       }
       j--;
       X = B5.x; Y = j;Z = (B5.z + B1.z)/2.0 + 30;i = X;
    }



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


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


    X = (B5.x + B8.x)/2.0 - 50; Y = B5.y; Z = B5.z;
    j = Y; k = B5.z;
    while(j>=B5.y-50)
    {
       while(k>=B5.z - 100)
       {
        Point3D_2D(&X,&Y,&Z,qx,qy,qz);
          putpixel(X,Y,4);
        k--;
        X = (B5.x + B8.x)/2.0 - 50; Y = j; Z = k;
        }
       j--;
       X = (B5.x + B8.x)/2.0 - 50;Y = j;Z = B5.z; k = 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-60;
    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-360;T2.z = B5.z;
    i = B5.x+400; j = T1.y;
    while(i >=B8.x-400)
    {
      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;

    }

}

/*****************************/
/**                         **/
/**     四棱锥的画法        **/
/**                         **/
/*****************************/
void Slz3D(Point3D A,int h,int r,float qx,float qy,float qz)
{
   int x,y,z,X,Y,Z,i,j,k;
   Point3D A1,A2,A3,A4,P;
   Point B1,B2,B3,B4,Q,temp;


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

   A1.x = x + r/2.0; A1.y = y - r/2.0; A1.z = A.z;
   A2.x = x + r/2.0; A2.y = y + r/2.0; A2.z = A.z;
   A3.x = x - r/2.0; A3.y = y + r/2.0; A3.z = A.z;
   A4.x = x - r/2.0; A4.y = y - r/2.0; A4.z = A.z;

   P.x = A.x; P.y = A.y; P.z = A.z - h;



   X = P.x; Y = P.y; Z = P.z;
      Point3D_2D(&X,&Y,&Z,qx,qy,qz);
   Q.x = X; Q.y = Y;

   X = A4.x; Y = A4.y; Z = A4.z;
   j = A4.y;
   while(j<=A3.y)
   {
      Point3D_2D(&X,&Y,&Z,qx,qy,qz);
      temp.x = X; temp.y = Y;
        MidPointLine(Q,temp,14);
        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(&X,&Y,&Z,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(&X,&Y,&Z,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(&X,&Y,&Z,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,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 - B1.z * 4.0/5.0;
   D2.x = B3.x; D2.y = (B3.y + B4.y)/2.0; D2.z = B2.z - B2.z * 4.0/5.0;


   X = B1.x; Y = B1.y; Z = B1.z;
     Point3D_2D(&X,&Y,&Z,qx,qy,qz);
   A1.x = X; A1.y = Y;

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

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

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

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

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

  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(&X,&Y,&Z,qx,qy,qz);
           temp1.x = X; temp1.y = Y;

       X = T2.x; Y = T2.y; Z = T2.z;
       Point3D_2D(&X,&Y,&Z,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(&X,&Y,&Z,qx,qy,qz);
           temp1.x = X; temp1.y = Y;

       X = T2.x; Y = T2.y; Z = T2.z;
       Point3D_2D(&X,&Y,&Z,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); */

}


/*****************************/
/**                         **/
/**     矩形的旋转          **/
/**                         **/
/*****************************/
void Rectangle_XuanZhuan(Rect R,float q)
{
  int x1,y1,x2,y2,x,y,color,X,Y;

  color = R.color;

  x1 = R.LeftTop.x;
  y1 = R.LeftTop.y;

  x2 = R.RightDown.x;
  y2 = R.RightDown.y;

  x = x1;
  while(x<=x2)
  {
    X = x;
    Y = y1;
    XuanZhuan(&X,&Y,q);
       putpixel(X,Y,color);

    X = x;
    Y = y2;
    XuanZhuan(&X,&Y,q);
       putpixel(X,Y,color);

    x++;
  }

  y = y1;
  while(y<=y2)
  {
     X = x1;

⌨️ 快捷键说明

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