计算机图形学CohenSutherland直线裁剪算法实验.docx
- 文档编号:28157287
- 上传时间:2023-07-08
- 格式:DOCX
- 页数:8
- 大小:251.04KB
计算机图形学CohenSutherland直线裁剪算法实验.docx
《计算机图形学CohenSutherland直线裁剪算法实验.docx》由会员分享,可在线阅读,更多相关《计算机图形学CohenSutherland直线裁剪算法实验.docx(8页珍藏版)》请在冰豆网上搜索。
计算机图形学CohenSutherland直线裁剪算法实验
《计算机图形学实验》报告
任课教师:
***
2016年春季学期
实验:
Cohen-Sutherland直线裁剪算法
实验时间:
2016年11月3日
实验地点:
信息学院2204
实验目的:
掌握Cohen-Sutherland直线裁剪算法
程序代码:
#include
#include
#include
#include
#include
#include
#include
inta,b,a1,b1,pp0,pq0,pp1,pq1;
voidsetPixel(GLintx,GLinty){
glBegin(GL_POINTS);
glVertex2i(x,y);
glEnd();
}
voidinit(void){
glClearColor(1.0,1.0,1.0,0.0);
glMatrixMode(GL_PROJECTION);
gluOrtho2D(0.0,200.0,0.0,150.0);
}
voidLineDDA(intx0,inty0,intxEnd,intyEnd){
intdx=xEnd-x0;
intdy=yEnd-y0;
intsteps,k;
floatxIncrement,yIncrement,x=x0,y=y0;
if(abs(dx)>abs(dy))
steps=abs(dx);
else
steps=abs(dy);
xIncrement=float(dx)/float(steps);
yIncrement=float(dy)/float(steps);
for(k=0;k { x+=xIncrement; y+=yIncrement; setPixel(x,y); } } //裁剪 classwcPt2D{ public: GLfloatx,y; }; inlineGLintround(constGLfloata){ returnGLint(a+0.5); } constGLintwinLeftBitCode=0x1; constGLintwinRightBitCode=0x2; constGLintwinBottomBitCode=0x4; constGLintwinTopBitCode=0x8; inlineGLintinside(GLintcode){ returnGLint(! code); } inlineGLintreject(GLintcode1,GLintcode2){ returnGLint(code1&code2); } inlineGLintaccept(GLintcode1,GLintcode2){ returnGLint(! (code1|code2)); } GLubyteencode(wcPt2Dpt,wcPt2DwinMin,wcPt2DwinMax){ GLubytecode=0x00; if(pt.x code=code|winLeftBitCode; if(pt.x>winMax.x) code=code|winRightBitCode; if(pt.y code=code|winBottomBitCode; if(pt.y>winMax.y) code=code|winTopBitCode; return(code); } voidswapPts(wcPt2D*p1,wcPt2D*p2){ wcPt2Dtmp; tmp=*p1; *p1=*p2; *p2=tmp; } voidswapCodes(GLubyte*c1,GLubyte*c2){ GLubytetmp; tmp=*c1; *c1=*c2; *c2=tmp; } voidlineClipCohSuth(wcPt2DwinMin,wcPt2DwinMax,wcPt2Dp1,wcPt2Dp2){ GLubytecode1,code2; GLintdone=false,plotLine=false; GLfloatm; intx0=0;inty0=0;intx1=0;inty1=0; while(! done){ code1=encode(p1,winMin,winMax); code2=encode(p2,winMin,winMax); if(accept(code1,code2)){ done=true; plotLine=true; }//简取 elseif(reject(code1,code2))//简弃 done=true; else{ if(inside(code1)){ swapPts(&p1,&p2); swapCodes(&code1,&code2); } if(p2.x! =p1.x) m=(p2.y-p1.y)/(p2.x-p1.x);//计算k if(code1&winLeftBitCode){ p1.y+=(winMin.x-p1.x)*m; p1.x=winMax.x; }elseif(code1&winBottomBitCode){ if(p2.x! =p1.x) p1.x+=(winMin.y-p1.y)/m; p1.y=winMin.y; }elseif(code1&winTopBitCode){ if(p2.x! =p1.x) p1.x+=(winMax.y-p1.y)/m; p1.y=winMax.y; } }//else }//while if(plotLine){ LineDDA(round(p1.x),round(p1.y),round(p2.x),round(p2.y)); } } voidcutwindow(intxmin,intymin,intxmax,intymax){ LineDDA(xmin,ymin,xmin,ymax); LineDDA(xmin,ymin,xmax,ymin); LineDDA(xmin,ymax,xmax,ymax); LineDDA(xmax,ymin,xmax,ymax); } voiddisplay(){//DDA演示 printf("DDA演示\n"); glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0,0.0,0.0); glBegin(GL_LINES); wcPt2Dmin; min.x=a; min.y=b; wcPt2Dmax; max.x=a1; max.y=b1; wcPt2Dp1; p1.x=pp0; p1.y=pq0; wcPt2Dp2; p2.x=pp1; p2.y=pq1; cutwindow(min.x,min.y,max.x,max.y);//绘制窗口 lineClipCohSuth(min,max,p1,p2); glEnd(); glFlush(); } voidmain(intargc,char**argv){ glutInit(&argc,argv); glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); glutInitWindowPosition(500,300); glutInitWindowSize(400,300); glutCreateWindow("直线裁剪"); init(); printf("请输入裁剪窗口左下角坐标\n"); scanf("%d%d",&a,&b); printf("请输入裁剪窗口右上角坐标\n"); scanf("%d%d",&a1,&b1); printf("请输入要裁剪的直线第一点坐标\n"); scanf("%d%d",&pp0,&pq0); printf("请输入要裁剪的直线第二点坐标\n"); scanf("%d%d",&pp1,&pq1); glutDisplayFunc(display); glutMainLoop(); } 实验结果:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 图形学 CohenSutherland 直线 裁剪 算法 实验