梁友栋-Barsky裁剪算法

来源:互联网 发布:iodine windows 编辑:程序博客网 时间:2024/05/22 10:50
#include <stdio.h>#include <math.h>#include <graphics.h>#define LEFT 1#define RIGHT 2#define BOTTOM 4#define TOP 8#define XL 150#define XR 350#define YB 150#define YT 300void LBClipLine(float x1,float y1,float x2,float y2,float xl,float xr,float yb,float yt);int ClipT(float p,float q,float *u1,float *u2);main(){int x1,y1,x2,y2,xx,yy,xxx,yyy;int gdriver=DETECT,gmode;initgraph(&gdriver,&gmode," ");cleardevice();setcolor(12);line(XL,YT,XR,YT);line(XL,YB,XR,YB);line(XL,YT,XL,YB);line(XR,YT,XR,YB);setcolor(9);x1=50;y1=200;x2=450;y2=350;xx=0;yy=0;xxx=0;yyy=0;line(x1,y1,x2,y2);getch();setcolor(15);LBClipLine(x1,y1,x2,y2,XL,XR,YB,YT);getch();closegraph();}void LBClipLine(float x1,float y1,float x2,float y2,float xl,float xr,float yb,float yt){float dx,dy,u1,u2;u1=0;u2=1.0;dx=x2-x1;dy=y2-y1;if(ClipT(-dx,x1-xl,&u1,&u2)){if(ClipT(dx,xr-x1,&u1,&u2)){if(ClipT(-dy,y1-yb,&u1,&u2)==0){if(ClipT(dy,yt-y1,&u1,&u2)){if(u2<1.0){x2=x1+u2*dx;y2=y1+u2*dy;}if(u1>0.0){x1=x1+u1*dx;y1=y1+u1*dy;}line(x1,y1,x2,y2);return;}}}}}int ClipT(float p,float q,float *u1,float *u2){float r,f;if(p<0.0){r=q/p;if(r>*u2)f=0;else if(r>*u1){*u1=r;f=1;}}else if(p>0.0){r=q/p;if(r<*u1) f=0;else if(r<*u2){*u2=r;f=1;}}else if(q<0.0)f=0;return f;}

原创粉丝点击