计算机图形学图形裁剪
宁夏师范学院数学与计算机科学学院
《计算机图形学》实验
报告
软件系统测试报告下载sgs报告如何下载关于路面塌陷情况报告535n,sgs报告怎么下载竣工报告下载
实验序号: 8 实验项目名称:图形裁剪
学 号 姓 名 专业、班
实验地点 指导教师 时 间
一、实验目的:
1.理解区域码(region Code,RC);
2.设计Cohen-Sutherland直线裁剪算法和梁友栋-Barsky线段裁剪算法
3.编程实现Cohen-Sutherland直线裁剪算法和梁友栋-Barsky线段裁剪算法 二、实验内容与步骤
1. Cohen-Sutherland算法分析:
Cohen-Sutherland线段裁剪算法也称之为编码算法,第一步判断线段两端是否都位于窗口内,如果是,则线段完全可见;否则进入第二步,判断线段是否为显然不可见,即线段的两端点均落在窗口某边所在直线的外侧,如果是,则裁减结束;否则进入第三步,求线段与窗口边延长线的交点,这个交点将线段分为两段,其中一段显然不可见,丢弃。对余下的另一段重新进行第一步,第二步判断,直至结束。整个裁减的过程可以看作一个丢弃的过程。
S S
i
外侧
P 内P 内侧 侧
情况1 情况2
S S
i
内侧
P P 外侧
情况3 情况4
2.梁友栋-Barsky算法分析:
(1)初始化线段交点的参数:u=0,u=1; 12
(2)计算出各个裁剪边界的p、q值;
(3)调用函数clipTest(),在函数中根据p、q来判断:是舍弃线段还是改变交点的参数。
? 当p<0时,参数r用于更新u; 1
(u=max{u,…,r}) 11k
? 当p>0时,参数r用于更新u。 2
(u=min{u,…,r}) 22k
?如果更新了u或u后,使u>u,则舍弃该线段。 1212
?当p=0且q<0时,因为线段平行于边界并且位于边界之外,则舍弃该
线段。见下图所示。
(4)p、q的四个值经判断后,如果该线段未被舍弃,则裁剪线段的端点坐标
由参数u和u的值决定。 12
三、程序代码:
1.Cohen-Sutherland程序代码: #include
#include
class wcPt2D{
public:
GLfloat x,y;};
inline GLint round(const GLfloat a){
return GLint(a+0.5);}
const GLint winLeftBitCode = 0x1;
const GLint winRightBitCode = 0x2; const GLint winBottomBitCode = 0x4; const GLint winTopBitCode = 0x8;
void init(void){
glClearColor(1.0,1.0,1.0,0.0);
glMatrixMode(GL_PROJECTION);
gluOrtho2D(0.0,640.0,0.0,480.0);
glMatrixMode(GL_MODELVIEW);} void setPixel(GLint xCoord,GLint yCoord){
glBegin(GL_POINTS);
glVertex2i(xCoord,yCoord);
glEnd();}
void lineBres (int x0,int y0,int xend,int yend){
int dx = fabs(xend - x0),dy = fabs(yend - y0);
int p = 2 * dy - dx;
int twoDy = 2 * dy, twoDyMinusDx = 2 * (dy - dx);
int x,y;
if(x0 > xend){
x = xend;
y = yend;
xend = x0;}
else{
x = x0;
y = y0;}
setPixel(x,y);
while(x < xend){
x++;
if(p < 0)
p += twoDy;
else{
y++;
p += twoDyMinusDx;}
setPixel(x,y);}}
inline GLint inside(GLint code){
return GLint(!code);}
inline GLint reject(GLint code1,GLint code2){
return GLint(code1&code2);} inline GLint accept(GLint code1,GLint code2){
return GLint(!(code1|code2));} GLubyte encode(wcPt2D pt,wcPt2D winMin,wcPt2D winMax){
GLubyte code = 0x00;
if(pt.xwinMax.x)
code = code|winRightBitCode;
if(pt.ywinMax.y)
code = code|winTopBitCode;
return (code);}
void swa
ppt
关于艾滋病ppt课件精益管理ppt下载地图下载ppt可编辑假如ppt教学课件下载triz基础知识ppt
s(wcPt2D *p1,wcPt2D*p2){
wcPt2D tmp;
tmp = *p1;
*p1 = *p2;
*p2 = tmp;}
void swapCodes(GLubyte *c1,GLubyte *c2){
GLubyte tmp;
tmp = *c1;
*c1 = *c2;
*c2 = tmp;}
void lineClipCohSuth(wcPt2D winMin,wcPt2D winMax,wcPt2D p1,wcPt2D p2){
GLubyte code1,code2;
GLint done = false,plotLine = false;
GLfloat m;
while(!done){
code1 = encode(p1,winMin,winMax);
code2 = encode(p2,winMin,winMax);
if(accept(code1,code2)){
done = true;
plotLine = true;}
else
if(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);
if(code1&winLeftBitCode){
p1.y+=(winMin.x-p1.x)*m;
p1.x = winMin.x;}
else
if(code1&winRightBitCode){
p1.y+=(winMax.x-p1.x)*m;
p1.x = winMax.x;}
else
if(code1&winBottomBitCode){
if(p2.x!=p1.x)
p1.x+=(winMin.y - p1.y)/m;
p1.y = winMin.y;}
else
if(code1&winTopBitCode){
if(p2.x!=p1.x)
p1.x+=(winMax.y - p1.y)/m;
p1.y = winMax.y;}
}
}
if(plotLine)
lineBres(round(p1.x),round(p1.y),round(p2.x),round(p2.y));//直线生成算法
}
void display(void){
int flag = 1;
wcPt2D winMin,winMax,p1,p2;
winMin.x = 100;//定义裁剪窗口
winMin.y = 200;
winMax.x = 400;
winMax.y = 400;
p1.x = 50;//定义被裁剪的直线端点
p1.y = 50;
p2.x = 450;
p2.y = 450;
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0.0,0.0,1.0);
glRectf(winMin.x,winMin.y,winMax.x,winMax.y);//绘制蓝色裁剪矩形
glColor3f(1.0,1.0,1.0);
if (flag){lineClipCohSuth (winMin, winMax,p1,p2);// 绘制裁剪线段}
else{
glBegin(GL_LINES);
glVertex2i(p1.x,p1.y);
glVertex2i(p2.x,p2.y);
glEnd();}
glFlush();
}
void Reshape(int w, int h){
glViewport(0, 0, (GLsizei) w, (GLsizei) h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0, (GLdouble) w, 0.0, (GLdouble) h);}
void keyboard(unsigned char key, int x, int y){
int flag;
if (key=='c' || key=='C') flag=1;
if (key=='r' || key=='R') flag=0;
glutPostRedisplay();}
void main(int argc,char **argv){
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowPosition(100,100);
glutInitWindowSize(640,480);
glutCreateWindow("chaungkou");
init();
glutDisplayFunc(display);
glutReshapeFunc(Reshape);
glutKeyboardFunc(keyboard);
glutMainLoop();}
2.梁友栋-Barsky程序代码: #include
#include
#include
class wcPt2D{
public:
GLfloat x,y;
setCoords(GLfloat xCoord,GLfloat yCoord){
x = xCoord;
y = yCoord;}
GLfloat getx() const{
return x;}
GLfloat gety() const{
return y;}
};
void init(void){
glClearColor(1.0,1.0,1.0,0.0);
glMatrixMode(GL_PROJECTION);
gluOrtho2D(0.0, 640.0, 0.0, 480.0);} void Reshape(int w, int h){
glViewport(0, 0, (GLsizei) w, (GLsizei) h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0, (GLdouble) w, 0.0, (GLdouble) h);}
inline GLint round(const GLfloat a){return GLint(a+0.5);}
GLint clipTest(GLfloat p,GLfloat q,GLfloat *u1,GLfloat *u2){
GLfloat r;
GLint returnValue = true;
if(p<0.0){
r = q/p;
if(r>*u2)
returnValue = false;
else
if(r>*u1)
*u1 = r;}
else
if(p>0.0){
r = q/p;
if(r<*u1)
returnValue = false;
else if(r<*u2)
*u2 = r;}
else
if(q<0.0)
returnValue = false;
return(returnValue);
}
void setPixel(GLint xCoord,GLint yCoord){
glBegin(GL_POINTS);
glVertex2i(xCoord,yCoord);
glEnd();}
void lineBres(int x0,int y0,int xEnd,int yEnd){
int dx = fabs(xEnd - x0),dy = fabs(yEnd - y0);
int p = 2*dy - dx;
int twoDy = 2*dy,twoDyMinusDx = 2*(dy - dx);
int x,y;
if(x0>xEnd){
x = xEnd;
y = yEnd;
xEnd = x0;}
else{
x = x0;
y = y0;}
setPixel(x,y);
while(x0.0){
p1.setCoords(p1.getx()+u1*dx,p1.gety()+u1*dy);}
glColor3f(0.0,0.0,0.0);
lineBres(round(p1.getx()),round(p1.gety()),round(p2.getx()),round(p2.gety()));}}}
void display(){
GLint flag = 1;
wcPt2D winMin , winMax , p1 , p2;
winMin.x=100; winMin.y=200;//定义裁剪窗口
winMax.x=400; winMax.y=400;
p1.x=50; p1.y=50; //定义被裁剪的直线端点
p2.x=450; p2.y=450;
glClear(GL_COLOR_BUFFER_BIT);
glColor3f (0.3, 0.8, 0.7);
glRectf(winMin.x ,winMin.y ,winMax.x,winMax.y); //绘制裁剪矩形
glColor3f (1.0, 1.0, 1.0);
if (flag){
lineClipLiangBarsk (winMin, winMax,p1,p2);// 绘制裁剪线段 }
else{
glBegin(GL_LINES);
glVertex2i(p1.x,p1.y);
glVertex2i(p2.x,p2.y);
glEnd();}
glFlush();}
void main(int argc,char **argv){
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowPosition(50,50);
glutInitWindowSize(600,600);
glutCreateWindow("Demo");
init();
glutDisplayFunc(display);
glutReshapeFunc(Reshape);
glutMainLoop();}
四、程序运行结果
Cohen,Sutherland算法结果: 梁友栋-Barsky算法结果:
六、教师评语
成绩
签名:
日期: 年 月 日