CG实验4裁剪Word格式文档下载.docx
《CG实验4裁剪Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《CG实验4裁剪Word格式文档下载.docx(13页珍藏版)》请在冰豆网上搜索。
如果上述两种条件都不成立,则按第三种情况处理。
求出线段与窗口某边的交点,在交点处把线段一分为二,其中必有一段完全在窗口外,可弃之,对另一段则重复上述处理。
4.实验代码:
#include<
GL/glut.h>
stdio.h>
stdlib.h>
voidLineGL(intx0,int
y0,intx1,inty1)
{
glBegin(GL_LINES);
glColor3f(1.0f,0.0f,0.0f);
glVertex2f(x0,y0);
glColor3f(0.0f,1.0f,0.0f);
glVertex2f(x1,y1);
glEnd();
}
structoutcode
unsignedall;
unsignedleft,right,top,bottom;
};
structRectangle
floatxmin,xmax,ymin,ymax;
Rectangle
rect;
intx0,y0,x1,y1;
GLbooleanbClip=false;
voidcompoutcode(floatx,floaty,Rectanglerect,outcode*outcode)
outcode->
all=0;
top=outcode->
bottom=0;
if(y>
(float)rect.ymax)
top=1;
all+=1;
elseif(y<
(float)rect.ymin)
bottom=1;
right=outcode->
left=0;
if(x>
(float)rect.xmax)
{
right=1;
elseif(x<
(float)rect.xmin)
left=1;
intcohensutherlandlineclip(Rectangle
rect,int&
x0,int&
y0,int&
x1,int&
y1)
intaccept,done;
outcodeoutcode0,outcode1;
outcode*outcodeout;
floatx,y;
accept=0;
done=0;
compoutcode(x0,y0,rect,&
outcode0);
compoutcode(x1,y1,rect,&
outcode1);
do{
if(outcode0.all==0&
&
outcode1.all==0)
accept=1;
done=1;
elseif(outcode0.all&
outcode1.all!
=0)
else
{
if(outcode0.all!
outcodeout=&
outcode0;
outcode1;
if(outcodeout->
left)
y=y0+(y1-y0)*(rect.xmin-x0)/(x1-x0);
x=(float)rect.xmin;
elseif(outcodeout->
top)
x=x0+(x1-x0)*(rect.ymax-y0)/(y1-y0);
y=(float)rect.ymax;
right)
y=y0+(y1-y0)*(rect.xmax-x0)/(x1-x0);
x=(float)rect.xmax;
bottom)
x=x0+(x1-x0)*(rect.ymin-y0)/(y1-y0);
y=(float)rect.ymin;
all==outcode0.all)
x0=x;
y0=y;
x1=x;
y1=y;
}while(!
done);
if(accept)
LineGL(x0,y0,x1,y1);
returnaccept;
voidmyDisplay()
glClear(GL_COLOR_BUFFER_BIT);
glRectf(rect.xmin,rect.ymin,rect.xmax,rect.ymax);
if(!
bClip)
cohensutherlandlineclip(rect,x0,y0,x1,y1);
glFlush();
voidInit()
glClearColor(0.0,0.0,0.0,0.0);
glShadeModel(GL_FLAT);
rect.xmin=100;
//窗口的大小
rect.xmax=300;
rect.ymin=100;
rect.ymax=300;
x0=450,y0=0,x1=0,y1=450;
//裁剪前的直线端点
printf("
Presskey'
c'
toClip!
\nPresskey'
r'
toRestore!
\n"
);
voidReshape(intw,inth)
glViewport(0,0,(GLsizei)w,
(GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0,(GLdouble)w,0.0,(GLdouble)h);
voidkeyboard(unsignedcharkey,intx,inty)
switch(key)
case'
:
bClip=true;
glutPostRedisplay();
//重画
break;
bClip=false;
Init();
//
x'
exit(0);
default:
intmain(intargc,char*argv[])
glutInit(&
argc,argv);
glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE);
glutInitWindowPosition(100,100);
glutInitWindowSize(640,480);
glutCreateWindow("
HelloWorld!
"
glutDisplayFunc(myDisplay);
glutReshapeFunc(Reshape);
glutKeyboardFunc(keyboard);
glutMainLoop();
return0;
5.实验思考题
请分别给出直线的三种不同位置情况,测试实验代码是否存在问题,有的话请调试改正。
可能的话,可以尝试实现梁友栋裁剪算法。
glut.h>
voidLineGL(intx0,inty0,intx1,inty1)
glBegin(GL_LINES);
glColor3f(1.0f,0.0f,0.0f);
glColor3f(0.0f,1.0f,0.0f);
glEnd();
unsignedall;
unsignedleft,right,top,bottom;
floatxmin,xmax,ymin,ymax;
structRectanglerect;
intbClip=0;
voidcompoutcode(floatx,floaty,structRectanglerect,structoutcode*outcode)
outcode->
if(y>
{
}
elseif(y<
if(x>
{
elseif(x<
intcohensutherlandlineclip(structRectanglerect,intx0,inty0,intx1,inty1)
intaccept,done;
structoutcodeoutcode0,outcode1;
structoutcode*outcodeout;
floatx,y;
accept=0;
done=0;
compoutcode(x0,y0,rect,&
compoutcode(x1,y1,rect,&
do{
if(outcode0.all==0&
accept=1;
done=1;
elseif(outcode0.all&
outcode1.all!
else
if(outcode0.all!
outcodeout=&
if(outcodeout->
y=y0+(y1-y0)*(rect.xmin-x0)/(x1-x0);
x=(float)rect.xmin;
elseif(outcodeout->
x=x0+(x1-x0)*(rect.ymax-y0)/(y1-y0);
y=(float)rect.ymax;
y=y0+(y1-y0)*(rect.xmax-x0)/(x1-x0);
x=(float)rect.xmax;
x=x0+(x1-x0)*(rect.ymin-y0)/(y1-y0);
y=(float)rect.ymin;
x0=x;
x1=x;
}while(!
if(accept)
LineGL(x0,y0,x1,y1);
returnaccept;
glClear(GL_COLOR_BUFFER_BIT);
glRectf(rect.xmin,rect.ymin,rect.xmax,rect.ymax);
if(!
cohensutherlandlineclip(rect,x0,y0,x1,y1);
glFlush();
glClearColor(0.0,0.0,0.0,0.0);
glShadeModel(GL_FLAT);
rect.xmin=100;
rect.xmax=300;
rect.ymin=100;
rect.ymax=300;
x0=450,y0=0,x1=0,y1=450;
printf("
glViewport(0,0,(GLsizei)w,(GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0,(GLdouble)w,0.0,(GLdouble)h);
switch(key)
case'
bClip=1;
glutPostRedisplay();
break;
bClip=0;
Init();
exit(0);
default:
glutInit(&
glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE);
glutInitWindowPosition(100,100);
glutInitWindowSize(640,480);
glutCreateWindow("
glutDisplayFunc(myDisplay);
glutReshapeFunc(Reshape);
glutKeyboardFunc(keyboard);
glutMainLoop();
return0;