计算机图形学毕业论文

2024-04-24

计算机图形学毕业论文(精选6篇)

篇1:计算机图形学毕业论文

工欲善其事,必先利其器

——浅析计算机图形学及其作用 本学期学校开设了计算机图形学,一开始不知计算机图形学为何物的我不是很理解为什么要有这门课,但是经过一学期的洗礼过后,我对计算机图形学有了一定的理解。我知道了计算机图形学(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++是计算机图形学中通用的语言。

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

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

篇2:计算机图形学毕业论文

名:专业班级:学

号:教

师:

马云峰

软件12K1

121909020116

姜丽梅

计算机图形学应用与发展

计算机图形学是一种使用数学算法将二维或三维图形转化为计算机显示器的栅格形式的科学。简单地说,计算机图形学的主要研究内容就是研究如何在计算机中表示图形、以及利用计算机进行图形的计算、处理和显示的相关原理与算法。

计算机图形学一个主要的目的就是要利用计算机产生令人赏心悦目的真实感图形。为此,必须建立图形所描述的场景的几何表示,再用某种光照模型,计算在假想的光源、纹理、材质属性下的光照明效果。所以计算机图形学与另一门学科计算机辅助几何设计有着密切的关系。事实上,图形学也把可以表示几何场景的曲线曲面造型技术和实体造型技术作为其主要的研究内容。同时,真实感图形计算的结果是以数字图像的方式提供的,计算机图形学也就和图像处理有着密切的关系

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

计算机图形学发展简史

第一台图形显示器在1950 年 作为美国麻省理工学院(MIT)旋风号—(Whirlwind)计算机的附件诞生了。该显示器用一个类似示波的阴极射线管(CRT)来显示一些简单的图形。在整个50 年代,只有子管计算机,用机器语言编程,主要应用于科学计算,为这些计算机置的图形设备仅具有输出功能。计算机图形学处于准备和酝酿时期并称之为 :“被动式”图形学。1963 年,伊凡·苏泽兰在麻省理工学院发表了名为 《画板》的博士论文,它标志着计算机图形学的正式诞生。此前的计算机主要是符号处理系统,自从有了计算机图形学,计算机可以部分地表现 人的右脑功能了,计算机图形学的建立意义重大。从1973年开始,相继出现了英国剑桥大学CAD小组的Build系统、美国罗彻斯特大学的PADLI系统等实体造型系统。1980年Whitted提出了一个光透视模型——— Whitted 模型,并第一次给出光线跟踪算法的范例,实现Whitted模型;1984年,美国Cornell大学和日本广岛大学的学者分别将热辐射工程中的辐射度的方法引入到计算机图形学中,用辐射度方法成功地模拟了理想漫反射表面间的多重漫反射效果;光线跟踪算法和辐射度算法的提出,标志着真实感图形的显示算法已逐渐成熟。从20世纪80年代中期以来,超大规模集成电路的发展,为图形学的飞速发展奠定了物质基础。计算机的运算能力的提高,图形处理速度的加快,使得图形学的各个研究方向得到充分发展,图形学已广泛应用于动画、科学计算可视化、CAD/CAM、影视娱乐等各个领域。

ACM SIGGRAPH会议是计算机图形学最权威的国际会议,每年在美国召开,参加会议。的人在50000人左右。SIGGRAPH会议很大程度上促进了图形学的发展,世界上不会有第二个领域会每年召开如此规模巨大的专业会议。SIGGRAPH是大约60年代中期,由Brown大学的教授AndriesvanDam和IBM公司的Sam Matsa发起的。1974年,在Corlorado大学召开了第一届SIGGRAPH年会,并取得了巨大的成功,当时有大约600位来自世界各地的专家参加了会议。到了1997年,参加会议的人数已经增加到48700。因为每年只录取大约50篇论文,在Computer Graphics杂志上发表,因此论文的学术水平较高,基本上代表了图形学已经的主流方向。

计算机图形学的应用、在制造业中,CAD技术已在制造业中广泛应用,其中以机床、汽车、飞机、船舶、航天器等制造业应用最为广泛、深入。众所周知,一个产品的设计过程要经过概念设计、详细设计、结构分析和优化、仿真模拟等几个主要阶段。同时,现代设计技术将并行工程的概念引入到整个设计过程中,在设计阶段就对产品整个生命周期进行综合考虑。当前先进的CAD应用系统已经将设计、绘图、分析、仿真、加工等一系列功能集成于一个系统内。现在较常用的软件有UG II、I-DEAS、CATIA、PRO/E、Euclid等CAD应用系统,这些系统主要运行在图形工作站平台上。在PC平台上运行的CAD应用软件主要有Cimatron、Solidwork、MDT、SolidEdge等。由于各种因素,目前在二维CAD系统中Autodesk公司的AutoCAD占据了相当的市场。

在工程设计中 CAD技术在工程领域中的应用有以下几个方面:

(1)建筑设计,包括方案设计、三维造型、建筑渲染图设计、平面布景、建筑构造设计、小区规划、日照分析、室内装潢等各类CAD应用软件。

(2)结构设计,包括有限元分析、结构平面设计、框/排架结构计算和分析、高层结构分析、地基及基础设计、钢结构设计与加工等。

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

(4)城市规划、城市交通设计,如城市道路、高架、轻轨、地铁等市政工程设计。(5)市政管线设计,如自来水、污水排放、煤气、电力、暖气、通信(包括电话、有线电视、数据通信等)各类市政管道线路设计。(6)交通工程设计,如公路、桥梁、铁路、航空、机场、港口、码头等。(7)水利工程设计,如大坝、水渠、河海工程等。

(8)其他工程设计和管理,如房地产开发及物业管理、工程概预算、施工过程控制与管理、旅游景点设计与布置、智能大厦设计等。

电器和电子电路方面 CAD技术最早曾用于电路原理图和布线图的设计工作。目前,CAD技术已扩展到印刷电路板的设计(布线及元器件布局),并在集成电路、大规模集成电路和超大规模集成电路的设计制造中大显身手,并由此大大推动了微电子技术和计算及技术的发展。

CAD技术除了在上述领域中的应用外,在轻工、纺织、家电、服装、制鞋、医疗和医药乃至体育方面都会用到CAD技术。

计算机图形学的前沿科技应用

3D技术3D计算机图形研究如何运用计算机和特殊的3D软件生成3D图形。3D之于2D就像雕塑之于绘画,其独特之处在于采用三维的方式来表示和保存虚拟物体。在CAD 领域中,目前一个重要的 研究领域是基于工程图纸的三维形体重建。三维形体重建是从二维信息中提取三维信息,通过对这些信息进行分类,综合等一系列处理,在三维空间中重新构造出二维信息所对应的三维形体,恢复形体的点、线、面及其拓扑关素,从而实现形体的重建。

计算机图形学的可视化研究

目前科学计算可视化广泛应用于医学、流体力学、有限元分析、气象分析当中。尤其在医学领域,可视化有着广阔的发展前途。依靠精密机械做脑部手术已经由机械人和医学专家配合做远程手术是目前医学上很热门的课题,而这些技术的实现的基础则是可视化。可视化技术将医用CT扫描的数据转化为三维图象,并通过一定的技术生成在人体内漫游的图象,使得医生能够看到并准确地判别病人的体内的患处,然后通过碰撞检测一类的技术实现手术效果的反馈,帮助医生成功完成手术。从目前的研究状况来看,这项技术还远未成熟,离实用还有一定的距离。主要难点在于生成人体内漫游图象的三维体绘制技术还没有达到实时的程度,而且现在大多的体绘制技术是基于平行投影的,而漫游则需要真实感更强的透视投影技术,然而体绘制的透视投影技术到还没有很好地解决。另外在漫游当中还要根据CT图象区分出不同的体内组织,这项技术叫Segmentation。目前的Segmentation主要是靠人机交互来完成,远未达到自动实时的地步。

图像实时绘制与自然景物仿真

在计算机中重现真实世界的场景叫做真实感绘制。真实感绘制的主要任务是模拟真实物体的物理属性,简单的说就是物体的形状、光学性质、表面的纹理和粗糙程度,以及物体间的相对位置、遮挡关系等等。这其中光照和表面属性是最难模拟的。为了模拟光照,已有各种各样的光照模型。从简单到复杂排列分别是:简单光照模型、局部光照模型和整体光照模型。从绘制方法上看有模拟光的实际传播过程的光线跟踪法,也有模拟能量交换的辐 射度方法。除了建造计算机可实现的逼真物理模型外,真实感绘制还有一个研究重点是研究加速算法,力求能在最短时间内绘制出最真实的场景。例如求交算法的加速、光线跟踪的加速等等,象包围体树、自适应八叉树都是著名的加速算法。实时的真实感绘制已经成为当前真实感绘制的研究热点,而当前真实感图形实时绘制的两个热点问题则是物体网格模型的面片简化和基于图象的绘制(IBR Image Based Rendering)。网格模型的面片简化,就是指对网格面片表示的模型,在一定误差的精度范围内,删除点、边、面,从而简化所绘制场景的复杂层度,加快图形绘制速度。IBR完全摒弃传统的先建模,然后确定光源的绘制的方法。它直接从一系列已知的图象中生成未知视角的图象。这种方法省去了建立场景的几何模型和光照模型的过程,也不用进行如光线跟踪等极费时的计算。该方法尤其适用于野外极其复杂场景的生成和漫游。另外,真实感绘制已经从最初绘制简单的室内场景发展到现在大量模拟野外自然景物,比如绘制山、水、云、树、火等等。人们提出了多种方法来绘制这些自然景物,比如绘制火和草的粒子系统(Particle System),基于生理模型的绘制植物的方法,绘制云的细胞自动机方法等。也出现了一些自然景物仿真绘制的综合平台,如德国Lintermann 和 Deussen的绘制植物的平台Xforg,以及清华大学自主开发的自然景物设计平台。

计算机动画

随着计算机图形和计算机硬件的不断发展,计算机动画应运而生。事实上动画也只是生成一幅幅静态的图象,但是每一幅都是对前一幅小部分修改,如何修改便是计算机 动画的研究内容,这样,当这些连续播放时,整个场景就动起来。早期的计算机动画灵感来源于传统的卡通片,在生成几幅被称作“关健帧”,连续播放时2 个关健帧就被有机的结合起来了。计算机动画内容丰富多彩,生成动画的方法也 多种多样,比如基于特征的图象变形,二维形状混合,轴变形方法,三维自由形体变形等。近年来人们普遍将注意力转向基于 物理模型的计算机动画生成方法。这是一种崭新的方法,该方法大量运用弹性力学和流体力学的方程进行计算,力求使动画过程体现出最适合真实世界的运动规律。然而要真正到达真实运动是很难的,比如人的行走或跑步,要实现很自然的人走路的画面,计算机方程非常复杂和计算量极大,基于物理模型的计算机 动画还有许多内容需要进一步研究。

计算机艺术

用计算机从事艺术创作,计算机图形学除了 广泛用于艺术品的制造,如各种图案、花纹及传统的油画、中国国画等。还成功的用来制造广告、动画片甚至电影,其中有的影片还获得了奥斯卡奖。这是电影界最高的殊荣。目前国内外不少人士正在研制人体模拟系统,这使得在不久的将来把历史上早已 去世的著名影视明星重新搬上新的影视片成为可能。这是一个传统的艺术家无法实现也不可想象的。

计算机图形学的未来

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

计算机图形学的理论产生与发展始于上世纪80年代, 在经过了近40年的发展与进步, 其已经发展成了前沿应用学科里非常重要的一门分支学科。同时, 计算机图形图像处理技术也已广泛的应用于工业制造、现代通讯、多媒体等多个领域中, 得到了越来越多的关注与重视。

2 计算机图形学概述

2.1 计算机图形学研究的主要内容

计算机图形学作为一门前沿应用科学, 其研究内容非常的广泛。例如, 图形标准化研究、图像交互研究、图形建模研究、图形图像的可视化研究、动画以及仿真研究等。在计算机图形学的研究中, 其主要是通过一定的计算机手段, 来展示出具有非常强烈真实感的图形图像。在研究计算机图形学的过程中, 离不开相关的几何设计理论。

2.2 计算机图形系统的组成与功能

2.2.1 计算机图形系统的组成

在进行计算机图形与图像处理过程中, 需要运用到计算机图形系统, 其主要包含有计算机硬件以及相关的处理软件。硬件设备包含有处理器装置、图形输入以及输出装置。处理器对于系统来说尤为关键, 其是实现计算机与图形终端设备信息传递的桥梁。处理器可以处理并储存相关的图形图像信息数据, 同时还可以对图形几何函数进行运算, 从而使图形系统拥有更加优异的图形显示功能以及更快的图像呈现速率。

在硬件装置不断发展的同时, 相应的软件技术也取得了很大的进步。现阶段, 已经开发出了多种能够用于图形处理的应用程序, 使计算机图形系统功能更加完善。

2.2.2 计算机图形系统的功能

对于计算机领域以及工程制造领域来说, 计算机图形系统的发展与进步是极为重要的。计算机图形系统也应当包含有计算功能、信息储存功能、信息输入与输出功能以及对话功能等。

(1) 计算功能。在此功能中, 应当可以完成图形设计与处理中必须的一些运算分析与汇总。例如, 坐标的转换、元素的合成等。

(2) 信息存储功能。此功能中, 应当可以实现对图形信息数据的存储, 同时应当实现对相关数据信息的检索以及维护。

(3) 信息输入以及输出功能。在此功能中, 应当可以实现对各种数据参数与命令的写入, 并利用相关设备实现对图形信息的输出。

(4) 对话功能。此功能可以实现利用显示设备或者人机交换装置而完成人机的信息交流。

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

(1) 两者的数据信息来源有所差异。图像信息是取自客观存在的环境中, 而图形信息则是取自主观世界。

(2) 两者的处理方式有所差异。对于图像进行处理时, 多采用几何修订、信息强化、图像识别等方式。而对于图形的处理, 则主要通过几何的转换、图形裁剪以及曲线拟合等相关方式进行。

(3) 两者所运用的理论有所差异。在对图像进行处理时, 多是运用数据信息处理理论、统计理论以及模糊数学模型理论等。而对图形进行处理时, 多用到仿射理论、几何以及分形理论等。

(4) 两者的用途有所差异。图像处理技术大多是用在航空领域、医学领域以及制造领域中。而图型处理技术大多用在CAD、计算机模拟以及动画模拟等相关领域中。

在目前的应用过程中, 计算机图形处理技术与计算机图像处理技术又是密不可分的, 只有将两者有机地融合, 才能够对图形图像的处理更为的完善与完美。两者之间的联系与转换关联图, 如图1所示。

4 计算机图形图像处理技术的实际应用

4.1 在辅助制造设计领域中的应用

在辅助制造以及设计方面, 计算机图形图像处理技术应用最多的便是CAD技术。此技术对于工业产品的设计制造以及工程设计等均发挥着极大的作用。通过应用计算机图形图像处理技术, 当设计过程中涉及数据量庞大、系统繁杂的电路图时, 单纯的依靠人工来完成几乎不可能实现, 而通过使用计算机图形图像处理技术, 则可以非常迅速、精准的完成相关的设计工作, 如此便节约了大量的人力以及时间, 为企业可以带来更多的效益。

4.2 在可视化领域中的应用

在网络通讯技术快速发展的同时, 数据库的数量不断增加, 导致对于数据信息的分析与处理过程中会出现较大的困难, 我们很难从海量的信息数据中快速的找到所需的信息数据, 更无法把掌握数据信息的规律性。而通过计算机图形图像处理技术, 将不同种类、特征的数据分类、归纳, 并以不同形式加以呈现, 如此便可以为我们获取数据信息提供极大的便利。例如, 图形图像处理技术在可视化气象分析、医学以及流体力学等领域中有了很好的应用。

4.3 在动画与艺术领域中的应用

在计算机技术以及图形图像处理技术快速发展与进步的同时, 我们也逐渐的突破了静态图像的限制, 逐步的发展了动画技术。并且, 现代的商业美术领域中, 设计者也多会利用计算机图形图像处理技术, 而完成相关的艺术设计。例如, 对3DMAX、ALins等软件的应用。其中, 一些计算机图形图像处理技术所拥有的功能, 是一般艺术工作者无法达到的水平。

5 结语

计算机图形图像技术被广泛地应用于各个领域中, 通过此技术的应用, 可以呈现出更为完美与新奇的感官效果, 同时更加激发了人们的潜在创作力, 也使得我们的生活更为多样与精彩。

参考文献

[1]罗嘉柃.浅谈计算机技术之计算机动画和计算机图形学[J].黑龙江科技信息, 2016 (07) .

[2]牛成英.浅谈计算机图形学与图形图像处理技术[J].信息化建设, 2016 (06) .

篇4:对计算机图形学的教学探讨

关键词:计算机图形学;教学方法;算法;实践

一、认真组织课堂教学内容

计算机图形学这门功课,没有学习积极性和主动性是很难学好的。难学是学习积极性的主要障碍。因此在教学内容上,应注意以下两點:

1.充分注意学生的接受程度,教学内容要“精”。首先是注重基础,强调基本概念、基本原理,以如何“逼真”地模拟现实世界的物体为主线。其次也要突出重点,对一些要求掌握的算法要仔细分析,强调其基本思想、基本原理。只要算法的基本思想掌握了,算法的实现就容易理解,对相关算法就可举一反三、触类旁通。在教学内容上,也应注意“新”。教学内容的选取应跟上学科发展的步伐,介绍一些当前的研究热点及重要文献,使学生了解学科发展情况,也同时增加课堂教学的趣味性。

2.在教学内容上,还应注意理论与实用软件之间的关系。应介绍计算机图形学的理论、算法在流行的图形设计和动画制作软件(如AutoCAD、3DMAX等)中的应用,促进理论学习和实用软件使用形成互动。如:流行软件中对图形变换、裁剪、消隐等的操作与使用,有助于对图形变换理论、裁减算法、消隐算法等理论知识的学习。

二、注重教学方法和手段

在教学方法上,注意启发性。如在讲画线算法前,应思考:为什么在屏幕上画出直线段时,经常出现锯齿,如何解决,等等。这些问题可以引导学生预习和自学,减轻课堂负担,使课堂教学的目标清晰,任务简化。

强调对比学习方法,对解决同一问题的不同方法进行比较,如Bezier、B样条、NURBS曲线曲面间的比较,CSG树、边界表示法、八叉树表示等实体造型技术间的比较等。

在教学手段上,采用多媒体教学与传统的教学方式相结合,充分发挥图形图示、动画演示的作用,“一幅画胜过千言万语”。我们在教学中制作了多媒体教学课件,而且设计了典型算法(如Bezier曲线、B样条曲线、光线跟踪算法等)演示系统,这些工作对于提高学生学习兴趣、增强原理、算法的理解性具有很大的作用。

三、恰当设计课前、课后习题

习题应与课堂教学、上机实验等环节的工作结合起来。习题可分为课后习题和课前思考题。课前思考题具有一定的引导作用,帮助学生预习和自学,减轻课堂负担,使课堂教学的目标清晰,任务简化。课后习题是对课堂教学内容的消化、吸收、补充、完善和提高。

习题一定要精心设计和选择,特别要避免作业形式单一、难度较大,否则就会使学生产生畏难情绪。注意循序渐进、难易适度。注重基础,注意多层次(如基础知识、算法设计和综合应用题等)、多形式(如判断题、选择题、填空题、简答题、算法设计题、综合应用题等),使学生得到全面的训练。

四、充分重视实验教学

计算机图形学课程具有很强的实践性,上机实验是其重要环节。实验类型分为两部分:一是编程能力的训练,另一个是流行软件的使用。这两方面应有机地结合起来,相互促进,以有利于图形学理论和算法的掌握。学会一种或几种流行的图形设计和动画制作软件(如AutoCAD、3DMAX等)的使用,分析计算机图形学在这些软件中的具体应用,如图层、交互技术(如橡皮筋技术、引力场技术等)等,对学习计算机图形学的理论和学习这些软件本身都是非常有益的。

编程环境可以选择Visual C++/Visual Basic,由学生自己确定。实际上,Visual Basic相对简单易学,而且功能强大,也适合作为计算机图形学实验的编程工具。注意加强实验过程的管理:实验前认真准备,实验过程中认真完成,实验课后认真总结。根据实验过程及实验报告评定每次实验成绩。为确保实验教学的质量,上机实验既要有趣味性,又要有挑战性。

五、课程设计必不可少

课程设计是计算机图形学实践教学的另一个重要环节,是对学生计算机图形学课程以及相关知识的综合测试,课程设计在课程教学的中后期完成。课程设计的题目、要求在该课程的中期给出,题目也可自拟。课程设计任务不宜过难,最好在实验课的基础上进行,可以是实验的综合、改进、完善等。要求在规定的期限内完成所有的文档资料(包括源程序清单、可执行程序等),并评定课程设计成绩,作为课程总成绩的重要组成部分。

六、严格教学的过程化管理与考核

重视教学的过程化管理与考核是保证教学质量的重要手段。对课堂、作业、实验等环节进行有效的管理,及时发现和纠正每一环节中存在的问题。过程化考核体现在评定学生的课程成绩时,全面考核各重要教学环节,如上课、作业、实验、课程设计、期末考试等的学习情况。教师应充分重视学生平时的学习情况,鼓励他们在平时作业、实验、课程设计中独立思考,并有所创新。每次作业、实验都要给出等级,各环节的学习情况都要逐一评定成绩,并按比例记入到课程的总成绩中。

参考文献:

[1]孙家广,扬长贵.计算机图形学[M].北京:清华大学出版社,1996.

篇5:计算机图形学毕业论文

课程名称 : 计算机图形学 实验名称 : 图形绘制与变换 学 院 : 电子信息工程学院 专 业 : 计算机科学与技术 班 级 : 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++提供的 高度可视化的应用程序开发工具和 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)中心点算法画圆

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

考虑第一象限内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);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*()的操作是单位矩阵,也就是对物体没有影响。

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;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;}}} 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){ 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移动后的曲线 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]);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(){ 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);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)实现多面体的上下左右平移(2)实现多面体的绕轴旋转:

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

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

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

五、实验心得体会

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

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

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

实验1-1:

通过循环画线,实现了画四边形的功能

实验1-2:

通过循环设置顶点坐标,循环画线,实现了画7个顶点的金刚石 实验1-3:

通过填充实现了画三彩多边形

实验2-1:

实现了画各种范围不同斜率的直线

实验3-1:

通过Cohen-Sutherland算法和清屏重画实现了金刚石的区域裁剪 实验4-1:

通过不断地清屏重画实现了北极星的平移、比例、旋转、对称 实验5-1:

上一篇:促织中职语文下一篇:野营策划书