计算机图形学裁剪
《计算机图形学》实验报告
学院:理学院专业:信息与计算科学班级:
姓名
学号
指导教师
实验时间
4.
实验地点
计算机实验室
成绩
实验项目名称
裁剪
实验环境
VC++ 6.0
实验内容
(1)理解直线裁剪的原理(Cohen-Surtherland算法、梁友栋算法)
(2)利用VC+OpenGL实现直线的编码裁剪算法,在屏幕上用一个封闭矩形裁剪任意一条直线。
};
Rectangle rect;
int x0,y0,x1,y1;
int CompCode(int x,int y,Rectangle rect)
{
int code=0x00;
if(y<rect.ymin)
code=code|4;
if(y>rect.ymax)
code=code|8;
if(x>rect.xmax)
x0=450,y0=0,x1=0,y1=450;
printf("Press key'c'to Clip!\nPress key'r'to Rrstore!\n");
}
void Reshape(int w,int h)
{
glViewport(0,0,(GLsizei)w,(GLsizei)h);
glMatrixMode(GL_PROJECTION);
accept=0;
done=0;
int code0,code1,codeout;
code0=CompCode(x0,y0,rect);
code1=CompCode(x1,y1,rect);
do{
if(!(code0 | code1))
{
accept=1;
done=1;
}
else if(code0 & code1)
}
}
}while(!done);
if(accept)
LineGL(x0,y0,x1,y1);
return accept;
}
void myDisplay()
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0f,0.0f,0.0f);
glRectf(rect.xmin,rect.ymin,rect.xmax,rect.ymax);
x=x0+(x1-x0)*(rect.ymax-y0)/(y1-y0);
y=(float)rect.ymax;
}
if(codeout==code0)
{
x0=x;y0=y;
code0=CompCode(x0,y0,rect);
}
else
{ቤተ መጻሕፍቲ ባይዱ
x1=x;y1=y;
code1=CompCode(x1,y1,rect);
y=y0+(y1-y0)*(rect.xmax)/(x1-x0);
x=(float)rect.xmax;
}
else if(codeout&BOTTOM_EDGE){
x=x0+(x1-x0)*(rect.ymin-y0)/(y1-y0);
y=(float)rect.ymin;
}
else if(codeout&TOP_EDGE){
glutReshapeFunc(Reshape);
glutMainLoop();
}
实验结果
实验总结
通过本次试验,理解直线裁剪的原理,利用VC+OpenGL实现直线的编码裁剪算法,在屏幕上用一个封闭矩形裁剪任意一条直线。
glutPostRedisplay();
break;
case'r':
Init();
glutPostRedisplay();
break;
case'x':
exit(0);
break;
default:
break;}
}
void main(int argc,char**argv)
{
glutInit(&argc,argv);
(3)调试、编译、修改程序。
实验原理
编码裁剪算法的主要思想是:对于每条线段,分为三种情况处理。(1)若线段完全在窗口之内,则显示该线段,称为“取”;(2)若线段明显在窗口之外,则丢弃该线段,称为“弃”;(3)若线段既不满足“取”的条件,也不满足“舍”的条件,则把线段分割为两段。其中一段完全在窗口之外,可弃之;对另一段则重复上述处理
LineGL(x0,y0,x1,y1);
glFlush();
}
void Init()
{
glClearColor(0.0,0.0,0.0,0.0);
glShadeModel(GL_FLAT);
rect.xmin=100;
rect.xmax=300;
rect.ymin=100;
rect.ymax=300;
done=1;
else
{
if(code0!=0)
codeout=code0;
else
codeout=code1;
if(codeout&LEFT_EDGE){
y=y0+(y1-y0)*(rect.xmin-x0)/(x1-x0);
x=(float)rect.xmin;
}
else if(codeout&RIGHT_EDGE){
实验过程
#include<GL/glut.h>
#include<stdio.h>
#include<stdlib.h>
#define LEFT_EDGE 1
#define RIGHT_EDGE 2
#define BOTTOM_EDGE 4
#define TOP_EDGE 8
void LineGL(int x0,int y0,int x1, int y1)
glLoadIdentity();
gluOrtho2D(0.0,(GLdouble)w,0.0,(GLdouble)h);
}
void keyboard(unsigned char key ,int x,int y)
{
switch(key)
{
case'c':
cohensutherlandlineclip(rect,x0,y0,x1,y1);
glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE);
glutInitWindowPosition(100,100);
glutInitWindowSize(640,480);
glutCreateWindow("hello world");
Init();
glutDisplayFunc(myDisplay);
code=code|2;
if(x<rect.xmin)
code=code|1;
return code;
}
int cohensutherlandlineclip(Rectangle rect,int&x0,int&y0,int&x1,int&y1)
{
int accept,done;
float x,y;
{
glBegin(GL_LINES);
glColor3f(1.0f,0.0f,0.0f); glVertex2f(x0,y0);
glColor3f(0.0f,1.0f,0.0f); glVertex2f(x1,y1);
glEnd();
}
struct Rectangle
{
float xmin,xmax,ymin,ymax;