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

📄 tuxing3.c

📁 计算机图形学
💻 C
📖 第 1 页 / 共 2 页
字号:
       putpixel(X,Y,color);

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


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

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

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

   LineDDA(A1,A2,color);
   LineDDA(A1,A4,color);
   LineDDA(A1,A5,color);

   LineDDA(A2,A3,color);
   LineDDA(A2,A6,color);

   LineDDA(A3,A4,color);
   LineDDA(A3,A7,color);

   LineDDA(A4,A8,color);

   LineDDA(A5,A6,color);
   LineDDA(A5,A8,color);

   LineDDA(A7,A6,color);
   LineDDA(A7,A8,color);


}





/*****************************/
/**                         **/
/**     矩形的旋转          **/
/**                         **/
/*****************************/
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;
     Y = y;
     XuanZhuan(&X,&Y,q);
       putpixel(X,Y,color);

     X = x2;
     Y = y;
     XuanZhuan(&X,&Y,q);
       putpixel(X,Y,color);
     y++;
  }

}




/******************************/
/*                            */
/*       椭圆的平移           */
/*                            */
/******************************/

/*平移后椭圆的4对称点的显示*/
void EllipsePoints_PinYi(int x0,int y0,int x,int y,int color,int tx,int ty) /*椭圆的中心为:(x0,y0)*/
{
  int X,Y;
  X = x;
  Y = y;
  PinYi(&X,&Y,tx,ty);
     putpixel(X,Y,color);      /*(x,  y)*/

  X = 2*x0-x;
  Y = y;
  PinYi(&X,&Y,tx,ty);
     putpixel(X,Y,color);      /*(-x, y)*/

  X = 2*x0-x;
  Y = 2*y0-y;
  PinYi(&X,&Y,tx,ty);
     putpixel(X,Y,color);      /*(-x,-y)*/

  X = x;
  Y = 2*y0-y;
  PinYi(&X,&Y,tx,ty);
     putpixel(X,Y,color);       /*(x, -y)*/
}

/* 椭圆的平移*/

void MidPointEllipse_PinYi(TuoYuan E,int tx,int ty)
{
  int x,y,xP,yP,x0,y0,a,b,color;
  float d,squrarea,squrareb;

   a = E.a;
   b = E.b;
   color = E.color;
   x0 = E.o.x;
   y0 = E.o.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_PinYi(x0,y0,x,y,color,tx,ty);

  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_PinYi(x0,y0,x,y,color,tx,ty);

  }

  /* 生成下半部椭圆*/
  x = x0 + a;
  y = y0;
  d = 4 * (squrarea - squrareb * a) + squrareb;

  EllipsePoints_PinYi(x0,y0,x,y,color,tx,ty);

  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_PinYi(x0,y0,x,y,color,tx,ty);

  }
}

/******************************/
/*                            */
/*       椭圆的旋转           */
/*                            */
/******************************/

/* 椭圆旋转后的4对称点的显示 */
void EllipsePoints_XuanZhuan(int m,int n,int x0,int y0,int x,int y,int color,float q) /*椭圆的中心为:(x0,y0),绕点(m,n)旋转*/
{
  int X,Y;
  X = x;
  Y = y;
  XuanZhuan_RY(m,n,&X,&Y,q);
     putpixel(X,Y,color);               /*(x,  y) */


  X = 2*x0-x;
  Y = y;
  XuanZhuan_RY(m,n,&X,&Y,q);
     putpixel(X,Y,color);              /*(-x, y) */


  X = 2*x0-x;
  Y = 2*y0-y;
  XuanZhuan_RY(m,n,&X,&Y,q);
     putpixel(X,Y,color);             /*(-x,-y) */

  X = x;
  Y = 2*y0-y;
  XuanZhuan_RY(m,n,&X,&Y,q);
     putpixel(X,Y,color);             /*(x, -y) */

}

/*        椭圆的旋转    */

MidPointEllipse_XuanZhuan(TuoYuan E,Point A,float q) /*绕A点旋转*/
{
  int x,y,xP,yP,x0,y0,a,b,color,m,n;
  float  d,squrarea,squrareb;
  m = A.x;
  n = A.y;
  x0 = E.o.x;
  y0 = E.o.y;
  a = E.a;
  b = E.b;
  color  = E.color;


  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_XuanZhuan(m,n,x0,y0,x,y,color,q);

  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_XuanZhuan(m,n,x0,y0,x,y,color,q);

  }
  /* 生成下半部椭圆*/
  x = x0 + a;
  y = y0;
  d = 4 * (squrarea - squrareb * a) + squrareb;

 EllipsePoints_XuanZhuan(m,n,x0,y0,x,y,color,q);

  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_XuanZhuan(m,n,x0,y0,x,y,color,q);
  }
}


/******************************/
/*                            */
/*       椭圆的放缩           */
/*                            */
/******************************/

/* 椭圆放缩后的4对称点的显示 */
void EllipsePoints_FangSuo(int m,int n,int x0,int y0,int x,int y,int color,float sx,float sy) /*椭圆的中心为:(x0,y0),以(m,n)为参考点放缩*/
{
  int X,Y;
  X = x;
  Y = y;
  FangSuo_RY(m,n,&X,&Y,sx,sy);
     putpixel(X,Y,color);               /*(x,  y) */


  X = 2*x0-x;
  Y = y;
  FangSuo_RY(m,n,&X,&Y,sx,sy);
     putpixel(X,Y,color);              /*(-x, y) */


  X = 2*x0-x;
  Y = 2*y0-y;
  FangSuo_RY(m,n,&X,&Y,sx,sy);
     putpixel(X,Y,color);             /*(-x,-y) */

  X = x;
  Y = 2*y0-y;
  FangSuo_RY(m,n,&X,&Y,sx,sy);
     putpixel(X,Y,color);             /*(x, -y) */

}

/*        椭圆的放缩     */

void MidPointEllipse_FangSuo(TuoYuan E,Point A,float sx,float sy) /*以A点为参考点放缩*/
{
  int x,y,xP,yP,x0,y0,a,b,color,m,n;
  float  d,squrarea,squrareb;
  m = A.x;
  n = A.y;
  x0 = E.o.x;
  y0 = E.o.y;
  a = E.a;
  b = E.b;
  color  = E.color;


  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_FangSuo(m,n,x0,y0,x,y,color,sx,sy);

  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_FangSuo(m,n,x0,y0,x,y,color,sx,sy);

  }
  /* 生成下半部椭圆*/
  x = x0 + a;
  y = y0;
  d = 4 * (squrarea - squrareb * a) + squrareb;

 EllipsePoints_FangSuo(m,n,x0,y0,x,y,color,sx,sy);

  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_FangSuo(m,n,x0,y0,x,y,color,sx,sy);
  }
}


/************************/
/**                    **/
/**   圆的错切变换     **/
/**                    **/
/************************/


/* 错切后圆的8对称点的显示 */
void CirclePoints_CuoQie(int m,int n,int x0,int y0,int x,int y,int color,float q,int flag)/* 圆心为(x0,y0);以(m,n)为参考点*/
{
  int X,Y;
  X = x;
  Y = y;
  CuoQie_RY(m,n,&X,&Y,q,flag);
       putpixel(X,Y,color);                /*(x,  y) */

  X = x0-y0+y;
  Y = y0-x0+x;
  CuoQie_RY(m,n,&X,&Y,q,flag);
        putpixel(X,Y,color);               /*(y,  x) */

  X = x0+y0-y;
  Y = y0-x0+x;
  CuoQie_RY(m,n,&X,&Y,q,flag);
        putpixel(X,Y,color);              /*(-y, x) */

  X = 2*x0-x;
  Y = y;
  CuoQie_RY(m,n,&X,&Y,q,flag);
        putpixel(X,Y,color);              /*(-x, y) */

  X = x0-y0+y;
  Y = y0+x0-x;
  CuoQie_RY(m,n,&X,&Y,q,flag);
        putpixel(X,Y,color);              /*(y, -x) */

  X = x;
  Y = 2*y0-y;
  CuoQie_RY(m,n,&X,&Y,q,flag);
       putpixel(X,Y,color);               /*(x, -y) */

  X =2*x0-x;
  Y =2*y0-y;
  CuoQie_RY(m,n,&X,&Y,q,flag);
       putpixel(X,Y,color);               /*(-x,-y) */

  X =x0+y0-y;
  Y =y0+x0-x;
  CuoQie_RY(m,n,&X,&Y,q,flag);
       putpixel(X,Y,color);               /*(-y,-x) */
}

/*  圆 的错切 */
void MidPointCircle_CuoQie(Yuan C,Point A,float q,int flag)/* 圆心为(x0,y0);*/
{
   int x,y,d,deltaE,deltaSE,x0,y0,radius,color,m,n;
   m = A.x;
   n = A.y;
   x0 = C.o.x;
   y0 = C.o.y;
   radius = C.r;
   color = C.color;

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

     CirclePoints_CuoQie(m,n,x0,y0,x,y,color,q,flag);
   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_CuoQie(m,n,x0,y0,x,y,color,q,flag);
   }

}


/***************************/
/****                   ****/
/****   图形显示函数    ****/
/****                   ****/
/***************************/

/** 显示一条直线 **/
void Show_L(Line L)
{
   LineDDA(L.A,L.B,L.color);
}

/** 显示一个圆     **/


void Show_C(Yuan C)
{
   MidPointCircle_3((C.o),C.r,C.color);
}

/** 显示一个椭圆 **/
void Show_E(TuoYuan E)
{
  MidPointEllipse(E.o,E.a,E.b,E.color);
}

/** 显示一个球 **/
void Show_Q(Qiu Q)
{
    QiuEC(Q.o,Q.r,Q.color);
}

/** 显示一个矩形 **/
void Show_R(Rect R)
{
   Rectangle(R.LeftTop,R.RightDown,R.color);
}

/** 显示一个正方体**/
void Show3D_Z(ZFT Z,float qx,float qy,float qz)/*观察方向为(qx,qy,qz)*/
{
   Zft3D(Z.A,Z.r,Z.color,qx,qy,qz);
}


main()
{
  int i;
  float k,h;

  Point PointA,PointB;
  Point * P;
  Line L1,L2;
  Yuan C1,C2;
  TuoYuan E1,E2,E3,E4;
  Qiu Q1,Q2,Q3;
  Rect R1,R2;

  Point3D D1,D2,D3;
  ZFT Z1,Z2;


  int graphdriver = DETECT,graphmode;
  initgraph(&graphdriver,&graphmode,"");

  PointA.x = 100,PointA.y = 100;PointB.x = 550,PointB.y = 150;

  L1.A = PointA;
  L1.B = PointB;
  L1.color = 2;

   /* Show_L(L1);  */


  C1.o.x = 300;
  C1.o.y = 300;
  C1.r = 60;
  C1.color = 11;
  C1.color = 4;

    /*Show_C(C1);*/ 
    PointA.x = 300;
    PointA.y = 240;
    k = 0.001;
       while(0)
       {
         C1.color = 0;
         MidPointCircle_CuoQie(C1,PointA,k - 0.001,0);
         C1.color = 4;
         MidPointCircle_CuoQie(C1,PointA,k,0);
         k = k + 0.001;
       }

  E1.o.x = 250;
  E1.o.y = 250;
  E1.a = 60; E1.b = 30;
  E1.color = 11;
    /* Show_E(E1);*/


  E2.o.x = 380;
  E2.o.y = 250;
  E2.a = 60; E2.b = 30;
  E2.color = 11;
      /* Show_E(E2);  */


  E3.o.x = 315;
  E3.o.y = 180;
  E3.a = 30; E3.b = 60;
  E3.color = 11;
      /* Show_E(E3); */

  E4.o.x = 315;
  E4.o.y = 320;
  E4.a = 30; E4.b = 60;
  E4.color = 11;
      /* Show_E(E4);

  PointA.x = 315;
  PointA.y = 248;

  R1.LeftTop.x = 313;
  R1.LeftTop.y = 248;
  R1.RightDown.x = 319;
  R1.RightDown.y = 450;
  R1.color = 2;
    Show_R(R1);*/

      k = 1;
      while(0)
      {
         E1.color = 0;
         E2.color = 0;
         E3.color = 0;
         E4.color = 0;
         MidPointEllipse_XuanZhuan(E1,PointA,k-1);
         MidPointEllipse_XuanZhuan(E2,PointA,k-1);
         MidPointEllipse_XuanZhuan(E3,PointA,k-1);
         MidPointEllipse_XuanZhuan(E4,PointA,k-1);
         Show_R(R1);
         E1.color = 11;
         E2.color = 11;
         E3.color = 11;
         E4.color = 11;
         MidPointEllipse_XuanZhuan(E1,PointA,k);
         MidPointEllipse_XuanZhuan(E2,PointA,k);
         MidPointEllipse_XuanZhuan(E3,PointA,k);
         MidPointEllipse_XuanZhuan(E4,PointA,k);
         k = k + 1;
      }
     PointB.x =190 ;
     PointB.y = 250;
        E1.color = 4;
      /* */  MidPointEllipse_FangSuo(E1,PointB,2,2);
       MidPointEllipse_PinYi(E1,150,0);




  Q1.o.x = 500;
  Q1.o.y = 400;
  Q1.r = 60;
  Q1.color = 11;

  /* */ Show_Q(Q1);

  R1.LeftTop.x = 50;
  R1.LeftTop.y = 150;
  R1.RightDown.x = 300;
  R1.RightDown.y = 200;
  R1.color = 11;
    Show_R(R1);

    Rectangle_XuanZhuan(R1,32);




  Z1.A.x = 500;
  Z1.A.y = 100;
  Z1.A.z = 200;
  Z1.r = 200;
  Z1.color = 11;

   Show3D_Z(Z1,40,50,50);








  getch();


  closegraph();
}


⌨️ 快捷键说明

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