直線裁剪

#include <graphics.h>
#include <conio.h>
int xw_min,xw_max,yw_min, yw_max;
main()
{
  int driver,mode;
  int x1,y1,x2,y2;
  xw_min=150; yw_min=100;xw_max=500; yw_max=300;
  driver=DETECT;
  initgraph(&driver,&mode,"");
  draw_win(1);
  
  x1=60;y1=120;x2=580;y2=270;
  clipline(x1,y1,x2,y2);

  x1=480;y1=260;x2=700;y2=150;
  clipline(x1,y1,x2,y2);

  getch();
  closegraph();
}

clipline(int x1,int y1,int x2,int y2)
{
  int i,code1[4],code2[2],done,display;
  float m;
  int x11,x22,y11,y22,mark;
  done=0;
  display=0;
  while(done==0)
  {
    x11=x1;x22=x2;y11=y1;y22=y2;
     setcolor(2);
   line(x1,y1,x2,y2);
    encode(x1,y1,code1);
    encode(x2,y2,code2);
    if(accept(code1,code2))
    {
      done=1;
      display=1;
      break;
    }
    else if(reject(code1,code2))
      {
        done=1;
        break;
      }
    mark=swapyn(code1,code2);
    if(mark==1)
    {
      x1=x22;
      x2=x11;
      y1=y22;
      y2=y11;
    }
    if(x2==x1)  m=-1;
    else  m=(float)(y2-y1)/(float)(x2-x1);
    if(code1[0])
    {
      x1+=(yw_min-y1)/m;
      y1=yw_min;
    }
    else if(code1[1])
      {
        x1-=(y1-yw_max)/m;
        y1=yw_max;
      }
      else if(code1[2])
           {
         y1-=(x1-xw_min)*m;
         x1=xw_min;
           }
           else if(code1[3])
            {
              y1+=(xw_max-x1)*m;
              x1=xw_max;
            }
  }
  if(display==1)
  setcolor(3);
   line(x1,y1,x2,y2);
}
encode(int x,int y,int code[])
{
  int i;
  for(i=0;i<4;i++)  code[i]=0;
  if(x<xw_min)
    code[2]=1;
  else if(x>xw_max)
       code[3]=1;
  if(y>yw_max)
    code[1]=1;
  else if(y<yw_min)
      code[0]=1;
}

accept(int code1[],int code2[])
{
  int i,flag;
  flag=1;
  for(i=0;i<4;i++)
    if((code1[i]==1)||(code2[i]==1))
    {
      flag=0;
      break;
    }
  return(flag);
}
reject(int code1[],int code2[])
{
  int i,flag;
  flag=0;
  for(i=0;i<4;i++)
    if((code1[i]==1)&&(code2[i]==1))
    {
      flag=1;
      break;
    }
  return(flag);
}
swapyn(int code1[],int code2[])
{
  int i,flag1,flag2,tmp;
  flag1=1;
  for(i=0;i<4;i++)
    if(code1[i]==1)
    {
      flag1=0;
      break;
    }
  flag2=1;
  for(i=0;i<4;i++)
    if(code2[i]==1)
    {
      flag2=0;
      break;
    }
  if((flag1==0)&&(flag2==0)) return(0);
  if((flag1==1)&&(flag2==0))
  {
    for(i=0;i<4;i++)
    {
      tmp=code1[i];
      code1[i]=code2[i];
      code2[i]=tmp;
    }
    return(1);
  }
  return(0);
}
draw_win(int c)
{
setcolor(c);
line(xw_min,yw_min,xw_max,yw_min);
line(xw_max,yw_min,xw_max,yw_max);
line(xw_max,yw_max,xw_min,yw_max);
line(xw_min,yw_max,xw_min,yw_min);

}
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章