计算机图形学实验报告
- 格式:doc
- 大小:162.00 KB
- 文档页数:18
武汉理工大学
学 生 实 验 报 告 书
实验课程名称 计算机图形学
开 课 学 院 计算机科学与技术学院
指导老师姓名 付国江
学 生 姓 名
学生专业班级
2012— 2013学年 第 1学期
学生学号 实验课成绩 实验课程名称: 软件工具与环境
实验项目名称 橡皮筋技术的实现 实验成绩
实验者 专业班级 1 组别
同组者 实验日期 年 月 日
第一部分:实验分析与设计(可加页)
一、实验内容描述(问题域描述)
运用OpenGl技术实现橡皮技术,使得生成直线终点随鼠标移动而改变。
二、实验基本原理与设计(包括实验方案设计,实验手段的确定,试验步骤等,用硬件逻辑或者算法描述)
#include
int iPointNum=0;
int x1=0,x2=0,y1=0,y2=0;
int winWidth=400,winHeight=300;
void Initial(void)
{
glClearColor(0.0f,0.0f,0.0f,0.0f);
}
void ChangeSize(int w,int h)
{
winWidth=w;
winHeight=h;
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity(); gluOrtho2D(0.0,winWidth,0.0,winHeight);
}
void Display(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();
}
void MousePlot(GLint button,GLint action,GLint xMouse,GLint yMouse)
{
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();
}
}
void PassiveMouseMove(GLint xMouse,GLint yMouse)
{
if(iPointNum ==1)
{
x2=xMouse;
y2=winHeight-yMouse;
glutPostRedisplay(); }
}
int main(int argc,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();
return 0;
}
三、主要仪器设备及耗材
个人计算机 C\C++学习试验系统
第二部分:实验调试与结果分析(可加页)
一、调试过程(包括调试方法描述、实验数据记录,实验现象记录,实验过程发现的问题等)
实验结果及分析(包括结果描述、实验现象分析、影响因素讨论、综合分析和结论等)
测试1:
二、实验小结、建议及体会
第一次试验,通过上机,对计算机图形学运用编程画图有了初步的了解,也对OpenGl有关知识有了了解,通过调试实现了橡皮筋技术。当然,实验时也出现了不少问题,但通过调试与查资料,最终完成了本次试验。
实验课程名称: 软件工具与环境
实验项目名称 直线的扫描转换 实验成绩
实验者 专业班级 组别
同组者 实验日期 年 月 日
第一部分:实验分析与设计(可加页)
三、实验内容描述(问题域描述)
选择一种方法完成直线的扫描转换,本次选用DDA方法生成
四、实验基本原理与设计(包括实验方案设计,实验手段的确定,试验步骤等,用硬件逻辑或者算法描述)
DDA画线算法程序:
void DDALine(int x0,int y0,int x1,int y1,int color)
{ int x;
float dx, dy, y, k;
dx = x1-x0; dy=y1-y0;
k=dy/dx,;y=y0;
for (x=x0;x< x1;x++)
{ drawpixel (x, int(y+0.5), color);
y=y+k;
}
}
源代码
#include
void LineDDA(int x0,int y0,int x1,int y1)
{
int x, dy, dx, y;
float m;
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;
}
}
void myDisplay(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();
} void Init()
{
glClearColor(0.0, 0.0, 0.0, 0.0);
glShadeModel(GL_FLAT);
}
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);
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowPosition(100, 100);
glutInitWindowSize(400, 400);
glutCreateWindow("");
Init();
glutDisplayFunc(myDisplay);
glutReshapeFunc(Reshape);
glutMainLoop();