计算机图形学实验报告

  • 格式: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();