2023年计算机图形学实验报告2

上传人:豆*** 文档编号:166068877 上传时间:2022-10-31 格式:DOCX 页数:18 大小:242.86KB
收藏 版权申诉 举报 下载
2023年计算机图形学实验报告2_第1页
第1页 / 共18页
2023年计算机图形学实验报告2_第2页
第2页 / 共18页
2023年计算机图形学实验报告2_第3页
第3页 / 共18页
资源描述:

《2023年计算机图形学实验报告2》由会员分享,可在线阅读,更多相关《2023年计算机图形学实验报告2(18页珍藏版)》请在装配图网上搜索。

1、计算机图形学实验一:基本图形生成算法演示一、实验目的与规定了解OpenGL图形软件包绘制图形的基本过程及其程序框架,并在已有的程序框架中添加代码实现直线和圆的生成算法,演示直线和圆的生成过程,从而加深对直线和圆等基本图形生成算法的理解。二、实验内容实验规定:(1)理解glut程序框架 (2)理解窗口到视区的变换 (3)理解OpenGL实现动画的原理 (4)添加代码实现中点Bresenham算法画直线 (5)添加代码实现改善Bresenham算法画直线 (6)添加代码实现圆的绘制(可以适当对框架坐标系进行修改) 实验操作和环节:本次实验重要的目的是为了掌握基本画线和画圆算法,对于书上给出的代码,

2、规定通过本次实验来具体的实现。由于实验已经给出大体的框架,所以只需要按照书上的算法思想来设计具体实现代码,对于直线DDA算法,中点Bresenham算法及其改善算法,以及Bresenham画圆算法都有进一步的体会。DDA算法是对每一步都要进行增量解决,然后取整,绘制,而Bresenham通过判断误差函数和求取递推公式来实现。特别是对于整数的选择取舍,以及代码的流程和循环的控制有一个进一步的了解。同时也纯熟运用OpenGL基本的绘图函数。三、实验结果1-1. DDA算法画直线。图1-1-1 ,显示每次DDA算法画线的坐标结果(如上)。图1-1-2.显示DDA算法画圆过程及截图1-2. 中点Bre

3、senham算法画直线1-2-1运用中点Bresenham算法画直线的各点坐标如上:1-2-2中点Bresenham画线算法画线过程截图1-3. 运用改善的Bresenham画线算法来画图1-3-1.运用改善的Bresenham算法来画图各点坐标如上:1-3-2.运用改善的Bresenham算法画直线图形如上1-4.运用Bresenham画圆算法来作图1-4-1.运用Bresenham画圆法作图各点坐标如上:1-4-2.运用Bresenham画圆法作图及截图如上。四、体会通过本次实验,我进一步加深了对于基本画图算法的理解。特别是对于DDA,Bresenham和画圆算法。其中,DDA算法由于每一

4、步都要解决浮点数的四舍五入,所以在绘图时要进行取整,效率较低,但是代码直观好懂,符合原理。而对于Bresenham及其改善算法,都是在理论推导的基础上来实现的,然后通过整数化,形成了一个高效率的画图算法,所以需要适当的理解,特别是对于取整操作判断比较巧妙,实现了避免多次判断计算浮点数的目的,所以比较高效。而绘制圆形的时候,用到的基本思想还是和Bresenham画图算法同样,只但是需要注意的是八分法画圆,这样只需要绘制其中的八分之一就可以运用对称的关系来绘制出整个图形。而对于是否走下一步,或者是停留,判断的依据还是误差函数,和前面的思想是类似。此外,通过实验训练了自己的编程能力,同时熟悉了Ope

5、nGL绘图的函数和流程,也进一步巩固了相关的知识。五、源程序源代码如下:/实验规定:(1)理解glut程序框架 / (2)理解窗口到视区的变换 / / (3)理解OpenGL实现动画的原理 / / (4)添加代码实现中点Bresenham算法画直线 / (5)添加代码实现改善Bresenham算法画直线 / (6)添加代码实现圆的绘制(可以适当对框架坐标系进行修改) / (7)适当修改代码实现具有宽度的图形(线刷子或方刷子) /#include #include #include stdio.hint m_PointNumber = 0; /动画时绘制点的数目int m_DrawMode =

6、1; /绘制模式 1 DDA算法画直线 / 2 中点Bresenham算法画直线 / 3 改善Bresenham算法画直线 / 4 八分法绘制圆 / 5 四分法绘制椭圆/绘制坐标线void DrawCordinateLine(void)int i = 0 ;/坐标线为黑色glColor3f(0.0f, 0.0f ,0.0f);glBegin(GL_LINES); for (i=10;i abs(dy) epsl = abs(dx);else epsl = abs(dy);xIncre = (float)dx / epsl ;yIncre = (float)dy / epsl ;for(k =

7、0; k=num-1) printf(x=%f,y=%f,取整后x=%d,y=%dn, x, y, (int)(x+0.5),(int)(y+0.5);break;x += xIncre;y += yIncre;if(x = 25 | y = 25) break;/中点Bresenham算法画直线(0=k x1)x = x1; x1 = x0; x0 = x;y = y1; y1 = y0; y0 = y;x = x0; y = y0;dx = x1 - x0; dy = y1 - y0;d = dx - 2 * dy;UpIncre=2*dx-2*dy;DownIncre=-2*dy;whi

8、le(x=x1)putpixel(x,y);printf(x = %d , y = %d n,x,y);x+;if(d0)y+;d+=UpIncre;elsed+=DownIncre;/改善的Bresenham算法画直线(0=k=1) /参数说明:x0,y0 起点坐标 / / x1,y1 终点坐标 / / num 扫描转换时从起点开始输出的点的数目,用于动画 / void Bresenham2Line(GLsizei x0, GLsizei y0, GLsizei x1, GLsizei y1, GLsizei num)glColor3f(1.0f,0.0f,0.0f);if(num = 1)

9、printf(改善的Bresenham算法画直线:各点坐标及判别式的值n);else if(num=0)return;/画线算法的实现GLsizei x,y,dx,dy,e;dx = x1-x0;dy = y1-y0;e = -dx;x=x0;y=y0;while(x0)y+;e = e-2*dx;/Bresenham算法画圆 /参数说明:x,y 圆心坐标 / / R 圆半径 / / num 扫描转换时从起点开始输出的点的数目,用于动画 / void BresenhamCircle(GLsizei x, GLsizei y, GLsizei R, GLsizei num)glColor3f(1

10、.0f,0.0f,0.0f);if(num = 1)printf(Bresenham算法画圆:各点坐标及判别式的值n);int d,k=0,xa,ya;xa=0;ya=R;d=1-R;while(xa=num-1) printf(x=%d , y=%dn , xa+x,ya+y);break;k+;if(d0) d+=2*xa+3;elsed+=2*(xa-ya)+5;ya-;xa+;/初始化窗口void Initial(void) / 设立窗口颜色为蓝色 glClearColor(1.0f, 1.0f, 1.0f, 1.0f);/ 窗口大小改变时调用的登记函数void ChangeSize(

11、GLsizei w, GLsizei h)if(h = 0)h = 1;/ 设立视区尺寸 glViewport(0, 0, w, h);/ 重置坐标系统glMatrixMode(GL_PROJECTION);glLoadIdentity();/ 建立修剪空间的范围 if (w = h) glOrtho (0.0f, 250.0f, 0.0f, 250.0f*h/w, 1.0, -1.0); else glOrtho (0.0f, 250.0f*w/h, 0.0f, 250.0f, 1.0, -1.0);/ 在窗口中绘制图形void ReDraw(void)/用当前背景色填充窗口glClear(

12、GL_COLOR_BUFFER_BIT);/画出坐标线DrawCordinateLine();switch(m_DrawMode)case 1:DDACreateLine(0,0,20,15,m_PointNumber);break;case 2:BresenhamLine(0,0,20,15,m_PointNumber);break;case 3:Bresenham2Line(1,1,8,6,m_PointNumber);break;case 4:BresenhamCircle(12,12,10,m_PointNumber);break;default:break; glFlush();/设

13、立时间回调函数void TimerFunc(int value)if(m_PointNumber = 0)value = 1;m_PointNumber = value;glutPostRedisplay();glutTimerFunc(500, TimerFunc, value+1);/设立键盘回调函数void Keyboard(unsigned char key, int x, int y) if (key = 1) m_DrawMode = 1;if (key = 2) m_DrawMode = 2;if (key = 3) m_DrawMode = 3;if (key = 4) m_D

14、rawMode = 4;m_PointNumber = 0;glutPostRedisplay();int main(int argc, char* argv)glutInit(&argc, argv);/初始化GLUT库OpenGL窗口的显示模式glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowSize(600,600);glutInitWindowPosition(100,100);glutCreateWindow(基本图元绘制程序); glutDisplayFunc(ReDraw); glutReshapeFunc(ChangeSize); glutKeyboardFunc(Keyboard);/键盘响应回调函数glutTimerFunc(500, TimerFunc, 1);/ 窗口初始化 Initial();glutMainLoop(); /启动主GLUT事件解决循环return 0;

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!