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

📄 tuxing3.c

📁 在TC环境下实现三维图形的生成
💻 C
📖 第 1 页 / 共 2 页
字号:
#include"stdio.h";
#include"graphics.h"
#include"math.h"
#include"dos.h"
#include"time.h"

/********************/
/*                  */
/*     二维图形     */
/*                  */
/********************/
typedef struct Point      /*  点 */
{
   int x;
   int y;
}Point;

typedef struct Line       /*  线 */
{
    Point  A;/*起点*/
    Point  B;/*终点*/
    int color; /*颜色*/
}Line;



typedef struct Yuan       /*  圆 */
{
   Point  o; /*圆心*/
   int r;    /*半径*/
   int color;/*颜色*/
}Yuan;

typedef struct TuoYuan    /*椭 圆*/
{
   Point  o;/*中心*/
   int a;   /*长轴*/
   int b;   /*短轴*/
   int color;/*颜色*/
}TuoYuan;

typedef struct Qiu        /* 球 */
{
   Point  o;/*中心*/
   int r;
   int color; /*颜色*/
}Qiu;

typedef struct Rect       /* 矩形*/
{
  Point LeftTop;
  Point RightDown;
  int color;
}Rect;


/********************************/
/****     二维基本变换     ******/
/********************************/

/* 点的平移变换 */
void PinYi(int * x,int * y,int tx,int ty)
{
  *x = *x + tx;
  *y = *y + ty;

}



/* 点的旋转变换 */

void XuanZhuan(int * x,int * y,float q)
{
  int m ;
  int n;
  float Q;
  Q = (3.1415926/180)*q;
  m = (*x);
  n = (*y);
  *x = m * cos(Q) - n * sin(Q);
  *y = m * sin(Q) + n * cos(Q);
}

/* 绕任意点的旋转变换 */

void XuanZhuan_RY(int m,int n,int * x,int * y,float q)/* 绕(m,n)的旋转*/
{

  PinYi(x,y,-m,-n);
    XuanZhuan(x,y,q);
  PinYi(x,y,m,n);
}

/* 点的放缩变换 */
void FangSuo(int * x,int * y,float sx,float sy)
{
   *x =*x * sx;
   *y =*y * sy;
}

/* 以任意点的放缩变换 */
void FangSuo_RY(int m,int n,int * x,int * y,float sx,float sy) /*以(m,n)为参考点*/
{
   PinYi(x,y,-m,-n);
     FangSuo(x,y,sx,sy);
   PinYi(x,y,m,n);
}



/* 点的错切变换 */
void CuoQie(int * x,int * y,float q,int flag)
{
  float Q;
  Q = (3.1415926/180) * q;
  if(flag==0)/* y为依赖轴 */
  {
    *x = *x + tan(Q)*(*y);
    *y = *y;
  }
  else
  {
    *y = *y + tan(Q)*(*x);
    *x = *x;
  }

}

/* 以任意点的错切变换 */
void CuoQie_RY(int m,int n,int * x,int * y,float q,int flag) /* 以为(m,n)参考点*/
{

    PinYi(x,y,-m,-n);
    CuoQie(x,y,q,flag);
    PinYi(x,y,m,n);

}



/***********************/
/*                     */
/*      三维图形       */
/*                     */
/***********************/


typedef struct Point3D      /*  点 */
{
   int x;
   int y;
   int z;
}Point3D;


typedef struct ZFT        /*正方体*/
{
  Point3D A;/*正方体的中心*/
  int r;    /*    边长    */
  int color;/* 第一面颜色 */
}ZFT;


/********************************/
/****                      ******/
/****     三维基本变换     ******/
/****                      ******/
/********************************/


/* 点的平移变换 */
void PinYi3D(int * x,int * y,int * z,int tx,int ty,int tz)
{
  *x = *x + tx;
  *y = *y + ty;
  *z = *z + tz;

}



/* 点旋转变换 */

void XuanZhuan3D(int * x,int * y,int *z,float q,int flag)
{
  int m,n,t;
  float Q;
  m = (*x);
  n = (*y);
  t = (*z);
  Q = (3.1415926/180)*q;
  if(flag==1)   /* 绕x轴旋转*/
  {
    *x = *x;
    *y = n * cos(Q) - t * sin(Q);
    *z = n * sin(Q) + t * cos(Q);
   }
   if(flag==2)  /* 绕y轴旋转*/
   {
     *x = m * cos(Q) + t * sin(Q);
     *y = *y;
     *z = -m * sin(Q) + t * cos(Q);
   }
   if(flag==3)  /* 绕z轴旋转*/
   {
      *x = m * cos(Q) - n * sin(Q);
      *y = m * sin(Q) + n * cos(Q);
      *z = *z;
   }

}

/* 以任意轴 的点的旋转变换 */
void XuanZhuan3D_RY(int * x,int * y,int *z,float q,int flag,int s)
{

  if(flag==1)   /* 绕x = s 轴旋转*/
  {
    PinYi3D(x,y,z,-s,0,0);
       XuanZhuan3D(x,y,z,q,flag);
    PinYi3D(x,y,z,s,0,0);
   }
   if(flag==2)  /* 绕y = s轴旋转*/
   {
     PinYi3D(x,y,z,0,-s,0);
       XuanZhuan3D(x,y,z,q,flag);
     PinYi3D(x,y,z,0,s,0);
   }
   if(flag==3)  /* 绕z = s轴旋转*/
   {
     PinYi3D(x,y,z,0,0,-s);
       XuanZhuan3D(x,y,z,q,flag);
     PinYi3D(x,y,z,0,0,s);
   }

}

/* 点放缩变换 */
void FangSuo3D(int * x,int * y,int * z,float sx,float sy,float sz)
{
   *x =*x * sx;
   *y =*y * sy;
   *z =*z * sz;
}

/* 以任意点的放缩变换 */
void FangSuo3D_RY(int m,int n,int t,int * x,int * y,int *z,float sx,float sy,float sz) /*以(m,n,t)为参考点*/
{
   PinYi3D(x,y,z,-m,-n,-t);
     FangSuo3D(x,y,z,sx,sy,sz);
   PinYi3D(x,y,z,m,n,t);
}

/************************/
/*                      */
/* 三维坐标系的旋转变换 */
/*                      */
/************************/

void XuanZhuan3D_ZBX(int * x,int * y,int *z,float q,int flag)
{
  int m,n,t;
  float Q;
  m = (*x);
  n = (*y);
  t = (*z);
  Q = (3.1415926/180 )*q;
  if(flag==1)   /* x,y轴的旋转*/
  {
    *x = m * cos(Q) + n * sin(Q);
    *y = m * cos(Q) - n * sin(Q);
    *z = *z;
   }
   if(flag==2)  /* y,z的轴旋转*/
   {
     *x = *x;
     *y = n * cos(Q) + t * sin(Q);
     *z = n * sin(Q) - t * cos(Q);
   }
   if(flag==3)  /* z,x的轴旋转*/
   {
      *x = t * sin(Q) - m * cos(Q);
      *y = *y;
      *z = t * cos(Q) + m * sin(Q);
   }
}


/********************************/
/*                              */
/* 三维空间点到二维平面点的投影 */
/*                              */
/********************************/
void Point3D_2D(int * x,int * y,int * z,float qx,float qy,float qz)/*投影方向为(qx,qy,qz)*/
{
  XuanZhuan3D_ZBX(x,y,z,qx,1);
  XuanZhuan3D_ZBX(x,y,z,qz,2);

}





/***********************/
/*   直线的DDA 算法    */
/***********************/

void LineDDA(Point A,Point B,int color)
{
   int x0,y0,x1,y1,x;
   float dy,dx,y,m;

   if(A.x<B.x)
   {
      x0 = A.x;
      y0 = A.y;
      x1 = B.x;
      y1 = B.y;

      dx = x1 - x0;
      dy = y1 - y0;
      m = dy/dx;
      y = y0;
      for(x = x0;x <= x1;x++)
      {
        putpixel(x,(int)(y + 0.5),color);
        y = y + m;
      }
   }

  if(A.x>B.x)
  {
      x0 = B.x;
      y0 = B.y;
      x1 = A.x;
      y1 = A.y;

      dx = x1 - x0;
      dy = y1 - y0;
      m = dy/dx;
      y = y0;
      for(x = x0;x <= x1;x++)
      {
        putpixel(x,(int)(y + 0.5),color);
        y = y + m;
      }
  }
  if(A.x==B.x)
  {
    if(A.y<=B.y)
     {
        x0 = A.x;
        y0 = A.y;
        while(y0<=B.y)
        {
           putpixel(x0,y0,color);
           y0 = y0 +1;
        }
     }
     else
     {
        x0 = B.x;
        y0 = B.y;
        while(y0<=A.y)
        {
           putpixel(x0,y0,color);
           y0 = y0 +1;
        }
     }
  }

}

/***********************/
/*   直线的中点算法    */
/***********************/

void MidPointLine(Point A,Point B,int color)
{
  int dx,dy,incrE,incrNE,d,x,y,x0,y0,x1,y1;

   x0 = A.x;
   y0 = A.y;
   x1 = B.x;
   y1 = B.y;

  dx = x1 - x0;
  dy = y1 - y0;
  d = dx - 2 * dy;
  incrE = -2 * dy;
  incrNE = 2 * (dx - dy);
  x = x0,y = y0;
  putpixel(x,y,color);
  while(x < x1)
  {
    if(d > 0)
      d = d + incrE;
    else
      {
        d = d + incrNE;
        y++;
       
      }
      x++;
      putpixel(x,y,color);
  }
}



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


/* 圆的8对称点的显示 */
void CirclePoints(int x0,int y0,int x,int y,int color)/* 圆心为(x0,y0);*/
{
  putpixel(x,y,color);                 /*(x,  y) */
  putpixel(x0-y0+y,y0-x0+x,color);     /*(y,  x) */
  putpixel(x0+y0-y,y0-x0+x,color);     /*(-y, x) */
  putpixel(2*x0-x,y,color);            /*(-x, y) */
  putpixel(x0-y0+y,y0+x0-x,color);     /*(y, -x) */
  putpixel(x,2*y0-y,color);            /*(x, -y) */
  putpixel(2*x0-x,2*y0-y,color);       /*(-x,-y) */
  putpixel(x0+y0-y,y0+x0-x,color);     /*(-y,-x) */
}


/* 算法 1:圆的中点算法 */
void MidPointCircle_1(Point Q,int radius,int color)/* 圆心为 Q */
{
  int x,y,x0,y0;
  float d;

  x0 = Q.x;
  y0 = Q.y;

  x = x0;
  y = y0+radius;
  d = 5.0/4.0 - radius;
  CirclePoints(x0,y0,x,y,color);
  while((y-y0)>(x-x0))
  {
    if(d<=0)
      d = d + 2.0*(x-x0) + 3;
    else
      {
        d = d + 2.0*((x-x0)-(y-y0)) + 5;
        y--;
      }
    x++;
    CirclePoints(x0,y0,x,y,color);
  }

}

/* 算法 2 :消除了浮点运算的中点算法 */

void MidPointCircle_2(Point Q,int radius,int color)/* 圆心为(x0,y0);*/
{
  int x,y,d,x0,y0;

  x0 = Q.x;
  y0 = Q.y;

  x = x0;
  y = y0 + radius;
  d = 5 - 4*radius;
  CirclePoints(x0,y0,x,y,color);
  while((y-y0)>(x-x0))
  {
   if(d<=0)
      d = d + 8*(x-x0) + 12;
    else
      {
        d = d + 8*((x-x0)-(y-y0)) + 20;
        y--;
      }
    x++;
    CirclePoints(x0,y0,x,y,color);
  }
}

/* 算法 3 :消除了乘法运算的中点算法 */
void MidPointCircle_3(Point Q,int radius,int color)/* 圆心为(x0,y0);*/
{
   int x,y,d,deltaE,deltaSE,x0,y0;

   x0 = Q.x;
   y0 = Q.y;

   x = x0;
   y = y0 + radius;
   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 Zft3D(Point3D A,int r,int color,float qx,float qy,float qz) /* 观察方向为(qx,qy,qz)*/
{
   int x,y,z,X,Y,Z;
   Point3D B1,B2,B3,B4,B5,B6,B7,B8;
   Point A1,A2,A3,A4,A5,A6,A7,A8;

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


   B1.x = x + r/2.0; B1.y = y - r/2.0; B1.z = z - r/2.0;
   B2.x = x + r/2.0; B2.y = y + r/2.0; B2.z = z - r/2.0;
   B3.x = x - r/2.0; B3.y = y + r/2.0; B3.z = z - r/2.0;
   B4.x = x - r/2.0; B4.y = y - r/2.0; B4.z = z - r/2.0;


   B5.x = x + r/2.0; B5.y = y - r/2.0; B5.z = z + r/2.0;
   B6.x = x + r/2.0; B6.y = y + r/2.0; B6.z = z + r/2.0;
   B7.x = x - r/2.0; B7.y = y + r/2.0; B7.z = z + r/2.0;
   B8.x = x - r/2.0; B8.y = y - r/2.0; B8.z = z + r/2.0;

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

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

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

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

⌨️ 快捷键说明

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