计算机图形学实验报告.docx
《计算机图形学实验报告.docx》由会员分享,可在线阅读,更多相关《计算机图形学实验报告.docx(14页珍藏版)》请在冰豆网上搜索。
计算机图形学实验报告
学生学号
实验课成绩
武汉理工大学
学生实验报告书
实验课程名称计算机图形学
开课学院计算机科学与技术学院
指导老师姓名付国江
学生姓名
学生专业班级
2012—2013学年第1学期
实验课程名称:
软件工具与环境
实验项目名称
橡皮筋技术的实现
实验成绩
实验者
专业班级
1
组别
同组者
实验日期
年月日
第一部分:
实验分析与设计(可加页)
一、实验内容描述(问题域描述)
运用OpenGl技术实现橡皮技术,使得生成直线终点随鼠标移动而改变。
二、实验基本原理与设计(包括实验方案设计,实验手段的确定,试验步骤等,用硬件逻辑或者算法描述)
#include
intiPointNum=0;
intx1=0,x2=0,y1=0,y2=0;
intwinWidth=400,winHeight=300;
voidInitial(void)
{
glClearColor(0.0f,0.0f,0.0f,0.0f);
}
voidChangeSize(intw,inth)
{
winWidth=w;
winHeight=h;
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0,winWidth,0.0,winHeight);
}
voidDisplay(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0.0f,1.0f,1.0f);
if(iPointNum>=1)
{
glBegin(GL_LINES);
glVertex2i(x1,y1);
glVertex2i(x2,y2);
glEnd();
}
glutSwapBuffers();
}
voidMousePlot(GLintbutton,GLintaction,GLintxMouse,GLintyMouse)
{
if(button==GLUT_LEFT_BUTTON&&action==GLUT_DOWN)
{
if(iPointNum==0||iPointNum==2)
{
iPointNum=1;
x1=xMouse;
y1=winHeight-yMouse;
}
else
{
iPointNum=2;
x2=xMouse;y2=winHeight-yMouse;
glutPostRedisplay();
}
}
if(button==GLUT_RIGHT_BUTTON&&action==GLUT_DOWN)
{
iPointNum=0;
glutPostRedisplay();
}
}
voidPassiveMouseMove(GLintxMouse,GLintyMouse)
{
if(iPointNum==1)
{
x2=xMouse;
y2=winHeight-yMouse;
glutPostRedisplay();
}
}
intmain(intargc,char*argv[])
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
glutInitWindowSize(400,300);
glutInitWindowPosition(100,100);
glutCreateWindow("橡皮筋技术");
glutDisplayFunc(Display);
glutReshapeFunc(ChangeSize);
glutMouseFunc(MousePlot);
glutPassiveMotionFunc(PassiveMouseMove);
Initial();
glutMainLoop();
return0;
}
三、主要仪器设备及耗材
个人计算机C\C++学习试验系统
第二部分:
实验调试与结果分析(可加页)
一、调试过程(包括调试方法描述、实验数据记录,实验现象记录,实验过程发现的问题等)
实验结果及分析(包括结果描述、实验现象分析、影响因素讨论、综合分析和结论等)
测试1:
二、实验小结、建议及体会
第一次试验,通过上机,对计算机图形学运用编程画图有了初步的了解,也对OpenGl有关知识有了了解,通过调试实现了橡皮筋技术。
当然,实验时也出现了不少问题,但通过调试与查资料,最终完成了本次试验。
实验课程名称:
软件工具与环境
实验项目名称
直线的扫描转换
实验成绩
实验者
专业班级
组别
同组者
实验日期
年月日
第一部分:
实验分析与设计(可加页)
三、实验内容描述(问题域描述)
选择一种方法完成直线的扫描转换,本次选用DDA方法生成
四、实验基本原理与设计(包括实验方案设计,实验手段的确定,试验步骤等,用硬件逻辑或者算法描述)
DDA画线算法程序:
voidDDALine(intx0,inty0,intx1,inty1,intcolor)
{intx;
floatdx,dy,y,k;
dx=x1-x0;dy=y1-y0;
k=dy/dx,;y=y0;
for(x=x0;x {drawpixel(x,int(y+0.5),color);
y=y+k;
}
}
源代码
#include
voidLineDDA(intx0,inty0,intx1,inty1)
{
intx,dy,dx,y;
floatm;
dx=x1-x0;
dy=y1-y0;
m=dy/dx;
y=y0;
glColor3f(0.0f,0.0f,0.0f);
for(x=x0;x<=x1;x++)
{
glBegin(GL_POINTS);
glVertex2i(x,(int)(y+0.5));
glEnd();
y+=m;
}
}
voidmyDisplay(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0.0f,1.0f,0.0f);
LineDDA(0,0,200,300);
glBegin(GL_LINES);
glColor3f(1.0f,0.0f,0.0f);
glVertex2f(100.0f,0.0f);
glColor3f(0.0f,1.0f,0.0f);
glVertex2f(180.0f,240.0f);
glEnd();
glFlush();
}
voidInit()
{
glClearColor(0.0,0.0,0.0,0.0);
glShadeModel(GL_FLAT);
}
voidReshape(intw,inth)
{
glViewport(0,0,(GLsizei)w,(GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0,(GLdouble)w,0.0,(GLdouble)h);
}
intmain(intargc,char*argv[])
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE);
glutInitWindowPosition(100,100);
glutInitWindowSize(400,400);
glutCreateWindow("");
Init();
glutDisplayFunc(myDisplay);
glutReshapeFunc(Reshape);
glutMainLoop();
return0;}
三、主要仪器设备及耗材
个人计算机C\C++学习试验系统
第二部分:
实验调试与结果分析(可加页)
一、调试过程(包括调试方法描述、实验数据记录,实验现象记录,实验过程发现的问题等)
实验结果及分析(包括结果描述、实验现象分析、影响因素讨论、综合分析和结论等)
、实验小结、建议及体会
通过本次试验对DDA算法的概念与实现有了了解,并通过上机编程实现了直线的生成,同时也尝试其他方法对直线的生成。
当然,实验时也出现了不少问题,但通过调试与查资料,最终完成了本次试验。
实验课程名称:
软件工具与环境
实验项目名称
圆的扫面转换
实验成绩
实验者
专业班级
组别
同组者
实验日期
年月日
第一部分:
实验分析与设计(可加页)
一、实验内容描述(问题域描述)
运用中点Bresenham算法实现圆的扫描转换。
二、实验基本原理与设计(包括实验方案设计,实验手段的确定,试验步骤等,用硬件逻辑或者算法描述)
voidBresenhamline(intx0,inty0,intx1,inty1,intcolor)
{intx,y,dx,dy;
floatk,e;
dx=x1-x0;dy=y1-y0;k=dy/dx;
e=-0.5;x=x0,;y=y0;
for(i=0;i {drawpixel(x,y,color);
x=x+1;e=e+k;
if(e0)
{y++;e=e-1;}
}
}
源代码
#defineGLUT_DISABLE_ATEXIT_HACK
#include
#include
voidInitial(void)
{
glClearColor(1.0f,1.0f,1.0f,1.0f);//设置窗口背景颜色为白色
glMatrixMode(GL_PROJECTION);//设置投影参数
gluOrtho2D(0.0,200.0,0.0,150.0);
}
voidSetPixel(floatx,floaty)//绘制一个点
{
glPointSize
(2);
glBegin(GL_POINTS);
glVertex2f(x,y);
glEnd();
}
voidCirclePoint(GLintx,GLinty)//八分法画圆
{
SetPixel(100+x,100+y);SetPixel(100-x,100+y);
SetPixel(100+x,100-y);SetPixel(100-x,100-y);
SetPixel(100+y,100+x);SetPixel(100-y,100+x);
SetPixel(100+y,100-x);SetPixel(100-y,100-x);
}
voidMidBresenhamLineCircle(GLintr)//中点Bresenham法画圆
{
intx,y,d;
x=0;y=r;d=1-r;
while(x<=y)
{
CirclePoint(x,y);
if(d<0)d+=2*x+3;
else
{
d+=2*(x-y)+5;
y--;
}
x++;
}
}
voidDisplay(void)
{
glClear(GL_COLOR_BUFFER_BIT);//用当前背景色填充窗口
glColor3f(0.0f,0.0f,0.0f);//设置当前的绘图颜色为黑色
MidBresenhamLineCircle(30);
glFlush();//处理所有的OpenGL程序
}
intmain(intargc,char*argv[])
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);//初始化窗口的显示模式
glutInitWindowSize(400,300);//设置窗口的尺寸
glutInitWindowPosition(100,120);//设置窗口的位置
glutCreateWindow("画圆");//创建一个名为矩形的窗口
glutDisplayFunc(Display);//设置当前窗口的显示回调函数
Initial();//完成窗口初始化
glutMainLoop();//启动主GLUT事件处理循环
return0;
}
三、主要仪器设备及耗材
个人计算机C\C++学习试验系统
第二部分:
实验调试与结果分析(可加页)
一、调试过程(包括调试方法描述、实验数据记录,实验现象记录,实验过程发现的问题等)
实验结果及分析(包括结果描述、实验现象分析、影响因素讨论、综合分析和结论等)
三、实验小结、建议及体会
最后一次实验,通过对之前直线画法的运用,尝试运用八分法画圆弧与重点Bresenham算法生成圆。
当然,实验时也出现了不少问题,但通过调试与查资料,最终完成了本次试验。