当前位置:编程学习 > C/C++ >>

编码裁剪算法

编码裁剪算法
     用任意颜色绘制窗口,并用一种颜色绘制线段,利用编码裁剪算法对线段进行裁剪。要求能够演示出裁剪过程,裁剪前的图形要绘出,当按下任意按键,绘制出裁剪结果。请使用TC打开源程序:
#include<stdio.h>
#include<graphics.h>
#define LEFT 1
#define RIGHT 2
#define BOTTOM 4
#define TOP 8
#define FALSE 0
#define TRUE 1
void Line_Clipping(x1,y1,x2,y2,xw_xmin,yw_ymin,xw_xmax,yw_ymax)
float x1,y1,x2,y2,xw_xmin,yw_ymin,xw_xmax,yw_ymax;
{
 int draw,done;
 int code1,code2,code;
 float x,y;
 draw=FALSE;done=FALSE;
 code1=get_code(x1,y1,xw_xmin,yw_ymin,xw_xmax,yw_ymax);
 code2=get_code(x2,y2,xw_xmin,yw_ymin,xw_xmax,yw_ymax);
 while(!done)
 {
  if(code1==0&&code2==0)
  {
   draw=TRUE;done=TRUE;
  }
  else if(code1&code2!=0)
  {
   done =TRUE;
  }else
  {
   if(code1!=0)
   code=code1;
   else
   code=code2;
  if((code&TOP)!=0)
  {y=yw_ymax;
  x=x1+(y-y1)*(x2-x1)/(y2-y1);

  }
else if((code&BOTTOM)!=0)
{
 y=yw_ymin;
 x=x1+(y-y1)*(x2-x1)/(y2-y1);
}
else if((code&RIGHT)!=0)
{
 x=xw_xmax;
 y=y1+(x-x1)*(y2-y1)/(x2-x1);
}
else if((code&LEFT)!=0)
{
 x=xw_xmin;
 y=y1+(x-x1)*(y2-y1)/(x2-x1);
}
if(code==code1)
{
 x1=x;
 y1=y;
 code1=get_code(x1,y1,xw_xmin,yw_ymin,xw_xmax,yw_ymax);
}
else
{
 x2=x;
 y2=y;
 code2=get_code(x2,y2,xw_xmin,yw_ymin,xw_xmax,yw_ymax);
}
}
if(draw)
{
 setcolor(8);
  line(x1,y1,x2,y2);
}
}
}
int get_code(x,y,xw_xmin,yw_ymin,xw_xmax,yw_ymax)
float x,y,xw_xmin,yw_ymin,xw_xmax,yw_ymax;
{
 int code;
 code=0;
 if(y>yw_ymax)
 code|=TOP;
 else if(y<yw_ymin)
 code|=BOTTOM;
 if(x>xw_xmax)
 code|=RIGHT;
 else if(x<xw_xmin)
 code|=LEFT;
 return code;
}
void main()
{
 float x1=76,y1=40,x2=60,y2=80,xw_xmin=50,xw_xmax=80,yw_ymin=50,yw_ymax=70;
 int gdriver=DETECT,gmode;
 initgraph(&gdriver,&gmode,"C:\\TURBOC2");
 setcolor(5);
 line(x1,y1,x2,y2);
 rectangle(xw_xmin,yw_ymin,xw_xmax,yw_ymax);
 getch();
 cleardevice();
 setcolor(8);
 rectangle(xw_xmin,yw_ymin,xw_xmax,yw_ymax);
 Line_Clipping(x1,y1,x2,y2,xw_xmin,yw_ymin,xw_xmax,yw_ymax);
 getch();
 closegraph();
}


摘自 pzhsunxu的专栏
补充:软件开发 , C语言 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,