计算机图形学实验--橡皮筋技术(完整代码,准确无误)

合集下载

计算机图形学--全部实验的实验报告

计算机图形学--全部实验的实验报告

一、实验目的根据曲线和曲面的基础知识和常用曲线的数学基础,对其算法进行程序设计,验证算法的正确性,并通过程序结果加深对常用曲线数学模型的理解。

二、实验任务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曲线。

实验报告文档

实验报告文档
accept=TRUE;
done=TRUE;
}else if((code0.all&code1.all)!=0){
done=TRUE;
}else{
if(code0.all!=0){
x = x0; y = y0;
dx = x1 - x0; dy = y1 - y0;
d = dx - 2 * dy;
UpIncre=2*dx-2*dy;DownIncre=-2*dy;
while(x<=x1)
{
putpixel(x,y);
printf("x = %d , y = %d \n",x,y);
对剩余部分,把它作为新的线段看待,又从头开始考虑。两遍循环之后,就能确定该线段是部分截留下来,还是全部舍弃。
1、分区编码
延长裁剪边框将二维平面分成九个区域,每个区域各用一个四位二进制代码标识。各区代 码值如图中所示。
2、判别
根据C1和C2的具体值,可以有三种情况:
(1)C1=C2=0,表明两端点全在窗口内,因而整个线段也在窗内,应予保留。
(2)C1&C2≠0(两端点代码按位作逻辑乘不为0),即C1和C2至少有某一位同时为1,表明两端点必定处于某一边界的同一外侧,因而整个线段全在窗外,应予舍弃。
(3)不属于上面两种情况,均需要求交点。
3、求交点
假设算法按照:左、右、下、上边界的顺序进行求交处理,对每一个边界求完交点,并相关处理后,算法转向第2步,重新判断,如果需要接着进入下一边界的处理。
实验
类型
设计型
综合型
创新型








1.实验内容

计算机图形学实验报告

计算机图形学实验报告

计算机图形学实验报告实验一 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\"文件夹中。

Visual_C++_MFC_绘图

Visual_C++_MFC_绘图

设备中绘图时,需要访问该设备的 DC。MFC 将 GDI 的 DC 封装在 C++类中,包括 CDC 类 和 CDC 派生类,这些类中的许多成员都是对本地 GDI 绘图函数进行简单封装而形成的内联 函数。
DC 的作用就是提供程序与物理设备或者虚拟设备之间的联系,除此之外,DC 还要处
理绘图属性的设置,如文本的颜色等。程序员可以通过调用专门的 GDI 函数修改绘图属性, 如 SetTextColor()函数。
第一个问题是建立什么类型的应用程序,有三个选项:单个文档(Single document)、 多重文档(Multiple document)和基本对话(Dialog based)。单个文档应用程序主窗口中只 有一个窗口,多重文档可以在主窗口中开多个子窗口,基本对话主窗口是一个对话框。例中 选择单个文档,单击“确定”, 如图 3-4 所示 ,进入下一个问题,。
图 3-3 第一个问题:选择应用程序的类型
图 3-4 第二个问题:选择是否要用 ODBC 支持
第三个问题是对 ActiveX 的支持。有五个选项:(1)没有对 ActiveX 的支持;(2)ActiveX 容器,它可以包含链接和嵌入对象。容器不能为其它的 ActiveX 程序提供支持,它只能维护 嵌入对象;(3)微型服务器(Mini-server),应用程序不能独立运行,只能被调用为其它程 序建立 ActiveX 对象。(4)完整服务器(Full-server),它能够独立运行,并能够为其它应用 程序建立 ActiveX 对象。(5)容器和服务器,一个应用程序可以同时是容器和服务器。
3.2.2 绘制基本图形
(1)画点 SetPixel()函数可以在指定的坐标位置按指定的颜色画点。函数原型说明如下:

计算机图形学实验报告

计算机图形学实验报告
4
图 2-3 填充线与边界的交点
将填充线与图形边界的交点按照一定顺序排序。根据进出边界的顺序,可以 算出哪些部分是显示的哪些部分是隐藏的。一般的,填充线从基数的交点进入图 形,从偶数的交点离开图形,所以只需要将排好序的交点两两分组,作端点绘制 填充线,如图 2-3 只需绘制点 1 与点 2 之间的部分和点 3 与点 4 之间的填充线。 2.6 多边形区域填充的原理
多边形区域的颜色填充可以使用漫水法填充,针对一行进行区域判断绘点。 其实可以将漫水法理解为特殊的填充线绘制,在漫水法中,填充线的斜率退化为 1,填充线的间隔退化为 0,就是截距只增加 1。
三、程序结果
绘制直线部分没有单独展示,因为在用多边形逼近法绘制椭圆和多边形填充 线绘制会大量使用,只有在直线绘制成功的前提下,才能完成多边形的绘制,在 程序中,不同斜率的直线颜色也会有区别。在这里也没有展示多边形区域的颜色 填充。
在程序中体现为横纵坐标的对换。 F.绘制斜率 m<0 的直线段
通过作 x 轴的对称线段,把斜率小于 0 的直线段转成斜率大于 0 的直线段。 随后按照斜率是否大于 1 继续判断用不用再对直线 y=x 作对称线段。最终转化为 斜率在[0,1]上直线段的绘制。
2.3 绘制圆弧的原理
圆是具有高度对称性的图元,所以可以利用对称性实现画圆算法的简化,现 在可以只考虑第一象限 y>x 的区域的部分。算法每一步都要寻找到离理想圆周最 近 的 点 ( 尽 量 保 证 到 圆 心 的 距 离 是 R ), 所 以 对 每 一 点 来 说 误 差 为 |D(Pi)|=|xi^2+yi^2-R^2|,如下图:
degree += t; xk = longaxis*cos(degree); yk = shortaxis*sin(degree); lineBres(hdc, centra_x + xi, centra_y + yi, centra_x + xk, centra_y + yk); xi = xk; yi = yk; }

计算机图形学实验报告

计算机图形学实验报告

计算机图形学实验报告
在计算机图形学课程中,实验是不可或缺的一部分。

通过实验,我们可以更好地理解课程中所学的知识,并且在实践中掌握这些
知识。

在本次实验中,我学习了如何使用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,否则结束操作。

计算机图形学第3章

计算机图形学第3章

H os pital
F ire s tat ion
3.恰当地使用各种表示方法进行选择性信息显示。 如 加框 ,加亮,闪烁,动画,变色等
3.1.3 反馈
反馈:就是动态地显示系统运行中所发生的一些变化,
以便更有效地进行交互作用。


反馈是计算机与用户对话的一个基本成分,用来帮助 用户对系统进行操作。
3.1.8 视觉效果设计 视觉效果设计涉及用户接口的各个方面,如屏幕的 布局、色彩的使用、信息的安排等等,这里强调的 是色彩的使用。 选择色彩对比时以色调对比为主。
就色调而言,最容易引起视觉疲劳的是兰色和紫色, 其次是红色和橙色;而黄色、绿色、蓝绿色和淡青 色等色调不容易引起视觉疲劳。 为减轻视觉疲劳,应在视野范围内保持均匀的色彩 的明亮度。
程序工作 数据采样 数据缓冲区 输入设备工作 数据生成
3. 事件模式(event mode) 程序和被置成事件方式的设备分别同时独立工作。 每次用户在输入设备上完成一个输入操作以及形成的数据叫做 一个事件; 一般一个事件发生时,往往来不及进行处理,于是,就要把事 件按先后次序排成队列,即把输入的信息及该设备的编号等便 被存放到事件队列中等待程序的处理。不同的应用程序可到队 列中来查询和提取与之有关的事件。
定位设备分为三类: 直接设备和间接设备 (ToutchScreen)
• 绝对坐标设备和相对坐标设备 (Digitizer)
连续设备和离散设备 (KeyBoard)
手柄 操纵杆
定位方法:
定位是确定平面一点(x, y)或空间一点(x, y, z)的坐标。 直接定位 直接定位是用定位设备直接指定某个点的位置,如键盘输入。直 接定位方法可以准确地给点定位. 间接定位 间接定位指通过定位设备的运动控制屏幕上的光标进行定位。如 在移动鼠标时,根据鼠标移动的相对距离去控制屏幕上光标的移 动。

《计算机图形学》实验指导书(正式版)

《计算机图形学》实验指导书(正式版)

《计算机图形学》实验指导谢晓玲华东理工大学信息学院计算机系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〔设备描述符〕来进行多边形填充,不需要使用帧缓冲存储。

计算机图形学实验报告

计算机图形学实验报告
//{{AFX_MSG_MAP(CMainFrame)
ON_WM_CREATE()
ON_WM_PAINT()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
static UINT indicators[] =
{
ID_SEPARATOR, // status line indicator
pView->m_ClearColorRed = (float)GetRValue(pApp->m_OptionColorGlBack) /255.0f;
pView->m_ClearColorGreen = (float)GetGValue(pApp->m_OptionColorGlBack) /255.0f;
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
};
// CMainFrame construction/destruction
CMainFrame::CMainFrame()
{
}
CMainFrame::~CMainFrame()
{
}
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CFormCommandView, CFormView)
//{{AFX_MSG_MAP(CFormCommandView)
ON_WM_PAINT()
ON_WM_LBUTTONUP()
ON_BN_CLICKED(IDC_RADIO_MODEL_1, OnRadioModel1)

计算机图形学报告

计算机图形学报告

. . . . .. . 优质资料 .. 计算机图形学 (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的正负符号,来确定下一个该亮点的象素点。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

计算机图形学上机实验报告
橡皮筋技术
计算机科学与技术学院
姓名: 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;
}。

相关文档
最新文档