计算机图形学实验报告Word格式文档下载.docx
- 文档编号:22656900
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:14
- 大小:83.99KB
计算机图形学实验报告Word格式文档下载.docx
《计算机图形学实验报告Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《计算机图形学实验报告Word格式文档下载.docx(14页珍藏版)》请在冰豆网上搜索。
实验分析与设计(可加页)
一、实验内容描述(问题域描述)
运用OpenGl技术实现橡皮技术,使得生成直线终点随鼠标移动而改变。
二、实验基本原理与设计(包括实验方案设计,实验手段的确定,试验步骤等,用硬件逻辑或者算法描述)
#include<
Gl/glut.h>
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;
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<
x1;
x++)
{drawpixel(x,int(y+0.5),color);
y=y+k;
源代码
#include<
GL/glut.h>
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;
=x1;
x++)
{
glBegin(GL_POINTS);
glVertex2i(x,(int)(y+0.5));
glEnd();
y+=m;
}
voidmyDisplay(void)
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);
glVertex2f(180.0f,240.0f);
glFlush();
}
voidInit()
glClearColor(0.0,0.0,0.0,0.0);
glShadeModel(GL_FLAT);
voidReshape(intw,inth)
glViewport(0,0,(GLsizei)w,(GLsizei)h);
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);
"
Init();
glutDisplayFunc(myDisplay);
glutReshapeFunc(Reshape);
一、调试过程(包括调试方法描述、实验数据记录,实验现象记录,实验过程发现的问题等)
、实验小结、建议及体会
通过本次试验对DDA算法的概念与实现有了了解,并通过上机编程实现了直线的生成,同时也尝试其他方法对直线的生成。
圆的扫面转换
运用中点Bresenham算法实现圆的扫描转换。
voidBresenhamline(intx0,inty0,intx1,inty1,intcolor)
{intx,y,dx,dy;
floatk,e;
dy=y1-y0;
k=dy/dx;
e=-0.5;
x=x0,;
for(i=0;
i<
dx;
i++)
{drawpixel(x,y,color);
x=x+1;
e=e+k;
if(e0)
{y++;
e=e-1;
源代码
#defineGLUT_DISABLE_ATEXIT_HACK
gl/glut.h>
math.h>
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;
d+=2*(x-y)+5;
y--;
x++;
glClear(GL_COLOR_BUFFER_BIT);
//用当前背景色填充窗口
glColor3f(0.0f,0.0f,0.0f);
//设置当前的绘图颜色为黑色
MidBresenhamLineCircle(30);
//处理所有的OpenGL程序
intmain(intargc,char*argv[])
glutInit(&
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
//初始化窗口的显示模式
glutInitWindowSize(400,300);
//设置窗口的尺寸
glutInitWindowPosition(100,120);
//设置窗口的位置
glutCreateWindow("
画圆"
//创建一个名为矩形的窗口
glutDisplayFunc(Display);
//设置当前窗口的显示回调函数
Initial();
//完成窗口初始化
glutMainLoop();
//启动主GLUT事件处理循环
return0;
三、实验小结、建议及体会
最后一次实验,通过对之前直线画法的运用,尝试运用八分法画圆弧与重点Bresenham算法生成圆。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 图形学 实验 报告