计算机图形学CohenSutherland直线裁剪算法实验.docx
《计算机图形学CohenSutherland直线裁剪算法实验.docx》由会员分享,可在线阅读,更多相关《计算机图形学CohenSutherland直线裁剪算法实验.docx(7页珍藏版)》请在冰豆网上搜索。
计算机图形学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.xcode=code|winLeftBitCode;
if(pt.x>winMax.x)
code=code|winRightBitCode;
if(pt.ycode=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();
}
实验结果: