计算机图形学基本图形

2022-08-18 版权声明 我要投稿

第1篇:计算机图形学基本图形

计算机图形学教学中图形计算思维方法研究

摘 要:图形计算思维是进行图形信息处理相关理论、方法、实践的重要思维方法,是计算思维在图形信息处理领域的应用和扩展。本文对图形计算思维概念进行了研究,并对图形计算思维在计算机图形学教学体系中如何设计和组织进行了探索,总结了3层次图形计算思维模式及其使用的主要方法,并分析其在教学实践中的应用效果。实践表明,将图形计算思维贯彻到教学中均会极大地提升理论课和实践课的教学质量和效果。

关键词:图形计算思维;计算机图形学;教學方法

计算思维被提出已有10余年的历史,人们对其内涵、外延、维度、层次结构、表述体系、实践等进行了一系列的研究和探索。[1]由于其发端于发展迅猛的计算机科学,且涉及哲学、心理、社会等学科,又要向人类社会生活的其它领域扩展,至今仍未建立一个完善的体系,存在大量问题需要研究。[2]但不妨碍其作为对计算机学科相关算法、原理、过程的思维方法和规律进行探索和研究的方法论而存在。在大学的计算机学科教学中,分层次、系统性地研究和探索计算思维教育是一种现实可行的方法,即根据计算思维方法层次体系的划分,结合各个专业培养目标需要,在每门课程中结合知识思维特性,探索、总结计算思维的教学规律和方法,系统培养人才的计算思维观念、方法,掌握使用计算思维解决相关领域问题的方法。

计算机图形学是计算机科学、数字媒体技术等本科专业重要的专业基础课,课程特点是理论知识抽象、算法思路多样、知识点众多、实践性很强。有很多学者对在计算机图形学教学中开展计算思维教育进行了探索。周虹等按照Wing的观点将图形学的教学内容划分为问题求解(经典图形学算法)、设计系统(结合OpenGL图形库和多种知识设计复杂的图形系统)和理解人类行为(某些过程性知识与人类思维过程接近),并组织、设计相关的教学体系。[3]李谷伟提出了运用计算思维激发学生学习兴趣,并理解知识的核心问题和求解方法, 通过对问题的引入、寻求解决问题的思路、引出问题的解决方法。[4]但对计算思维在图形学的使用缺少系统性的方法总结和提炼。方佳诚、王勇刚给出了教育部大学计算机课程教学指导委员会对计算思维表述体系的8种分类,并给出了较为经典的图形学算法、过程对应的核心表述方法和参考案例,指出在图形学知识点表述上主要以计算和自动化为核心,且不同课程的知识点表述核心会有所不同。[5][6]但未给出图形学核心算法、过程思维规律的方法总结。本文结合笔者在图形学教学中对计算思维的思考、研究、实践进行了总结,提出了图形计算思维的概念,对如何在图形学教学体系中贯彻和执行图形计算思维进行了研究,分析了图形计算思维中主要方法,并进行了实证研究。

一、图形计算思维的提出

美国K-12教育实践中将计算思维定义为一组认知技能和解决问题的过程,涉及数据的组织和分析、分解问题,程序化的思维技巧、算法思维,并将问题解决过程拓展到社会领域等。[5]该定义较为符合图形计算思维的主要过程。但图形思维拥有自己独特的思考、解决问题的思维方法和规律,而在当前的有关计算思维表述体系中缺少对图形方法的论述。因此,将图形思维纳入计算思维是理所当然的。

图形计算思维包含2个方面。一是广义上的,本文结合计算机学科特点,将其概括为,借助于图形化接口(界面)系统展示事物内在规律和外在过程,通过交互手段接受外部输入(Input),系统内部通过计算仿真(Process)事物的运动规律,将处理结果图形化地输出(Output)到接口。以此来获得对事物规律性的认识,提高人类学习、思考和处理问题的能力。[6]这个过程涉及一系列的思维方法,可称其为可视化思维方法。二是狭义上的,即仅就计算机图形学本身而言,主要涉及3个层次的思维模式:①对图形学基本算法、原理、过程思维过程和规律的认知;②利用图形计算思维进行图形系统设计;③将图形计算思维的方法扩展到其他领域,并解决其他领域的问题。本文仅就狭义图形计算思维在图形学课程教学中相关过程的设计、组织和方法进行讨论。

二、图形计算思维在图形学教学体系中的设计和组织

在图形计算思维教学过程的设计和组织中,不能停留在理论层面,应使学生“既能感受到又能看得见,具体的计算思维”。[6]需要解决“授人以渔”的问题,既需要教师有目的地设计教学环节,并将其落实到各个知识点的教学活动中;同时也需要学生有意识地学习掌握这一思维规律,在学好课程知识的基础上,灵活利用计算思维解决其它问题。首先教师在思想上应高度认识到课程的教学目标包括两部分:一是课程知识的讲授,二是系统性地总结课程中用到的图形计算思维方法,并将其设计、组织到相关教学活动中;其次,深刻领会计算思维的真谛,研究其主要的方法和过程,结合课程的授课目的和知识结构特点,总结提炼课程中所使用的计算思维方法,并与相关的课程知识点结合,讲授其中的思维规律和方法。[7]

在知识体系上,采用“概论→图形系统→图形开发平台→场景创建→几何变换与动画→场景观察→真实感图形绘制→图形交互→光栅图形处理→曲线曲面与图形表示”的顺序来组织教学内容和知识点。这样在知识体系上可以较好地搭建一个容纳3层次图形计算思维模式的教学内容框架。

理论课与编程实践并重已成为应用型人才培养公认的一种教学方式。经典图形学算法理论教学主要体现了问题求解的相关思维方法及规律,实践教学中有关图形学原理、方法和过程的验证实验也属于第1层次思维模式,即对问题求解的实践验证。综合使用图形学理论和方法,通过编程设计开发综合运用多种知识的图形系统,可以满足第2层次思维模式培养需求。通过第1、2层次的学习,能够掌握经典理论的思维规律,掌握高级图形系统开发的思维规律,并以此为工具能够解决其他领域(如虚拟现实、增强现实、游戏设计等)的图形计算思维问题,则属于第3层次。

图形学的显著特点是由大量算法、原理、过程组成,其中贯穿着很多思考问题的方法和规律,初学者很容易陷入一个个不同算法、原理和过程的复杂描述中,而难以领会和掌握其中的思维规律。这就要求教师在超越知识点描述的高度,总结这些经典算法思考、解决问题的思维规律,并结合知识点讲解这一思维规律,从而引导学生自觉学习和掌握思维方法。

在图形系统设计能力的培养中,也存在很多图形计算思维规律和方法,如基于交互的图形系统设计思维方法、图形系统开发框架和基于某种宿主语言的开发思维过程等。

在整个教学过程的设计与组织过程中应贯穿:思维规律和方法介绍落实于知识点的讲解,思维方法随着知识的贯通而养成,图形系统设计能力随着对图形计算思维的理解而得到提升。[8]

三、图形计算思维方法

图形计算思维的养成需要贯穿到教学的具体环节中,深刻发掘课程知识点背后的计算思维方法,并将其与具体的知识点加以融合,是落实计算思维教学的好方法。图形学的知识内容体系主要围绕图形处理过程中的原理、算法、过程、方法来组织展开。其中,既包括相对独立的求解某一问题的算法、过程或方法,也包括作为相对连贯的一系列原理、过程或方法。因此,在其方法论体系中涉及3类思维方法:一是基本图形原理、方法、过程的思维方法,二是图形系统开发的思维方法,三是常规性思维方法。

1.基本图形原理、方法、过程的思维方法

各种原理、算法、方法、过程构成了计算机图形学的主体知识内容,主要用到计算思维表述体系中的计算(状态转换、按时间/空间排序)、抽象(概念模型与形式模型)、自动化(形式化、迭代、递归)等核心概念。[5]除此之外,深入挖掘如下四类图形计算思维规律,介绍清楚其设计思考过程,引导初学者掌握其背后的思维规律,有助于激发其学习兴趣。

每一种原理、算法、方法、过程都有其设计、处理问题的逻辑思维过程,并以形式化方法进行抽象描述。初学者往往会先对这些描述进行字面理解,再去揣摩描述背后隐藏的逻辑思维过程,这样会事倍功半。在教学中总结算法描述背后的逻辑思维过程,再进行算法描述的理解,并以实例解释其实现过程,会达到事半功倍的效果。

一些算法、过程在设计过程中会遵循过程递进的思维规律,单独去看某个算法或过程会使初学者前不知来者后不知去处。将递进思维规律介绍清楚将会有助于初学者按照思维规律去完整理解算法、过程的设计思路。如二维图形光栅化生成算法涉及3个相互联系的递进思维过程:①算法设计的总体思路。对于任何图形的生成和显示均是在光栅显示器等设备上找到一个能够最佳逼近于数学意义上描述图形形状的像素集合的過程。只有理解了这一总前提,才能对后续具体算法的设计思想有一个目的性了解。②总体思路可递进分解为如下的思维主线。a.明确问题的数学或几何意义及相应的数学公式;b.设计特定算法找到最佳逼近的像素点集来显示这些图形;c.所设计的算法针对特定需求有哪些优化方法。③在生成线段、圆所使用的中点算法、Bresenham算法的设计中,又将整个算法分解为3个过程。a.根据图形的几何方程式构造判别条件,根据判别条件的值与0之间的关系确定下一个像素点的坐标;b.根据坐标增量规律计算判别条件之间的递推关系,并确定在起点处的初始判别条件值;c.观察判别条件中有无可能进行一些调整来减少运算的复杂程度,并加以优化。通过以上思维过程的递进分解可以揭示算法设计的思维规律,可使初学者较为轻松地掌握类似算法设计的思维逻辑。

图形学有很多原理、过程描述,使用空间想象思维、类比思维的方法可以帮助初学者更好地掌握这些原理和过程。如在三维场景的构建和漫游中,尽管使用的是含有三维空间坐标顶点信息的函数来设计搭建三维场景,通过改变漫游函数的参数来实现漫游,这一过程完全可以想象成是在计算机虚拟空间像垒砖瓦盖房子似地搭建三维场景,把漫游想象成在虚拟三维空间中的观察活动;而类比方法的使用,最典型的是将三维图形观察过程类比于相机的照相过程,三维场景的搭建、观察坐标系的定义、裁剪体定义、投影变换、图像的显示均与照相过程相似。

在图形计算思维中还涉及一些其他方法,如在几何变换中使用“化非基本几何变换为基本几何变换”的思维方法来解决复合几何变换问题。几何变换背后所使用的矩阵计算方法的揭示使初学者能够从本质上理解几何变换发生的真实过程。在二维线段裁剪算法中巧用区域编码方法解决线段顶点与裁剪窗口边框间关系判断的问题等。

2.图形系统开发的思维方法

任何软件设计都有一套设计框架和思路(即设计框架思维),在程序设计时必须遵循这套框架和思路,再在其框架内扩展自己的功能需求。思维方法包括交互图形系统设计思维方法、图形系统开发框架嵌套到某种宿主平台的开发思维方法。

交互图形系统设计思维方法包括:①交互图形系统界面设计,即分析如何用图形方式来展现内容主题,以及图形部分的输入信息处理方式、响应交互处理的图形渲染过程和图形输出方式。设计用户界面构成元素,如窗口层级关系、菜单、图标、信息显示交互控件、按钮、图形。②图形元素设计,即由哪些几何体组成,几何体分解为哪些几何图元,怎样组合在一起,几何图元由哪些顶点构成,顶点在三维空间的坐标(x,y,z)是什么。③交互逻辑处理算法设计,即根据交互处理功能需要,设计交互设备与图形元素交互事件处理,完成相应功能的逻辑处理算法的设计。

图形系统开发平台与宿主平台的嵌套处理思维过程是指,图形系统开发平台需要嵌套到某些宿主平台方可完成整个系统的开发任务,需要掌握某个图形系统开发平台(如OpenGL等)应用程序开发框架,以及将其嵌套到宿主平台的思维规律。

3.常规性思维方法

计算机图形学是计算机科学的一个分支,在处理算法、过程的设计中遵循计算思维的一般规律和过程。其中,分治思想、森林与树木的关系等是其中使用的重要思维方法。

分治思想是人们处理很多问题时使用的共同方法之一,形象地讲就是大事化小,小事化了。即将一个大的问题分解为一个个相对较小的问题,再对每个小问题进一步进行分解,使其成为一个个利用已有知识、方法可以解决的问题,从而逐层上推,使大问题也可以得到解决。对于图形处理主要体现在两个方面:一是在所有算法设计中均遵循此方法,如凹多边形的识别算法,首先将其分解为根据顶点坐标计算各个边向量,再计算相邻2个边向量间的叉积,最后根据所有叉积的符号的异同来判别其凸凹性;二是在图形系统的开发中,模块化程序设计方法也是这一思想的具体体现。

森林与树木的关系是一种全局与局部的关系,要在森林中不迷路,既要从全局的角度了解森林的总体构成,又要了解每个局部的树木组成。在计算机图形学中,主要体现在整个计算机图形学的知识体系与每个知识单元的关系,以及图形绘制流水线与相关知识单元的关系。这个问题介绍不清楚,往往导致初学者迷失在庞大的图形学知识体系里,不能从总体上把握图形学所要研究和处理的问题。这是一个需要从粗浅的总体了解(即从高空俯视森林),到掌握相关知识点(了解具体树木信息),再回到全局掌握(对整个森林了然于胸)的思维过程。这一方法将贯穿于课程学习的全过程。

四、图形计算思维在教学中的实践应用

除了教给学生课程知识外,更重要的是要教给学生学习、掌握解决类似问题的思维方法,在理论课和实践课教学环节贯彻知识和思维方法并重的教学理念。并进行了理论课教学风格和实践环节设计的变革,很好地提高了教学效果,学生教学打分均在93至96之间。

在理论课教学中进行了如下的教学變革:①将森林与树木的关系思维方法落实到相应的教学环节,使学生既可建立起图形学整个学科研究内容的整体认知,也可学习掌握各个知识点具体的研究内容。注意前后知识点的联系,使学生能够将所学知识串联起来成为一个整体。②将单纯的理论讲授,变为思维过程的启发式分析引导。对于所讲授的原理、算法、过程等,先分析其设计、求解的思维过程,再结合具体实例讲授其每一步求解的过程。尤其在介绍某些算法及其优化方法的比较时,引导学生理解其改进点在哪里、优势是什么,使学生可以体会到“算法之美”,从而提高学生的学习兴趣。③在PPT近20处知识点讲解中,明确给出解决问题的图形计算思维的具体方法和过程,并将其应用到知识点问题的解决过程中。④注重理论与实践教学的有机结合,一是在原理、算法、过程的讲授之后紧接着讲授实现的函数,以及函数参数的变化如何体现在相应的原理、算法、过程中。二是所设计的实践过程体现了单元知识和整体知识。

实践教学环节包括两部分:一是体现为单元知识的编程练习,以验证理论知识为主,如画线、画圆算法、线段裁剪算法、光照模型实现等。二是为期一周的课程设计,是在理论知识和单元编程练习基础上对图形系统开发能力的提升。以GLUT库和Win32 OpenGL控制台程序框架为平台,综合使用内置几何体、显示列表、动画、场景漫游、光照模型、纹理贴图、键盘鼠标交互、菜单等技术综合完成一个集多种技术于一体的作品。掌握每种技术开发框架和图形系统开发思维过程成为本环节培养学生的主要目的。后者是学生收获很大的教学环节,不但使学生将理论与实践紧密结合起来,而且锻炼了学生图形系统设计、开发的能力。每个学生均可按照要求综合运用3种以上技术完成完整图形系统的开发,其中部分学生能够综合运用多种技术开发出主题健康、场景画面优美、功能多样的图形系统。此环节学生获得感最强。

为了对图形计算思维教学效果进行评价,设计了教学效果调查表,并对连续两个年级的学生进行了调查。调查表主要针对图形计算思维是什么、主要的方法有哪些、学生掌握的程度和学生还有哪些建议设置了调查问题。调查结果表明:学生建立了图形计算思维的概念,对主要的思维方法有所了解,能够有意识地使用计算思维去解决类似软件系统设计的问题,但对整体方法掌握有限。

五、总结

本文结合笔者多年的教学经验,提出了图形计算思维的概念,并对图形计算思维如何在计算机图形学教学体系中设计和组织进行了探索,总结了3层次图形计算思维模式及主要方法,并对其在教学实践中的运用进行了研究。实践表明,在教学过程中实施图形计算思维教学,在理论课和实践开发上均会极大地提升教学质量和效果。但系统性地总结和整理图形计算思维方法,如何更为有效地将其落实到教学工作中,如何将其扩展到其它课程的教学过程中,仍有很多研究工作需要开展。

参考文献:

[1]WING J M.Computational thinking[J].Communications of the Acm,2006(3):33-35.

[2]史文崇.全球计算思维研究与实践综述[J].计算机工程与应用,2018(4):31-35,71.

[3]周虹,傅向华,王志强.基于计算思维的计算机图形学教学改革[J].计算机教育,2013(5):55-58.

[4]李谷伟.基于计算思维的计算机图形学教学改革探讨[J].科技资讯,2014(14):152.

[5]方佳诚.中、美、英三国信息技术学科能力比较研究[J].中国教育信息化,2017(21):1-5.

[6]王勇刚.以计算思维为核心的程序设计入门类课程教学研究[J].中国教育信息化,2018(14):30-34.

[7]唐培和,秦福利,王宇等.加强计算思维教育 提升创新创业能力[J].中国高等教育,2018(8):47-48.

[8]战德臣,王浩.面向计算思维的大学计算机课程教学内容体系[J].中国大学教学,2014(7): 59-66.

(编辑:王天鹏)

作者:吴学毅 潘向辉

第2篇:计算机图形学与图形图像处理技术研究

摘要:随着我国计算机信息技术的不断革新延展,涉及图形图像处理技术开始引起社会各界广泛关注。在此类背景影响下,笔者决定针对计算机图形学主流研究方向、发展背景、系统机理结构、日后应用领域等内容,加以细致化验证解析。希望经过上述图形学、图形处理技术内容的重新诠释过后,能够更好地调整相关技术操作人员专业技能和职业道德素质,为今后我国图形图形处理工艺可持续发展,奠定基础。

关键词:计算机;图形图像;处理技术;革新改造

Key words: computer; graphic image; processing technology; innovation and transformation

这里广泛强调的计算机图形学,实质上就是利用计算机系统进行图像图形一切内涵信息精确化表达的学科内容,可以顺势细化为图形表达、图像处理、生成显示等工序流程。随着我国现代信息技术的不断升级调试,该类学科活跃性大幅度提升,已经在我国各类领域之中得到大力推广沿用。

1 计算机图形图像处理的基础性内涵机理论述

所谓的计算机图形图像处理技术,就是主张利用概念和数学描述方式,进行特定物体几何数据和模型描述,在计算机系统之中加以显示、修改、储存完善。其核心内容可以细化为:

第一,几何变换,包括平移、缩放、透视和投影等工序环节。

第二,即图形数字化编码、增强、复原、分割和分析事务。

第三,则是曲线和曲面拟合。

第四,建模和造型改良设计。

第五,隐线、隐面的适当消除。

第六,明暗和贴图纹理调试。

第七,色彩包装修饰。

归结来讲,图形图像处理技术,长期渗透于计算机辅助设计CAD、制造CAM、教育CAI,以及虚拟现实等操作空间之中,并且当中CAD的应用最为广泛。

2 计算机图像学涉猎的主流工作内容研究

计算机图像学研究内容着实广泛,包括图形硬件、标准、交互式操作技术、曲线曲面建模、真实感图形显示计算方式、虚拟现实等结构单元。其核心动机,在于借助计算机系统将真实感图像灵活表达。因此,相关技术人员必须尽快搭建起图形描述场景几何表示体系,配合光照模型,进行假想光源、纹理结构、材质属性等层面的光照效果计算演练。另外,图像学还能够灵活呈现特殊几何场景曲线曲面和实体造型,全程利用数字图像模式加以支撑引导。总体来讲,计算机图像学和图像处理之间,保留着深刻的关联特性。

3 计算机图像学的主流应用领域解析

3.1 计算机辅助设计和制造活动方面

如今计算机图形学已经成功地应用到建筑室内施工、机械产品制造等领域,如动车、发电厂、模具厂的功能调试等事务,而CAD和CAM便是在现代工业界中最为常见的计算机图形操作程序。而在电子工业设计项目中,计算机图形学也成功地过渡转接到集成电路、电力线路网络分析等细务之上,当中呈现的优势地位也都有目共睹。单纯拿CAD程序为例,其主要应用在现代建筑工程图纸三维形体建模工序之中,主张透过一系列二维信息之中,进行三维信息提取、划分和综合化处理,进一步在立体空间内搭建起对应的形态架构,令当中一切点、线、面的交互式拓扑关系得以重整,最终贯彻所需形体的重建任务指标。

3.2 计算机图形处理的用户接口供应方面

维护控制一类图形化用户界面的优质性,第一要务便是集中一切技术手段进行图形操作软件易用性调节。事实上,自从Apple企业成功推广全新图形操作系统过后,尤其是在Windows各项应用辅助范畴之下,图形学知识开始全面灌输到计算机操作的各项事务之中。

3.3 地形地貌和自然资源模拟演示方面

计算机图形处理技术,能够将代表国家经济系统的一切国土基础信息搜集重整,进一步衍生出生动形态的平面、三维地形地貌演示图,确保至此过后,高层国土整治机构能够作出更加科学的预测和决策,真正为国土资源多元化开发利用,提供较为精准的指导线索。

3.4 计算机动画和其余艺术作品创作方面

随着我国计算机信息技术大力革新和推广布置,能够成功地在艺术创意领域中发挥指导作用的软件,几乎不胜枚举,包括二维平面的Photo Shop,三维动画建模和宣传调试程序3D MAX等,如今都已经在艺术创作和产业之中渗透交接,对于我民族文化推广和动画产业长期协调运营,都将产生极强的支撑辅助效用。

4 计算机图形、图像操作应用技术的诸多差异和关联细节探讨

首先,数据来源渠道不同。图像数据大多数情况下源自于客观世界,而图形处理数据则倾向于主观世界。

其次,处理工艺形式不同。图像处理工艺可细化为几何结构修正、图像形式变换、图像分割、图像内涵解析、图像类型识别等。相比之下,图形调试手段则包含几何变换、开窗裁剪、隐藏面消除、明暗纹理加工等。

最后,理论基础和应用价值不同。图像处理技术全程配合高端数字信号、模糊数学理论等,进行遥感、医学、军事等领域图像综合化调试。而计算机图形处理则深度联合样条、计算几何和分形理论,进行CAD计算机模拟调试和动画艺术作品创作。

而在诸多计算机图形、图像应用环节之中,两类操作技术交互式关联特性便不断呈现,如若技术人员能够及时结合外国先进操作理念和自身实践经验,进行图形、图像诸多控制优势融合,便能够在较短时间范围内令设计成品视觉效果和质量等,趋近完善形态。事实上,经过图形图形技术综合化发展步伐的逐渐加快,关于两类工艺技术交互式渗透环节中的界限也变得模糊起来。至于两者之间的联系和转换流程则具体如下图所示:

由上图观察验证得知,图形学的逆向运作过程,主要是进行输入图像三维数据模型提取,包括机器视觉和写体识别等。至于模型变换,则主张联合计算机辅助几何设计软件,进行各类几何形体数学模型灵活便利地创建,顺势提升内部算法自动化运作效率,辅助技术人员全面研究认证曲线、曲面的表示、生成、拼接拟合手法,最终在计算机系统之内更好地存储和管理特定模型结构。

5 结语

综上所述,计算机图形和图像处理技术如今已经得到全面革新发展,并且逐渐渗透到人民学习、工作、生活,以及企业产业领域之中。相关技术人员有必要不断提升相关软件程序熟练操作技能,尽量将各类数据内容灵活存储和改造沿用,相信长此以往,必将为我国计算机图形图像学和社会主义经济建设事业系统化发展,提供较为稳固的过渡支撑桥梁。

参考文献:

[1] 柳海兰.浅谈计算机图形学的发展及应用[J].电脑知识与技术,2010,35(33):166-171.

[2] 田亮.浅析计算机图形学的应用及其发展[J].民营科技,2011,13(12):120-166.

[3] 温玉春.计算机图像处理技术应用研究[J].现代商贸工业,2011,11(2):88-95.

作者:陈耿

第3篇:计算机图形学与图形图像处理技术分析

摘要:计算机技术的普及与发展带动了全社会的进步,现代社会活动中几乎所有领域都在使用计算机技术,该技术为企业节约了大量的生产成本,提高了工作效率,改变了人们的生活方式。计算机图形学和图形图像技术在人们工作中的使用日益频繁,凸显了现代科学应用领域对该技术研究的重要性,本文就计算机图形学与图形图像处理技术从定义、区别和联系以及具体应用几方面展开论述,期望该技术能够为人们的工作和生活提供更大便利。

关键词:计算机图形学;图形图像处理;技术

1概述

1.1概念

计算机图像处理是指利用计算机技术,来对图像进行一定的加工和分析,以获取最终的目标图像及结果。

目前该项处理技术在应用中,主要经过两个基本过程。第一,转化要研究的图像,把它变成通过计算机能够清晰辨别的数据,这样把图像存放在计算机中;第二,在将电脑中的图像做出相关处理与转化时,将采用不同形式的计算方法进行处理。

1.2图像的分类

根据图像能否在计算机上处理,将图像的种类进行了以下归类:

第一类,数字化图像。由于科技的迅猛发展,图像已经逐渐走向数字化。同时,数字化图像具有与生俱来的优势,例如处理方法便捷、精准度高等,满足了现代化国家的需求。

第二类,模拟图像。在现代生活中,模拟图像到处可以看到,比如胶片照相机相片、光学图像等,这些都是模拟图像。模拟图像一般在输出时较方便快捷,但是也有不是很灵活、精密度不够的缺陷。

2计算机图形与图像技术的区别与联系

计算机图形处理技术与图像处理技术是两种技术,两种技术密不可分,两者的有机融合才能将图像和图像处理更加符合客户需求,两者的转换和联系如图1所示,但两者也有若干区别:

(1)理论基础不同。计算机图形学的理论基础是计算几何、分型、透视、变换、仿射理论、分形理论等,而计算机图像处理技术的理论基础是统计学、模糊数学、数字信号、数据信息处理理论等。

(2)数据信息来源不同。图形由设计而来,因此其信息源自设计人员的主观世界,而图像信息存在与客观环境中。

(3)处理方式不同。图形处理的方式有几何转换、曲线拟合、图形裁剪、纹理产生、明暗处理等,图像的处理方式为识别、修订和信息强化,二者解决的设计需求不同,处理方式必然存在差异。

(4)用途不同。计算机图形处理技术主要用于计算机模拟、动画模拟、CAD 等设计相关的领域,计算机图像处理技术多数用于航空、医学以及制造领域。

3计算机图像处理技术的应用

随着计算机图像处理技术的不断完善升级,它所应用的范围也日渐多面化。比如,在很多方面都采用了计算机图像处理技术,如在医学卫生、农业、气象等领域,接下来分别分析计算机图像处理技术在不同领域的应用情况:

3.1工业领域

现代工业化进程不断推进,工业加工领域更趋智能化、无人化。这一种种的进步很大程度上决定于计算机技术的发展。比如计算机图像处理技术能够很好地运用在现代工业,在不同工业细分领域普及应用,带动更大的社会效益。如当代的工业流水线的辨别系统,能够在计算机上实时进行图像处理,这样能够精确掌控其流水线,从而实现自动化生产。

3.2 农业方面

计算机的图像处理技术在农业方面的应用,大大推进了我国农业现代化进行,已经取得良好成效。通过计算机图像处理技术,实现了农作物在机械方面的全自主化的运作,其在极大水平上提升了农作物的加工效益,进一步节约人力资源,使更多的劳动力涌入城镇,推进城镇化建设。比如已经开发成型的蘑菇自动化采摘系统,这项技术在生态农业中得到了广泛的应用。该项技术主要是利用计算机图像处理方法,来操控机器人实施蘑菇采摘的自动化。在进行机械自主化的发展中,在提高蘑菇采摘的质量的同时也有效地提高了蘑菇采摘的效率。

3.3纺织业

计算机图像处理技术在纺织业应用中,主要体现在对原材料深度处理及解析,对样品进行多层面的评估,以至于在极大水平上降低人为处理时的误判。计算机图像处理技术运用在纺织业上,能够很好地改变纺织业在传统中的管理模式和方法。如图1所示。

3.4交通领域

现阶段各个一线城市道路交通拥堵已成为常态如何获得安全的道路交通就成为众多城市管理者所面临的难题。为了解决这个难题,一般是以现代化科技作为其手段,进行系统化管理,其中最常用的就是城市交通摄像监控系统。具体是指在車辆经过十字路口时,当遇到红灯时,如车辆没有停下来或者其他一些违规现象发生后,摄像头就会进行记录,然后把它传输到计算机后台,进行保存。不管是自动识别还是分类保存,在上述过程中均需要采用先进的计算机图像处理技术。因此,该技术广泛应用在交通领域内,既有利于记录交通违法违章行为,又有利于搭建城市交通安全网络。

4结语

计算机技术的应用方便了人们的生活与工作,计算机图形和图像技术的应用改善了制造业、传媒业、动画业等产业的设计流程和效益,实现了完美的感官效果,激发了设计人员的潜在创作灵感,满足了人们对真实高清的可视化图形图像的需要。今后的发展中学科建设和技术应用领域要致力于计算机图形图像处理技术的优化和创新,不断推进知识转化为生产力的步伐。

参考文献:

[1]张艳华.计算机图形图像处理的关键技术[J].电子技术与软件工程 ,2017,(03):87-88.

[2]侯培文.:计算机图形学与图形图像处理技术[J].电子技术与软件工程 ,2016,(22):84.

(作者单位:沈阳星之火软件有限公司)

作者:王玉娟

第4篇:计算机图形学课程设计 图形绘制变换分解

计算机图形学 实验报告

课程名称 : 计算机图形学 实验名称 : 图形绘制与变换 学 院 : 电子信息工程学院 专 业 : 计算机科学与技术 班 级 : 11计科本 01班 学 号 : 111102020103 姓 名 : 张慧 指导教师 : 王征风

二零一四年

目录

一、引言 ---------------- 3

二、设计需求 --------- 3

2.1 设计目标 -- 3 2.2 设计环境 -- 3

2.2.1 VC++6.0 ------------------------ 3 2.2.2 MFC ------------------------------ 4 2.3 设计题目及要求 ---------------------- 4 2.4 总体流程图 ---------------------------- 4

三、课程设计原理 --- 5

3.1 实现的算法 ------------------------------ 5

3.1.2 Bresenham算法画直线 ------ 5 3.1.3 中心点算法画圆和椭圆 ------ 5 3.2 图形变换的基本原理 ------------------ 7

3.2.1 平移变换 ------------------------ 7 3.2.2 旋转变换 ---------------------- 8 3.2.3 比例变换 ---------------------- 8

四、总体设计与功能实现 ------------------------- 8

4.1 主要界面设计 --------------------------- 8 4.2 设置颜色界面 --------------------------- 8

4.2.1 界面设置代码 ------------------ 8 4.2.2 运行结果 ------------------------ 9 4.3 二维线画图元实现 --------------------- 9 4.4 画多边形功能的实现 -------------- 13 4.5 画Bezier曲线功能的实现 ------- 14 4.6 二维图形变换的实现 -------------- 16 4.7 三维图形的变换 -------------------- 17

五、实验心得体会

一、引言

计算机图形学(Computer Graphics,简称CG)是一种使用数学算法将二维或三维图形转化为计算机显示器的栅格形式的科学。简单地说,计算机图形学的主要研究内容就是研究如何在计算机中表示图形、以及利用计算机进行图形的计算、处理和显示的相关原理与算法。是计算机科学的一个分支领域,主要关注数字合成与操作视觉的图形内容。计算机图形学研究的是应用计算机产生图像的所有工作,不管图像是静态的还是动态的,可交互的还是固定的,等等。图形API是允许程序员开发包含交互式计算机图形操作的应用而不需要关注图形操作细节或任务系统细节的工具集。计算机图形学有着广泛的应用领域,包括物理、航天、电影、电视、游戏、艺术、广告、通信、天气预报等几乎所有领域都用到了计算机图形学的知识,这些领域通过计算机图形学将几何模型生成图像,将问题可视化从而为各领域更好的服务。

计算机图形学利用计算机产生让人赏心悦目的视觉效果,必须建立描述图形的几何模型还有光照模型,再加上视角、颜色、纹理等属性,再经过模型变换、视图变换、投影操作等,这些步骤从而实现一个完整的OpenGL程序效果。OpenGL是一个开放的三维图形软件包,它独立于窗口系统和操作系统,以它为基础开发的应用程序可以十分方便地在各种平台间移植。计算机图形学通过应用OpenGL的功能,使得生成的图形效果具有高度真实感。学习计算机图形学的重点是掌握OpenGL在图形学程序中的使用方法。 事实上,图形学也把可以表示几何场景的曲线曲面造型技术和实体造型技术作为其主要的研究内容。同时,真实感图形计算的结果是以数字图像的方式提供的,计算机图形学也就和图像处理有着密切的关系。

通过21世纪是信息的时代,在日新月异的科技更新中相信计算机会发挥越来越重要的作用,计算机图形学也会在更多的领域所应用,虽然我国在这方面还比较薄弱,但相信会有越来越好的时候的。

二、设计需求

2.1 设计目标

以图形学算法为目标,深入研究。继而策划、设计并实现一个能够表现计算机图形学算法原理的或完整过程的演示系统,并能从某些方面作出评价和改进意见。通过完成一个完整程序,经历策划、设计、开发、测试、总结和验收各阶段,达到:巩固和实践计算机图形学课程中的理论和算法;学习表现计算机图形学算法的技巧;培养认真学习、积极探索的精神。

2.2 设计环境

2.2.1 VC++6.0 VC++6.0是 Microsoft 公司推出的一个基于 Windows 系统平台、可视化的 集成开发环境,它的源程序按 C++语言的要求编写,并加入了微软提供的功能 强大的 MFC(Microsoft Foundation Class)类库。MFC 中封装了大部分 Windows API 函数和 Windows 控件,它包含的功能涉及到整个 Windows 操作系统。MFC 不仅给用户提供了 Windows 图形环境下应用程序的框架, 而且还提供了创建应 用程序的组件,这样,开发人员不必从头设计创建和管理一个标准 Windows 应 用程序所需的程序,而是从一个比较高的起点编程,故节省了大量的时间。另 外,它提供了大量的代码,指导用户编程时实现某些技术和功能。因此,使用VC++提供的

3 高度可视化的应用程序开发工具和 MFC 类库,可使应用程序开发变 得简单。 2.2.2 MFC MFC(Microsoft Foundation Classes) ,是 一 个 微 软 公 司 提 供 的 类 库 ( class libraries)以 C++类的形式封装了 Windows 的 API, , 它包含了窗口等许多类的定义。各种类的集合构成了一个应运程序的框架结构,以减少应用程序开发人员的工作 量。其中包含的类包含大量 Windows 句柄封装类和很多 Windows 的内建控件和组 件的封装类。MFC 6.0 版本封装了大约 200 个类,其中的一些可以被用户直接使用。例如CWnd 类封装了窗口的功能,包括打印文本、绘制图形及跟踪鼠标指针的移动等;CsplitterWnd 类是从 CWnd 类派生出来的,继承了基类或称父类 CWnd 类的所 有特 性,但增加了自己的功能,实现拆分窗口,使窗口至少可被拆分成两个窗口,用户 可以移动两个窗口之间的边框来改变窗口的大小;CtoolBar 类可以定义工具栏等。MFC 命名的惯例是类的名字通常是由“C”打头;成员变量使用前缀“m_”,接着使用一个字母来指明数据类型,然后是变量的名称;所有的单词用大写字母开头。

2.3 设计题目及要求

(1)题目:实现多边形和曲线的绘制和变换

(2)要求:学会使用VC++编写实现图形的绘制变换,需包括直线、曲线、多边形的绘制和变换,及三维立体图形的相应变换. 2.4 总体流程图

三、课程设计原理

3.1 实现的算法

3.1.1 DDA算法画直线

DDA是数字微分分析式(Digital Differential Analyzer)的缩写。

已知直线两端点(x1,y1)、(x2,y2)则斜率m为:m = (y2-y1)/(x2-x1)= Dx/Dy;直线中的每一点坐标都可以由前一点坐标变化一个增量(Dx, Dy)而得到,即表示为递归式: xi+1=xi+Dx yi+1=yi+Dy 。

递归式的初值为直线的起点(x1, y1),这样,就可以用加法来生成一条直线。具体算法是: 该算法适合所有象限,其中用了用了两个函数如:Integer(-8.5)= -9; Integer(8.5) =8;Sign(i),根据i的正负,分别得到-1,0,+1; 相应代码:

//DDA DrawLine

{if(abs(x2-x1) > abs(y2-y1))

length = abs(x2-x1);

else

length = abs(y2-y1);

Dx = (x2-x1)/length;

Dy = (y2-y1)/length;

x = x1+0.5*Sign(Dx);

y = x2 + 0.5*Sign(Dy);

i = 1;

while(i <= lenght)

{ setpixel(Integer(x),Integer(y),color);

x= x + Dx;

y= y + Dy;

i+=1;} } 3.1.2 Bresenham算法画直线

思路如下: // 假设该线段位于第一象限内且斜率大于0小于1,设起点为(x1,y1),终点为(x2,y2). // 根据对称性,可推导至全象限内的线段. 1.画起点(x1,y1).2.准备画下个点。x坐标增1,判断如果达到终点,则完成。否则,由图中可知,下个要画的点要么为当前点的右邻接点,要么是当前点的右上邻接点.如果线段ax+by+c=0与x=x1+1的交点的y坐标大于M点的y坐标的话,下个点为U(x1+1,y1+1),否则,下个点为B(x1+1,y1),3.画点(U或者B).4.跳回第2步.5.结束. 3.1.3中心点算法画圆和椭圆

(1)中心点算法画圆

在一个方向上取单位间隔,在另一个方向的取值由两种可能取值的中点离圆的远近而定。实际处理中,用决策变量的符号来确定象素点的选择,因此算法效率较高。生成圆弧的中点算

5 法和上面讲到的生成直线段的中点算法类似。

考虑第一象限内x[0,R/2]的八分之一圆弧段。经过计算,得出判别式的递推公式为:

di1di2xi3di2(xiyi)5d0d0

(xi, M SE yi,r) E 这两个递推公式的初值条件为:

(x0,y0,r)(0,R)d05/4R

编写成员函数如下:

void CMy2_9View::MidPointEllipse(CDC *pDC, double a, double b, int color) { double x,y,d,xP,yP,squarea,squareb;

squarea=a*a;

squareb=b*b;

xP=(int)(0.5+(double)squarea/sqrt((double)(squarea+squareb)));

yP=(int)(0.5+(double)squareb/sqrt((double)(squarea+squareb)));

x=0;

y=b;

d=4*(squareb-squarea*b)+squarea;

pDC->SetPixel(x,y,color);

while(x<=xP)

{if(d<=0) d+=4*squareb*(2*x+3);

else

{d+=4*squareb*(2*x+3)-8*squarea*(y-1);

y--;}

x++;

pDC->SetPixel(x,y,color);}

x=a;

y=0;

d=4*(squarea-a*squareb)+squareb;

pDC->SetPixel(x,y,color) ;

while(y

{ if(d<=0) d+=4*squarea*(2*y+3);

else

{d+=4*squarea*(2*y+3)-8*squareb*(x-1);

x--; }

y++;

pDC->SetPixel(x,y,color);}} 编写OnDraw函数如下:

void CMy2_9View::OnDraw(CDC* pDC) {CMy2_9Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc);

6 MidPointEllipse(pDC,500,300,RGB(0,0,0));} (2)中心点算法画椭圆

我们先考虑圆心在原点的椭圆的生成,对于中心不是原点的椭圆,可以通过坐标的平移变换获得相应位置的椭圆。中心在原点。焦点在坐标轴上的标准椭圆具有X轴对称、Y轴对称和原点对称特性,已知椭圆上第一象限的P点坐标是(x, y),则椭圆在另外三个象限的对称点分别是(x, -y)、(-x, y)和(-x, -y)。因此,只要画出第一象限的四分之一椭圆,就可以利用这三个对称性得到整个椭圆。

相应代码:

void MP_Ellipse(int xc , int yc , int a, int b) { double sqa = a * a; double sqb = b * b; double d = sqb + sqa * (-b + 0.25); int x = 0; int y = b; EllipsePlot(xc, yc, x, y); while( sqb * (x + 1) < sqa * (y1)) * 2 - (a * b) * 2; while(y > 0) {if (d < 0) { d += sqb * (2 * x + 2) + sqa * (-2 * y + 3); x++; } else

{d += sqa * (-2 * y + 3); } y--; EllipsePlot(xc, yc, x, y);}} 3.2 图形变换的基本原理

3.2.1 平移变换

平移变换函数如下:

void glTranslate{fd}(TYPE x, TYPE y, TYPE z); 三个函数参数就是目标分别沿三个轴向平移的偏移量。这个函数表示用于这三个偏移量生成的矩阵乘以当前矩阵。当参数是(0.0,0.0,0.0)时,表示对函数glTranslate*()的操作是单位矩阵,也就是对物体没有影响。

7 3.2.2 旋转变换

旋转变换函数如下:

Void glRota{fd}TYPE angle, TYPE x, TYPE y, TYPE z);

函数中第一个参数是表示目标沿从点(x,y,z)到原点方向逆时针旋转的角度,后三个参数是旋转的方向点坐标。这个函数表示用这四个参数生成的矩阵乘以当前矩阵。当角度参数是0.0时,表示对物体没有影响。 3.2.3 比例变换

比例变换函数如下:

Void glScale{fd}(TYPE x, TYPE y, TYPE z);

单个函数参数值就是目标分别沿三个轴方向缩放的比例因子。这个函数表示用这三个比例因子生成的矩阵乘以当前矩阵。这个函数能完成沿相应的轴对目标进行拉伸、压缩和反射三项功能。以参数x为例,若当x大于1.0时,表示沿x方向拉伸目标;若x小于1.0,表示沿x轴方向收缩目标;若x=-1.0表示沿x轴反射目标。其中参数为负值时表示对目标进行相应轴的反射变换。

四、总体设计与功能实现

4.1 主要界面设计

4.2 设置颜色界面

4.2.1 界面设置代码:

void CGraphicsView::OnClock() { WHAT_TO_DO=ID_CLOCK;

clean(); int xx = 450, yy = 300, r = 150,d = 5; int i, white = RGB (255,255,255); mile (xx, yy, r, COLOR); Matrix m (xx, 240), s (xx, 200); Matrix t1 (xx, yy, true), t2 (-xx, -yy, true), mr ( PI/1800 ), sr ( PI/30 ); mile (m.getx (), m.gety (), d+1, COLOR); mile (s.getx (), s.gety (), d, COLOR); dne ( m.getx (), m.gety (), xx, yy, COLOR ); dne ( s.getx (), s.gety (), xx, yy, COLOR );

for (i=0;i<120;i++){

::Sleep (80);

mile (m.getx (), m.gety (), d+1, white); mile (s.getx (), s.gety (), d, white); dne ( m.getx (), m.gety (), xx, yy, white ); dne ( s.getx (), s.gety (), xx, yy, white ); m = t1*mr*t2*m; s = t1*sr*t2*s; mile (m.getx (), m.gety (), d+1, COLOR); mile (s.getx (), s.gety (),d, COLOR); dne ( m.getx (), m.gety (), xx, yy, COLOR ); dne ( s.getx (), s.gety (), xx, yy, COLOR );}} 4.2.2 点击“设置--颜色”后,运行结果如下:

4.3 二维线画图元实现

4.3.1 实现代码:

void CGraphicsView::MidCir(CDC *pdc, int x0, int y0, int x1, int y1, int color) { int r,x,y,deltax,deltay,d; r=sqrt(((double)x1-(double)x0)*((double)x1-(double)x0)+((double)y1-(double)y0)*((double)y1-(double)y0)); x=0; y=r; deltax=3; deltay=2-r-r; d=1-r; while(x<=y) { ::Sleep(time);

pdc->SetPixel(x+x0,y+y0,color);

::Sleep(time);

pdc->SetPixel(-x+x0,y+y0,color);

::Sleep(time);

pdc->SetPixel(x+x0,-y+y0,color);

::Sleep(time);

pdc->SetPixel(-x+x0,-y+y0,color);

::Sleep(time);

pdc->SetPixel(y+x0,x+y0,color);

::Sleep(time);

pdc->SetPixel(-y+x0,x+y0,color);

::Sleep(time);

pdc->SetPixel(y+x0,-x+y0,color);

::Sleep(time);

pdc->SetPixel(-y+x0,-x+y0,color);

if(d<0)

{ d+=deltax;

deltax+=2;

x++;}

else

{ d+=deltax+deltay;

deltax+=2;

deltay+=2;

x++;

y--; }}} void CGraphicsView::midellispse(int xx, int yy, int r1, int r2, int color) { } void CGraphicsView::Ellipse(CDC *pdc, int x1, int y1, int x2, int y2, int color) {

xx0=(x2+x1)/2; yy0=(y2+y1)/2; rra=abs(x2-x1)/2; rrb=abs(y2-y1)/2; if(rra==0 && rrb==0) return; Ellipse0(pdc,xx0,yy0,rra,rrb,color);} void CGraphicsView::Ellipse0(CDC *pdc, int x0, int y0, int a, int b, int color) {

int i,yy; int x,y,deltax,deltay; int aa,aa2,aa3,bb,bb2,bb3; double d1,d2; aa=a*a; aa2=aa*2; aa3=aa*3; bb=b*b; bb2=bb*2; bb3=bb*3; x=0; y=b; d1=bb+aa*(-b+0.25); deltax=bb3;

10 deltay=-aa2*b+aa2; pdc->SetPixelV(x+x0,y+y0,color); pdc->SetPixelV(x+x0,-y+y0,color); while(bb*(x+1)

yy=y;

if(d1<0)

{ d1+=deltax;

deltax+=bb2;

x++;}

else

{

d1+=deltax+deltay;

deltax+=bb2;

deltay+=aa2;

x++;

y--;}

::Sleep(time);

pdc->SetPixelV(x+x0,y+y0,color);

::Sleep(time);

pdc->SetPixelV(-x+x0,y+y0,color);

::Sleep(time);

pdc->SetPixelV(x+x0,-y+y0,color);

::Sleep(time);

pdc->SetPixelV(-x+x0,-y+y0,color);} d2=bb*(x+0.5)*(x+0.5)+aa*(y-1)*(y-1)-aa*bb; deltax-=bb; deltay+=aa; while(y>0) { if(d2<0)

{ d2+=deltax+deltay;

deltax+=bb2;

deltay+=aa2;

x++;

y--; }

else

{ d2+=deltay;

deltay+=aa2;

y--; }

::Sleep(time);

pdc->SetPixelV(x+x0,y+y0,color);

::Sleep(time);

pdc->SetPixelV(-x+x0,y+y0,color);

::Sleep(time);

pdc->SetPixelV(x+x0,-y+y0,color);

::Sleep(time);

pdc->SetPixelV(-x+x0,-y+y0,color); }} void CGraphicsView::DDALine(CDC *pdc, int x0, int y0, int x1, int y1, int color) { int xx,yy,s,s1,s2,di; float dx,dy,k,x,y; dx=x1-x0; if(dx>=0)

s1=1; else

s1=-1; dy=y1-y0; if(dy>=0)

s2=1; else s2=-1; dx=abs(dx); dy=abs(dy); if(dx>=dy) {

s=0;

di=(int)dx;

k=dy/dx*s2;} else { s=1;

di=(int)dy;

k=dx/dy*s1;} x=x0; y=y0; for(int i=0;i<=di;i++) {if(s==0)

{

xx=(int)x;

yy=(int)(y+0.5);

::Sleep(time);

pdc->SetPixel(xx,yy,color);

x+=s1;

y+=k;}

else{

xx=(int)(x+0.5);

yy=(int)y;

::Sleep(time);

pdc->SetPixel(xx,yy,color);

y+=s2;

x+=k;}}}

12 4.3.2 点击二维线画图元,课相应画出直线、圆和椭圆,结果如下:

4.4 画多边形功能的实现

4.4.1 部分实现代码:

void CGraphicsView::OnDrawDuoBX() { Vertex_Count dlg; if(dlg.DoModal()==IDOK) { if(dlg.m_vertex_count>MAX)

{ MessageBox("输入顶点数过大");

return; }

VertexTotal=dlg.m_vertex_count;

CDC *pDC=GetDC();

CPen pen(PS_SOLID,2,RGB(255,255,255));

CPen *pOldpen=pDC->SelectObject(&pen);

pDC->MoveTo((int)(inVertexArray[0].x+0.5),(int)(inVertexArray[0].y+0.5));

int i;

for(i=1;i

pDC->LineTo((int)(inVertexArray[i].x+0.5),(int)(inVertexArray[i].y+0.5));

pDC->LineTo((int)(inVertexArray[0].x+0.5),(int)(inVertexArray[0].y+0.5));

pDC->SelectObject(pOldpen);

ReleaseDC(pDC);

inLength=0;

outLength=0;

WHAT_TO_DO=ID_DrawDuoBX;}}

4.4.2 点击多边形,输入定点个数,可绘制出相应的多边形,结果如下:

4.5 画Bezier曲线功能的实现

4.5.1 部分实现代码:

void CGraphicsView::OnBezier() { // TODO: Add your command handler code here WHAT_TO_DO=ID_BEZIER; CDC *p=GetDC ();

p->TextOut (10, 20, "PS:鼠标左键添加曲线,鼠标右键修改曲线.");

ReleaseDC (p);} void CGraphicsView::OnBezierClear() { n = -1; RedrawWindow();} void CGraphicsView::DrawBezier(DPOINT *p) { if (n <= 0) return; if((p[n].x < p[0].x+1) && (p[n].x > p[0].x-1) && (p[n].y < p[0].y+1) && (p[n].y > p[0].y-1)) { pDC->SetPixel(p[0].x, p[0].y, COLOR);

return; } DPOINT *p1; p1 = new DPOINT[n+1]; int i, j; p1[0] = p[0]; for(i=1; i<=n; i++) { for(j=0; j<=n-i;j++)

{ p[j].x = (p[j].x + p[j+1].x)/2;

p[j].y = (p[j].y + p[j+1].y)/2; }

p1[i] = p[0];} DrawBezier(p); DrawBezier(p1); delete p1; } void CGraphicsView::OnBezierAdd() { AddorMove = 1; } void CGraphicsView::OnBezierMove() { AddorMove = -1;} void CGraphicsView::OnMouseMove(UINT nFlags, CPoint point) { switch(WHAT_TO_DO) { case ID_BEZIER:

{ if(current >= 0 )

14 { points[current].x = point.x;

points[current].y = point.y;

RedrawWindow();} if(current2 >= 0 )

{ points[current2].x = point.x;

points[current2].y = point.y;

RedrawWindow();}

break; } default:break;} CView::OnMouseMove(nFlags, point);} 4.5.2 点击曲线--Beizer曲线,可实现Beizer曲线的绘制功能,绘制结果如下图:

图 1 图 2

4.5.3 点击曲线--Beizer曲线,可实现Beizer曲线的移动,鼠标点击其中的任一点,可实现曲线的移动,绘制结果如下图:

上图1移动后的曲线

上图2移动后的曲线

15 4.6 二维图形变换的实现

可以实现一椭圆在界面上的随机移动,一圆在界面上饶某一点的旋转和一正方形由大变小在变大的变化,部分实现代码如下: void CGraphicsView::OnXuanzhuan() { WHAT_TO_DO=ID_XUANZHUAN;

time=0;

OnClear();

CClientDC dc(this); CDC* pDC=&dc;

int i, white=RGB(255,255,255), point [2][2]={{300,200},{300,250}};

Matrix a (point[0][0],point[0][1]), b (point[1][0],point[1][1]);

int midx=(point[0][0]+point[1][0])/2,midy=(point[0][1]+point[1][1])/2;

Matrix t1 (midx, midy,true), t2 (-midx, -midy,true);

Matrix r (PI/50);

Matrix temp (midx, midy,true);

temp = t1*r*t2;

for(i=0;i<200;i++){

::Sleep(50);

MidCir(pDC, a.getx(), a.gety(), b.getx(), b.gety(), white);

a = temp*a;

b = temp*b;

MidCir(pDC, a.getx(), a.gety(), b.getx(), b.gety(), COLOR); }

for(i=0;i<200;i++){

::Sleep(50);

MidCir ( pDC,a.getx(), a.gety(), b.getx(), b.gety(), white);

a = temp*a;

b = temp*b;

MidCir (pDC, a.getx(), a.gety(), b.getx(), b.gety(), COLOR); }

time=5;} void CGraphicsView::OnUpdateXuanzhuan(CCmdUI* pCmdUI) { pCmdUI->SetCheck(WHAT_TO_DO==ID_XUANZHUAN);} void CGraphicsView::OnScale() { WHAT_TO_DO=ID_SCALE;

OnClear(); CClientDC dc(this); CDC* pDC=&dc;

time=0; int i,white=RGB(255,255,255), point[4][2]={{300,250},{400,250},{300,300},{400,300}}; float sx=0.9,sy=0.85; int midx=(point[0][0]+point[3][0])/2,midy=(point[0][1]+point[3][1])/2; Matrix s1 (sx,sy),s2 (1/sx,1/sy); Matrix t1 (midx, midy,true), t2 (-midx, -midy,true);

Matrix a (point[0][0],point[0][1]), b (point[1][0],point[1][1]); Matrix c (point[2][0],point[2][1]), d (point[3][0],point[3][1]);

16 Matrix temp (midx, midy,true); temp = t1*s1*t2; DDALine (pDC,a.getx(),a.gety(),b.getx(),b.gety(),COLOR); DDALine (pDC,a.getx(),a.gety(),c.getx(),c.gety(),COLOR); DDALine (pDC,c.getx(),c.gety(),d.getx(),d.gety(),COLOR); DDALine (pDC,d.getx(),d.gety(),b.getx(),b.gety(),COLOR); for(i=0;i<20;i++){

::Sleep (30);

DDALine (pDC,a.getx(),a.gety(),b.getx(),b.gety(),white);

DDALine (pDC,a.getx(),a.gety(),c.getx(),c.gety(),white);

DDALine (pDC,c.getx(),c.gety(),d.getx(),d.gety(),white);

DDALine (pDC,d.getx(),d.gety(),b.getx(),b.gety(),white);

a=temp*a;

b=temp*b;

c=temp*c;

d=temp*d;

DDALine (pDC,a.getx(),a.gety(),b.getx(),b.gety(),COLOR);

DDALine (pDC,a.getx(),a.gety(),c.getx(),c.gety(),COLOR);

DDALine (pDC,c.getx(),c.gety(),d.getx(),d.gety(),COLOR);

DDALine (pDC,d.getx(),d.gety(),b.getx(),b.gety(),COLOR);} temp = t1*s2*t2; for(i=0;i<20;i++){

::Sleep (30);

DDALine (pDC,a.getx(),a.gety(),b.getx(),b.gety(),white);

DDALine (pDC,a.getx(),a.gety(),c.getx(),c.gety(),white);

DDALine (pDC,c.getx(),c.gety(),d.getx(),d.gety(),white);

DDALine (pDC,d.getx(),d.gety(),b.getx(),b.gety(),white);

a=temp*a;

b=temp*b;

c=temp*c;

d=temp*d;

DDALine (pDC,a.getx(),a.gety(),b.getx(),b.gety(),COLOR);

DDALine (pDC,a.getx(),a.gety(),c.getx(),c.gety(),COLOR);

DDALine (pDC,c.getx(),c.gety(),d.getx(),d.gety(),COLOR);

DDALine (pDC,d.getx(),d.gety(),b.getx(),b.gety(),COLOR); } time=5;} void CGraphicsView::OnUpdateScale(CCmdUI* pCmdUI) { pCmdUI->SetCheck(WHAT_TO_DO==ID_SCALE);} 4.7 三维图形的变换

主要实现三维图形的上下左右平移,分别绕X轴Y轴Z轴的旋转,放大和缩小,以及正方体六个面的颜色变换,除此之外,还可以选择背景颜色的改变 4.7.1 部分代码如下:

void CGraphicsView::OnAoduomianti()

17 { WHAT_TO_DO=ID_AODUOMIANTI; CDrawDLG dlg1; dlg1.DoModal();} void CGraphicsView::OnUpdateAoduomianti(CCmdUI* pCmdUI) { pCmdUI->SetCheck(WHAT_TO_DO==ID_AODUOMIANTI);} void CDrawDLG::OnPaint()

{ CPaintDC dc(this); // device context for painting CWnd *pWnd=GetDlgItem(IDC_DRAW); pWnd->UpdateWindow(); // CDC *PDC=pWnd->GetDC(); Draw();} void CDrawDLG::Draw() { CWnd *pWnd=GetDlgItem(IDC_DRAW); pWnd->UpdateWindow(); CDC *pDC=pWnd->GetDC(); CRect rect; pWnd->GetClientRect(rect); D v[8]={ {-fs,-fs,fs},{-fs,fs,fs},{fs,fs,fs},{fs,-fs,fs},{-fs,-fs,-fs},{-fs,fs,-fs},{fs,fs,-fs},{fs,-fs,-fs} },d[8];

POINT p0[4],p1[4],p2[4],p3[4],p4[4],p5[4],w[8]; int z[8];

for (int i=0; i<8; i++) { d[i].x=v[i].x;

d[i].y=(int)(v[i].y*cos(a*DU)-v[i].z*sin(a*DU));

d[i].z=(int)(v[i].y*sin(a*DU)+v[i].z*cos(a*DU));

v[i].x=(int)(d[i].x*cos(b*DU)+d[i].z*sin(b*DU));

v[i].y=d[i].y;

v[i].z=(int)(d[i].z*cos(b*DU)-d[i].x*sin(b*DU));

d[i].x=(int)(v[i].x*cos(c*DU)-v[i].y*sin(c*DU));

d[i].y=(int)(v[i].x*sin(c*DU)+v[i].y*cos(c*DU));

d[i].z=v[i].z;

w[i].x=d[i].x+cx;

w[i].y=d[i].y+cy;

z[i]=d[i].z;} p0[0]=w[0];p0[1]=w[1];p0[2]=w[2];p0[3]=w[3]; p1[0]=w[4];p1[1]=w[5];p1[2]=w[6];p1[3]=w[7];

p2[0]=w[0];p2[1]=w[1];p2[2]=w[5];p2[3]=w[4]; p3[0]=w[1];p3[1]=w[2];p3[2]=w[6];p3[3]=w[5]; p4[0]=w[2];p4[1]=w[3];p4[2]=w[7];p4[3]=w[6]; p5[0]=w[0];p5[1]=w[3];p5[2]=w[7];p5[3]=w[4]; switch (Maxnum(z,7)) { case 0:fill(p0,p2,p5,0,2,5);break;

case 1:fill(p0,p2,p3,0,2,3);break;

case 2:fill(p0,p3,p4,0,3,4);break;

case 3:fill(p0,p4,p5,0,4,5);break;

case 4:fill(p1,p2,p5,1,2,5);break;

case 5:fill(p1,p2,p3,1,2,3);break;

case 6:fill(p1,p3,p4,1,3,4);break;

case 7:fill(p1,p4,p5,1,4,5);break;}} BOOL CDrawDLG::OnInitDialog() { CDialog::OnInitDialog(); m_scroll1.SetScrollRange(-180,180); m_scroll1.SetScrollPos(0); m_scroll2.SetScrollRange(-180,180); m_scroll2.SetScrollPos(0); m_scroll3.SetScrollRange(-180,180); m_scroll3.SetScrollPos(0); m_scroll4.SetScrollRange(0,350); m_scroll4.SetScrollPos(200); m_scroll5.SetScrollRange(0,300); m_scroll5.SetScrollPos(115); m_scroll6.SetScrollRange(0.00,300.00); m_scroll6.SetScrollPos(50.00); a=b=c=0; fs=50.00; SetTimer(1,100,NULL); Ctrl=0; cx=200; cy=115; COLOR1=RGB(123,234,43); COLOR2=RGB(123,123,0); COLOR3=RGB(123,24,235); COLOR4=RGB(0,123,95); COLOR5=RGB(23,234,34); COLOR6=RGB(234,124,0); COLOR7=RGB(0,43,98); return TRUE; // return TRUE unless you set the focus to a control} void CDrawDLG::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) { int nID=pScrollBar->GetDlgCtrlID(); switch(nID) { case IDC_SCROLLBAR1: a=pScrollBar->GetScrollPos();

switch (nSBCode)

{ case SB_LINELEFT: a--;break;

case SB_LINERIGHT: a++;break;

case SB_PAGELEFT: a-=10;break;

case SB_PAGERIGHT: a+=10;break;

case SB_THUMBTRACK: a=nPos;break; }

if (a<-180)a=180;

if (a>180)a=-180;

pScrollBar->SetScrollPos(a);

break; case IDC_SCROLLBAR2: b=pScrollBar->GetScrollPos();

switch (nSBCode)

{ case SB_LINELEFT: b--;break;

case SB_LINERIGHT: b++;break;

case SB_PAGELEFT: b-=10;break;

case SB_PAGERIGHT: b+=10;break;

case SB_THUMBTRACK: b=nPos;break; }

if (b<-180)b=180;

if (b>180)b=-180;

pScrollBar->SetScrollPos(b);

break; case IDC_SCROLLBAR3: c=pScrollBar->GetScrollPos();

switch (nSBCode)

{ case SB_LINELEFT: c--;break;

case SB_LINERIGHT: c++;break;

case SB_PAGELEFT: c-=10;break;

case SB_PAGERIGHT: c+=10;break;

case SB_THUMBTRACK: c=nPos;break; }

if (c<-180)c=180;

if (c>180)c=-180;

pScrollBar->SetScrollPos(c);

break; case IDC_SCROLLBAR4: cx=pScrollBar->GetScrollPos();

switch (nSBCode)

{ case SB_LINELEFT: cx--;break;

case SB_LINERIGHT: cx++;break;

case SB_PAGELEFT: cx-=10;break;

case SB_PAGERIGHT: cx+=10;break;

case SB_THUMBTRACK: cx=nPos;break;}

if (cx<0)cx=200;

if (cx>350)cx=200;

pScrollBar->SetScrollPos(cx);

break; case IDC_SCROLLBAR5: cy=pScrollBar->GetScrollPos();

switch (nSBCode)

{ case SB_LINELEFT: cy--;break;

case SB_LINERIGHT: cy++;break;

case SB_PAGELEFT: cy-=10;break;

case SB_PAGERIGHT: cy+=10;break;

case SB_THUMBTRACK: cy=nPos;break; }

if (cy<0)cy=300;

if (cy>300)cy=0;

pScrollBar->SetScrollPos(cy);

break;

case IDC_SCROLLBAR6: fs=pScrollBar->GetScrollPos();

switch (nSBCode)

{ case SB_LINELEFT: fs--;break;

case SB_LINERIGHT: fs++;break;

case SB_PAGELEFT: fs-=0.55;break;

case SB_PAGERIGHT: fs+=0.55;break;

case SB_THUMBTRACK: fs=nPos;break; }

if (fs<0)fs=50;

if (fs>300)fs=50;

pScrollBar->SetScrollPos(fs);

break; // UpdateData(FALSE);} // Invalidate(); Draw(); CDialog::OnHScroll(nSBCode, nPos, pScrollBar);} void CDrawDLG::OnOK() { KillTimer(1);

CDialog::OnOK();} int CDrawDLG::Maxnum(int *p, int n) { int max=p[0]; int x; for (int i=0; i<=n;i++) {

if (max<=p[i])

{ max=p[i]; x=i; } } return x;} void CDrawDLG::fill(POINT *x, POINT *y, POINT *z, int i,int j,int q) { CWnd *pWnd=GetDlgItem(IDC_DRAW); pWnd->UpdateWindow(); CDC *pDC=pWnd->GetDC(); CRect rect; pWnd->GetClientRect(rect);

CDC dcmem; dcmem.CreateCompatibleDC(pDC); CBitmap bmp,*oldbmp; bmp.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height()); oldbmp=dcmem.SelectObject(&bmp); CBrush brush[6]; brush[0].CreateSolidBrush(COLOR1); brush[1].CreateSolidBrush(COLOR2);

21 brush[2].CreateSolidBrush(COLOR3); brush[3].CreateSolidBrush(COLOR4); brush[4].CreateSolidBrush(COLOR5); brush[5].CreateSolidBrush(COLOR6); CBrush *oldbrush=dcmem.SelectObject(&brush[i]); dcmem.FillSolidRect(rect,COLOR7); dcmem.Polygon(x,4); dcmem.SelectObject(&brush[j]); dcmem.Polygon(y,4); dcmem.SelectObject(&brush[q]); dcmem.Polygon(z,4); dcmem.SelectObject(oldbrush); for (int b=0; b<6;b++) brush[b].DeleteObject(); pDC->BitBlt(rect.left,rect.top,rect.Width(),rect.Height(), &dcmem,0,0,SRCCOPY); dcmem.SelectObject(oldbmp); bmp.DeleteObject(); dcmem.DeleteDC();} 4.7.2 运行结果如下:

(1)实现多面体的上下左右平移

22 (2)实现多面体的绕轴旋转:

(3)实现多面体的放大缩小:

23

(4)实现多面体及背景的颜色设置:

(5)三维图形变换整体图形

24

五、实验心得体会

在本次课程设计过程中,基本掌握了计算机图形学关于图形绘制变换的基础知识,DDA法画直线和中心点法画圆及椭圆的方法,还对图形的变换及需要用到的一系列的函数有了相应的理解,也了解的很多有关于图形学中三维图形的变换的知识。不过都只是皮毛而已,从中锻炼了自己的动手做实验的能力,但同时也让自己看清了自己的水平,以便在以后的生活里多加强有关这方面的学习,从而提升自己在图形学方面的知识水平。

在本次课程设计中,设计方案存在着很多的死板化的实现方法,也是很不人性化的一点,只提供了画一种曲线的方法,且画出的曲线只能移动,此为本次设计方案的不足之一;然后就是能实现曲面和多边形的绘制,却没有对应的实现绘制好图形后直接对其进行平移、选择等变换,此为设计方案不足之二。再者就是三维图形只能实现变换不能实现绘制,此为设计方案不足之三。鉴于个人能力真的有限,所以只能设计出此种级别的效果了。因为实验重要的只是思想过程,效果的不美观只能是因为学习的知识还远远不够,所以不能设计出完美的全面的图形绘制变换程序。

经过此次设计,使我学到了很多东西,在没有开始做程序之前,没有任何思路,不知道该从哪里入手,可能是因为自己平时不认真听课的缘故。后来经过上网查询资料,翻阅参考书,在别人做的程序的启发下,才有了做此程序设计的眉目。在设计过程中遇到了很多的问题,在这里需要感谢王征风老师的帮助和指导,以及同学的帮助,最后一个个问题都被解决了,写出了完整的程序设计。最后也发现,其实只要努力,写出一个设计不是很困难,重要的是自己在写程序的过程中,要会学习,会查阅资料。这次的课程设计让我学习到了很多,以后我会努力提高自己在图形学方面的知识水平。

25

第5篇:计算机图形学论文

工欲善其事,必先利其器

——浅析计算机图形学及其作用 本学期学校开设了计算机图形学,一开始不知计算机图形学为何物的我不是很理解为什么要有这门课,但是经过一学期的洗礼过后,我对计算机图形学有了一定的理解。我知道了计算机图形学(Computer Graphics,简称CG)是一种使用数学算法将二维或三维图形转化为计算机显示器的栅格形式的科学。简单地说,计算机图形学的主要研究内容就是研究如何在计算机中表示图形、以及利用计算机进行图形的计算、处理和显示的相关原理与算法。图形通常由点、线、面、体等几何元素和灰度、色彩、线型、线宽等非几何属性组成。从处理技术上来看,图形主要分为两类,一类是基于线条信息表示的,如工程图、等高线地图、曲面的线框图等,另一类是明暗图,也就是通常所说的真实感图形。 计算机图形学一个主要的目的就是要利用计算机产生令人赏心悦目的真实感图形。对于我们将来从事景观设计的人来说,为了使自己的方案获得更多人的欣赏,必须创建图形所描述的场景的几何表示,再用某种光照模型,计算在假想的光源、纹理、材质属性下的光照明效果。所以计算机图形学与另一门学科计算机辅助几何设计有着密切的关系。事实上,图形学也把可以表示几何场景的曲线曲面造型技术和实体造型技术作为其主要的研究内容。同时,真实感图形计算的结果是以数字图象的方式提供的,计算机图形学也就和图像处理有着密切的关系。

谈到图形和图像时,现如今图形与图像两个概念间的区别越来越模糊,但还是有区别的:图像纯指计算机内以位图形式存在的灰度信息,而图形含有几何属性,或者说更强调场景的几何表示,是由场景的几何模型和景物的物理属性共同组成的。

计算机图形学的研究内容非常广泛,如图形硬件、图形标准、图形交互技术、光栅图形生成算法、曲线曲面造型、实体造型、真实感图形计算与显示算法、非真实感绘制,以及科学计算可视化、计算机动画、自然景物仿真、虚拟现实等。

自1963年,伊凡·苏泽兰(Ivan Sutherland)在麻省理工学院发表了名为《画板》的博士论文, 标志着计算机图形学的正式诞生起,至今已有四十多年的历史。此前的计算机主要是符号处理系统,自从有了计算机图形学,计算机可以部分地表现人的右脑功能了,所以计算机图形学的建立具有重要的意义。通过课堂上的学习以及网上的介绍,我发现近年来, 计算机图形学在如下几方面有了长足的进展:

在智能CAD方面,就目前流行的大多数CAD软件来看,主要功能是支持产品的后续阶段一一工程图的绘制和输出,产品设计功能相对薄弱, 利用AutoCAD 最常用的功能还是交互式绘图,如果要想进行产品设计, 最基本的是要其中的AutoLisp语言编写程序,有时还要用其他高级语言协助编写,

很不方便。而新一代的智能CAD 系统可以实现从概念设计到结构设计的全过程。

在计算机美术与设计方面,自1952年.美国的Ben·Larose用模拟计算机做了预示着电脑美术的开始得具有历史性意义的波型图《电子抽象画》开始,以微机和工作站为平台的个人计算机图形系统逐渐走向成熟, 大批商业性美术设计软件如雨后春笋般纷纷面市; 以苹果公司的MAC 机和图形化系统软件为代表的桌面创意系统被广泛接受,CAD成为美术设计领域的重要组成部分。而计算机设计学包括三个方面:即环境设计(建筑、汽车)、视觉传达设计(包装)、产品设计。 CAD对艺术的介入,分三个应用层次:(1)计算机图形作为系统设计手段的一种强化和替代; 效果是这个层次的核心(高精度、高速度、高存储)。(2)计算机图形作为新的表现形式和新的形象资源。

(3)计算机图形作为一种设计方法和观念。

同时,计算机图形学、计算机绘画、计算机音乐、计算机辅助设计、电影技术、电视技术、计算机软件和硬件技术等众多学科的最新成果都对计算机动画技术的研究和发展起着十分重要的推动作用。计算机动画的一个重要应用就是制作电影特技 可以说电影特技的发展和计算机动画的发展是相互促进的。比如广受欢迎的终结者系列中便大量运用了电脑特技,而在影片《阿凡达 》中几乎成为了电影特效的天下,电影特技的运用丰富了人们的视觉效果,是电影卖座的重要保证。我国的计算机动画技术起步较晚。1990年的第11届亚洲运动会上,首次采用了计算机三维动画技术来制作有关的电视节目片头。从那时起,计算机动画技术在国内影视制作方面得到了讯速的发展, 继而以3D Studio 为代表的三维动画微机软什和以Photoshop等为代表的微机二维平面设计软件的普及,对我国计算机动画技术的应用起到了推波助谰的作用。 计算机动画的应用领域十分宽广 除了用来制作影视作品外, 在科学研究、视觉模拟、电子游戏、工业设计、教学训练、写真仿真、过程控制、平面绘画、建筑设计等许多方面都有重要应用。

科学计算的可视化是发达国家八十年代后期提出并发展起来的一门新兴技术,它将科学计算过程中及计算结果的数据转换为几何图形及图象信息在屏幕上显示出来并进行交互处理,成为发现和理解科学计算过程中各种现象的有力工具。它涉及到下列相互独立的几个领域:计算机图形学、图象处理、计算机视觉、计算机辅助设计及交互技术等。科学计算可视按其实现的功能来分, 可以分为三个档次:(1)结果数据的后处理;(2)结果数据的实时跟踪处理及显示;(3)结果数据的实时显示及交互处理。

“虚拟现实”(Virtual Reality)一词是由美国喷气推动实验室(VPL)的创始人拉尼尔(Baron Lanier)首先提出的 在克鲁格(Algren Krueger)70年

代中早期实验里.被称为 人工现实”(Artificial reality);而在吉布森(William Gibson)l984 年出版的科幻小说Necromancer里,又被称为“可控空间”(Cyberspace)。虚拟现实是美国国家航空和航天局及军事部门为模拟而开发的一门高新技术 它利用计算机图形产生器,位置跟踪器,多功能传感器和控制器等有效地模拟实际场景和情形,从而能够使观察者产生一种真实的身临其境的感觉。虚拟环境由硬件和软件组成,硬件部分主要包括:传感器(Sensors)、印象器(Effecter)和连接侍感器与印象器产生模拟物理环境的特殊硬件。利用虚拟现实技术产生虚拟现实环境的软件需完成以下三个功能:建立作用器(Actors)以及物体的外形和动力学模型:建立物体之间以及周围环境之间接照牛顿运动定律所决定的相互作用;描述周围环境的内容特性。

在工程设计方面,计算机图形学的作用主要表现在

(1)建筑设计,包括方案设计、三维造型、建筑渲染图设计、平面布景、建筑

构造设计、小区规划、日照分析、室内装潢等各类CAD应用软件。

(2)结构设计,包括有限元分析、结构平面设计、框/排架结构计算和分析、

高层结构分析、地基及基础设计、钢结构设计与加工等。

(3)设备设计,包括水、电、暖各种设备及管道设计。

(4)城市规划、城市交通设计,如城市道路、高架、轻轨、地铁等市政工程设

计。

(5)市政管线设计,如自来水、污水排放、煤气、电力、暖气、通信(包括电

话、有线电视、数据通信等)各类市政管道线路设计。

(6)交通工程设计,如公路、桥梁、铁路、航空、机场、港口、码头等。

(7)水利工程设计,如大坝、水渠、河海工程等。

(8)其他工程设计和管理,如房地产开发及物业管理、工程概预算、施工过程

控制与管理、旅游景点设计与布置、智能大厦设计等。

那么如何学好计算机图形学呢? 除了计算机图形学的基础知识以外,我们还需要相关知识,懂得越多,才能学的越好。

英语,如果要学好计算机图形学的话,我认为需要阅读大量的英文书籍和资料,毕竟国外相关研究更加深入,好的英文功底有助于紧跟国际潮流。

数学,计算机图形学里面经常会遇到数学方面的知识,比如高等数学中的数值分析,微分几何,拓扑,差值概论以及微分方程等。

物理,如果要进行基于物理的建模,一些物理理论是要学习的。如力学,光学,有限元„„

编程语言,C语言或C++是计算机图形学中通用的语言。

数据结构,当需要用数据结构来描述图形形象时,除了通用的链表、树等数据结构外,图形学还有自己特殊的数据结构。

所以说,一门学科可能会和许多学科发生穿插,不能希望只通过一本教科书就能学好一门学科,一定要在掌握教科书内容的基础上与其他学科融会贯通才能获得更大的收获。这就是我学习计算机图形学的心得,可能不够成熟,希望在以后的进一步学习中获得更多的经验,为自己未来的职业生涯打下坚实的基础。

第6篇:计算机图形学实验

实验三 MFC画直线

最近自己在学习如何在VC 6.0 开发环境下的使用MFC AppWizard(exe)来绘画一条直线,虽然比较简单,通过这样的练习可以帮助你熟悉MFC的开发环境以及其中的消息传递机制,希望对于像我一样初入MFC图形绘制学习的人有帮

第一步:构建MFC窗体

打开Visual C++ 6.0编译器 新建→工程→MFC AppWizard(exe),工程名以DrawLine为例,然后确定。为了方便,在MFC应用程序向导—步骤1当中选择“单文档”,其余所有的步骤都为默认值,直接“完成”。这样一个简单的MFC窗体就构建好了,自己不妨Compile—Build—BuildExecute一下。

第二步:编辑菜单项

选择ResourceView视窗展开Menu文件夹,左键双击IDR_DRAWLITYPE,右边就会出现菜单图形编辑界面,为了简化,我们只在添加帮助→DrawLine功能选择项。双击空白会弹出“菜单项目 属性”对话框。ID:ID_DRAW_LINE;标明:

DrawLine(&D),其它的为缺省。

第三步:建立消息命令

如果此时运行该程序,你会发现帮助—DrawLine的功能选项是灰色的,原因就在于我们还没有添加该功能的消息命令相应函数。 通过“查看—Message Maps—Project:DrawLine—Class name:CDrawLineView—Object IDs:ID_DRAW_LINE—选定COMMAND—Add Function„”,其它为默认,最后确定完成。现在如果再重新运行该程序的话,会发现原来的灰色已经消除了。

第四步:添加鼠标消息响应

打开ClassView视窗,右键选定CDrawLineView,选择Add Windows Messsage Handler会弹出对话框,完成CDrawLineView类的WM_LBUTTONDOWN、WM_MOUSEMOVE、WM_LBUTTONUP三个Windows消息事件的新建。

第五步:添加响应代码

首先,在ClassView视窗中双击CDrawLineView会定位到“DrawLineView.h : interface of the CDrawLineView class”的文件,添加CDrawLineView类的成员:protected: int m_Drag; POINT m_pPrev; POINT m_pOrigin;三个成员变量。视窗中展开CDrawLineView类,双击定位OnLBUTTONDOWN()函数。在该函数消息响应

处添加如下代码:

//建立好绘图的设备环境

CClientDC dc(this); OnPrepareDC(&dc);

dc.DPtoLP(&point);

//获取起始点坐标 m_pPrev=point; m_pOrigin=point;

m_Drag=1;

然后,定位于OnMouseMove(),添加如下代码(其中关键用到了橡皮筋技术):

//建立好绘图的设备环境

CClientDC dc(this);

OnPrepareDC(&dc); dc.DPtoLP(&point);

dc.SetROP2(R2_NOT);//橡皮筋绘图技术

//判断是否BUTTONDOWN

if(m_Drag)

{

dc.MoveTo(m_pOrigin); dc.LineTo(m_pPrev); dc.MoveTo(m_pOrigin); dc.LineTo(point);

}

m_pPrev=point;

最后,在OnLBUTTONDOWN()添加代码: m_Drag=0;

程序运行效果图

2

实验4 实现圆的生成算法

一、实验目的

1. 熟悉CDC图形程序库; 2. 掌握中点画圆生成算法; 3. 掌握Bresenham画圆算法。

二、实验内容

利用VisualC++6.0设计一个简易画圆绘图板,验证圆生成算法。

三、实验指导

1. 生成绘图应用程序的框架,如下图所示。 具体实现见第二次实验,过程不再详细说明。

2. 在应用程序中增加菜单

完成相关菜单的设计,具体的效果如下图所示,并设置好相关菜单消息的映射,具体的实现在前面的实验中介绍过,再此不在详细说明。

3. 在绘图函数中添加代码

通过以上步骤,得到了与菜单对应的消息映射,就可以在函数中添加代码绘制图形了。 (1)利用中点画圆算法实现圆的生成(算法原理见教材)。 void CDraw_CirView::OnMid() { // TODO: Add your command handler code here CDC*pDC=GetDC();//得到绘图类指针

RedrawWindow();//重绘窗口

int x,y,x0=200,y0=200,r=100;//圆的圆心为(x0,y0),半径为r float d; x=0; y=r; d=1.25-r;

pDC->SetPixel(x+x0,y+y0,RGB(255,0,0)); pDC->SetPixel(y+x0,x+y0,RGB(255,0,0)); pDC->SetPixel(y+x0,-x+y0,RGB(255,0,0)); pDC->SetPixel(x+x0,-y+y0,RGB(255,0,0)); pDC->SetPixel(-x+x0,-y+y0,RGB(255,0,0)); pDC->SetPixel(-y+x0,-x+y0,RGB(255,0,0)); pDC->SetPixel(-y+x0,x+y0,RGB(255,0,0)); pDC->SetPixel(-x+x0,y+y0,RGB(255,0,0)); while(x<=y) {

if(d<0)

{

d=d+2*x+3;

x++;

}

else

{

d=d+2*(x-y)+5;

x++;

y--;}

pDC->SetPixel(x+x0,y+y0,RGB(255,0,0));

pDC->SetPixel(y+x0,x+y0,RGB(255,0,0));

pDC->SetPixel(y+x0,-x+y0,RGB(255,0,0));

pDC->SetPixel(x+x0,-y+y0,RGB(255,0,0));

pDC->SetPixel(-x+x0,-y+y0,RGB(255,0,0));

pDC->SetPixel(-y+x0,-x+y0,RGB(255,0,0));

pDC->SetPixel(-y+x0,x+y0,RGB(255,0,0));

pDC->SetPixel(-x+x0,y+y0,RGB(255,0,0)); } } 由以上代码绘出的图形如下:

(2)利用Bresenham算法生成圆(算法原理见教材)。 void CDraw_CirView::OnBre() {

5 // TODO: Add your command handler code here CDC*pDC=GetDC();//得到绘图类指针

//RedrawWindow();//重绘窗口

int x,y,x0=200,y0=200,r=50;//圆的圆心为(x0,y0),半径为r int delta,delta1,delta2,direction; x=0;y=r; delta=2*(1-r); while(y>=0) {

pDC->SetPixel(x+x0,y+y0,RGB(0,0,255));

pDC->SetPixel(x+x0,-y+y0,RGB(0,0,255));

pDC->SetPixel(-x+x0,y+y0,RGB(0,0,255));

pDC->SetPixel(-x+x0,-y+y0,RGB(0,0,255));

if(delta<0)

{

delta1=2*(delta+y)-1;

if(delta<=0)direction=1;

else direction=2;

}

else if(delta>0)

{

delta2=2*(delta-x)-1;

if(delta2<=0)direction=2;

else direction=3;

}

else direction=2;

switch(direction)

{

case 1:x++;

delta+=2*x+1;

break;

case 2:x++;y--;

delta+=2*(x-y+1);

break;

case 3:y--;

delta+=(-2*y+1);

break;

} } }

由以上代码绘出的图形如下:

(3)以上是本次实验的基本部分,利用中点画圆和Bresenham画圆算法实现的基本图形的绘制。能不能利用该算法,完成一些复杂图形的生成,比如利用基本的画圆算法绘制一个奥运五环。甚至根据画圆算法,实现二次曲线的生成,如椭圆的生成等等。请同学们认真考虑,完成这部分的内容,上机调试。

四、思考

1. 如何实现圆心为任意位置的圆的绘制; 2. 两种画圆算法的比较。

第7篇:计算机图形学实验报告

0900213 38 8 郭佩佩

实验一

建立计图实验环境 1. 实验目的 为了体现面向对象的程序设计思想,本实验采用基于 Visual C 十十集成环境的 MFC 编程方法,从开发 windows 应用程序的角度,来建立一个菜单交互式绘图基本环境,为后续的实验打基础。

2. 实验内容 1)

建立菜单交互式绘图基本环境的工程文件 Vcad,运行后如图:

2)在绘图菜单的下拉子菜单下有如下菜单项:

直线

----用弹性线方法输入直线的起止点后,调用 bresenham 算法替换原来

的 moveto/lineto 算法画直线

圆/圆弧

----在该菜单选择后,可分别画圆或圆弧。

直线段裁剪 ----输入矩形域左上角及右下角后,产生裁剪区域;然后可输入若干条直线段,矩形域作为主裁剪域对其裁剪之。

面区填充

----输入多边形的若干顶点后,调用面区填充算法对多边形域的内部填充

之。

贝塞尔曲线 ----输入四顶点后,调用三次贝塞尔曲线生成算法生成贝塞尔曲线。

实验二

园和园弧的绘制算法

1.实验目的 通过园和椭圆弧生成算法的上机调试,掌握:

1)

VC++图形函数的使用方法; 2)

圆和椭圆弧的生成原理。

2.实验内容 1)以函数形式编写圆的生成算法,然后在 VCAD 绘图小系统中的绘图----圆子菜单下找到合适的程序修改点,将本实验要求你编写的画圆算法插入工程文件中,通过调试来验证你编写的画圆算法的正确性。

2)

以函数形式编写角度 DDA 椭圆弧生成算法,然后在 VCAD 绘图小系统中的绘图----圆弧子菜单下找到合适的程序修改点,将本实验要求你编写的画圆弧算法插入工程文件中,通过调试来验证你编写的画圆弧算法的正确性。

Arc(int xc,int yc,doubli r,double ts,double te) {

double rad,ts1,tel,deg,dte,ta,ct,st;

int x,y,n,I;

rad=0.0174533;

tsl=ts*rad;

tel=te*rad;

if(r<5.08)

deg=0.015;

else

if(r<7.62)

deg=0.06;

else

if(r<25.4)

deg=0.075;

else

deg=0.15;

dte=deg*25.4/r;

if(tel

tel+=6.28319;

n=(int)((tel-tsl)/dte+0.5); if(n==0)

n=(int)(6.28319/dte+0.5);

ta=tsl;

x=xc+r*cos(tsl);

y=yc+r*sin(tsl);

moveto(x,y);

for(i=1;i<=n;i+++)

{ ta+=dte; ct=cos(ta); st=sin(ta); x=xc+r*ct; y=yc+r*st; lineto(x,y); }

x=xc+r*cos(tel);

y=yc+r*sin(tel);

lineto(x,y);

return(0); }

实验三

直线的裁剪( 编码裁剪算法)

1. 实验目的 通过编码裁剪算法的设计与调试,了解二维线段的裁剪过程,提高程序设计能力与上机调试能力,达到理论与实践有机结合之目的。注:此实验已有可运行的中点裁剪算法作为参考实例,做实验时,可将中点裁剪算法替换为你编写的编码裁剪算法。

2. 实验内容 1)

以函数形式编写编码裁剪算法及相关子算法;

Var xl,xr,yb,yt:real; …… procedure clip(x1,y1,x2,y2:real); label:return; type edge=(L,R,B,T);

outcode=set of edge; Var c,c1,c2:outcode;x,y:real; Procedure

code(x,y:real;Var

c:outcode);

Begin c:=[ ];

If x

Else if x>xr then c:=[R];

If y

Else if y>yt then c:=c+[T];

End {end of code} Begin {main}

Code(x1,y1,c1);code(x2,y2,c2); While (c1<>[]) or (c2<>[]) do

Begin

if c1*c2<>[] then return;{显然不可见}

c:=c1;if c=[] then c:=c2;

If L in c then begin

x:=xl;y:=…end;{对左边界求交}

If R in c then begin

x:=xr;y:=…end; {对右边界求交}

If B in c then begin

x:=…;y:=yb end; {对底边界求交}

If T in c then begin

x:=…;y:=yt end; {对顶边界求交} If c=c1 then begin

x1:=x;y1:=y;

code(x,y,c1) end

Else begig

x2:=x,y2:=y;

code(x,y,c2) end End;{End of while} Line(x1,y1,x2,y2);

Return: end; {end of clip}

2)

交互产生矩形裁剪框,并输入不同斜率的直线段的始、终点,先画出此直线段,然后调用裁剪算法,画出裁剪后保留的可见线段部分。

3)

在 VCAD 绘图小系统中的绘图----直线裁剪子菜单下找到合适的修改点,将本实验要求你编写的编码裁剪算法替换掉工程文件中的中点裁剪算法,通过调试来验证你编写的编码裁剪算法的正确性。

实验四

面区填充(Y-X 算法)

1. 实验目的 通过 Y-X 面区填充算法的调试,掌握:

1)

多边形面区填充算法的数据组织; 2)

利用相关性提高算法效率; 3)

奇异点的处理方法; 4)

提高程序设计能力。

2. 实验内容 1)

以函数形式编写 Y-X 面区填充算法; 2)

在 VCAD 绘图小系统中的绘图----面区填充子菜单下找到合适的修改点,将本实验要求你编写的面区填充算法插入工程文件中,通过调试来验证你编写的面区填充算法的正确性。操作时,用鼠标交互给出多边形的若干顶点,画出此多边形,然后调用你编写的 Y-X 面区填充算法填充,以自选的颜色填充多边形。

实验五

贝塞尔曲线生成算法的设计与调试

一、实验目的 在掌握曲线、曲面数学理论的基础上,通过调试,绘制 Bezier 曲线。加深同学 对数学理论的理解。通过二条 Bezier 曲线的拼接设计,掌握自由曲线的拟合方法。

二、内容和要求

3

1、由三次 Bezier 曲线的公式:P(t)=∑P i

B i,3 (t)

出发,编写生成 Bezier

i=0 曲线的程序,要求如下:

a)

用鼠标输入特征多边形的四点。然后调用 Bezier 曲线生成算法绘出曲线。

b)

重复上步 3—4 遍,验证你编写的算法的正确性。

typedef cptype float[4][4]; float cc (int n,int i) //计算 n!/(i!(n-i)!)

{int j;

float a;

a=1;

for(j=i+1;j<=n;j++) a*=j;

for(j=2;j<=n-i;j++) a/=j;

return a;

}

float b_lend(Int i,int n,float t2) //计算 B i,n (t)

{float v;

v=cc(n,i); for(j= 1;j<=i;j++) v*=t2;

for(j=1;j<=n-i;j++) v*=(1-t2);

return v;

} void bezier(float x0,float y0,float z0,float t0,int n,cptype cp2)//给定 t0,计算 f(t0) {int i;

float b1,g;

for(i=0;i<=n;i++) {b1=b_lend(i,n,t0);

x0=x0+cp2[i,1]*b1; y0=y0+cp2[i,2]*b1; z0=z0+cp2[i,3]*b1; }} void draw_curv(int k,cptype cp1)//将 t 分成 k 等份,循环迭代,绘出曲线。

{int i,j,x1,y1,z1;

float x,y,z,delt;

delt=1.0/k;

t=0;

for(i=1;i<=k;i++)

{x=y=z=0;

bezier(x,y,z,t,3,cp1);

if(t==0) moveto(x,y);

else lineto(x,y);

t+=delt; }}

2、将特征多边形改为五个控制点,修改程序后绘出四次曲线。

3、实现二条三次 Bezier 的拼接,并使连接点处保持一阶连续。

实验小结:

实验的过程是辛苦的,特别是处理大量的数据,大量的临时变量,很容易出错,需要极大的耐心。一些计算时,例如DDA 算法画圆时,需要强制类型转换一些数据,因为遗漏导致程序出了许多奇怪的错误,调试很久才发现。另外,贝塞尔曲线的算法编写中,一些数学函数的调用也很复杂,因为不常用,所以经常翻阅 API 文档。

最困难的是因为对该图形系统的不熟悉,导致处理鼠标操作时遇到一些难题,仔细比对才得以解决。

通过本次实验,对整个图形系统有了比较透彻的了解,同时对一些数学函数的使用再次加深了印象,更重要的是掌握了许多实用的计算机图形学的算法,对 MFC 的使用有了很大提升。

这次实验中积累的经验在今后的软件开发中将使我受益匪浅。

2005 年 1 月 3 日

第8篇:计算机图形学心得体会

名:

号:

201203284

级:

计科11202

号:

31

系:

计算机科学学院

通过一个学期的学习,经过老师细心的讲解,我对图形学这门课有了基础的认识,从您的课上我学到了不少知识,基本上对图形学有了一个大体的认识。上课的时候,您的PPT做的栩栩如生,创意新颖的FLASH就吸引了我的眼球,再加上您那详细生动的讲解,就让我对这门课产生了浓厚的兴趣,随着一节一节课的教学,您的讲课更加深深地吸引了我,并且随着对这门课越来越深入的了解更促使我产生了学好这门的欲望。您教会了我们怎们做基本知识,还教了我们不少的算法。听您的课可以说是听得津津有味。以下就是我对计算机图形学这门课的认识。

一、 图形通常由点、线、面、体等几何元素和灰度、色彩、线型、线宽等非几何属性组成。从处理技术上来看图形主要分为两类一类是基于线条信息表示的如工程图、等高线地图、曲面的线框图等另一类是明暗图也就是通常所说的真实感图形。 计算机图形学一个主要的目的就是要利用计算机产生令人赏心悦目的真实感图形。为此必须建立图形所描述的场景的几何表示再用某种光照模型计算在假想的光源、纹理、材质属性下的光照明效果。所以计算机图形学与另一门学科计算机辅助几何设计有着密切的关系。事实上图形学也把可以表示几何场景的曲线曲面造型技术和实体造型技术作为其主要的研究内容。同时真实感图形计算的结果是以数字图像的方式提供的计算机图形学也就和图像处理有着密切的关系。

二、计算机图形学的研究内容非常广泛如图形硬件、图形标准、图形交互技术、光栅图形生成算法、曲线曲面造型、实体造型、真实感图形计算与显示算法、非真实感绘制以及科学计算可视化、计算机动画、自然景物仿真、虚拟现实等。1990年的第11届亚洲运动会上首次采用了计算机三维动画技术来制作有关的电视节目片头。继而以3D Studio 为代表的三维动画微机软什和以Photostyler、Photoshop等为代表的微机二维平面设计软件的普及对我国计算机动画技术的应用起到了推波助谰的作用。 计算机动画的应用领域十分宽广 除了用来制作影视作品外 在科学研究、视觉模拟、电子游戏、工业设计、教学训练、写真仿真、过程控制、平面绘画、机械设计等许多方面都有重要应用如军事战术模拟。

三、 科学计算可视化它将科学计算过程中及计算结果的数据转换为几何图形及图象信息在屏幕上显示出来并进行交互处理成为发现和理解科学计算过程中各种现象的有力工具。 科学计算可视按其实现的功能来分可以分为三个档次1结果数据的后处理2结果数据的实时跟踪处理及显示3结果数据的实时显示及交互处理。利用虚 拟现实技术产生虚拟现实环境的软件需完成以下三个功能建立作用器Actors以及物体的外形和动力学模型建立物体之间以及周围环境之间接照牛顿运动定律所决定的相互作用描述周围环境的内容特性

四、发展趋势 计算机图形学主要是研究图形图像的计算机生成其研究方向众多。在图形基础研究方面可归纳为两个主要方向即建模modeling技术又称造型技术和绘制rendering技术。 建模技术又可分为两大分支即计算机辅助几何设计和自然景物建模。计算机辅助几何设计追求建模的精确度、可靠性和建模的速度自然景物建模追求建模的逼真度和速度。计算机图形学中的绘制技术是指基于光栅图形显示技术的真实感图形绘制技术包括各种光照模型、明暗shading处理和纹理生成等内容。绘制技术追求的是真实感逼真度和绘制速度。 综合上述两大研究方向的追求目标可以看出计算机图形学研究水平的高低就是反映在真实感和速度的高低以及两者的结合上也就是既要逼真地反映客观世界的对象又能高速地、通常又称实时地绘制它们。众所周知真实感与实时性是一对尖锐的矛盾如何解决这一矛盾是当代计算机图形学工作者奋斗的目标。计算机图形学的主攻方向不再是孤立地追求图形的真实感和绘制的实时性而是把重点转移到如何把两者结合在一起即向更高的目标迈进。 体现这一重点转移的研究方向有以下方面:

1、基于图像的建模与绘制技术成为研究热点 基于图像的建模与绘制技术应用图像处理方法来加速图形学的建模和绘制的研究工作可追溯到早期的纹理映射工作。该方法是基于几何和基于图像两种建模方法的混合方法包括利用摄影测量学原理提取照片建筑的基本几何模型利用基于模型的立体视图方法提取建筑立面的细节利用视点无关的纹理映射方法绘制建筑的多种视图。

2、.PC机图形硬件的三维化及高档图形硬件结构与图像处理硬件相结合的趋向 图形硬件、图形软件及图形基础算法三者的有机结合和相互影响形成了计算机图形学辉煌的今天。从原理上讲当图形的绘制速度足够高使所绘制的多边形中仅含几个像素如3个的时候基于多边形的3D图形系统就失去了意义因为插值运算已没有意义。这时基于图像的建模和绘制就成为当然的选择。从上述介绍中已可明显感到图形 学与图像处理相结合的发展趋向。

3、细节的分层表示、层次化绘制以及小波理论在图形学中的应用继续成为热点

4、计算机动画和虚拟现实是当前计算机图形学的应用热点 在电视广播这一通常大量应用专用视频处理硬件的领域里如何应用通用图形工作站来生成高质量的实时动画以及特技图形效果的优点、难点和今后的发展方向。三维动作跟踪器3D-Trackers可提供32个关节传感器同时实时纪录两个人的全身动作并体现在屏幕卡通人物的形体动作上。游戏开发就得用到计算机图形学中的方方面面.

5、分形理论及应用 形理论是当今世界十分活跃的新理论。作为前沿学科的分形理论认为大自然是分形构成的。大千世界对称、均衡的对象和状态是少数和暂时的而不对称、不均衡的对象和状态才是多数和长期的分形几何是描述大自然的几何学。作为人类探索复杂事物的新的认知方法分形对于一切涉及组织结构和形态发生的领域均有实际应用意义并在石油勘探、地震预测、城市建设、癌症研究、经济分析等方面取得了不少突破性的进展。

6、曲面造型技术 它是计算机图形学和计算机辅助几何设计Computer Aided Geometric Design的一项重要内容主要研究在计算机图象系统的环境下对曲面的表示、设计、显示和分析。经三十多年发展现在它已经形成了以Bezier和B样条方法为代表的参数化特征设计和隐式代数曲面表示这两类方法为主体以插值Interpolation 、拟合Fitting 、逼近Approximation这三种手段为骨架的几何理论体系。随着计算机图形显示对于真实性、实时性和交互性要求的日益增强随着几何设计对象向着多样性、特殊性和拓扑结构复杂性靠拢的趋势的日益明显随着图形工业和制造工业迈向一体化、集成化和网络化步伐的日益加快随着激光测距扫描等三维数据采样技术和硬件设备的日益完善曲面造型在近几年来得到了长足的发展。

五、对计算机图形学的认识 经过了一阶段计算机图形学的学习对于图形学中基本图形的生成算法有了一定的了解。深度研究图形学需要高深的数学知识且每一个细化的方向需要的知识也不一样。图形学是计算机科学与技术学科的活跃前沿学科被广泛的应用到生物学、物理学、化学、天文学、地球物理学、材料科学等领域。我深深感到这门学科涉及的领域之广是惊人的可以说博大精深。在这个计算机的时代什么都要用到,计算机技术图形也是我们生活中重要的部分所以我们得好好学好图形学。

可惜在这么短的时间内来不及更深入地学习,关于图形学还有不少知识老师对我们没来及细细讲解只是一提带过,不能不说这是个遗憾,希望以后还有机会听您给我们细细讲解未涉及的内容,带领我们更深入的对图形学进行探讨和钻研,能够翱翔在图形学这片蔚蓝的天空。您就是领航人,我们就是那一艘艘在知识大海中航行的船泊,在老师的指引下扬帆前进!

第9篇:计算机图形学结课论文

——计算机图形学在虚拟现实领域的应用

姓 名:班 级:学 号:系 部:环境与市政工程系

xxxx

xx给水排水工程x班 xxxxx

1 前言摘要:随着计算机图形学的不断发展和进步,他的应用领域也越来越广泛和深入,本文先介绍什么是虚拟世界,再将其在虚拟世界领域的应用作全面的介绍和举例。时代在进步,科学在发展,若你还不知道计算机图形学在虚拟世界的应用价值,那么请认真阅读此文,本文将让你走进科学的暴风。

正文:

虚拟现实(virtual reality,VR)是一项崛起于二十世纪八十年代末九十年代初的高新技术、实用技术。它是利用计算机软硬件以及各种传感器构成三维信息的人工环境——虚拟环境,从而真实地模拟现实世界中可以实现的(甚至是不可实现的)物理上的、功能上的事物和环境。

作为一项综合技术,虚拟现实技术主要涉及到计算机技术、传感器技术和人工智能等领域。如前所述,虚拟现实的主要目的在于提供虚拟环境,并在虚拟环境中实现用户和环境的互动,从这个角度上说,虚拟现实主要有三个方面的含义:首先借助虚拟现实技术生成虚拟实体,虚拟实体主要是针对用户的生理感觉(视、听、触、嗅等)而言;其次,用户可以通过人的生理的自然技能同这个环境交互,人的生理的自然技能主要是头部、眼球的转动,身体四肢、躯干的运动等人体力学运动;最后虚拟现实技术主要利用传感器完成人和虚拟环境的交

2 互。

我们可以说,虚拟现实的基础是对环境的虚拟,而对环境的虚拟又主要基于计算机图形学运用。近年来计算机图形学的发展对虚拟现实技术极大的推动作用,也说明了计算机图形学在虚拟现实技术领域中的主要领导地位。

它主要具备四个重要特征:

一、 多感知性:即虚拟现实能多维感知,不仅包括视觉,还包括听觉,触觉和嗅觉等;

二、 存在感:即临场感,指用户感到存在于虚拟环境中的真实度;

三、

四、 交互性:指用户和环境的双向交流;

自主性:指虚拟环境中物体根据物理定律运动的程度。

虚拟现实的技术因素主要包括图形图像的处理、语音处理与音响、模式识别、人工智能、智能借口、传感器、实时分布系统和数据库技术等。典型的虚拟现实系统的基本组成主要包括:

一、效果产生器:完成人与虚拟环境交互的硬件接口装置;

二、实景仿真器:系统的核心部分,由计算机软件系统、软件开发工具等组成;

三、应用系统:面向具体问题的软件部分,描述仿真的具体内容;

四、集合构造系统:提供描述仿真对象的物理特性的信息。

在这几个基本组成中,计算机图形学理论作为基础理论无疑都发挥着巨大的作用。

在虚拟现实系统中,,为了使人和计算机能够融洽的交互,让人

3 沉浸到虚拟环境中去,必须配备相应的硬件设备。

首先是跟踪系统,它的主要任务是实时检测出虚拟现实系统中的人体各部位的空间坐标和指向,并将这些数据反馈给控制系统,生产随视线变化的图像。跟踪系统主要包括:电磁跟踪系统、声学跟学跟踪系统和光踪系统。

其次是触觉系统,在用户与虚拟环境产生接触的环节,触觉系统产生沉浸效果,使用户可以感觉到虚拟物体的反作用力。

第三是音频系统,由语音与音响合成设备、识别设备和声源定位设备构成,通过听觉通道提供的辅助信息可以加强拥护对环境的感知。

再有就是图像生成和显示系统,它的主要作用是:计算生成真实感的图形;计算生成或取得有真实感的背景图像;将图形和背景统一安排在同一坐标系中。图像生成和显示系统是虚拟环境系统的重要组成部分,也凸显出计算机图形学在虚拟现实技术中的重要地位。

最后就是可视化显示设备,它集上述四种技术于一体,并结合了人类感知的生理特点。

从虚拟现实系统的组成可以看出,虚拟现实系统在本质上也是一类仿真系统,是一种与计算机图形学的理论与技术密切相关的仿真系统。一般意义上的仿真是指通过对给定模型进行计算,最后给出一系列的数据,这就是数字仿真;通过计算机图形学的理论和技术,为数字仿真过程及结果增加图形、图像和动画表现,使得仿真过程更加直观,结果更容易理解,并能验证仿真过程是否正确,这便是可视化仿真。

4 虚拟现实是一种可以创建和体验虚拟世界的计算机系统,虚拟世界是全体虚拟环境或给定仿真对象的全体,而对对象的仿真主要是视觉上的刻画,这就给计算机图形学提供了广阔的应用平台。建立在计算机图形学理论和技术之上并通过其他途径完善的虚拟现实系统,与一般交互式仿真系统相比,具有更高的真实性和多维性。

由于计算机图形学理论的发展和进步,使得虚拟现实系统对对象的刻画更为深刻,从而推动了虚拟现实技术在教育、医疗、娱乐、科技、工业制造、建筑和商业等领域中的广泛应用。

近年来在城市规划,室内设计,文物保护,交通模拟,虚拟现实游戏,工业设计,远程教育等方面都取得了巨大的发展,虚拟无限相信,这是不可逆转的趋势,并且会运用更加广泛。 1:城市规划

在城市规划中经常会用到VR技术,用VR技术不仅能十分直观的表现虚拟的城市环境,而且能很好的模拟各种天气情况下的城市,而且可以一目了然的了解排水系统,供电系统,道路交通,沟渠湖泊等等。而且能模拟飓风、火灾、水灾、地震等自然灾害的突发情况。对于政府在城市规划的工作中起到了举足轻重的作用。 2:室内设计

在室内设计应用方面,用VR技术不仅能十分完美的表现室内的环境,而且能在三维的室内空间中自由行走。目前业内常用VR技术做室内360度全景展示和室内漫游,受到一致好评,而且不仅能在室内漫游,还能用VR技术做预装修系统,可以实现即时动态的对墙壁的颜色进

5 行更换或贴上不同材质的墙纸,还可以更换地面的颜色或贴上不同的木地板、瓷砖等,更能移动家具的摆放位置、更换不同的装饰物。这一切都在VR虚拟现实技术下将被完美的表现。 3:文物保护

VR技术在文物保护方面也是应用相当广泛的,埃及的金字塔就做过网上的体验中心,运用了全景虚拟技术和三维虚拟技术,而且IBM目前正在运用VR虚拟现实技术对北京故宫进行整个故宫的数字虚拟。届时大家也许可以在网上直接看到数字三维化的故宫。 4:交通

无论是在空中、陆地还是海洋河流的交通规划模拟方面,VR虚拟技术都有其得天独厚的优势,不仅仅能用三维GIS技术将各种交通路线表现得十分到位,更能动态模拟各种自然灾害情况。 5:房地产

近几年在房地产的表现和推广应用方面,VR虚拟现实技术被得到越来越多的应用,更有逐步取代效果图和三维动画之势。用VR虚拟技术不仅可以十分完美的表现整个小区的环境,设施。还能表现不存在但即将建成的绿化带,喷泉,休息区,运动场等等。。不仅如此,用户还能在整个小区中任意漫游、仔细欣赏小区的每一处风景。大大刺激了浏览者的感受。 6:游戏

对于游戏的开发,目前VR技术比较适合开发:角色扮演类、动作类、冒险解迷类、竞速赛车类的游戏,其先进的图像引擎丝毫不亚于目前

6 的主流游戏引擎的图像表现效果,而且整合配套的动力学和AI系统更给游戏的开发提供了便利。 7:军事

VR技术就是诞生于军事应用,在军事应用方面很多,包括:模拟战场,模拟操作,模拟驾驶,模拟装配等等。。都需要通过VR技术来实现。而且在相关军事工作汇报中也会有VR技术的支持。 8:家电

家电产品的展示、展览、发布上。运用VR技术不仅可以完美表现产品的外观,更能将其功能表现的淋漓尽致。而且家电行业产品种类繁多、数量庞大。市场需求量十分大,无论是使用全景虚拟还是视频虚拟还是三维虚拟技术都能在家电行业大有作为。 9:地理

VR技术在地里应用上,主要是运用三维GIS地理信息系统来表现直观的三维地形地貌,对于地理工作者提供便利,对于相关工程建设提供可靠的参考数据。 10:教育

VR技术在教育领域,主要是发挥其互动性和生动的表现效果,用于立体几何、物理化学等相关课件的模拟制作。而且在相关专业的培训机构,VR虚拟现实技术能够提供学员更多的辅助,比如虚拟驾驶、各种交通规则的模拟。特种器械模拟操作、模拟装备等等。 11:工业

VR技术在工业应用上,主要运用于工业园模拟、机床模拟操作、设

7 备管理、虚拟装配、工控仿真。由于VR技术本身的特性所以从事以上的相关工作模拟十分方便、快捷而真实准确。 12:视频

VR技术在工视频应用上,已经相当广泛了,在各大电视台中均有虚拟演播室,而且有的电视台还运用了虚拟主持人。这种虚拟技术的运用无论是CCTV还是各个地方卫视都有应用。

关键词:虚拟现实环境

多感知性

三维GIS地理信息系统

虚拟装配

8

9

10

上一篇:健康大讲堂策划案下一篇:幼儿园安全工作记录