计算机图形学实验--橡皮筋技术(完整代码,准确无误)
- 格式:doc
- 大小:53.50 KB
- 文档页数:7
一、实验目的根据曲线和曲面的基础知识和常用曲线的数学基础,对其算法进行程序设计,验证算法的正确性,并通过程序结果加深对常用曲线数学模型的理解。
二、实验任务1.抛物线程序设计;2.Hermite 曲线程序设计;3.Bezier曲线的算法实现;4.B样条曲线的程序设计三、实验内容和实验步骤任务一:抛物线程序设计实现抛物线算法的C语言程序段如下:(工程名:parabola)Par(int xs,int ys,int xm,int ym,int xe,int ye) //已知起点、中点和终点三个控制点的坐标{double t,dt,ax,ay,bx,by,cx,cy;int n,i;ax=xe-2*xm+xs;ay=ye-2*ym+ys;bx=2.0*(xm-xs);by=2.0*(ym-ys);cx=xs; cy=ys;n=sqrt(ax*ax+ay*ay);n=sqrt(n*100.0);moveto(xs,ys);dt=1.0/n; t=0;for (i=0;i<=n; i++){lineto((int)(ax*t*t+bx*t+cx),(int)( ay*t*t+by*t+cy));t=t+dt;}lineto(xe,ye);}读者可以根据上述抛物线程序设计,写出抛物线参数样条曲线的程序。
任务二:Hermite 曲线程序设计P(t)=FB=TMB=[ t3 t2 t 1 ]程序设计时只考虑二维图形的显示,其代数形式为:x(t)=TMBx , Bx =[ P0x P1x R0x R1x]Ty(t)= TMBy , By =[ P0y P1y R0y R1y]T所以,只要给出Hermite曲线的起点坐标(P0x,P0y),终点坐标(P1x,P1y),以及起点处的切矢量(R0x,R0y)和终点处的切矢量(R1x,R1y),参数变量t在[0,1]的范围内分别取0.01,0.02,…,1,步长为0.01,取100个点,分别求出P(t)=[ x(t),y(t)],在计算机屏幕上显示出每个坐标点,即可绘出Hermite曲线。
计算机图形学实验报告实验一 3D模型的加载、渲染与三维操作学院:专业班级:指导老师:学号:姓名:完成日期:目录一、实验目的 (3)二、使用的工具软件及环境 (3)三、实验内容 (3)四、实验步骤 (3)五、思考 (12)一、实验目的1、掌握在Microsoft Visual Studio环境中使用OpenGL、GLUT 和GLUI;2、了解计算机图形学固定流水线;3、了解OpenGL编程基础;4、掌握三维观察的数学表达和程序实现;5、掌握多边形网格的绘制;二、使用的工具软件及环境Microsoft Visual Studio 2010、OpenGL、Glut、Glui三、实验内容1、在VS 2010中配置OpenGL环境;2、编译简单的GLUT程序;3、编译GLUI源代码,并在调试模式下执行6个示例程序;4、在给定的工程中添加绘制简单几何体的代码;5、在给定的工程中添加读取、绘制三维模型的代码;6、在给定的工程中添加旋转、平移和缩放的控制代码;四、实验步骤1、安装Microsoft Visual Studio软件版本选择:Microsoft Visual Studio 2010以上版本2、VS2010中配置GLUT1)下载GLUT。
Windows环境下的GLUT下载地址:/resources/libraries/glut/glutdlls37be ta.zip2)将下载的压缩包解开,将得到5个文件:glut.h、glut.lib、glut32.lib、glut.dll、glut32.dll。
3)将glut.h放到"%WinDir%\ProgramFiles(x86)\Microsoft SDKs\Windows\v7.0A\Include\gl\"文件夹中。
4)将glut.lib和glut32.lib放到"%WinDir%\ProgramFiles(x86)\Microsoft Visual Studio 10.0\VC\lib\"文件夹中。
计算机图形学实验报告
在计算机图形学课程中,实验是不可或缺的一部分。
通过实验,我们可以更好地理解课程中所学的知识,并且在实践中掌握这些
知识。
在本次实验中,我学习了如何使用OpenGL绘制三维图形,并了解了一些基本的图形变换和视图变换。
首先,我们需要通过OpenGL的基本命令来绘制基本图形,例
如线段、矩形、圆等。
这些基本的绘制命令需要首先设置OpenGL 的状态,例如绘制颜色、线段宽度等,才能正确地绘制出所需的
图形。
然后,在实验中我们学习了图形的变换。
变换是指通过一定的
规则将图形的形状、位置、大小等进行改变。
我们可以通过平移、旋转、缩放等变换来改变图形。
变换需要按照一定的顺序进行,
例如先进行旋转再进行平移等。
在OpenGL中,我们可以通过设
置变换矩阵来完成图形的变换。
变换矩阵包含了平移、旋转、缩
放等信息,通过矩阵乘法可以完成图形的复合变换。
最后,视图变换是指将三维场景中的图形投影到二维平面上,
成为我们所见到的图形。
在实验中,我们学习了透视投影和正交
投影两种方式。
透视投影是指将场景中的图形按照视点不同而产
生不同的远近缩放,使得图形呈现出三维感。
而正交投影则是简单地将场景中的图形按照平行投影的方式呈现在屏幕上。
在OpenGL中,我们可以通过设置视图矩阵和投影矩阵来完成视图变换。
通过本次实验,我对于计算机图形学有了更深入的了解,并掌握了一些基本的图形绘制和变换知识。
在今后的学习中,我将继续学习更高级的图形绘制技术,并应用于实际的项目中。
装订首页
工业学院教案
课程:计算机图形学
学期:2013/14第一学期
课时:理论52,实验12
教材:计算机图形学基础教程
计算机图形学实践教程
教师:孔令德静丽亚
工业学院教案
工业学院教案
工业学院教案
工业学院教案
工业学院教案
工业学院教案
工业学院教案
工业学院教案
工业学院教案
工业学院教案
工业学院教案
工业学院教案
工业学院教案
工业学院教案
工业学院教案
工业学院教案
工业学院教案
工业学院教案
工业学院教案
工业学院教案
工业学院教案
工业学院教案
工业学院教案
工业学院教案
工业学院教案
工业学院教案
工业学院教案
工业学院教案
工业学院教案
工业学院教案
工业学院教案
工业学院教案。
计算机图形学基础实验指导书目录实验一直线的生成 ............................................................... -..2.-实验二圆弧及椭圆弧的生成........................................................ -..3 -实验三多边形的区域填充 ......................................................... - (4)-实验四二维几何变换 ............................................................. -..5.-实验五裁剪算法 ................................................................. -..6.-实验六三维图形变换 ............................................................. -..7.-实验七BEZIER 曲线生成......................................................... -..8.-实验八交互式绘图技术实现........................................................ -..10-实验一直线的生成一、实验目的掌握几种直线生成算法的比较,特别是Bresenham 直线生成算法二、实验环境实验设备:计算机实验使用的语言: C 或Visual C++ 、OpenGL三、实验内容用不同的生成算法在屏幕上绘制出直线的图形,对不同的算法可设置不同的线形或颜色表示区别。
四、实验步骤直线Bresenham 生成算法思想如下1)画点(x i, y i), dx=x2-x i, dy=y2-y i,计算误差初值P i=2dy-dx , i=1;2)求直线下一点位置x i+i=x i+i 如果P i>0,贝U y i+i=y i+i,否则y i+i=y i;3)画点(x i+i ,y i+i );4)求下一个误差P i+i 点,如果P i>0,贝U P i+i=P i+2dy-2dx,否则P i+i=P i+2dy;i=i+i ,如果i<dx+i 则转步骤2,否则结束操作。
《计算机图形学》实验指导谢晓玲华东理工大学信息学院计算机系2010年8月目录实验1 OpenGL应用的创建 (2)实验2 橡皮筋技术的实现 (17)实验3 基本变换 (24)实验4 拾取 (41)实验5 三维观察的实现 (54)实验1 OpenGL应用的创建一、实验目的1、了解C++.NET开发基于窗口技术的应用程序的步骤;2、了解OpenGL绘图的步骤;3、显示一个三角形图形。
二、使用的工具软件及环境C++.NET、OpenGL三、实验内容1、构造一个单文档的Windows应用程序2、定义一个填充图案;3、通过菜单,交互控制填充开关;4、显示一个填充的三角形图形。
四、实验指导1、基本要素(1)C++.NET程序设计框架C++.NET提供了一套应用程序框架,应用程序框架是指用于生成一般的应用程序所必须的各种面向对象的软件组建的集合。
C++程序设计的特点之一就是大量使用类库来进行功能扩展。
类库是一个可以在应用程序中使用的相互关联的C++类的集合。
一些类库是随编译器一起提供的,一些是由其他软件公司销售的,还有一些是由用户自己开发的。
应用程序框架是一种类库的超集,它用来定义程序的结构,将其他的类库,例如文档类、视图类及用户自定义类等,嵌入到应用程序框架中,以完成用户预期的功能。
通过定制,C++.NET 可以自动生成一套程序代码,以单文档多视风格的应用程序为例,自动生成的源代码主要包含应用程序类、主框架类、文档类、视口类。
以MyDemo为工程名,C++.NET自动生成的类如下:A.class CMyDemoApp: public CWinAppCMyDemoApp的对象就代表了一个应用程序。
该程序定义了一个单独的全局CMyApp对象theApp:CMyDemoApp theApp;其基类决定了theApp的行为,包括程序的启动、初始化和运行等。
B.class CMainFrame : public CFrameWnd它代表了应用程序的主框架窗口,它负责创建和显示具体的窗口结构,并负责消息的分发。
计算机图形学实验报告计算机图形学实验报告引言计算机图形学是研究计算机生成和处理图像的学科,它在现代科技和娱乐产业中扮演着重要的角色。
本实验报告旨在总结和分享我在计算机图形学实验中的经验和收获。
一、实验背景计算机图形学实验是计算机科学与技术专业的一门重要课程,通过实践操作和编程,学生可以深入了解图形学的基本原理和算法。
本次实验主要涉及三维图形的建模、渲染和动画。
二、实验内容1. 三维图形建模在实验中,我们学习了三维图形的表示和建模方法。
通过使用OpenGL或其他图形库,我们可以创建基本的几何体,如立方体、球体和圆柱体,并进行变换操作,如平移、旋转和缩放。
这些基本操作为后续的图形处理和渲染打下了基础。
2. 光照和着色光照和着色是图形学中重要的概念。
我们学习了不同的光照模型,如环境光、漫反射和镜面反射,并了解了如何在三维场景中模拟光照效果。
通过设置材质属性和光源参数,我们可以实现逼真的光照效果,使物体看起来更加真实。
3. 纹理映射纹理映射是一种将二维图像映射到三维物体表面的技术。
通过将纹理图像与物体的顶点坐标相对应,我们可以实现更加细致的渲染效果。
在实验中,我们学习了纹理坐标的计算和纹理映射的应用,使物体表面呈现出具有纹理和细节的效果。
4. 动画和交互动画和交互是计算机图形学的重要应用领域。
在实验中,我们学习了基本的动画原理和算法,如关键帧动画和插值技术。
通过设置动画参数和交互控制,我们可以实现物体的平滑移动和变形效果,提升用户体验。
三、实验过程在实验过程中,我们首先熟悉了图形库的使用和基本的编程技巧。
然后,我们按照实验指导书的要求,逐步完成了三维图形建模、光照和着色、纹理映射以及动画和交互等任务。
在实验过程中,我们遇到了许多挑战和问题,但通过不断的尝试和调试,最终成功实现了预期的效果。
四、实验结果通过实验,我们成功实现了三维图形的建模、渲染和动画效果。
我们可以通过键盘和鼠标控制物体的移动和变形,同时观察到真实的光照效果和纹理映射效果。
电脑图形学实验指导实验一、直线的扫描转换算法实验实验目的掌握中点Bresenham直线扫描转换算法的思想。
实验环境实验内容问题描述:给定两个点的坐标P0(x0,y0),P1(x1,y1),使用中点Bresenham直线扫描转换算法画出连接两点的直线。
中点Bresenham直线扫描转换算法原理见课本。
实验基本步骤首先、使用MFC AppWizard(exe)向导生成一个单文档视图程序框架。
其次、使用中点Bresenham直线扫描转换算法实现自己的画线函数,函数原型可表示如下:void DrawLine(CDC *pDC, int p0x, int p0y, int p1x, int p1y);在函数中,可通过调用CDC成员函数SetPixel来画出扫描转换过程中的每个点。
COLORREF SetPixel(int x, int y, COLORREF crColor );再次、找到文档视图程序框架视图类的OnDraw成员函数,调用DrawLine函数画出不同斜率情况的直线,如下列图:最后、调试程序直至正确画出直线。
实验要求1写出中点Bresenham直线扫描转换算法的程序并在vc6下编译和调试通过,画出具有各种斜率范围的直线(仅使用GDI函数SetPixel函数)。
2按规定的实验格式写出实验报告,包含实验代码〔自己写的画线函数〕,结果〔截图〕。
实验二、多边形填充算法实验实验目的掌握边标志算法或有效边表算法进行多边形填充的基本设计思想。
实验环境实验内容问题描述:给定多边形的顶点的坐标P0(x0,y0),P1(x1,y1),P2(x2,y2),P3(x3,y3),P4(x4,y4)…使用边标志算法或有效边表算法进行多边形填充。
边标志算法或有效边表算法原理见课本。
实验基本步骤首先、使用MFC AppWizard(exe)向导生成一个单文档视图程序框架。
其次、实现边标志算法或有效边表算法函数,如下:void FillPolygon(CDC *pDC, int px[], int py[], int ptnumb);px:该数组用来表示每个顶点的x坐标py :该数组用来表示每个顶点的y坐标ptnumb:表示顶点个数注意实现函数FillPolygon可以直接通过窗口的DC〔设备描述符〕来进行多边形填充,不需要使用帧缓冲存储。
. . . . .. . 优质资料 .. 计算机图形学 (2017年秋季学期)实验 报 告系别:计算机科学与技术 班级: : 学号:实验名称:2-真实感图形绘制2020-11-132/3《计算机图形学》实验报告实验名称真实感图形绘制 实验序号 2实验日期 2017.12.13 实验人 一、实验目的、要求与环境1.目的:通过实验,学生应掌握通过计算机程序进行真实感图形绘制的基本原理,特别是对三维显示对象进行纹理映射的基本方法,将理论和实际应用切实结合起来。
2.要求:对一个三维立方体进行旋转,对其6个不同的面进行6个不同图像的纹理映射,并进行投影变换与显示,分析增强后的视觉效果,提交实验报告。
3.环境:Windows 7操作系统Microsoft Visual Studio 2005OpenGL 函数库4. 自带位图文件(换成你自己的图像文件):总成绩:评语:日期:2020-11-1311/12二、实验容与步骤1. 准备相关图像文件。
2. 进行立方体各面图像与旋转速度的大体设计。
3.在Windows 7 操作系统上,打开Microsoft Visual Studio 2005,编写相关程序,完成程序主体框架结构。
4.编写六面体显示相关的程序代码。
5.编写六面体旋转相关的程序代码。
6.编写深度检测相关的程序代码。
7. 编写纹理载入功能的相关程序代码。
8. 编写纹理参数定义功能的相关程序代码。
9. 编写纹理映射功能的相关程序代码。
10.对程序进行相关调试,修改程序,去除其中的BUG 。
11. 观察纹理映射后的六面体的旋转显示,与预想的结果进行对比,修改相关程序参数。
12.截屏,保留实验结果,进行实验结果分析,并撰写实验报告。
2020-11-13 2/32020-11-13 11/12四、编译过程截图五、实验结果与分析(下面是一个例子,换上你自己的图)实验结果:实验分析程序通过glBindTexture(GL_TEXTURE_2D, lastTextureID);语句,完成了恢复之2020-11-13 2/32020-11-13 11/122020-11-13 2/32020-11-13 11/122020-11-13 2/3。
计算机图形学上机实验报告橡皮筋技术计算机科学与技术学院姓名: xxx完成日期: 2010-12-7实验:橡皮筋技术一、实验目的与要求实验目的:1.学会使用OpenGL,进一步掌握基本图形的绘制方法,2.理解glut程序框架3.理解窗口到视区的变换4.理解OpenGL实现动画的原理5.学会基于鼠标和键盘实现交互的实现方法二、实验内容:利用OpenGL实现折线和矩形的皮筋绘制技术,并采用右键菜单实现功能的选择实现方法:1.橡皮筋技术的实现采用双缓存技术,绘制图形时分别绘制到两个缓存,交替显示。
2.右键菜单控制选择绘制折线还是绘制矩形,实现方法:通过菜单注册函数创建一个弹出式菜单,然后使用函数加入菜单项,最后使用函数讲菜单与鼠标右键关联起来,GLUT通过为菜单提供一个整数标识符实现对菜单的管理,在main主函数通过标识符用函数指定对应的菜单为当前的菜单。
2. 折线的橡皮筋绘制技术实现:鼠标所在位置确定一个点,移动鼠标时,每次移动时将点的信息保存在数组中,连接当前鼠标所在点和前一个点的直线段。
3.矩形的橡皮筋绘制技术:每个矩形由两个点唯一确定,鼠标当前点为第一个点,移动鼠标确定第二个点的位置,由这两点的坐标绘制出举行的四条边(直线段),矩形即绘制完毕。
图1.1 鼠标右键菜单图1.2 绘制矩形四、体会1> 经过这次实验,逐步对opengl软件有了一定的了解,而且对于理论知识有了很好的巩固,并非仅仅会C语言就能编写画图程序,gult程序有自己特殊的框架与实现过程.在这次试验中,虽然没有完全理解其原理,但在一定程度上已经为我们今后的学习应用打下了基础.2>初步了解了如何在OpenGL实现基本的绘图功能,以及鼠标和键盘灯交互设备的实现,还有如何由初始生成元绘制分形物体。
在这个过程中遇到了很多问题,程序的调试也是困难重重,通过自己看书思考和老师、同学的帮助最终完成了程序的调试,在这一过程中加深了对理论知识的理解,以及理清了理论到实践转换的一点点思路,再一次体会到理论与实践的结合的重要性,今后要多多提高提高动手能力。
作业橡皮筋技术班级: 2015级计算机科学与技术(专升本)学号: 150907190108 姓名:田林玉课程名称:人机交互基础教程人机交互实验报告实验名称:橡皮筋技术实验日期:2016.9月姓名:田林玉班级:15级计科专升本实验目的1.掌握橡皮筋技术的实现原理和方法;2.掌握Vs2010 C++集成编译环境的使用,常用图形程序设计、鼠标编译、橡皮筋交互技术。
实验体会:我们认识到是通过对VS2010 C++的学习,掌握C++图形程序设计的方法,为计算机图形学原理部分的算法实现提供程序工具和方法。
其实,如果需要真正做一个应用,我们会发现前面的知识还远远不够。
这项任务,也许代码不是很完善,需要改进,以后一定更加努力,争取进步。
主要代码:MainFrm.cpp// MainFrm.cpp : CMainFrame 类的实现#include "stdafx.h"#include "tly.h"#include "MainFrm.h"#ifdef _DEBUG#define new DEBUG_NEW#endif// CMainFrameIMPLEMENT_DYNCREATE(CMainFrame, CFrameWndEx)const int iMaxUserToolbars = 10;const UINT uiFirstUserToolBarId = AFX_IDW_CONTROLBAR_FIRST + 40; const UINT uiLastUserToolBarId = uiFirstUserToolBarId + iMaxUserToolbars - 1;BEGIN_MESSAGE_MAP(CMainFrame, CFrameWndEx)ON_WM_CREATE()ON_COMMAND(ID_VIEW_CUSTOMIZE,&CMainFrame::OnViewCustomize)ON_REGISTERED_MESSAGE(AFX_WM_CREATETOOLBAR,&CMainFrame::OnToolbarCreateNew)END_MESSAGE_MAP()static UINT indicators[] ={ID_SEPARATOR, // 状态行指示器ID_INDICATOR_CAPS,ID_INDICATOR_NUM,ID_INDICATOR_SCRL, };// CMainFrame 构造/析构CMainFrame::CMainFrame(){// TODO: 在此添加成员初始化代码}CMainFrame::~CMainFrame(){}int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct){if (CFrameWndEx::OnCreate(lpCreateStruct) == -1)return -1;BOOL bNameValid;// 设置用于绘制所有用户界面元素的视觉管理器CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisu alManagerVS2008));if (!m_wndMenuBar.Create(this)){TRACE0("未能创建菜单栏\n");return -1; // 未能创建}m_wndMenuBar.SetPaneStyle(m_wndMenuBar.GetPaneStyle() | CBRS_SIZE_DYNAMIC | CBRS_TOOLTIPS | CBRS_FLYBY);// 防止菜单栏在激活时获得焦点CMFCPopupMenu::SetForceMenuFocus(FALSE);if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD |WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||!m_wndToolBar.LoadToolBar(theApp.m_bHiColorIcons ?IDR_MAINFRAME_256 : IDR_MAINFRAME)){TRACE0("未能创建工具栏\n");return -1; // 未能创建}CString strToolBarName;bNameValid = strToolBarName.LoadString(IDS_TOOLBAR_STANDARD);ASSERT(bNameValid);m_wndToolBar.SetWindowText(strToolBarName);CString strCustomize;bNameValid = strCustomize.LoadString(IDS_TOOLBAR_CUSTOMIZE);ASSERT(bNameValid);m_wndToolBar.EnableCustomizeButton(TRUE, ID_VIEW_CUSTOMIZE, strCustomize);// 允许用户定义的工具栏操作:InitUserToolbars(NULL, uiFirstUserToolBarId, uiLastUserToolBarId);if (!m_wndStatusBar.Create(this)){TRACE0("未能创建状态栏\n");return -1; // 未能创建}m_wndStatusBar.SetIndicators(indicators,sizeof(indicators)/sizeof(UINT));// TODO: 如果您不希望工具栏和菜单栏可停靠,请删除这五行m_wndMenuBar.EnableDocking(CBRS_ALIGN_ANY);m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);EnableDocking(CBRS_ALIGN_ANY);DockPane(&m_wndMenuBar);DockPane(&m_wndToolBar);// 启用Visual Studio 2005 样式停靠窗口行为CDockingManager::SetDockingMode(DT_SMART);// 启用Visual Studio 2005 样式停靠窗口自动隐藏行为EnableAutoHidePanes(CBRS_ALIGN_ANY);// 启用工具栏和停靠窗口菜单替换EnablePaneMenu(TRUE, ID_VIEW_CUSTOMIZE, strCustomize,ID_VIEW_TOOLBAR);// 启用快速(按住Alt 拖动)工具栏自定义CMFCToolBar::EnableQuickCustomization();if (CMFCToolBar::GetUserImages() == NULL){// 加载用户定义的工具栏图像if (m_UserImages.Load(_T(".\\UserImages.bmp"))){CMFCToolBar::SetUserImages(&m_UserImages);}}// 启用菜单个性化(最近使用的命令)// TODO: 定义您自己的基本命令,确保每个下拉菜单至少有一个基本命令。
目录实验一:OpenGL基础知识 0实验二 OpenGL中的建模与变换 (1)实验三 OpenGL中的光照 (4)实验四 OpenGL中的拾取 (7)实验五 OpenGL中的纹理映射 (10)实验一:OpenGL基础知识一、实验目的1、建立Windows系统下的OpenGL实验框架。
2、学习理解OpenGL工作流程。
二、实验环境⒈硬件:每个学生需配备计算机一台。
⒉软件:Visual C++;三、实验内容1、建立非控制台的Windows程序框架。
2、建立OpenGL框架。
3、建立OpenGL框架的类文件。
4、完善Windows框架。
5、理解程序间的相互关系。
四、实验要求1、学习教材第2章的内容。
2、理解教材中相关实例的代码,按要求添加到适当的地方,调试并通过运行。
3、运行结果应该与教材中的相关实例相符。
4、编译第2章的框架代码,修改背景色、窗口标题。
五、程序设计提示(略)六、报告要求1.认真书写实验报告,字迹清晰,格式规范。
报告中应写清姓名、学号、实验日期、实验题目、实验目的、实验原理。
2.报告中应书写主要源程序,且源程序中要有注释。
3.报告中应包含运行结果及结果分析。
如调试通过并得到预期的效果,请注明‘通过’并粘贴运行效果图;如未调试通过或结果不正确,试分析原因。
4.报告最后包含实验总结和体会。
实验二 OpenGL中的建模与变换一、实验目的1.学习配置OpenGL环境。
2.掌握在OpenGL中指定几何模型的方法。
3. 掌握OpenGL中的透视投影和正投影的设置方法,学会诊断投影问题导致的显示异常。
二、实验环境⒈ 硬件:每个学生需配备计算机一台。
⒉ 软件:Visual C++;三、实验内容1.建立OpenGL编程环境(注:Windows自带gl和glu,还需要安装glut库文件。
)(a)查看Windows自带的OpenGL文件。
在文件夹c:\windows\system32下查看是否存在文件opengl32.dll和glu32.dll;在Visual Studio的安装目录Vc7\PlatformSDK\Include\gl下查看是否存在gl.h和glu.h;在Vc7\PlatformSDK\Lib 下是否存在opengl32.lib和glu32.lib。
一、实验背景魔术,作为一门古老而神秘的技艺,一直以来都深受人们的喜爱。
近年来,随着科技的发展,魔术表演也越来越多地融入了科学原理。
本实验旨在通过皮筋魔术,探究力的作用以及皮筋的弹性特性,同时,也希望借此机会培养同学们的动手能力和观察能力。
二、实验目的1. 了解皮筋魔术的基本原理,掌握皮筋魔术的基本手法。
2. 通过实验,探究力的作用以及皮筋的弹性特性。
3. 培养同学们的动手能力和观察能力,提高科学素养。
三、实验器材1. 皮筋两条2. 秒表一只3. 针一根4. 纸一张5. 铅笔一支四、实验原理皮筋魔术主要利用了皮筋的弹性特性以及力的相互作用。
当皮筋受到外力作用时,会发生形变,而当外力消失后,皮筋会恢复原状。
通过巧妙地运用手法,可以使皮筋在观众面前产生神奇的效果。
五、实验步骤1. 准备工作将两条皮筋套在一起,形成一个环状。
用针在皮筋环中穿一个小孔,将纸条穿过小孔,并在纸条两端系上铅笔。
2. 皮筋分离(1)左手握住皮筋环,右手食指和中指夹住皮筋环的一端。
(2)用力向左拉皮筋环,使皮筋环产生形变。
(3)迅速将右手食指和中指分开,皮筋环会自动恢复原状,皮筋分离。
3. 皮筋复原(1)左手握住皮筋环,右手食指和中指夹住皮筋环的一端。
(2)用力向右拉皮筋环,使皮筋环产生形变。
(3)迅速将右手食指和中指分开,皮筋环会自动恢复原状,皮筋复原。
4. 皮筋拉长(1)左手握住皮筋环,右手食指和中指夹住皮筋环的一端。
(2)用力向右拉皮筋环,使皮筋环产生形变。
(3)用秒表记录拉长皮筋环的时间。
5. 皮筋复原(1)左手握住皮筋环,右手食指和中指夹住皮筋环的一端。
(2)用力向左拉皮筋环,使皮筋环产生形变。
(3)用秒表记录拉长皮筋环的时间。
六、实验结果与分析1. 皮筋分离通过实验发现,当皮筋环受到外力作用时,会产生形变,而当外力消失后,皮筋环会自动恢复原状。
这是由于皮筋的弹性特性所致。
2. 皮筋复原实验过程中,皮筋环在受到外力作用后,会自动恢复原状。
计算机科学技术:计算机图形学题库五101、填空题在处理图形时常常涉及的坐标系有模型坐标系(),世界坐标系,观察坐标系,设备坐标系。
答案:局部坐标系102、填空题生成直线的四点要求是:生成的直线要直,直线的终止点要准,直线的粗细O,速度要快。
答案:要均匀103、名词解释图形答案:图形是指由外部轮廓线条构成的矢量图。
即由计算机绘制的直线、圆、矩形、曲线、图表等。
104、判断题齐次坐标提供了坐标系变换的有效方法,但仍然无法表示无穷远的点。
答案:错105【判断题矢量字符表示法用(曲)线段记录字形的边缘轮廓线。
答案:对1061填空题连贯性原理包括O性、扫描线连贯性和边连贯性。
答案:区域连贯107、判断题观察空间位于前后裁剪面之间的部分称为裁剪空间或视见体。
答案:对108、单选计算机图形学与计算几何之间的关系是OA,学术上的同义词B,计算机图形学以计算几何为理论基础C.计算几何是计算机图形学的前身D.两门毫不相干的学科答案:B1091填空题计算机图形系统由O系统和软件系统组成。
答案:硬件110、单选一个逻辑输入设备可以对应O物理输入设备。
A.仅一个B.仅二个C.多个D,以上都不是答案:CI11>填空题区域的内点表示法枚举区域内的所有像素,通过给区域内的像素赋予()属性值来实现内点表示。
答案:同一112、问答题常见的交互任务有哪几种?你认为哪一种交互任务最难完成?答案:常见的交互任务有8种:定位、选择、文本、定向、定路径、定量、三维交互任务、组合交互任务。
其中三维交互任务和组合交互任务最难完成,因为三维交互任务涉及定位、选择和旋转,用户难以区分屏幕上游标选择到对象的深度值和其他显示对象的深度值。
组合交互任务主要包含对话框、构造和动态控制三种,其实现前面几种的结合,是动态的,故其完成难度最大。
113、单选对直线的扫描转换算法中,下列说法正确的是()A.Bresenham算法主要是通过借助于一个决策变量d的正负符号,来确定下一个该亮点的象素点。
计算机图形学上机实验报告
橡皮筋技术
计算机科学与技术学院
姓名: xxx
完成日期: 2010-12-7
实验:橡皮筋技术
一、实验目的与要求
实验目的:1.学会使用OpenGL,进一步掌握基本图形的绘制方法,
2.理解glut程序框架
3.理解窗口到视区的变换
4.理解OpenGL实现动画的原理
5.学会基于鼠标和键盘实现交互的实现方法
二、实验内容:
利用OpenGL实现折线和矩形的皮筋绘制技术,并采用右键菜单实现功能的选择
实现方法:1.橡皮筋技术的实现采用双缓存技术,绘制图形时分别绘制到两个缓存,交替显示。
2.右键菜单控制选择绘制折线还是绘制矩形,实现方法:通过菜单注册函数创建一个弹出式菜单,然后使用函数加入菜单项,最后使用函数讲菜单与鼠标右键关联起来,GLUT通过为菜单提供一个整数标识符实现对菜单的管理,在main主函数通过标识符用函数指定对应的菜单为当前的菜单。
2. 折线的橡皮筋绘制技术实现:鼠标所在位置确定一个点,移动鼠标时,每次移动时将点的信息保存在数组中,连接当前鼠标所在点和前一个点的直线段。
3.矩形的橡皮筋绘制技术:每个矩形由两个点唯一确定,鼠标当前点为第一个点,移动鼠标确定第二个点的位置,由这两点的坐标绘制出举行的四条边(直线段),矩形即绘制完毕。
三、实验结果
图鼠标右键菜单
图绘制矩形
四、体会
1> 经过这次实验,逐步对opengl软件有了一定的了解,而且对于理论知识有了很好的巩固,并非仅仅会C语言就能编写画图程序,gult程序有自己特殊的框架与实现过程.在这次试验中,虽然没有完全理解其原理,但在一定程度上已经为我们今后的学习应用打下了基础.
2>初步了解了如何在OpenGL实现基本的绘图功能,以及鼠标和键
盘灯交互设备的实现,还有如何由初始生成元绘制分形物体。
在这个过
程中遇到了很多问题,程序的调试也是困难重重,通过自己看书思考和
老师、同学的帮助最终完成了程序的调试,在这一过程中加深了对理论
知识的理解,以及理清了理论到实践转换的一点点思路,再一次体会到
理论与实践的结合的重要性,今后要多多提高提高动手能力。
五、源程序
橡皮筋技术程序清单:
#include <gl/>
static GLsizei iMode=1;
int winWidth=400,winHeight=300; //窗口的宽度和高度
int num=0,a[100],b[100],w1,h1,w2,h2;
int iPointNum=0,x1,x2,y1,y2;
void Initial(void)
{
glClearColor,,,; //设置窗口背景颜色
}
void ChangeSize(int w,int h)
{
winWidth=w,winHeight=h; //保存当前窗口的大小
glViewport(0,0,w,h); //指定窗口显示区域
glMatrixMode(GL_PROJECTION); //指定设置投影参数
glLoadIdentity(); //调用单位矩阵,去掉以前的投影参数设置 gluOrtho2D,winWidth,,winHeight); //设置投影参数
}
void Display(void)
{
GLint i;
glClear(GL_COLOR_BUFFER_BIT); //用当前背景色填充窗口
glColor3f,,; //指定当前的绘图颜色
if(iMode==1) //绘制折线
{
glBegin(GL_LINE_STRIP);
for(i=0;i<num;i++)
glVertex2i(a[i],b[i]);
glEnd();
glBegin(GL_LINES);
glVertex2i(w1,h1);
glVertex2i(w2,h2);
glEnd();
}
else if(iMode==2)
{ //绘制矩形
glBegin(GL_LINES); //通过给定两点的坐标,绘制矩形的四条边 glVertex2i(x1,y1);
glVertex2i(x2,y1);
glEnd();
glBegin(GL_LINES);
glVertex2i(x1,y1);
glVertex2i(x1,y2);
glEnd();
glBegin(GL_LINES);
glVertex2i(x2,y1);
glVertex2i(x2,y2);
glEnd();
glBegin(GL_LINES);
glVertex2i(x1,y2);
glVertex2i(x2,y2);
glEnd();
}
glutSwapBuffers(); //交换缓冲区
}
void MousePlot(GLint button,GLint action,GLint xMouse,GLint yMouse)
{
if(iMode==1)
{
if(button==GLUT_LEFT_BUTTON&&action==GLUT_DOWN)
{
if(num==0)
{
w1=xMouse;h1=winHeight-yMouse;
a[num]=w1;b[num]=h1;num++;
}
else
{
w2=xMouse;h2=winHeight-yMouse;
a[num]=w2;b[num]=h2;num++;
w1=w2;h1=h2;
glutPostRedisplay();
}
}
if(button==GLUT_RIGHT_BUTTON&&action==GLUT_DOWN)
{
num=0;
glutPostRedisplay();
}
else if(iMode==2)
{
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(iMode==1)
{
if(num)
{
w2=xMouse;
h2=winHeight-yMouse;
glutPostRedisplay();
}
}
else if(iMode==2)
{
if(iPointNum==1)
{
x2=xMouse;
y2=winHeight-yMouse;
glutPostRedisplay();
}
}
void ProcessMenu(int value)
{
iMode=value;
glutPostRedisplay();
}
int main(int argc,char* argv[])
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
glutInitWindowSize(1000,600);
glutInitWindowPosition(100,100);
glutCreateWindow("橡皮筋技术");
glutCreateMenu(ProcessMenu);
glutAddMenuEntry("折线",1);
glutAddMenuEntry("矩形",2);
glutAttachMenu(GLUT_RIGHT_BUTTON);
glutDisplayFunc(Display);
glutReshapeFunc(ChangeSize);
glutMouseFunc(MousePlot);
glutPassiveMotionFunc(PassiveMouseMove);
Initial();
glutMainLoop();
return 0;
}。