直线段裁剪算法实验完整源代码

第一问:
#include
#include
#include
double xl=0.0,xr=500.0,yb=0.0,yt=500.0;
int makecode(double x,double y)
{
int c=0;
if(xelse if(x>xr) c=2;
if(yelse if(y>yt) c=c+8;
return c;
}


void DDALine(double x1,double y1,double x2,double y2)
{
double dx,dy,e,x,y;
int i;
dx=x2-x1;
dy=y2-y1;
e=(fabs(dx)>fabs(dy))? fabs(dx):fabs(dy);
dx/=e;
dy/=e;
x=x1;
y=y1;
for(i=0;i<=e;i++)
{
glBegin(GL_POINTS);
glColor3f(0.8,0.5,0.5);
glVertex2d(x/1000,y/1000);
glEnd();
x+=dx;
y+=dy;
}
glFlush();
}
void Cohen_Sutherland(void)
{
double x0=-3,y0=-3,x2=1000,y2=1000;
int c,c1,c2;
double x,y;
glClear(GL_COLOR_BUFFER_BIT);
c1=makecode(x0,y0);
c2=makecode(x2,y2);
while(c1!=0||c2!=0)
{
if(c1&c2==1) return;
c=c1;
if(c==0) c=c2;
if(c&1==1){y=y0+(y2-y0)*(xl-x0)/(x2-x0);x=xl;}
else if(c&2){y=y0+(y2-y0)*(xr-x0)/(x2-x0);x=xr;}
else if(c&4){x=x0+(x2-x0)*(yb-y0)/(y2-y0);y=yb;}
else if(c&8){x=x0+(x2-x0)*(yt-y0)/(y2-y0);y=yt;}
if(c==c1)
{
x0=x;y0=y;c1=makecode(x,y);
}
else
{
x2=x;y2=y;c2=makecode(x,y);
}
}
DDALine(x0,y0,x2,y2);
DDALine(xl,yb,xl,yt);
DDALine(xl,yt,xr,yt);
DDALine(xr,yt,xr,yb);
DDALine(xr,yb,xl,yb);
glFlush();
}
void main(int argc, char **argv) {
glutInit(&argc, argv); //3?ê??ˉglut
glutInitDisplayMode(GLUT_DEPTH | GLUT_SINGLE | GLUT_RGBA);
//éè??′°?úμ??£ê?£-é??è?o′?£?μ¥?o′?£???é??£Dí
glutInitWindowPosition(200,200); //éè??′°?úμ?????
glutInitWindowSize(400,400); //éè??′°?úμ?′óD?
glutCreateWindow("Cohen_Sutherland"); //′′?¨′°?ú2¢?3óètitle
glutDisplayFunc(&Cohen_Sutherland);//μ÷ó?renderScene°?????′??íμ?′°?ú
glutMainLoop(); //??è??-?·μè′y
}

第二问:
#include
#include
#include
double xl=0.0,xr=500.0,yb=0.0,yt=500.0;
bool cansee(double q,double d,double *t0,double *t1)
{
double r;
if(q<0)
{
r=d/q;
if(r>*t1) {return false;}
else if(r>*t0) {*t0=r; return true;}
}
else if(q>0)
{
r=d/q;
if(r<*t0) {return false;}
else if(r<*t1) {*t1=r; return true;}
}
else if(d<0) {return false;}
return true;
}
void DDALine(double x1,double y1,double x2,double y2)
{
double dx,dy,e,x,y;
int i;
dx=x2-x1;
dy=y2-y1;
e=(fabs(dx)>fabs(dy))? fabs(dx):fabs(dy);
dx/=e;
dy/=e;
x=x1;
y=y1;
for(i=0;i<=e;i++)
{
glBegin(GL_POINTS);
glColor3f(0.8,0.5,0.5);
glVertex2d(x/1000,y/1000);
glEnd();
x+=dx;
y+=dy;
}
glFlush();
}
void L_Barsky(void)
{
double x0=-3,y0=-30,x2=1500,y2=1000;
double t0,t1,deltax,deltay;
glClear(GL_COLOR_BUFFER_BIT);
t0=0.0;t1=1.0;
deltax=x2-x0; deltay=y2-y0;
if(cansee(-deltax,x0-xl,&t0,&t1))
if(cansee(deltax,xr-x0,&t0,&t1))
if(cansee(-deltay,y0-yb,&t0,&t1))
if(cansee(deltay,yt-y0,&t0,&t1))

{
x2=x0+t1*deltax;
y2=y0+t1*deltay;
x0=x0+t0*deltax;
y0=y0+t0*deltay;
}
DDALine(x0,y0,x2,y2);
DDALine(xl,yb,xl,yt);
DDALine(xl,yt,xr,yt);
DDALine(xr,yt,xr,yb);
DDALine(xr,yb,xl,yb);
}
void main(int argc, char **argv) {
glutInit(&argc, argv); //3?ê??ˉglut
glutInitDisplayMode(GLUT_DEPTH | GLUT_SINGLE | GLUT_RGBA);
//éè??′°?úμ??£ê?£-é??è?o′?£?μ¥?o′?£???é??£Dí
glutInitWindowPosition(200,200); //éè??′°?úμ?????
glutInitWindowSize(400,400); //éè??′°?úμ?′óD?
glutCreateWindow("L_Barsky"); //′′?¨′°?ú2¢?3óètitle
glutDisplayFunc(&L_Barsky);//μ÷ó?renderScene°?????′??íμ?′°?ú
glutMainLoop(); //??è??-?·μè′y
}

相关文档
最新文档