计算机图形学实验报告.docx
- 文档编号:30750799
- 上传时间:2023-08-20
- 格式:DOCX
- 页数:22
- 大小:174.56KB
计算机图形学实验报告.docx
《计算机图形学实验报告.docx》由会员分享,可在线阅读,更多相关《计算机图形学实验报告.docx(22页珍藏版)》请在冰豆网上搜索。
计算机图形学实验报告
学生实验实习报告册
学年学期:
2016-2017学年春
秋学期
课程名称:
大学计算机基础
学生学院:
通信与信息工程学院
专业班级:
学生学号:
学生姓名:
联系电话:
重庆邮电大学教务处印制
实验实习名
OpenGL基本使用
指导教师
秦红星
考核成绩
课程名称
计算机图形学A
课程编号
040659
实验实习地点
信息科技大厦S306
完成日期
2016年10月17日
学生姓名
学生学号
学院专业
广电与数字媒体类
所在班级
教师评语
教师签名:
年月日
一、实验实习目的及要求
目的:
认识了解OpenGL的性质、功能
要求:
1.利用OpenGL绘制一个简单的场景:
比如球体、正方体
2.加入灯光
3.实现交互操作:
平移、缩放、旋转
二、实验实习设备(环境)及要求(软硬件条件)
采用MicrosoftVisualC2010生成环境并用C++编写程序
三、实验实习内容与步骤
内容:
背景为黑色,在点光源下,能够实现平移、缩放、旋转的球。
步骤:
建立立体-->添加光照-->添加变换
1.先写“主函数”,在主函数中将窗口生成好。
2.在“自定义函数1”中对窗口进行清除、填色等操作。
3.在“自定义函数1”中设置点光源,设置光照的各种参数。
4.在“自定义函数1”中设置平移、缩放、旋转及各参数。
5.在“自定义函数2”中设置平移和缩放的循环。
6.在主函数中调用这两个自定义函数,并且在主函数里面用“自定义函数1”为参数调用glutDisplayFunc()来注册一个绘图函数。
其次用空闲回调函数glutIdleFunc()来使球体不停地循环有缩放、平移功能的函数。
实现动画。
四、实验实习过程或算法(源程序、代码)
#include
GLfloatangle=0.0f;
GLfloatmultiply=0.0f;
voiddisplay(void)
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glClearColor(0.0f,0.0f,0.0f,0.0f);//设置窗口里面的背景颜色
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(90.0f,1.0f,1.0f,20.0f);
glLoadIdentity();
gluLookAt(0.5,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0);
{
//设置一个点光源
GLfloatlight_position[]={0.5f,0.0f,0.0f,1.0f};//(xyzw)w为1时代表点光源,0时代表方向光源
GLfloatlight_ambient[]={0.5f,0.5f,0.5f,1.0f};//(0001)
GLfloatlight_diffuse[]={1.0f,1.0f,1.0f,1.0f};//(1111)
GLfloatlight_specular[]={1.0f,1.0f,1.0f,1.0f};//(1111)
glLightfv(GL_LIGHT0,GL_POSITION,light_position);
glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient);//光源环境光强值
glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);//光源漫反射强值
glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular);//光源镜面反射强值
glEnable(GL_LIGHT0);//打开该光源
glEnable(GL_LIGHTING);//打开光照
}
{
glRotatef(angle,0.0f,1.0f,0.0f);
glTranslatef(0.0f,0.0f,0.6f);//平移
glScaled(multiply,multiply,multiply);//缩放
glutSolidSphere(0.2,50,50);
}
glutSwapBuffers();
}
voidrotateAndzoom(void)//旋转和缩放
{
angle+=1.0f;
if(angle>=360.0f)
angle=0.0f;
display();
//设置旋转
multiply+=0.01f;
if(multiply>=2.0f)
//multiply-=0.01f;
//if(multiply<=1.0f)
multiply=1.0f;
display();
//设置缩放
}
intmain(intargc,char*argv[])
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_RGBA|GLUT_DOUBLE);
glutInitWindowPosition(400,50);
glutInitWindowSize(800,800);
glutCreateWindow("立体");
glutDisplayFunc(&display);
glutIdleFunc(&rotateAndzoom);//旋转
glutMainLoop();//调用该函数启动程序,所有以创建的窗口将会显示
return0;
}
五、实验实习结果分析和(或)源程序调试过程
实验实习名
直线扫面和区域填充实现
指导教师
秦红星
考核成绩
课程名称
计算机图形学A
课程编号
040659
实验实习地点
信息科技大厦S306
完成日期
2016年11月10日
学生姓名
学生学号
学院专业
广电与数字媒体类
所在班级
教师评语
教师签名:
年月日
一、实验实习目的及要求
项目目的:
熟悉光栅图形学中的相关算法
项目要求:
1.应用OpenGL点绘制函数直线与区域
2.采用直线扫面算法绘制一条线段,直线有离散点组成
3.利用区域填充算法绘制多边形区域,区域由离散点组成
二、实验实习设备(环境)及要求(软硬件条件)
采用MicrosoftVisualC2010生成环境并用C++编写程序
三、实验实习内容与步骤
内容:
1.用DDA算法实现点绘制直线。
2.用直线扫描法填充绘制绿色的六边形。
步骤:
点绘制直线:
1.选定用利用DDA算法。
2.完善相应计算点的算法代码,利用该代码算出直线上所有的点。
3.用OpenGL函数将点连接起来形成直线绘制直线。
区域填充:
1.初始化一个空的栈用于存放种子点,将种子点(x,y)入栈;
2.判断栈是否为空,如果栈为空则结束算法,否则取出栈顶元素作为当前扫描线的种子点(x,y),y是当前的扫描线;
3.从种子点(x,y)出发,沿当前扫描线向左、右两个方向填充,直到边界。
分别标记区段的左、右端点坐标为xLeft和xRight;
4.分别检查与当前扫描线相邻的y-1和y+1两条扫描线在区间[xLeft,xRight]中的像素,从xLeft开始向xRight方向搜索,若存在非边界且未填充的像素点,则找出这些相邻的像素点中最右边的一个,并将其作为种子点压入栈中,然后返回第
(2)步;
四、实验实习过程或算法(源程序、代码)
1.“点绘制直线”的代码:
#include
#include
voidinit(void)
{
glClearColor(0.0,0.0,0.0,0.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0,500.0,0.0,500.0);
glMatrixMode(GL_MODELVIEW);
}
voiddrawpixel(intx,inty,intz)//此为一个画点的函数
{
glBegin(GL_POINTS);
glViewport(0,0,500,500);//指定在窗口中的位置。
0,0为左下角窗口的位置,500,500为宽度和高度
glVertex3d(x,y,0);
glEnd();
glFlush();
}
voidDDALine(intx0,inty0,intx1,inty1)
{
intx;
GLfloatNx,Ny,y;//x,y的点的个数
intdx,dy,quantity;//dx是x0-x1的x的总增量,dy是y0-y1的y的总增量,quantity为点的数量
floatk;
dx=x1-x0;
dy=y1-y0;
k=dy/dx;
if(abs(dx)>abs(dy))//通过绝对值判断谁为先变
{
quantity=abs(dx);
}
else
{
quantity=abs(dy);
}
Nx=(GLfloat)dx/(GLfloat)quantity;//x方向上的单位增量
Ny=(GLfloat)dy/(GLfloat)quantity;//y方向上的单位增量
for(x=x0,y=y0;x<=x1;x++)
{
x=int(x+Nx);
y=y+Ny;
drawpixel(x,int(y+0.5),0);
}
}
voiddisplay(void)//生成直线的函数
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0,0.0,0.0);//红色
DDALine(100,150,300,100);
glFlush();
}
voidmain(intargc,char*argv[])
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(500,500);
glutCreateWindow("项目2");
init();
glutDisplayFunc(display);
glutMainLoop();
}
2.“区域填充”的代码:
#include
#include
constintPOINTNUM=6;//多边形点数.
//定义结构体用于活性边表AET和新边表NET
typedefstructXET
{
floatx;
floatdx,ymax;
XET*next;
}AET,NET;
//定义点结构体point
structpoint
{
floatx;
floaty;
}
polypoint[POINTNUM]={250,50,500,150,550,400,400,250,200,350,100,100};//多边形顶点
voidPolyScan()
{
//计算最高点的y坐标(扫描到此结束)
intMaxY=0;
inti;
for(i=0;i if(polypoint[i].y>MaxY) MaxY=polypoint[i].y; //初始化AET表 AET*pAET=newAET; pAET->next=NULL; //初始化NET表 NET*pNET[1024]; for(i=0;i<=MaxY;i++) { pNET[i]=newNET; pNET[i]->next=NULL; } glClear(GL_COLOR_BUFFER_BIT);//赋值的窗口显示. glColor3f(0.5,0.5,0.0);//设置直线的颜色红色 glBegin(GL_POINTS); //扫描并建立NET表 for(i=0;i<=MaxY;i++) { for(intj=0;j if(polypoint[j].y==i) {//一个点跟前面的一个点形成一条线段,跟后面的点也形成线段 if(polypoint[(j-1+POINTNUM)%POINTNUM].y>polypoint[j].y) { NET*p=newNET; p->x=polypoint[j].x; p->ymax=polypoint[(j-1+POINTNUM)%POINTNUM].y; p->dx=(polypoint[(j-1+POINTNUM)%POINTNUM].x-polypoint[j].x)/(polypoint[(j-1+POINTNUM)%POINTNUM].y-polypoint[j].y); p->next=pNET[i]->next; pNET[i]->next=p; } if(polypoint[(j+1+POINTNUM)%POINTNUM].y>polypoint[j].y) { NET*p=newNET; p->x=polypoint[j].x; p->ymax=polypoint[(j+1+POINTNUM)%POINTNUM].y; p->dx=(polypoint[(j+1+POINTNUM)%POINTNUM].x-polypoint[j].x)/(polypoint[(j+1+POINTNUM)%POINTNUM].y-polypoint[j].y); p->next=pNET[i]->next; pNET[i]->next=p; } } } //建立并更新活性边表AET for(i=0;i<=MaxY;i++) { //计算新的交点x,更新AET NET*p=pAET->next; while(p) { p->x=p->x+p->dx; p=p->next; } //更新后新AET先排序 //断表排序,不再开辟空间 AET*tq=pAET; p=pAET->next; tq->next=NULL; while(p) { while(tq->next&&p->x>=tq->next->x) tq=tq->next; NET*s=p->next; p->next=tq->next; tq->next=p; p=s; tq=pAET; }//(改进算法)先从AET表中删除ymax==i的结点 AET*q=pAET; p=q->next; while(p) { if(p->ymax==i) { q->next=p->next; deletep; p=q->next; } else { q=q->next; p=q->next; } }//将NET中的新点加入AET,并用插入法按X值递增排序 p=pNET[i]->next; q=pAET; while(p) { while(q->next&&p->x>=q->next->x) q=q->next; NET*s=p->next; p->next=q->next; q->next=p; p=s; q=pAET; }//配对填充颜色 p=pAET->next; while(p&&p->next) { for(floatj=p->x;j<=p->next->x;j++) glVertex2i(static_cast p=p->next->next;//考虑端点情况 } } glEnd(); glFlush(); } voidinit(void) { glClearColor(1.0,1.0,1.0,0.0);//窗口的背景颜色设置为白色 glMatrixMode(GL_PROJECTION); gluOrtho2D(0.0,600.0,0.0,600.0); } voidmain(intargc,char*argv) { glutInit(&argc,&argv);//I初始化GLUT. glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);//设置显示模式: 单个缓存和使用RGB模型 glutInitWindowPosition(50,50);//设置窗口的顶部和左边位置 glutInitWindowSize(800,800);//设置窗口的高度和宽度 glutCreateWindow("AnExampleOpenGLProgram");//创建显示窗口 init();//调用初始化过程 glutDisplayFunc(PolyScan);//图形的定义传递给我window. glutMainLoop();//显示所有的图形并等待 } 五、实验实习结果分析和(或)源程序调试过程 运行结果截图: 实验实习名 利用OpenGL绘制Bezier曲线 指导教师 秦红星 考核成绩 课程名称 计算机图形学A 课程编号 040659 实验实习地点 信息科技大厦S306 完成日期 2016年12月7日 学生姓名 学生学号 学院专业 广电与数字媒体类 所在班级 教师评语 教师签名: 年月日 一、实验实习目的及要求 项目目的: 了解Bezier曲线,并熟悉生成Bezier曲线的迭代算法 项目要求: 1.使用鼠标在在屏幕中任意设置控制点,并声称曲线 2.使用鼠标和键盘的交互设计操作实现对曲线的修改 二、实验实习设备(环境)及要求(软硬件条件) 采用MicrosoftVisualC2010生成环境并用C++编写程序 三、实验实习内容与步骤 内容: 利用迭代算法绘制贝塞尔曲线,并且实现鼠标、键盘的交互: 鼠标点击左键出现点,点击右键生成Bezier曲线;键盘输入a/b/c实现清除等。 步骤: 利用迭代算法,并且通过opengl库提供的回调函数进行相关设计。 四、实验实习过程或算法(源程序、代码) 代码: #include"stdafx.h" #include #include #include #include constintMAX_POINT=40; constintwidth=800; constintheight=600; intr_num=0; typedefstruct { GLfloatx,y; }POINT; POINTpoint[MAX_POINT];//存储控制点的坐标 intnumnum(intn) { if(n==1||n==0) { return1; } else { returnn*numnum(n-1); } }//求阶乘 doubleQueqe(intn,inti) { return(double)numnum(n)/((double)numnum(i)*(double)numnum(n-i)); } //求排列 voidDraw(POINT*p) { voiddisplay(); if(r_num<=0) return; POINT*p1; p1=newPOINT[1000]; GLfloatu=0,x,y; inti,num=1; p1[0]=p[0]; for(u=0;u<=1;u+=0.001) { x=0; y=0; for(i=0;i { x+=Queqe(r_num-1,i)*pow(u,i)*pow(1-u,r_num-1-i)*p[i].x; y+=Queqe(r_num-1,i)*pow(u,i)*pow(1-u,r_num-1-i)*p[i].y; } p1[num].x=x; p1[num].y=y; num++; } glPointSize(4.0); glColor3f(0.0,0.0,0.0); glBegin(GL_LINE_STRIP); for(intk=0;k<1000;k++) glVertex2f(p1[k].x,p1[k].y); glEnd(); glFlush(); return; } voidmouse(intbutton,intstate,intx,inty) { voiddisplay(); floatwx,wy; if(state! =GLUT_DOWN) { return; } else { if(button==GLUT_LEFT_BUTTON) { wx=(2.0*x)/
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 图形学 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)