#include<graphicsh>
#include<stdlibh>
#define PI 314159
void WhirlCircle(int x,int y,int r)
{
int i;
clearviewport();
while(!kbhit())
{
for(i=1;i<=21600;i++)
{
if(i%5400==0) setcolor(random(14)+1);
line(x,y,x+rcos(iPI/10800),y-rsin(iPI/10800));
}
}
getch();
}
void main()
{
int gd=DETECT,gm;
initgraph(&gd,&gm,"");
WhirlCircle(320,240,100);
closegraph();
}
以Microsoft公司的Windows *** 作系统为例,Win32应用程序设计接口(API)使用四种坐标空间:世界坐标系空间、页面空间、设备空间、和物理设备空间。应用程序运用世界坐标系空间对图形输出进行旋转、斜切或者反射。而Win32 API把世界坐标系空间和页面空间称为逻辑空间;最后一种坐标空间(即物理设备空间)通常指应用程序窗口的客户区;但是它也包括整个桌面、完整的窗口(包括框架、标题栏和菜单栏)或打印机的一页或绘图仪的一页纸。物理设备的尺寸随显示器、打印机或绘图仪所设置的尺寸而变化。
如要在物理设备上绘制输出,Windows把一个矩形区域从一个坐标空间拷贝到(或映射到)另一个坐标空间,直至最终完整的输出呈现在物理设备上(通常是屏幕或打印机)。如果该应用程序调用了SetWorldTransform函数,那么映射就从应用程序的世界坐标系空间开始;否则,映射在页面空间中进行。在Windows把矩形区域的每一点从一个空间拷贝到另一个空间时,它采用了一种被称作转换的算法,转换是把对象从一个坐标空间拷贝到另一个坐标空间时改变(或转变)这一对象的大小、方位、和形态,尽管转换把对象看成一个整体,但它也作用于对象中的每一点或每条线。
本文同时发布在我的个人博客上: >
如何在计算机中表示图形,以及如何利用计算机进行图形的生成、处理和显示的相关原理与算法,构成了计算机图形学的主要研究内容。从处理技术上来看,图形主要分为两类,一类是由线条组成的图形,如工程图、等高线地图、曲面的线框图等,另一类是类似于照片的明暗图(Shading),也就是通常所说的真实感图形。[2]
可以说,计算机图形学的一个重要研究内容就是要利用计算机产生令人赏心悦目的真实感图形。计算机图形学与另一门学科-计算机辅助几何设计有着密切的关系。事实上,图形学也把可以表示几何场景的曲线曲面造型技术和实体造型技术作为其重要的研究内容。同时,真实感图形计算的结果是以数字图象的方式提供的,计算机图形学也就和图象处理有着密切的关系。图形与图象两个概念间的区别越来越模糊,但我们认为还是有区别的:图象纯指计算机内以位图(Bitmap)形式存在的灰度信息。
计算机图形学的研究内容非常广泛,如图形硬件、图形标准、图形交互技术、光栅图形生成算法、曲线曲面造型、实体造型、真实感图形计算与显示算法,以及科学计算可视化、计算机动画、自然景物仿真、虚拟现实等。作为一本面向计算机专业本科生和非计算机专业研究生的图形学教材,本书着重讨论与光栅图形生成、曲线曲面造型和真实感图形生成相关的原理与算法。[3]
主要组成
图形通常由点、线、面、体等几何元素和灰度、色彩、线型、线宽等非几何属性组成。从构成要素上看,图形主要分为两类,一类是几何要素在构图中具有突出作用的图形,如工程图、等高线地图、曲面的线框图等,另一类非几何要素在构图中具有突出作用的图形,如明暗图、晕渲图、真实感图形等。
主要目的
计算机图形学一个主要的目的就是要利用计算机产生令人赏心悦目的真实感图形。为此,必须建立图形所描述的场景的几何表示,再用某种光照模型,计算在假想的光源、纹理、材质属性下的光照明效果。所以计算机图形学与另一门学科计算机辅助几何设计有着密切的关系。事实上,图形学也把可以表示几何场景的曲线曲面造型技术和实体造型技术作为其主要的研究内容。同时,真实感图形计算的结果是以数字图像的方式提供的,计算机图形学也就和图像处理有着密切的关系。
概念区分
图形与图像两个概念间的区别越来越模糊,但还是有区别的:图像纯指计算机内以位图形式存在的灰度信息,而图形含有几何属性,或者说更强调场景的几何表示,是由场景的几何模型和景物的物理属性共同组成的。
研究范围
计算机图形学的研究内容非常广泛,如图形硬件、图形标准、图形交互技术、光栅图形生成算法、曲线曲面造型、实体造型、真实感图形计算与显示算法、非真实感绘制,以及科学计算可视化、计算机动画、自然景物仿真、虚拟现实等。
2学科历史
编辑
伊凡·苏泽兰1963年,伊凡·苏泽兰(Ivan Sutherland)在麻省理工学院发表了名为《画板》的博士论文, 它标志着计算机图形学的正式诞生。至今已有四十多年的历史。此前的计算机主要是符号处理系统,自从有了计算机图形学,计算机可以部分地表现人的右脑功能了,所以计算机图形学的建立具有重要的意义。计算机图形学在如下几方面有了长足的进展:
智能CAD
CAD 的发展也显现出智能化的趋势,就大多数流行的CAD软件来看,主要功能是支持产品的后续阶段一一工程图的绘制和输出,产品设计功能相对薄弱, 利用AutoCAD最常用的功能还是交互式绘图,如果要想进行产品设计, 最基本的是要其中的AutoLisp语言编写程序,有时还要用其他高级语言协助编写,很不方便。而新一代的智能CAD 系统可以实现从概念设计到结构设计的全过程。例如,德国西门子公司开发的Sigraph Design软件可以实现如下功能:① 从一开始就可以用计算机设计草图,不必耗时费力的输入精确的坐标点,能随心所欲的修改,一旦结构确定,给出正确的尺寸即得到满意的图纸;② 这个软件中具有关系数据结构, 当你改变图纸的局部,相关部分自动变化,在一个视图上的修改,其他视图自动修改,甚至改变一个零件图,相关的其它零件图以及装配图的相关部分自动修改:③ 在各个专业领域中,有一些常用件和标准件, 因此,希望有一个参数化图库。而Sigraph不用编程只需画一遍图就能建成自己的图库;④Sigraph还可以实现产品设计的动态模拟用于观察设计的装置在实际运行中是否合理等等。智能CAD的另一个领域是工程图纸的自动输入与智能识别,随着CAD技术的迅速推广应用,各个工厂、设计院需要把成千上万张长期积累下来的设计图纸快速而准确输入计算机,作为新产品开发的技术资料。多年来,CAD 中普遍采用的图形输入方法是图形数字化仪交互输入和鼠标加键盘的交互输入方法.很难适应工程界大量图纸输入的迫切需要。因此, 基于光电扫描仪的图纸自动输入方法已成为国内外CAD工作者的努力探索的新课题。但由于工程图的智能识别涉及到计算机的硬件、计算机图形学、模式识别及人工智能等高新技术内容,使得研究工作的难点较大。工程图的自动输入与智能识别是两个密不可分的过程,用扫描仪把手绘图纸输入到计算机后,形成的是点阵图象。CAD 中只能对矢量图形进行编辑, 这就要求把点阵图象转化成矢量图形.而这些工作都让计算机自动完成.这就带来了许多的问题.如① 图象的智能识别;② 字符的提取与识别;③ 图形拓扑结构的建立与图形的理解;④实用化的后处理方法等等。国家自然科学基金会和863计划基金都在支持这方面的研究, 国内外已有一些这方面的软件付诸实用,如美国的RVmaster,德国的VPmax, 以及清华大学,东北大学的产品等。但效果都不很理想.还未能达到人们企盼的效果。
美术与设计
计算机美术的发展
1952年.美国的Ben .Laposke用模拟计算机做的波型图《电子抽象画》预示着电脑美术的开始(比计算机图形学的正式确立还要早)。计算机美术的发展可分为三个阶段。
代表作品:1960年Wiuiam Ferrter为波音公司制作的人体工程学实验动态模拟.模拟飞行员在飞机中各种情况;1963年Kenneth Know Iton的打印机作品《裸体》。1967年日本GTG小组的《回到方块》。
伦敦第一次世界计算机美术大展一“控制论珍宝 (Cybernehic Serendipity1为标志,进入世界性研究与应用阶段;计算机与计算机图形技术逐步成熟, 一些大学开始设置相关课题, 出现了一些CAD应用系统和成果, 三维造型系统产生并逐渐完善。
代表作品:1983年美国IBM 研究所Richerd Voss设计出分形山(可到网站“分形频道hrtp:ttfracta1.126.tom 中查找有关“分形”的知识)
个人计算机图形系统逐渐走向成熟, 大批商业性美术(设计)软件面市; 以苹果公司的MAC 机和图形化系统软件为代表的桌面创意系统被广泛接受,CAD成为美术设计领域的重要组成部分。
代表作品:1990年Jefrey Shaw的交互图形作品“易读的城市f The legible city) 。
计算机设计学
(Computer Designics)
包括三个方面:环境设计(建筑、汽车)、视觉传达设计(包装)、产品设计。
CAD对艺术的介入,分三个应用层次。
计算机动画艺术
1历史的回顾
计算机动画技术的发展是和许多其它学科的发展密切相关的。计算机图形学、计算机绘画、计算机音乐、计算机辅助设计、**技术、电视技术、计算机软件和硬件技术等众多学科的最新成果都对计算机动画技术的研究和发展起着十分重要的推动作用50年代到60年代之间,大部分的计算机绘画艺术作品都是在打印机和绘图仪上产生的。一直到60年代后期,才出现利用计算机显示点阵的特性,通过精心地设计图案来进行计算机艺术创造的活动。
70年代开始,计算机艺术走向繁荣和成熟。1973 年,在东京索尼公司举办了“首届国际计算机艺术展览会”80年代至今,计算机艺术的发展速度远远超出了人们的想象 在代表计算机图形研究最高水平的历届SIGGRAPH年会上,精彩的计算机艺术作品层出不穷。另外,在此期间的奥斯卡奖的获奖名单中,采用计算机特技制作**频频上榜,大有舍我其谁的感觉。在中国,首届计算机艺术研讨会和作品展示活动于1995年在北京举行 它总结了计算机艺术在中国的发展,对未来的工作起到了重要的推动作用。
玩具总动员2**特技
计算机动画的一个重要应用就是制作**特技 可以说**特技的发展和计算机动画的发展是相互促进的。1987年由著名的计算机动画专家塔尔曼夫妇领导的MIRA 实验室制作了一部七分钟的计算机动画片《相会在蒙特利尔》 再现了国际影星玛丽莲·梦露的风采。1988年,美国**《谁陷害了兔子罗杰》 (Who Framed Roger Rabbit)中二维动画人物和真实演员的完美结合,令人瞠目结舌、叹为观止 其中用了不少计算机动画处理。1991年美国**《终结者II:世界末日》展现了奇妙的计算机技术。此外,还有《侏罗纪公园》(Jurassic Park)、《狮子王》、《玩具总动员》(Toy Story)等。
3国内情况
中国的计算机动画技术起步较晚。1990年的第11届亚洲运动会上,首次采用了计算机三维动画技术来制作有关的电视节目片头。从那时起,计算机动画技术在国内影视制作方面得到了迅速的发展, 继而以3D Studio 为代表的三维动画微机软什和以Photostyler、Photoshop等为代表的微机二维平面设计软件的普及,对中国计算机动画技术的应用起到了推波助谰的作用。2006年由环球数码制作了中国第一部3D动画**《魔比斯环》。
计算机动画的应用领域十分宽广 除了用来制作影视作品外, 在科学研究、视觉模拟、电子游戏、工业设计、教学训练、写真仿真、过程控制、平面绘画、建筑设计等许多方面都有重要应用,如军事战术模拟
科学计算可视化
科学计算的可视化是发达国家八十年代后期提出并发展起来的一门新兴技术,它把科学计算过程中及计算结果的数据转换为几何图形及图象信息在屏幕上显示出来并进行交互处理,成为发现和理解科学计算过程中各种现象的有力工具。
1987年2月英国国家科学基金会在华盛顿召开了有关科学计算可视化的首次会议。会议一致认为“把图形和图象技术应用于科学计算是一个全新的领域” 科学家们不仅需要分析由计算机得出的计算数据,而且需要了解在计算机过程中数据的变化。会议把这一技术定名为“科学计算可视化(Visualization in Scientific Computing)”。科学计算可视为把图形生成技术图象理解技术结合在一起, 它即可理解送入计算机的图象数据.也可以从复杂的多维数据中产生图形。它涉及到下列相互独立的几个领域:计算机图形学、图象处理、计算机视觉、计算机辅助设计及交互技术等。科学计算可视按其实现的功能来分, 可以分为三个档次:(1)结果数据的后处理;(2)结果数据的实时跟踪处理及显示;(3)结果数据的实时显示及交互处理。
可视化现状
这是美国国家宇航局(Ames)研究中心的研究项目,包括连接到一台超能计算机上的两个虚拟屏幕。这一共享的分布式虚拟环境用来实现三维不稳定流场。两个人协同工作, 可在一个环境中从不同视点和观察方向同一流场数据。
这是美国国家超级计算机应用中心(NCSA)的研究项目. 是在交互分布环境下研究大气流体的软件。PHTHFINDER通过多个相联系的模型来研究暴风雨。
心脏CT数据的动态显示
这也是NCSA的研究项目,它利用远程的并行计算资源.用体绘制技术实现CT扫描三维数据场动态显示。其具体内容是显示一个狗的心脏跳动周期的动态图像。
动态模型的可视化
这是美国西北大学的研究项目.可以显示发生在非烧热的气体燃烧中复杂的空问瞬态图象。火焰位于两个同心圆柱之间.可燃混合气体从内圆柱注入,燃烧所生成的物质通过外圆柱送出。
依利诺大学芝加哥分校研制了一个在工作站和超级计算机上实现的可视亿应用软件。其内容是对一个七周的人类胚胎实现交互的三维显示,是由卫生和医学国家博物馆所得到的数据重构而成的。这一项目表示了对人类形态数据实现远程访问和在网络资源中实现分布计算的可能性。美国还会做整个人体的可视化, 他们把两个自愿者(一男一女)做成了切片,男的被切了1780片, 厚度约1毫米,女的被切了5400片, 厚度约O.3毫米,数据量很大。概括起来有以下几点:
空气动力学、数学、医学图象等领域。科学计算可视化的技术水平正在从后处理向实时跟踪和交互控制发展。
虚拟现实
吉布森“虚拟现实”(Virtual Reality)- 词是由美国喷气推动实验室(VPL)的创始人拉尼尔(Jaron Lanier)首先提出的 在克鲁格(Myren Kruege)70年代中早期实验里.被称为 人工现实”(Artificial reality);而在吉布森(William Gibson)1984 年出版的科幻小说Neuremanccr里,又被称为“可控空间”(Cyberspaee)。虚拟现实, 也育人称之为虚拟环境(Virtual Environment)是美国国家航空和航天局及军事部门为模拟而开发的一门高新技术 它利用计算机图形产生器,位置跟踪器,多功能传感器和控制器等有效地模拟实际场景和情形,从而能够使观察者产生一种真实的身临其境的感觉虚拟环境由硬件和软件组成,硬件部分主要包括:传感器(Sensors)、印象器(Efeeter)和连接侍感器与印象器 产生模拟物理环境的特殊硬件。利用虚拟现实技术产生虚拟现实环境的软件需完成以下三个功能:建立作用器(Actors)以及物体的外形和动力学模型:建立物体之间以及周围环境之间接照牛顿运动定律所决定的相互作用;描述周围环境的内容特性
虚拟现实,是指由计算机实时生成一个虚拟的三维空间。这个空间可以是小到分子、原子的微观世界,或是大到天体的宏观世界,也可以是类似于真实社会的生活空间。它可以乱真,所以又称之为虚拟现实。用户可以在这个三维空间中“自由”地走动,随意地观察,并可通过一些设备与其中的虚拟景物进行交互 *** 作。交互是多通道的,自然的,用以传递信息的可以是一个手势、一个眼神,也可以是一个表情等。在此环境中,用户看到的是由计算机生成的逼真图像,听到的是虚拟环境中的声音,身体感受到的是虚拟环境所反馈的作用力,由此产生身临其境的感觉。
虚拟现实技术主要研究用计算机模拟(构造)三维图形空间,并使用户能够自然地与该空间进行交互。它涉及很多科学的知识,对三维图形处理技术的要求特别高。简单的虚拟现实系统早在70年代便被应用于军事领域,训练驾驶员。80年代后随着计算机软硬件技术的提高,它也得到重视并迅速发展。它已在航空航天、医学、教育、艺术、建筑等领域得到初步的应用。例如,1997年7月,美国航天局的旅居者号火星车着陆距地球约19亿公里的火星。这辆在火星表面缓慢爬行的小车中并没有驾驶员,它是由地球上的工程师通过虚拟现实系统 *** 纵的。
虚拟现实应用
1用于脑外科规划的双手 *** 作空间接口工具
美国弗尼亚大学推出了一种能用于脑外科规划的被称为Netra的双手 *** 作空间接口工具,根据脑外科医生的工作环境和习惯,该系统采用一种外形象人头的控制器。脑外科医生可以根据他们的职业习惯,通过转动外形象人头的控制器, 来方便地观察人脑的不部位, 同时通过右手控制面板的平面来控制人脑的剥面的扫描井能根据CT或强磁共振图像所产生的主体脑模型显示所需得到观察视点着色后的真实图像。
2虚拟环境用于恐高症治疗
英国研制的一个虚拟现实系统可以产生以下虚拟环境:① 透明的玻璃电梯,② 高层建筑阳台.@位于蛱咎之上的索桥。为了增加真实的感觉,患者除了佩戴能够产生三维立体景象的头盔式显示器外,还必须站在一个特制的框架内。调节电梯、.阳台和索桥的高度就可以产生不同程度的刺激。
3虚拟风洞
德国信息技术国家研究中心的克鲁格等人建立了一个所谓的“虚拟风嗣 ,用以代替风洞实验(因风洞实验成本高,且实验难以控制)。在虚拟风洞中,其模拟的数据来自超级计算机或高性能工作站上运行的有限元程序。利用虚拟风洞,观测者通过佩戴液晶开关眼镜可以方便地对于给定的点和线进行观察,而且还可以通过放大的方式进行更细致的研究,大大方便了人们对于物体动力中特性的研究。
4封闭式战斗作战训练器
封闭式战斗作战训练器(CCTT)是马斯塔格利等人为美军研制的用于坦克和机械化步兵在实际地形上进行演习的模拟装置。它与通常的虚拟环境和模拟器不同,它需要建立的是适用于军队训练的大规模复杂的虚拟环境。
5虚拟现实技术在建筑设计中应用
虚拟现实技术还被广泛用于建筑设计。克鲁格等把他们设计的未来建筑显现在他们发明的虚拟工作平台上,建筑学家们聚集在一起透过所佩戴的液晶眼镜,可以看到设计的立体建筑,井方便地增添或移去建筑的一部分或其它物体。同时也可以通过数据手套来设置不同的光源。模拟不同时间的日光和月光。观察在不同光线下所设计建筑的美感以及与整个环境的协调性。
地理信息系统
地理信息系统(GIS: Geographical Information System)是建立在地理图形之上的关于人口、矿藏、森林、旅游等资源的综合信息管理系统。它在发达国家中已得到广泛应用,中国也对其开展了广泛的研究与应用。在地理信息系统中,计算机图形学技术被用来产生高精度的各种资源的图形,包括地理图、地形图、森林分布图、人口分布图、矿藏分布图、气象图、水资源分布图等等。地理信息系统为管理和决策者提供非常有效的支持。
总之.虚拟现实技术是一门多学科交叉和综合集成的新技术。因此, 它的发展会取决于相关科学技术的发展和进步 虚拟现实技术最基本的要求就是反映的实时性和场景的真实性。但一般来说,实时性与真实性往往是相互矛盾的。
用户界面
用户界面是计算机系统中人与计算机之间相互通讯的重要组成部分。八十年代以WIMP(窗口、图符、菜单、鼠标)为基础的图形用户界面(GUD极大地改善了计算机的可用性、可学性和有效性,迅速代替了命令行为代表的字符界面,成为当今计算机用户界面的主流。以用户为中心的系统设计思想.增进人机交互的自然性,提高人机交互的效率和带宽是用户界面的研究方向。于是提出了多通道用户界面的思想,它包括语言、姿势输入、头部跟踪、视觉跟踪、立体显示、三维交互技术、感觉反馈及自然语言界面等。可以这样说人体的表面就是人机界面。人体的任何部分都应成为人机对话的通道。虚拟现实显示是关键所在,这不仅要求软件来实现,更主要的是硬件上的实现。概括起来虚拟现实的人机交互通道可分为两个方面:主要的感觉通道和主要作用通道。
虚拟现实的发展要求必会带动计算机图形学各学科的发展。同样虚拟现实的发展也会依赖于其他学科的发展,计算机图形前景诱人。形势逼人(中国还比较落后),但通过努力还是可以缩短差距的。
import javaawt;
import javaawtevent;
import javaio;
import javaxswing;
import javaxswingevent;
import javaxswingfilechooserFileFilter;
import static javaawteventInputEvent;
import javaawtdatatransfer;
import javautilEnumeration;
import javautilHashtable;
/import javaxswing;
import javaxswingfilechooserFileFilter;
import javaawtevent;
import javaawt;
import javaioBufferedReader;
import javaioBufferedWriter;
import javaioFile;
import javaioFileNotFoundException;
import javaioFileReader;
import javaioFileWriter;
import javaioIOException;/
class jishiben
{
public static void main(String args[])
{
TextEdit TE=new TextEdit("记事本");
}
}
class TextEdit extends Frame implements ActionListener
{
MenuBar m;
Menu m1,m2;
MenuItem xinjian,dakai,baocun,tuichu,jianqie,fuzhi,zhantie;
TextArea text;
String filename;
FileDialog openFD,saveFD;
BufferedReader in;
FileReader read;
BufferedWriter out;
FileWriter writer;
Clipboard cb;
TextEdit(String s)
{
super(s);
m=new MenuBar();
m1=new Menu("文件");
xinjian=new MenuItem("新建");
dakai=new MenuItem("打开");
baocun=new MenuItem("保存");
tuichu=new MenuItem("退出");
m2=new Menu("编辑");
jianqie=new MenuItem("剪切");
fuzhi=new MenuItem("复制");
zhantie=new MenuItem("粘贴");
text=new TextArea();
openFD=new FileDialog(this,"打开",FileDialogLOAD);
saveFD=new FileDialog(this,"保存",FileDialogSAVE);
filename="NoName";
m1add(xinjian);
m1addSeparator();
m1add(dakai);
m1addSeparator();
m1add(baocun);
m1addSeparator();
m1add(tuichu);
m2add(jianqie);
m2addSeparator();
m2add(fuzhi);
m2addSeparator();
m2add(zhantie);
madd(m1);
madd(m2);
//关键部分,没有为cb申请内存,下面对cb *** 作会出错
cb = new Clipboard("nothing");
//
setMenuBar(m);
setSize(300,400);setVisible(true);
add(text,"Center");
xinjianaddActionListener(this);
dakaiaddActionListener(this);
baocunaddActionListener(this);
tuichuaddActionListener(this);
jianqieaddActionListener(this);
fuzhiaddActionListener(this);
zhantieaddActionListener(this);
addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
Systemexit(0);
}
});
}
public void actionPerformed(ActionEvent e)
{
if(egetSource()==xinjian)
{
textsetText("");
}
if(egetSource()==dakai)
{
openFDshow();
String s;
filename=openFDgetDirectory()+openFDgetFile();
if(filename!=null)
{
try
{
File file=new File(filename);
read=new FileReader(file);
in=new BufferedReader(read);
while((s=inreadLine())!=null)
textappend(s+'\n');
inclose();
readclose();
}
catch(IOException e2){}
}
}
if(egetSource()==baocun)
{
saveFDshow();
filename=saveFDgetDirectory()+saveFDgetFile();
if(filename!=null)
{
try
{
File file=new File(filename);
writer=new FileWriter(file);
out=new BufferedWriter(writer);
outwrite(textgetText(),0,(textgetText())length());
outclose();
writerclose();
}
catch(IOException e2){}
}
}
if(egetSource()==tuichu)
{
Systemexit(0);
}
if(egetSource()==jianqie)
{
//类text中没有cut方法,不能使用textcut
String s=textgetSelectedText();
StringSelection select=new StringSelection(s);
cbsetContents(select,null);
textreplaceRange("",textgetSelectionStart(),textgetSelectionEnd());
}
if(egetSource()==fuzhi)
{
//同上,没有copy这个方法
String s=textgetSelectedText();
StringSelection select=new StringSelection(s);
cbsetContents(select,null);
}
if(egetSource()==zhantie)
{
//同上,没有paste方法
String s="";
Transferable t = cbgetContents(null);
try
{
if (t != null
&& tisDataFlavorSupported(DataFlavorstringFlavor))
{
// 因为原系的剪贴板里有多种信息, 如文字, , 文件等
// 先判断开始取得的可传输的数据是不是文字, 如果是, 取得这些文字
s = (String)tgetTransferData(DataFlavorstringFlavor);
// 同样, 因为Transferable中的DataFlavor是多种类型的,
// 所以传入DataFlavor这个参数, 指定要取得哪种类型的Data
//Systemoutprintln(s);
}
}
catch (UnsupportedFlavorException ex)
{
exprintStackTrace();
}
catch (IOException ex)
{
exprintStackTrace();
}
textinsert(s,textgetCaretPosition());
}
}
}
填充算法满复杂的,常用的有活动边表填充,我以前也尝试用c#做图形学的程序。现在假设你知道填充算法,需要注意的是,c#中Graphics类没有setPixel()方法。你需要创建一个image(位图)对象,在位图中进行填充,然后再用Graphics类中的setImage()方法将位图显示在屏幕中。大概是这样,时间很长了,里面一些方法可能不太对,详细你查msdn,祝你成功!
#include <gl/gluth>
#define WIDTH 400
#define HEIGHT 400
#include <mathh>
#define ColoredVertex(c, v) do{ glColor3fv(c); glVertex3fv(v); }while(0) //这段就不用解释了吧……
GLfloat angle = 00f; //设定转角
void myDisplay(void) //绘图函数
{
static int list = 0;
if( list == 0 )
{
// 如果显示列表不存在,则创建
GLfloat //GLfloat为OpenGL用到的数据类型,与C的float基本一致
PointA[] = {-05, -5sqrt(5)/48, sqrt(3)/6}, //此处为4个顶点的坐标,因为时3D坐标系下的,所以每个坐标有3个分量,分别对应X,Y,Z轴。至于各轴方向定义……默认下屏幕水平为X,竖直为Y,里外为Z。
PointB[] = { 05, -5sqrt(5)/48, sqrt(3)/6},
PointC[] = { 0, -5sqrt(5)/48, -sqrt(3)/3},
PointD[] = { 0, 11sqrt(6)/48, 0};
/GLfloat
PointA[] = { 05f, -sqrt(60f)/12, -sqrt(30f)/6},
PointB[] = {-05f, -sqrt(60f)/12, -sqrt(30f)/6},
PointC[] = { 00f, -sqrt(60f)/12, sqrt(30f)/3},
PointD[] = { 00f, sqrt(60f)/4, 0};
/
GLfloat
ColorR[] = {1, 0, 0}, //定义颜色数组,每个数组为一个颜色,也含有3个分量,对应红,绿,蓝,分量范围[0,1],每种颜色都可看做是这3个颜色混合得到。可一自己改变下其中的数值看看具体效果。
ColorG[] = {0, 1, 0},
ColorB[] = {0, 0, 1},
ColorY[] = {1, 1, 0};
list = glGenLists(1);
glNewList(list, GL_COMPILE); //创建一个顶点表,这个表里包含有绘图的顶点信息
glBegin(GL_TRIANGLES); //开始绘图,(GL_TRIANGLES)表示绘制三角形
// 平面ABC
ColoredVertex(ColorR, PointA); //以颜色R绘制点A,以下类推,ColoredVertex()函数在程序开头定义了。
ColoredVertex(ColorG, PointB);
ColoredVertex(ColorB, PointC);
// 平面ACD
ColoredVertex(ColorR, PointA);
ColoredVertex(ColorB, PointC);
ColoredVertex(ColorY, PointD);
// 平面CBD
ColoredVertex(ColorB, PointC);
ColoredVertex(ColorG, PointB);
ColoredVertex(ColorY, PointD);
// 平面BAD
ColoredVertex(ColorG, PointB);
ColoredVertex(ColorR, PointA);
ColoredVertex(ColorY, PointD);
glEnd();
glEndList(); //结束绘图 结束绘图顶点表。
glEnable(GL_DEPTH_TEST); //打开深度测试。打开深度测试的作用是:如果在场景中有多个物体,而它们相对观察者的距离不同(简单理解为远近),那么这个时候,前面的物体则可以挡住后面的物体(没错吧),使场景具有深度感。如果不打开深度测试,那么绘图会按绘制的顺序,后绘制的物体覆盖住现绘制的物体。这里要注意的是,深度仅影响物体重合时谁显示谁不显示,并不影响其3D效果,远处的物体仍然会变“小”,物体在空间中的位置仍为三维的。
}
// 已经创建了显示列表,在每次绘制正四面体时将调用它
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //清除颜色缓存和深度缓存
glPushMatrix(); //绘图坐标系入栈,可以简单理解为存下了这次画图时画笔的起始位置
glRotatef(angle, 1, 05, 0); //绘图坐标系绕(1,05,0)轴旋转angle角,可理解为模型绕该轴旋转angle角。
glCallList(list); //调用顶点表,绘制四面体模型
glPopMatrix(); //绘图坐标系出栈,则回到了刚才的绘图起始位置
glutSwapBuffers(); //使用双缓存(第一个在前面显示模型,另一个在后面绘制新的模型,当新模型绘制完毕后送给第一个缓存显示。这样不会出现模型上一些点已经绘制完了,而另一些点还在绘制的情况。)
}
void myIdle(void)
{
++angle;
if( angle >= 3600f )
angle = 00f; //转角超过360度,将其置零。
myDisplay(); //绘制模型}
int main(int argc, char argv[]) { glutInit(&argc, argv); //创建绘图窗口
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE); //设置绘图模式
glutInitWindowPosition(200, 200); //设置窗口位置
glutInitWindowSize(WIDTH, HEIGHT); //设置窗口大小
glutCreateWindow("OpenGL 窗口"); //设置窗口标题
glutDisplayFunc(&myDisplay); //重复调用函数
glutIdleFunc(&myIdle);//重复调用函数
glutMainLoop(); //该循环用来对上述两个重复调用函数不断调用
return 0;
}
回答完毕。
以上就是关于懂C语言的高手进来帮帮忙! 有关计算机图形学,画一辆会动的自行车程序。我的编译没错,可是不能运行。全部的内容,包括:懂C语言的高手进来帮帮忙! 有关计算机图形学,画一辆会动的自行车程序。我的编译没错,可是不能运行。、详述物体在计算机中的显示流程,计算机图形学中的。、计算机图形学(OPENGL):帧缓冲等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)