在Opengl应用框架下实现C-S裁剪算法
《计算机图形学》上机试验报告 姓名 学号 20147770228 试验 题目 Cohen-Sutherland裁剪算法 实 验 设 计 (必做)在Opengl应用框架下实现C-S裁剪算法。 完成一个四边形对两条线段的裁剪: 四边形的左上角和右下角顶点分别为(100,100),(300,200), 线段1的两个端点为(150,50),(250,150); 线段2的两个端点为(180,50),(180,380)。 关 键 代 码 #include // OPenGL好用工具库 const int XL=100; const int XR=300; const int YB=100; const int YT=200; int x1=150,y1=50,x2=250,y2=150; #define LIFT 1 #define RIGHT 2 #define BOTTOM 4 #define TOP 8 char encode(float x,float y) { char c=0; if(xXR) c|=RIGHT; if(yYT) c|=TOP; return c; } void CSLineClip(int char code2=encode(x2,y2); int x,y; char code = 3; while (code1||code2) { if(code1 != 0) { code=code1; }else { code=code2; } if((code float k=(float)(y2-y1)/(x2-x1); y=int(k*(XL-x1)+y1+0.5); } else if((code float k=(float)(y2-y1)/(x2-x1); y=int(k*(XR-x1)+y1+0.5); } else if((code float k=(float)(x2-x1)/(y2-y1); x=int(k*(y-y1)+x1+0.5); } else if((code float k=(float)(x2-x1)/(y2-y1); x=int(k*(y-y1)+x1+0.5); } if(code==code1) { x1=x; y1=y; code1=encode(x,y); } else if(code==code2) { x2=x; y2=y; code2=encode(x,y); } } } void init(void) { glClearColor(1.0, 1.0, 1.0, 0.0); // 设置背景颜色 glMatrixMode(GL_PROJECTION); // 设置投影参数 gluOrtho2D(0.0, 600.0, 0.0, 400.0); // 设置场景的大小 } void draw(void) { glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0, 0.0, 0.0); // 设置画图颜色 glBegin(GL_LINE_LOOP); glVertex2i(XL, YB); // 绘制几何图形 glVertex2i(XR, YB); glVertex2i(XR, YT); glVertex2i(XL, YT); glEnd( ); glBegin(GL_LINES); glVertex2i(x1, y1); // 绘制几何图形 glVertex2i(x2, y2); glEnd( ); CSLineClip(x1,y1,x2,y2,XL,XR,YB,YT); glColor3f(1.0, 0.0, 0.0); glLineWidth(3.0); glBegin(GL_LINES); glVertex2i(x1, y1); // 绘制几何图形 glVertex2i(x2, y2); glEnd( ); gl( ); // 处理绘图pipeLine } void main(int argc, char** argv) { glutInit( // 初始化GLUT环境 glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); // GLUT显示模式:单缓冲区、RGB颜色模型 glutInitWindowPosition(50, 100); // 窗口左上角的位置 glutInitWindowSize(600, 450); // 显示窗口的大小 glutCreateWindow(“An Example of OpenGL“); // 创建显示窗口,加上标题 init( ); glutDisplayFunc(draw); // 调用绘图函数 glutMainLoop( ); // 进入事务处理循环 } 运 行 截 图 注:表格高度可依据内容自己调整。