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

📄 zhang.c

📁 计算机图形学
💻 C
📖 第 1 页 / 共 2 页
字号:
{
  int x0,x1,y0,y1,color,width;
  int figure;
  char ct;
  void MidPointLine(int x0,int y0,int x1,int y1,int color,int width,int figure);
  printf("Notice:\n");
  printf("  you can input the follow parameter:\n");
  printf("MidPointLine(50,25,-50,-25,2,1,1)\n");
  printf("MidPointLine(-50,25,50,-25,3,2,1)\n");
  printf("MidPointLine(-50,25,50,-25,3,2,0)\n");
  printf("MidPointLine(-50,75,50,-75,7,5,0)\n");
  MidPointLine(50,25,-50,-25,2,1,1);
  MidPointLine(-50,25,50,-25,3,2,1);
  MidPointLine(-50,-75,50,75,6,3,0);
  MidPointLine(-50,75,50,-75,7,5,0);
  printf("x0=");
  scanf("%d",&x0);
  printf("y0=");
  scanf("%d",&y0);
  printf("x1=");
  scanf("%d",&x1);
  printf("y1=");
  scanf("%d",&y1);
  printf("color=");
  scanf("%d",&color);
  printf("width=");
  scanf("%d",&width);
  printf("if draw real line,input 1 draw dashed,input else\n");
  printf("figure=");
  scanf("%d",&figure);
  MidPointLine(x0,y0,x1,y1,color,width,figure);
  setcolor(YELLOW);
  outtextxy(10,370,"If you want to continue to draw line:push Y");
  ct = getch();              /* Read a character from kbd    */
  if( 121 == ct )
  {
    clearviewport();
    moveto(0,0);
    setcolor(WHITE);
    printf("Try it again!\n");
    establishcoordinate();
    DrawLine(); }
 }
/*--------------------------------------------二维裁剪------------------------------------------*/
void CohenSutherlandLineClip(float x0,float y0,float x1,float y1,Rectangle *rect)
{
 void CompOutCode(float x,float y,Rectangle* rect,OutCode* outCode);
 int accept,done;
 OutCode outCode0,outCode1;
 OutCode *outCodeOut;
 float x,y;
 accept=false;
 done=false;
 CompOutCode(x0,y0,rect,&outCode0);
 CompOutCode(x1,y1,rect,&outCode1);
 Pause();
 do{
    if(outCode0.all==0&&outCode1.all==0)
    {
     accept=true;
     done=true;
     }
     else if((outCode0.all&outCode1.all)!=0)
      done=true;
     else
     {
      if(outCode0.all!=0)
       outCodeOut=&outCode0;
      else
       outCodeOut=&outCode1;
      if(outCodeOut->left)
      {
       y=y0+(y1-y0)*(rect->xmin-x0)/(x1-x0);
       x=(float)rect->xmin;
       }
       else if(outCodeOut->top)
      {
       x=x0+(x1-x0)*(rect->ymax-y0)/(y1-y0);
       y=(float)rect->ymax;
       }
        else if(outCodeOut->right)
      {
       y=y0+(y1-y0)*(rect->xmax-x0)/(x1-x0);
       x=(float)rect->xmax;
       }
       else if(outCodeOut->bottom)
      {
       x=x0+(x1-x0)*(rect->ymin-y0)/(y1-y0);
       y=(float)rect->ymin;
       }
       if(outCodeOut->all==outCode0.all)
       {x0=x;
        y0=y;
        CompOutCode(x0,y0,rect,&outCode0);
       }
       else
       {x1=x;
        y1=y;
        CompOutCode(x1,y1,rect,&outCode1);

        }
       }
      }while(!done);
      setcolor(BLACK);
      line(200,0,100,400);
      setcolor(WHITE);
      if(accept)
       line((int)x0,(int)y0,(int)x1,(int)y1);
       Pause();
    }
void CompOutCode(float x,float y,Rectangle* rect,OutCode* outCode)
/*说明:这个子程序供CohenSutherlandLineClip函数调用
  功能:实现对直线端点的编码*/
{
 outCode->all=0;
 outCode->top=outCode->bottom=0;
 if(y>(float)rect->ymax)
 {
  outCode->top=1;
  outCode->all+=8;
 }
 else if(y<(float)rect->ymin)
 {
  outCode->bottom=1;
  outCode->all+=4;
  }
 outCode->right=outCode->left=0;
 if(x>(float)rect->xmax)
 {
  outCode->right=1;
  outCode->all+=2;
 }
 else if(x<(float)rect->xmin)
 {
  outCode->left=1;
  outCode->all+=1;
  }
}

/*-----------------------显示三次Bezier曲线--------------------*/

void DisplayCubicBezierCurve(float p[4][2],int count)
{
 float c[2][4],t,deltat;
 float V[2],newV[2];
 int i,j;
 for(j=0;j<2;j++)
 {c[j][0]=p[0][j];
  c[j][1]=-3*p[0][j]+3*p[1][j];
  c[j][2]=3*p[0][j]-6*p[1][j]+3*p[2][j];
  c[j][3]=-p[0][j]+3*p[1][j]-3*p[2][j]+p[3][j];
  }
  V[0]=p[0][0];V[1]=p[0][1];
  deltat=1.0/count;
  t=0.0;
  for(i=1;i<=count;i++)
  {
   t+=deltat;
   newV[0]=c[0][0]+t*(c[0][1]+t*(c[0][2]+t*c[0][3]));
   newV[1]=c[1][0]+t*(c[1][1]+t*(c[1][2]+t*c[1][3]));
   line(V[0],V[1],newV[0],newV[1]);
   V[0]=newV[0],V[1]=newV[1];
   Pause();
   }

}

/*----------------------梁友栋-Barsky线段裁剪算法------------------------*/
int ClipT(float q,float d,float* t0,float* t1)
{
 float r;
 if(q<0)
 {
  r=d/q;
  if(r>*t1)
   return 0;
  else if(r>*t0)
  {
   *t0=r;
   return 1;
   }
  }
  else if(q>0)
  {
   r=d/q;
  if(r<*t0)
   return 0;
  else if(r<*t1)
  {
   *t1=r;
   return 1;
   }
  }
  else if(d<0)
   return 0;
 return 1;
}

void LiangBarskyLineClip(float x0,float y0,float x1,float y1,Rectangle *rect)
{
 float deltax,deltay,t0,t1;
 t0=0;t1=1;
 deltax=x1-x0;
 if(ClipT(-deltax,x0-rect->xmin,&t0,&t1))
  if(ClipT(deltax,rect->xmax-x0,&t0,&t1))
  {deltay=y1-y0;
   if(ClipT(-deltay,y0-rect->ymin,&t0,&t1))
    if(ClipT(deltay,rect->ymax-y0,&t0,&t1))
    {
     Pause();
     setcolor(BLACK);
     line(0,200,400,100);
     setcolor(YELLOW);
     line((int)(x0+t0*deltax),(int)(y0+t0*deltay),(int)(x0+t1*deltax),(int)(y0+t1*deltay));
     Pause();
     return;
    }
 }
 outtext("POP1 NOT BE SEEN!");
 Pause();
}


int main(void)
{
  int radius,list[10][2],x0,x1,y0,y1;
  float a,b,c,count=50;
  Rectangle rect={100,200,100,300};
  float p1[4][2]={{100,400},{200,200},{300,100},{400,300}};
  float p2[4][2]={{100,400},{200,200},{300,150},{400,300}};
 x0=0;
  x1=400;
  y0=200;
  y1=100;
 /*----------------------这组数也可以作为测试数据------------------------*/
  /* x0=125;
  x1=225;
  y0=150;
  y1=150;*/
  initgr(); /* BGI初始化 */
  /*****此部分添加你自己的代码,例如
  line(25, 25, 220, 220);
  circle(100, 100, 50);
  等等*****/
/*----------该小段用于LiangBarskyLineClip program的输入-----*/
  setcolor(CYAN);
  outtextxy(200,0,"this is a LiangBarskyLineClip program!");
  setcolor(YELLOW);
  line(0,200,400,100);
  rectangle(100,300,200,100);
  LiangBarskyLineClip(x0,y0,x1,y1,&rect);
  clearviewport();

/*--------该小段用于Bezier program的输入-----*/
  setcolor(GREEN);
  line(100,400,200,200);
  line(200,200,300,100);
  line(300,100,400,300);
  setcolor(YELLOW);
  line(100,400,200,200);
  line(200,200,300,150);
  line(300,150,400,300);
  outtextxy(200,0,"this is a Bezier program!");
  setcolor(RED);
  DisplayCubicBezierCurve(p1,count);
  setcolor(WHITE);
  DisplayCubicBezierCurve(p2,count);
  clearviewport();

/*--------该小段用于Cohen-Sutherland的输入-----*/
  outtextxy(200,0,"this is a Cohen-Sutherland program!");
  x0=200;
  x1=100;
  y0=0;
  y1=400;
  line(200,0,100,400);
  rectangle(100,300,200,100);
  CohenSutherlandLineClip(x0,y0,x1,y1,&rect);
  clearviewport();

/*--------该小段用于绘制五角星------*/
  DrawPentacle(100,450,225);

/*--------该小段用于填充五角星------*/
  FillPentacle(RED);

/*--------该小段用于PositiveNegativeParabola program的输入------*/
  setcolor(GREEN);
  printf("\n");
  outtextxy(55,0,"this is a parabola program drawed by positive-negative method");
  setcolor(WHITE);
  printf("\nstep\n");
  printf("First:establish coordinate\n");
  Pause();
  establishcoordinate();
  printf("Second:draw parabola  y=a*(x-b)^2+c\n");
  printf("    please input parameter:\n");
  printf("                           a=");
  scanf("%f",&a);
  printf("                           b=");
  scanf("%f",&b);
  printf("                           c=");
  scanf("%f",&c);
  PositiveNegativeParabola(a,b,c,BLUE);

/*--------该小段用于画直线法的输入------*/
  DrawLine();
  printf("\n\n");

/*--------该小段用于生成圆的等面积正多边形迫近法------*/
  printf("this is a program used for draw circle\n");
  printf("please input parameter:radius=");
  scanf("%d",&radius);
  CircleToPolygon(radius);
  Pause();
  getch(); /* 暂停一下,看看前面绘图代码的运行结果 */
  closegr(); /* 恢复TEXT屏幕模式 */
  return 0;
}

⌨️ 快捷键说明

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