CG实验4裁剪Word格式文档下载.docx

上传人:b****7 文档编号:22849986 上传时间:2023-02-05 格式:DOCX 页数:13 大小:25KB
下载 相关 举报
CG实验4裁剪Word格式文档下载.docx_第1页
第1页 / 共13页
CG实验4裁剪Word格式文档下载.docx_第2页
第2页 / 共13页
CG实验4裁剪Word格式文档下载.docx_第3页
第3页 / 共13页
CG实验4裁剪Word格式文档下载.docx_第4页
第4页 / 共13页
CG实验4裁剪Word格式文档下载.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

CG实验4裁剪Word格式文档下载.docx

《CG实验4裁剪Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《CG实验4裁剪Word格式文档下载.docx(13页珍藏版)》请在冰豆网上搜索。

CG实验4裁剪Word格式文档下载.docx

如果上述两种条件都不成立,则按第三种情况处理。

求出线段与窗口某边的交点,在交点处把线段一分为二,其中必有一段完全在窗口外,可弃之,对另一段则重复上述处理。

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;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 成人教育 > 自考

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1