图形学实验3
计算机图形学实验报告模板
![计算机图形学实验报告模板](https://img.taocdn.com/s3/m/948356df6294dd88d0d26b80.png)
巢湖学院计算机图形学实验报告(模板>本课程实验包括:以下为实验二和实验三模板实验一:基本图元绘制一、实验目的了解OpenGL图形软件包绘制图形的基本过程及其程序框架,并在已有的程序框架中添加代码实现直线和圆的生成算法,演示直线和圆的生成过程,从而加深对直线和圆等基本图形生成算法的理解。
b5E2RGbCAP二、实验内容实验操作和步骤:本次实验主要的目的是为了掌握基本画线和画圆算法,对于书上给出的代码,要求通过本次实验来具体的实现。
由于实验已经给出大体的框架,所以只需要按照书上的算法思想来设计具体实现代码,对于直线DDA算法,中点Bresenham算法及其改进算法,以及Bresenham画圆算法都有进一步的体会。
DDA算法是对每一步都要进行增量处理,然后取整,绘制,而Bresenham通过判断误差函数和求取递推公式来实现。
特别是对于整数的选择取舍,以及代码的流程和循环的控制有一个深入的了解。
同时也熟练运用OpenGL基本的绘图函数。
p1EanqFDPw三、体会通过本次实验,我进一步加深了对于基本画图算法的理解。
特别是对于DDA,Bresenham和画圆算法。
其中,DDA算法由于每一步都要处理浮点数的四舍五入,所以在绘图时要进行取整,效率较低,但是代码直观好懂,符合原理。
而对于Bresenham及其改进算法,都是在理论推导的基础上来实现的,然后经过整数化,形成了一个高效率的画图算法,所以需要适当的理解,特别是对于取整操作判断比较巧妙,实现了避免多次判断计算浮点数的目的,所以比较高效。
而绘制圆形的时候,用到的基本思想还是和Bresenham画图算法一样,只不过需要注意的是八分法画圆,这样只需要绘制其中的八分之一就可以利用对称的关系来绘制出整个图形。
而对于是否走下一步,或者是停留,判断的依据还是误差函数,和前面的思想是类似。
另外,通过实验训练了自己的编程能力,同时熟悉了OpenGL绘图的函数和流程,也进一步巩固了相关的知识。
计算机图形学实验报告3 - Bresenham画线
![计算机图形学实验报告3 - Bresenham画线](https://img.taocdn.com/s3/m/74de7a6eddccda38366baf0e.png)
在大括号内填入以下代码
CDC *pDC=GetDC();
int k;
double x1=10,y1=10,x2=200,y2=150;
double x,y,deltx,delty,E;
deltx=x2-x1;delty=y2-y1;
x=x1;y=y1;k=1;
if(deltx>0&&delty>0)
3.Object IDs选择ID_Bresenham,Messages选择COMMAND
4.点击Add Function,点击OK,点击Edit Code,进入编辑函数的界面([项目名]View.cpp)
void C[项目名]View::OnBresenham()
{
// TODO: Add your command handler code here
实验要求:
掌握Bresenham画线算法
实验仪器:
软件:VC++6.0,windows XP
硬件:计算机
实验步骤、内容:
一、新建MFC工程
1.开始所有程序Microsoft Visual C++ 6.0Microsoft Visual C++ 6.0
2.文件-->新建-->工程,工程名称填[项目名],左边的类型选择MFC AppWizard [exe],点击确定
{
if(fabs(deltx)>fabs(dfor(k=1;k<=fabs((int)deltx);k++)
{
pDC->SetPixel((int)x,(int)y,RGB(0,0,0));
E+=(2*delty);
计算机图形学 实验三 二维图形的区域填充
![计算机图形学 实验三 二维图形的区域填充](https://img.taocdn.com/s3/m/fc2591b3d1f34693daef3ee1.png)
西北农林科技大学实习报告学院名称:理学院专业班级:姓名:学号:课程:计算机图形学实验报告日期:第十四周实验三二维图形的区域填充一、实验目的1)加深对填充算法的理解,分析比较种子填充和边缘填充的差异。
2)掌握二维图形区域种子填充的原理和算法。
二、实验步骤1)对任意多边形的几何形状进行分析,选定比较合适的算法模型。
2)画出程序流程图;3)编写程序的源程序;4)编辑源程序并进行调试;5)进行特殊模式的运行测试,并结合情况进行调整。
三、实验内容用种子填充算法编写程序实现区域填充,并能在计算机上编译运行,正确地实现任意多边形边界的单色填充。
原理边界填充算法可以让用户首先勾画图的轮廓,选择填充颜色和填充模式,然后拾取内部点,系统就可以自动给图的内部涂上所需要的颜色和图案。
该算法的输入是种子点坐标 ( x , y )、填充色和边界颜色。
算法从( x , y )开始检测相邻位置是否是边界颜色,若不是,就用填充色着色,并检测其相邻位置。
该过程延续到已经检测完区域边界颜色范围内的所有像素为止。
使用栈结构来实现4-连通边界填充算法的算法步骤如下:(1)种子像素入栈。
(2)执行如下三步操作:1 栈顶像素出栈。
2 将出栈像素置成填充色。
3 检查出栈像素的4-邻接点,若其中某个像素不是边界色且未置成多边形色,则把该像素入栈。
(3)检查栈是否为空,若栈非空重复执行步骤(2),若栈为空则结束。
边界填充算法可以用于填充带有内孔的平面区域。
其缺点是把太多的像素压入堆栈,有些像素甚至会入栈多次,这样一方面降低了算法的效率,另一方面还要求很大的存储空间以实现栈结构。
将之改进,可构造沿扫描线填充水平像素段的4-连通边界填充算法,其算法步骤如下:(1)种子像素入栈。
(2)执行如下三步操作:1 栈顶元素出栈。
2 填充出栈元素所在扫描行的连续像素段,从出栈的像素开始沿扫描线向左和向右填充,直到遇到边界像素为止,即每出栈一个像素,就对包含该像素的整个扫描线区间进行填充,并且记录下此时扫描线区间的x坐标范围[ x1, x2 ]。
计算机图形学 实验报告(3)
![计算机图形学 实验报告(3)](https://img.taocdn.com/s3/m/2fcce64e0b1c59eef9c7b40b.png)
(2)绘制一个由上述顶点所描绘的三角形,实现该三角形进行下列 的几何变化:首先使三角形沿着其中心的x轴,y轴方向缩小50%;然后沿 着初始中心旋转90度;最后沿着y轴平移100个单位。 四、实验结果与数据处理
1、矩形在窗口内沿着水平线匀速移动
代码如下:
实验结果如图示:
2、对一个三角形分别实现平移、缩放、旋转等变化 代码如下:
三、实验内容与步骤 本实验要求完成: 1、实现矩形在窗口内沿着水平线匀速移动; 2、已知某三角形的三顶点坐标为{50.0,25.0},{150.0,25.0},
{100.0,100.0}。 要求:(1)创建一个长宽分别为600、600的窗口,窗口的左上角位于 屏幕坐标(100,100)处。(提示:请试着修改gluOrtho2D函数参数, 使得绘制的三角形尽可能居中显示)
怀化学院数学实验中心
《计算机图形学》 实验报告
学 号实验Biblioteka 点姓 名指导教 师
年级、班 实验时间
实验三 二维图形的几何变换
一、实验目的 1、掌握二维图形的基本几何变换,如平移、旋转、缩放、对称、错
切变换; 2、掌握OpenGL中模型变换函数,实现简单的动画技术。
二、实验设备(环境)及要求 硬件:普通PC386以上微机; 软件:操作系统:Windows XP,Window7; 开发语言: Turbo C 、Visual C++ 6.0、OpenGl,或其它学生掌握 的高级语言。
结果如图示:
五、分析与讨论 通过本实验的学习,我了解了二维图形的基本几何变换,如平移、
旋转、缩放、对称、错切变换;了解了OpenGL中模型变换函数,实现
简单的动画技术,在老师同学的帮助下运用OpenGL实现了矩形在窗口 内沿着水平线匀速移动。
计算机图形学实验报告
![计算机图形学实验报告](https://img.taocdn.com/s3/m/46acf6d9d15abe23482f4d28.png)
计算机图形学实验报告计算机图形学实验 (一) – OpenGL 基础用OPENGL画直线\圆\曲线等二维图1.1 综述这次试验的目的主要是使大家初步熟悉OpenGL 这一图形系统的用法,编程平台是Visual C++,它对OpenGL 提供了完备的支持。
OpenGL 提供了一系列的辅助函数,用于简化Windows 操作系统的窗口操作,使我们能把注意力集中到图形编程上,这次试验的程序就采用这些辅助函数。
本次实验不涉及面向对象编程,不涉及MFC。
1.2 在 VC 中新建项目1.2.1 新建一个项目选择菜单File 中的New 选项,弹出一个分页的对话框,选中页Projects 中的Win32Console Application 项,然后填入你自己的Project name,如Test,回车即可。
VC 为你创建一个工作区(WorkSpace ),你的项目Test 就放在这个工作区里。
1.2.2 为项目添加文件为了使用OpenGL,我们需要在项目中加入三个相关的Lib 文件:glu32.lib、glaux.lib、opengl32.lib,这三个文件位于c:\programfiles\microsoft visualstudio\vc98\lib 目录中。
选中菜单Project->Add To Project->Files 项(或用鼠标右键),把这三个文件加入项目,在FileView 中会有显示。
这三个文件请务必加入,否则编译时会出错。
或者将这三个文件名添加到Project->Setting->Link->Object/library Modules 即可。
点击工具条中New Text File 按钮,新建一个文本文件,存盘为Test.c 作为你的源程序文件,再把它加入到项目中,然后就可以开始编程了。
1.3 一个 OpenGL 的例子及说明1.3.1 源程序请将下面的程序写入源文件Test.c,这个程序很简单,只是在屏幕上画两根线。
计算机图形学实验三
![计算机图形学实验三](https://img.taocdn.com/s3/m/66bdb1dfe53a580216fcfefa.png)
太原工业学院实验报告GetClientRect(&rect);//获得客户区的大小pDC->SetMapMode(MM_ANISOTROPIC);//pDC自定义坐标系pDC->SetWindowExt(rect.Width(),rect.Height());//设置窗口范围pDC->SetViewportExt(rect.Width(),-rect.Height());//设置视区范围,x轴水平向右,y轴垂直向上pDC->SetViewportOrg(rect.Width()/2,rect.Height()/2);//客户区中心为原点CDC memDC;//内存DCCBitmap NewBitmap,*pOldBitmap;//内存中承载的临时位图memDC.CreateCompatibleDC(pDC);//创建一个与显示pDC兼容的内存memDCNewBitmap.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height());//创建兼容位图pOldBitmap=memDC.SelectObject(&NewBitmap);//将兼容位图选入memDCmemDC.FillSolidRect(rect,pDC->GetBkColor());//按原来背景填充客户区,否则是黑色memDC.SetMapMode(MM_ANISOTROPIC);//memDC自定义坐标系memDC.SetWindowExt(rect.Width(),rect.Height());memDC.SetViewportExt(rect.Width(),-rect.Height());memDC.SetViewportOrg(rect.Width()/2,rect.Height()/2);rect.OffsetRect(-rect.Width()/2,-rect.Height()/2);DrawWindowRect(&memDC);//绘制窗口if(PtCount>=1){memDC.MoveTo(Round(P[0].x),Round(P[0].y));memDC.LineTo(Round(P[1].x),Round(P[1].y));}pDC->BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),&memDC,-rect.Width()/2,-rect.Height()/2,SRCCOPY);//将内存memDC中的位图拷贝到显示pDC中memDC.SelectObject(pOldBitmap);//恢复位图NewBitmap.DeleteObject();//删除位图}(2)绘制裁剪窗口void CTestView::DrawWindowRect(CDC* pDC)//绘制裁剪窗口{// TODO: Add your message handler code here and/or call defaultpDC->SetTextColor(RGB(128,0,255));pDC->TextOut(-10,Wyt+20,CString("窗口"));CPen NewPen3,*pOldPen3;//定义3个像素宽度的画笔NewPen3.CreatePen(PS_SOLID,3,RGB(255,128,0));pOldPen3=pDC->SelectObject(&NewPen3);pDC->Rectangle(Wxl,Wyt,Wxr,Wyb);pDC->SelectObject(pOldPen3);NewPen3.DeleteObject();}(3)Cohen-Sutherland算法void CTestView::Cohen()//Cohen-Sutherland算法{CP2 p;//交点坐标EnCode(P[0]);//起点编码EnCode(P[1]);//终点编码while(P[0].rc!=0 || P[1].rc!=0)//处理至少一个顶点在窗口之外的情况{if((P[0].rc & P[1].rc)!=0)//简弃之{PtCount=0;return;}if(0==P[0].rc)//确保P[0]位于窗口之外{CP2 Temp;Temp=P[0];P[0]=P[1];P[1]=Temp;}UINT RC=P[0].rc;double k=(P[1].y-P[0].y)/(P[1].x-P[0].x);//直线段的斜率//窗口边界按左、右、下、上的顺序裁剪直线段if(RC & LEFT)//P[0]点位于窗口的左侧{p.x=Wxl;//计算交点y坐标p.y=k*(p.x-P[0].x)+P[0].y;}else if(RC & RIGHT)//P[0]点位于窗口的右侧{p.x=Wxr;//计算交点y坐标p.y=k*(p.x-P[0].x)+P[0].y;}else if(RC & BOTTOM)//P[0]点位于窗口的下侧{p.y=Wyb;//计算交点x坐标p.x=(p.y-P[0].y)/k+P[0].x;}else if(RC & TOP)//P[0]点位于窗口的上侧{p.y=Wyt;//计算交点x坐标p.x=(p.y-P[0].y)/k+P[0].x;}EnCode(p);P[0]=p;}}void CTestView::EnCode(CP2 &pt)//端点编码函数{pt.rc=0;if(pt.x<Wxl)pt.rc=pt.rc|LEFT;else if(pt.x>Wxr)pt.rc=pt.rc|RIGHT;if(pt.y<Wyb)pt.rc=pt.rc|BOTTOM;else if(pt.y>Wyt)pt.rc=pt.rc|TOP;}(4)人机交互void CTestView::OnDrawpic(){// TODO: Add your command handler code herePtCount=0;bDrawLine=TRUE;MessageBox(CString("鼠标画线,剪刀裁剪"),CString("提示"),MB_OKCANCEL);Invalidate(FALSE);}运行结果:实验拓展:在屏幕上显示一个直线构成的图案,使用鼠标选择两点绘制矩形代表窗口对图案矩形裁剪。
计算机图形学-实验报告3-透视投影算法
![计算机图形学-实验报告3-透视投影算法](https://img.taocdn.com/s3/m/f3c71551804d2b160b4ec0fb.png)
实验地点
软件实验室
指导教师
李丽亚
在屏幕客户区中心绘制立方体的透视投影线框模型使用工具栏的动画图标按钮或键盘上的方向键旋转视点观察立方体生成立方体的旋转动画
实验报告
课ห้องสมุดไป่ตู้名称
班级
班级学号
姓名
实验日期
成绩
实验题目
透视投影算法
一、实验目的:
观察变换矩阵
透视投影变换矩阵
一点透视
二点透视
三点透视
二、实验内容:
在屏幕客户区中心绘制立方体的透视投影线框模型,使用工具栏的“动画”图标按钮或键盘上的方向键旋转视点观察立方体,生成立方体的旋转动画。选择工具栏的123图标按钮分别绘制立方体线框模型的一点透视图,二点透视图,三点透视图。
三、实验步骤:
(1)读入立方体8个顶点构成的顶点表与6个表面构成的表面表。
(2)使用透视投影矩阵在屏幕坐标系绘制立方体的透视投影。
(3)旋转视点观察立方体的透视投影。
(4)使用鼠标左键增加视径,缩小立方体的透视投影。
(5)使用鼠标左键减小视径,放大立方体的透视投影。
(6)使用双缓冲技术绘制立方体旋转动画。
图形学第三次实验
![图形学第三次实验](https://img.taocdn.com/s3/m/31df1d72a26925c52cc5bf75.png)
实验三几何变换与光照1.实验目的●熟悉三维图形显示的基本流程●熟悉视图变换的设置●熟悉Windows环境下几何变换的设置与实现●熟悉光照的设置2.实验内容在实验一的基础上,增加如下功能:●利用鼠标的中键(滚轮)实现几何物体的缩放●利用鼠标的左键实现几何物体的旋转●利用鼠标右键实现几何物体的平移●在场景中设置好光照,要求包括:环境光、漫反射光、镜面反射光3.实验指导在设置场景中的几何变换时,我们需要对三维图形的基本显示流程或者说显示流水线有个基本了解,而后熟悉OpenGL中每种几何变换的实现方法。
3.1三维图形的基本显示流程在计算机绘图中,对场景进行变换的整个过程类似于用一台相机拍摄照片。
如图0.1所示,相机拍摄照片的具体步骤(括号内表示相应的计算机绘图操作)如下:(1)将相机固定在三脚架上并使相机对准场景(视图变换)(2)使想要拍摄的场景处于取景框中的合适位置(模型变换)(3)选择相机镜头或调整放大倍数(投影变换)(4)决定最终照片尺寸的大小,比如想要得到一张经过放大后的照片(视区变换)(a )照相机(b )计算机环境图 0.1 和照相机类比的计算机显示流程这些步骤与程序中指定的变换顺序相对应,然而这一顺序并不是固定的。
在源代码中,视图变换一定要在模型变换之前执行,但是投影变换和视区变换则可以在进行绘图之前的任何时刻进行。
图 0.2显示了在计算机中上述操作的顺序。
局部坐标世界坐标视点坐标图像坐标备坐标屏幕坐标glMatrixModel(GL_MODELVIEW );gluLookAt ();glTranslate {f,d}();glScale {f,d}();glRotate {f,d}();glMatrixModel(GL_PROJECTION );gluPerspective ();glFrustum ();glOrtho ();gluOrtho2D ();glViewPort ()图 0.2 OpenGL 的几何变换流水线及各阶段的主要函数既然在计算机中OpenGL 的几何变换具有如图 0.2所示的固定流水线,为什么在源代码中,视图变换一定要在模型变换之前执行,但是投影变换和视区变换则可以在绘图之前的任何时刻进行呢?这主要是因为在OpenGL 中,维护了一个模型视图矩阵modelView M 和一个投影矩阵proj M (准确的来说,是维护了一个模型视图矩阵堆栈和一个投影矩阵堆栈,栈顶的矩阵即为当前的变换矩阵),对于物体空间的任意一点,其投影以后的图像坐标由式(2.1)得到,proj modelView '**v v =M M(0.1)因此,模型视图变换和投影变换在源代码中的先后顺序并不影响程序的结果,视口变换也是一样,它也是单独保存的,规格化后的设备坐标经视区变换后即可得到屏幕坐标,它的顺序也不影响程序的结果。
计算机图形学实验报告
![计算机图形学实验报告](https://img.taocdn.com/s3/m/61b257b7bb0d4a7302768e9951e79b89680268cc.png)
实验结果与结论
• 在本次实验中,我们成功地实现了复杂场景的渲染,得到了具有较高真实感和视觉效果的图像。通过对比 实验前后的效果,我们发现光线追踪和着色器的运用对于提高渲染质量和效率具有重要作用。同时,我们 也发现场景图的构建和渲染脚本的编写对于实现复杂场景的渲染至关重要。此次实验不仅提高了我们对计 算机图形学原理的理解和实践能力,也为我们后续深入研究渲染引擎的实现提供了宝贵经验。
2. 通过属性设置和变换操作,实现了对图形的定 制和调整,加深了对图形属性的理解。
4. 实验的不足之处:由于时间限制,实验只涉及 了基本图形的绘制和变换,未涉及更复杂的图形 处理算法和技术,如光照、纹理映射等。需要在 后续实验中进一步学习和探索。
02
实验二:实现动画效果
实验目的
掌握动画的基本原 理和实现方法
04
实验四:渲染复杂场景
实验目的
掌握渲染复杂场景的基本流程和方法 理解光线追踪和着色器在渲染过程中的作用
熟悉渲染引擎的实现原理和技巧 提高解决实际问题的能力
实验步骤
• 准备场景文件 • 使用3D建模软件(如Blender)创建或导入场景模型,导出为常用的3D格式(如.obj或.fbx)。 • 导入场景文件 • 在渲染引擎(如Unity或Unreal Engine)中导入准备好的场景文件。 • 构建场景图 • 根据场景的层次结构和光照需求,构建场景图(Scene Graph)。 • 设置光照和材质属性 • 为场景中的物体设置光照和材质属性(如漫反射、镜面反射、透明度等)。 • 编写渲染脚本 • 使用编程语言(如C或JavaScript)编写渲染脚本,控制场景中物体的渲染顺序和逻辑。 • 运行渲染程序 • 运行渲染程序,观察渲染结果。根据效果调整光照、材质和渲染逻辑。 • 导出渲染图像 • 将渲染结果导出为图像文件(如JPEG或PNG),进行后续分析和展示。
实验三二维图形编辑(一)实验报告参考模板
![实验三二维图形编辑(一)实验报告参考模板](https://img.taocdn.com/s3/m/6bad0c931711cc7930b716a0.png)
AutoCAD课程上机实验报告实验序号:实验三实验名称:二维图形编辑(一)班级:08计科学号:2008032514 姓名:黄智华分组人数:5 人指导老师:李伙友实验日期:年月日实验成绩:一、实验目的及要求目的:1.理解选择集概念,熟练掌握各种对象选择方式。
2.熟练掌握二维图形编辑(ERASE、COPY、MIRROR、OFFSET、ARRAY、MOVE、LENGTH、TRIM、EXEND、BREAK等)命令的使用。
3.熟悉掌握绘图环境设置(图形单位、图形范围、对象颜色、对象线型和对象线宽)。
4.熟练掌握辅助绘图工具(栅格显示、网格捕捉、正交模式、对象捕捉和自动跟踪)。
要求:1.将图形绘制在文件“实验三二维图形编辑(一)”中,图形界限为120*90,绘图尺寸自定,但要与原图相似。
2.绘图时设置合适的绘图环境。
3.绘图时使用合适的绘图工具。
4.使用绘图、编辑、辅助绘图命令绘制图形。
5.尺寸标注略。
二、实验环境本次上机实践所使用的平台为:windows7操作系统所使用的软件为:AutoCAD 2006三、实验内容绘制图s5-1、图s5-2、图s5-3、图s5-4所示的图形。
四、实验主要步骤1.绘制图s5-1:1)启动AutoCAD2006系统,进入AutoCAD2006绘图界面。
2)用LIMITS命令设置图形界限为120-90。
3)用ZOOM命令及“全部”选项设置绘图区为图界范围。
4)用LINE命令、正交方式和45度极轴追踪方式绘制图s5-1的基本图形(三角旗)。
5)用COPY、MOVE、MIRROR、ROTATE和ALIGN命令及对象捕捉绘制s5-1其余图形。
2.绘制图s5-2:1)用LINE命令、网格捕捉喝正交方式绘制辅助线。
2)用CIRCLE和LINE命令,以及对象捕捉功能绘制图形。
3)用TRIM命令修剪圆绘制图形。
4)用ERASE命令删除辅助线,生成s5-2图形。
3.绘制图形s5-31)用CIRCLE和LINE命令,以及对象捕捉功能绘制图形。
图形学实验报告
![图形学实验报告](https://img.taocdn.com/s3/m/b840c05250e2524de5187ee3.png)
图形学实验报告计算机图形学实验指导书学号:1441901105姓名:谢卉实验一:图形的几何变换实验学时:4学时实验类型:验证实验要求:必修一、实验目的二维图形的平移、缩放、旋转和投影变换(投影变换可在实验三中实现)等是最基本的图形变换,被广泛用于计算机图形学的各种应用程序中,本实验通过算法分析以及程序设计实验二维的图形变换,以了解变换实现的方法。
如可能也可进行裁剪设计。
二、实验内容掌握平移、缩放、旋转变换的基本原理,理解线段裁剪的算法原理,并通过程序设计实现上述变换。
建议采用VC++实现OpenGL程序设计。
三、实验原理、方法和手段1.图形的平移在屏幕上显示一个人或其它物体(如图1所示),用交互操作方式使其在屏幕上沿水平和垂直方向移动Tx和Ty,则有x’=x+Tx y’=y+Ty其中:x与y为变换前图形中某一点的坐标,x’和y’为变换后图形中该点的坐标。
其交互方式可先定义键值,然后操作功能键使其移动。
2.图形的缩放在屏幕上显示一个帆船(使它生成在右下方),使其相对于屏幕坐标原点缩小s倍(即x方向和y方向均缩小s倍)。
则有:x’=x*s y’=y*s注意:有时图形缩放并不一定相对于原点,而是事先确定一个参考位置。
一般情况下,参考点在图形的左下角或中心。
设参考点坐标为xf、yf则有变换公式x’=x*Sx+xf*(1-Sx)=xf+(x-xf)*Sxy’=y*Sy+yf*(1-Sy)=yf+(y-yf)*Sy式中的x与y为变换前图形中某一点的坐标,x’和y’为变换后图形中该点的坐标。
当Sx>1和Sy>1时为放大倍数,Sx<1和Sy<1时为缩小倍数(但Sx 和Sy必须大于零)。
3.图形的旋转在屏幕上显示一个汽车,根据自己确定的旋转角度和旋转中心对图形进行旋转。
旋转公式为x’=xf+(x-xf)*cos(angle)-(y-yf)*sin(angle)y’=yf+(y-yf)*cos(angle)+(x-xf)*sin(angle)其中:xf,yf为围绕旋转的中心点的坐标。
计算机图形学实验报告三
![计算机图形学实验报告三](https://img.taocdn.com/s3/m/29c4bbb77e21af45b207a866.png)
《计算机图形学》实验报告glClear(GL_COLOR_BUFFER_BIT);//glEnable(GL_SCISSOR_TEST);//glScissor(0.0f,0.0f,500,300);glutWireTeapot(0.4);glFlush();}//窗口调整子程序void myReshape(int w, int h){glViewport(500, -300, (GLsizei)w, (GLsizei)h);glMatrixMode(GL_PROJECTION);glLoadIdentity();if (w <= h)glOrtho(-1, 1, -(float)h / w, (float)h / w, -1, 1);elseglOrtho(-(float)w / h, (float)w / h, -1, 1, -1, 0.5);}2,使用opengl函数写一个图形程序,要求分别使用三个光源从一个茶壶的前右上方(偏红色),正左侧(偏绿色)和前左下方(偏蓝色)对于其进行照射,完成程序并观察效果。
}//绘图子程序void display(void){glColor3f(1.0, 1.0, 0.0);glClear(GL_COLOR_BUFFER_BIT);//glMatrixMode(GL_MODELVIEW);//glLoadIdentity();//设置光源的属性1GLfloat LightAmbient1[] = { 1.0f, 0.0f, 0.0f, 1.0f }; //环境光参数 ( 新增 )GLfloat LightDiffuse1[] = { 1.0f, 0.0f, 0.0f, 1.0f }; // 漫射光参数 ( 新增 )GLfloat Lightspecular1[] = { 1.0f, 0.0f, 0.0f, 1.0f }; // 镜面反射GLfloat LightPosition1[] = { 500.0f, 500.0f, 500.0f, 1.0f }; // 光源位置 ( 新增 ) glLightfv(GL_LIGHT0, GL_POSITION, LightPosition1);glViewport(0, 0, (GLsizei)w, (GLsizei)h);glMatrixMode(GL_PROJECTION);glLoadIdentity();3,使用opengl函数完成一个图形动画程序,显示一个球沿正弦曲线运动的过程,同时显示一个立方体沿抛物线运动过程。
计算机图形学实验(全)
![计算机图形学实验(全)](https://img.taocdn.com/s3/m/95e84bcedb38376baf1ffc4ffe4733687e21fcda.png)
计算机图形学实验(全)实验1 直线的绘制实验目的1、通过实验,进一步理解和掌握DDA和Bresenham算法;2、掌握以上算法生成直线段的基本过程;3、通过编程,会在TC环境下完成用DDA或中点算法实现直线段的绘制。
实验环境计算机、Turbo C或其他C语言程序设计环境实验学时2学时,必做实验。
实验内容用DDA算法或Besenham算法实现斜率k在0和1之间的直线段的绘制。
实验步骤1、算法、原理清晰,有详细的设计步骤;2、依据算法、步骤或程序流程图,用C语言编写源程序;3、编辑源程序并进行调试;4、进行运行测试,并结合情况进行调整;5、对运行结果进行保存与分析;6、把源程序以文件的形式提交;7、按格式书写实验报告。
实验代码:DDA:# include abs(dy))epsl=abs(dx);elseepsl=abs(dy);xIncre=(float)dx/(float)epsl;yIncre=(float)dy/(float)epsl;for(k=0;k#includevoid BresenhamLine(int x0,int y0,int x1,int y1,int color) {int x,y,dx,dy,e;dx=x1-x0;dy=y1-y0;e=-dx;x=x0;y=y0;while(x0){y++;e=e-2*dx;}}}main(){int gdriver ,gmode ; gdriver = DETECT;initgraph( BresenhamLine(0, 0 , 120, 200,5 );getch ( );closegraph ( );}实验2 圆和椭圆的绘制实验目的1、通过实验,进一步理解和掌握中点算法;2、掌握以上算法生成椭圆或圆的基本过程;3、通过编程,会在TC环境下完成用中点算法实现椭圆或圆的绘制。
实验环境计算机、Turbo C或其他C语言程序设计环境实验学时2学时,必做实验。
《计算机图形学》实验3实验报告
![《计算机图形学》实验3实验报告](https://img.taocdn.com/s3/m/b16fe6d880eb6294dd886c8c.png)
实验3实验报告格式《计算机图形学》实验3实验报告实验题目:直线(光栅化)实数型Bresenham 算法在用户坐标系和Java AWT 坐标系下显示图像实验内容:1 直线(光栅化)实数型Bresenham 算法原理及程序。
2 直线(光栅化)DDA 算法原理及程序。
3 在用户坐标系和Java AWT 坐标系下显示图像的算法原理及实现。
写程序调用验证之。
参考资料:1 课件:光栅图形生成算法.PP T2 Bresenham 算法演示程序已经在MyCanvas 包里,DDA 算法applet 演示程序DDA.java3 有一个示范程序imageDrawApplet.java基本概念:(详细叙述自己对实验内容的理解) 直线(光栅化):画一条从(x1, y1)到(x2, y2)的直线,实质上是一个发现最佳逼近直线的像素序列、并填入色彩数据的过程。
这过程称为直线光栅化。
Bresenham 算法:Bresenham 直线算法是用来描绘由两点所决定的直线的算法,它会算出一条线段在 n 维光栅上最接近的点。
这个算法只会用到较为快速的整数加法、减法和位元移位,常用于绘制电脑画面中的直线。
DDA 算法:DDA 算法(Digital Differential Analyzer ),又称数值微分法,是计算机图形学中一种基于直线的微分方程来生成直线的方法。
算法设计:(详细叙述自己设计的Bresenham 算法以及程序的功能、不同坐标系下图像显示的算法)程序功能:用DDA 算法画出直线,在不同的坐标系下显示图像。
Bresenham 算法:用坐标为(xi ,yi,r)的象素来表示直线上的点,则第i+1个点只能在C 和D 中选取。
令d1=BC ,d2=DBd1-d2=(yi+1–yi,r)-( yi,r+1-yi+1)=2yi+1–yi,r –(yi,r+1)= 2yi+1–2yi,r –1x i x i+1令ε(xi+1)= yi+1–yi,r–0.5=BC-AC=BA=B-A= yi+1–(yi,r+ yi,r+1)/2当ε(xi+1)≥0时,yi+1,r= yi,r+1,即选D点,即下个点(xi+1,yi+1 )对应的象素(xi +1,yi+1,r )为(xi+1,yi,r+1 )当ε(xi+1)<0时,yi+1,r= yi,r,即选C点,即下个点(xi+1,yi+1 )对应的象素(xi +1,yi+1,r )为(xi+1,yi,r )ε(xi+1)= yi+1–yi,r–0.5ε(xi+1)≥0时,yi+1,r= yi,r+1ε(xi+1)<0时,yi+1,r= yi,r用户坐标系下图像显示算法:定义自己的坐标系,将用户坐标系转换为Java awt坐标,调用Graphics类的drawImage方法即可。
计算机图形学实验报告
![计算机图形学实验报告](https://img.taocdn.com/s3/m/c08a233e4b73f242326c5f08.png)
实验一:二维图形的绘制和变换一、实验目的掌握基本的图形学算法,熟悉VC下图形学的编程,初步了解并使用OpenGL 绘制图形。
二、实验内容二维图形的绘制和变换,绘制包括直线、三角形、矩形,变换包括平移、旋转、缩放。
三、实验原理二维图形的绘制和变换:在图形系统中,矩阵是实现变换的标准方法。
平移变换、旋转变换和缩放变换的矩阵表示形式如下。
平移变换:P’=P+T。
旋转变换:P’=R*P。
缩放变换:P’=S*P。
引入齐次坐标后,平移、旋转和缩放变换的矩阵表示形式如下所示。
(1)平移变换:[1 0 0][x’, y’, 1] = [x, y, 1] [0 1 0][tx ty 1](2)旋转变换:[cosɵsinɵ0][x’, y’, 1] = [x, y, 1] [-sinɵcosɵ0][0 0 1](3)缩放变换:[s x0 0][x’, y’, 1] = [x, y, 1] [0 s y0][0 0 1]四、实验代码及结果1.编写对一个三角形分别实现平移、缩放、旋转等变化的源码及效果图。
实验核心代码void display(void){glClear (GL_COLOR_BUFFER_BIT);glColor3f (1.0, 1.0, 1.0);glLoadIdentity ();glColor3f (1.0, 1.0, 1.0);glTranslatef(-100.0,-50.0,1.0);draw_triangle ();glLoadIdentity ();glTranslatef (0.0, 100.0, 1.0);draw_triangle ();glLoadIdentity ();glRotatef (90.0, 0.0, 0.0, 1.0);draw_triangle ();glLoadIdentity ();glScalef (0.5, 0.5, 1.0);draw_triangle ();glFlush ();}2. 实现如图功能#include<windows.h>#include <GL/glut.h>#include <stdlib.h>void init(void){glClearColor (0.0, 0.0, 0.0, 0.0);glShadeModel (GL_SMOOTH); }void draw_triangle(void){glShadeModel(GL_SMOOTH);glColor3f(0.2,0.7,0.30);glBegin (GL_TRIANGLES);//画出三角形,为混合色填充方式glVertex2f(50.0, 25.0);glColor3f(0.4,0.5,0.60);glVertex2f(150.0, 25.0);glColor3f(0.9,0.7,0.8);glVertex2f(100.0, 100.0);glEnd();}void display(void){glClear (GL_COLOR_BUFFER_BIT);glColor3f (1.0, 1.0, 1.0);glLoadIdentity ();glColor3f (1.0, 1.0, 1.0);glTranslatef(-100.0,-50.0,1.0);draw_triangle ();glLoadIdentity ();glTranslatef (0.0, 100.0, 1.0);glRotatef (90.0, 0.0, 0.0, 1.0);glScalef (0.5, 0.5, 1.0);draw_triangle ();//经过三种变换后画出图形glFlush ();}void reshape (int w, int h){glViewport (0, 0, (GLsizei) w, (GLsizei) h);glMatrixMode (GL_PROJECTION);glLoadIdentity ();if (w <= h)gluOrtho2D (-200.0, 250.0, -100.0*(GLfloat)h/(GLfloat)w,200.0*(GLfloat)h/(GLfloat)w);//调整裁剪窗口elsegluOrtho2D (-200.0*(GLfloat)w/(GLfloat)h,250.0*(GLfloat)w/(GLfloat)h, -50.0, 200.0);glMatrixMode(GL_MODELVIEW);int main(int argc, char** argv){glutInit(&argc, argv);glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);glutInitWindowSize (600, 600);glutInitWindowPosition (100, 100);glutCreateWindow (argv[0]);init ();glutDisplayFunc(display);glutReshapeFunc(reshape);glutMainLoop();return 0;}实验二:使用中点扫描算法绘制直线和圆一、实验目的掌握基本的图形学算法,熟悉VC下图形学的编程,初步了解并使用OpenGL 绘制图形。
计算机图形学 实验3 三维形体构造
![计算机图形学 实验3 三维形体构造](https://img.taocdn.com/s3/m/feb871bf960590c69ec3769d.png)
一、实验题目:三维形体构造二、实验内容使用三维造型工具(如3DSMax或AutoCAD)设计一个日常生活用品(如:计算机器材、水果、杯子、电视、桌椅等)三、实验过程1、设计过程(1)在‘标准几何体’面板中选择“球体”命令将球体的半径设置为40,段数为36,然后在视图区中的顶视图中绘制一个球体(2)在顶视图中鼠标右键单击球体,在快捷菜单中选择“转换为”中的“转换NURBS曲面”命令。
(3)单击命令面板中的“NURBS曲面”选项前面的“+”按钮,选择该命令中的“CV曲面”命令,这时,球体的周围出现了黄色的经线和纬线组成的框线,并且在交叉点上有绿色的点,这些绿色的点被称为CV控制点(4)在CV卷展栏中单击“单个控制点”按钮,在顶视图中单击球体的中心控制点(5)关闭CV卷展栏,打开软选择卷展栏,将该命令下的“软选择”和“影响相邻”命令激活,在“衰减”命令栏中输入20,选择工具栏中的“选择移动”工具,在前视图中对选择的中心点沿Y轴向下移动,这时在苹果的上端会出现一个向下的苹果顶坑(6)在顶视图中球体的中心位置再次单击鼠标的左键选择球体下面的控制点(7)在前视图中沿Y轴向上移动鼠标,创建一个球体的向上凹进的苹果底坑,这时,前视图如下:(8)在‘标准几何体’面板中选择“圆柱体”命令,把光标放在顶视图苹果的中心,画出苹果的叶柄,设置相应的参数。
(9)在修改器列表中选择“弯曲”,设置弯曲的角度为60,再选择“锥化”,设置参数,数量为0,曲线为-2.0(10)给苹果和叶柄渲染上相应的颜色,得到苹果2、实验结果图3、说明设计中采用哪些三维形体构成方法该设计采用的是几何体素构造法,该方法是一种用简单几何形体构造复杂实体的造型方法,用到的造型体素有球体、圆柱体。
4、该实体构造方法的优缺点分析优点:CSG既能增加体素,又能移去体素的布尔运算。
一般造型系统都为用户提供了基本体素,它们的尺寸、形状、位置都可由用户输入少量的参数值来确定,因此非常便捷。
图形学第三次实验作业答案
![图形学第三次实验作业答案](https://img.taocdn.com/s3/m/fc342b50ad02de80d4d8407a.png)
解:(1)
C(7,9) D(9,8) G(11,8)
(11,6)
B(4,6)
(2,5)
E(7,5)
F(9,5) I(9,3)
A(2.5,2.5) J(6,1)
H(11,1)
4
已知如右图所示的多边形,请建立进行多边形扫描线填充所需的桶分类 (边表) 并依次计算每条扫描线的活性边表。
C(7,10) D(9,9) G(11,9)
List outputList = subjectPolygon; for (Edge clipEdge in clipPolygon) do List inputList = outputList; outputList.clear(); Point S = st; for (Point E in inputList) do if (E inside clipEdge) then if (S not inside clipEdge) then outputList.add(ComputeIntersection(S,E,clipEdge)); end if outputList.add(E); else if (S inside clipEdge) then outputList.add(ComputeIntersection(S,E,clipEdge)); end if S = E; done done 可以,见书上代码 275-277,把 276 第一次调 clipPoint 的地方,第二个参数改成 winEdge+1 (2)
zprp −z zvp −z 100 z
−1 0 0 0 0 1 0 0 ′ � Mt =� 0 0 −1 −1 0 0 0 1 gluPerspective 的变换矩阵为,求解方法见附件 gluPerspective.pdf 及第七章
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验3:A Racing Car (综合实验预计18 小时)
实验目的:
●熟练掌握和综合运用OpenGL编程技术来开发简单的三维交互式游戏
实验内容:
1.利用Gl/Glu/Glut库,编写一个OpenGL程序,实现以下功能:
●设计并绘制一辆汽车模型以及一个简单的直线跑道;其中,车轮可以用
glutCylinder来绘制。
关于glutCylinder的使用可以参照下面的例子:
GLUquadricObj *quadratic;
int InitGL(GLvoid) // 此处开始对OpenGL进行所有设置
{
quadratic=gluNewQuadric(); // 创建二次几何体
}
int DrawGLScene(GLvoid) // 从这里开始进行所有的绘制
{
gluCylinder(quadratic,0.6f,0.6f,0.4f,32,32);//画圆柱
}
●缺省视图是从外面一个固定的视点观察汽车和跑道;
●利用鼠标和键盘控制汽车前进、后退、转弯、加速和减速;
●制作一个弹出菜单,上面的菜单项用来控制车身和车轮的颜色以及退出程序;
●定义对应于ReShape事件的回调函数,使得当用户改变窗口的大小时,显示
的汽车不会变形。
2.加分题(可选择做其中的0个、1个或多个)
●采用弯曲的封闭的跑道。
●轮胎画成封闭的形状。
以上例子画出的只是一个两端开放的圆柱面, 你们可
以使用gluDisk(…) 将圆柱体两端封闭。
●在缺省视图下,绘制汽车在跑道上的阴影(自定义一个假想的点光源);
●在路边设置一些路标,对于地面、跑道和/或天空进行纹理映射等以增强逼
真度。
●除了缺省视图之外,支持第二种视图:坐在车内从驾驶座位向前看的视图。
两种视图之间用“t”键进行切换。
3.完成一份实验报告,描述你如何设计本程序,你的程序实现了哪些功能,并
且给出屏幕截图。