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

📄 3dgraphics4.c

📁 计算机图形学
💻 C
📖 第 1 页 / 共 5 页
字号:
          }
        x++;
       putpixel(y,x,color);
       }

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


}



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


/* 圆的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 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) */

⌨️ 快捷键说明

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