#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 300
void 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;
}
梁友栋-Barsky裁剪算法
最新推荐文章于 2021-10-18 16:29:24 发布