(计算机软件与理论专业论文)霓虹灯cad网格编辑.pdf_第1页
(计算机软件与理论专业论文)霓虹灯cad网格编辑.pdf_第2页
(计算机软件与理论专业论文)霓虹灯cad网格编辑.pdf_第3页
(计算机软件与理论专业论文)霓虹灯cad网格编辑.pdf_第4页
(计算机软件与理论专业论文)霓虹灯cad网格编辑.pdf_第5页
已阅读5页,还剩40页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

摘要 霓虹灯动态效果设计是霓虹灯行业的重要组成部分,其关键在于扫描方式的设计。 传统设计方法存在着工作强度大、设计周期长、重复工作多与不能即时看到设计效果等 缺陷。针对以上不足,设计编写了套霓虹灯c a d 系统。系统内置了丰富多样的扫描 方式,对于霓虹灯的一些常见动态效果都提供了系统级的支持,而且允许用户自定义花 样。系统采用面向对象的设计方法,具有良好的接口,可供未来对新的扫描方式进行扩 展。通过本系统可以方便的对霓虹灯动态效果进行设计及演示,从而提高工作效率。本 文阐述了系统的整体结构及网格编辑模块的具体实现,并详细讨论了其中的参数抽象、 花样分层等问题。 关键字:霓虹灯扫描方式网格编辑 a b s t r a c t a b s t r a c t t h ed c s i 弘o fn c o o 重i g h t s d ) i i i 础e f f e c ti s eo ft h em o s ti m p o r t a n tp a r t so ft h e n e o n - l i g l 吐i n e i l | s l r y , t h e k e y o f w h i c h i s t h e d e s i g n o f s c a n n i n g m o d e t h e r e a r es o m c d e f e c t s i n t r a d i t i o n a ld e s i g nm e t h o d s s u c h 签g r e a tp 【n e ro fw o r k , l o n gd e s i g n i n gc y c l e , e x c e s s i v e d u p l i c a t el a b 0 ls i g h t l e s so fi m m e d i a t ed e s i g n i n ge f f e c ta n ds oo i la i ma t a l lo fa b o v e , a n e o n a i g h tc a ds y s t e mh a s b e e nd e s 培吼v a r i o u ss c a n n i n gn l o d ci sb u i l ti nt h es y s - t e l n w h i c h o f f e r ss y s t e m - l e v e ls u p p o r tf o rt h em o s tc o m m o ns c a nm o d e , a n du s e i sc a l ld e f i n ep a t t e r na s t h e yl i k e o b j e c t - o r i e n t e dd e s i g nm e t h o di sa d o p t e di nt h i ss y s t e m , s o i th a sg o o di n t e r f a c e sa n d c a ne x p a n df o rn e w s c a n n i n gm o d e i nf u t u r e i ft h i ss y s t e mi su s e di np r a c t i c e , t h ed e s i g na n d v i s u a l i z a t i o no ft h en e o nl i g h t s d y m i ce f f e c ti sc o n v e n i e n ta n dw o r k i n ge f f i c i e n c yc a nb e i m p r , w 融t h i sp a p e rc l e a r l yi n t r o d u c e dt h ei n t e g r a t e dd e s i g no ft h es y s t e ma n dt h e i m p l e m e n t a t i o nm e t h o do ft h eg r i d - e d i t i n gm o d u l e s o m eq u e s t i o n ss u c ha st h ep a r a m e t e r a b s t t a t a i o na n dt h ep a t t e r nl a y e r i n ga r ed i s c u s s e di nd e t a i l k e y w o r d :n e o n 出s c a nm o d e 酬e d i t i n g 创新性声明 本人声明所呈交的论文是我个人在导师指导下进行的研究工作及取得的研 究成果。尽我所知,除了文中特别加以标注和致谢中所罗列的内容以外,论文中 不包含其他人已经发表或撰写过的研究成果;也不包含为获得西安电子科技大学 或其它教育机构的学位或证书而使用过的材料。与我一同工作的同志对本研究所 做的任何贡献均已在论文中做了明确的说明并表示了谢意。 本人签名:桶到蠢劾 日期:丝1 2 型:兰! 关于论文使用授权的说明 本人完全了解西安电子科技大学的有关保留和使用学位论文的规定,即:学 校有权保留送交论文的复印件,允许查阅和借阅论文;学校可以公布论文的全部 或部分内容,可以允许采用影印、缩印和其他复制手段保存论文。( 保密论文在 解密后遵守此规定) 本学位论文属于保密,在年解密后适用本授权书。 本人签名: 他从彩 导师签名: 日期: 日期:基 第1 章绪论 第1 章绪论 1 1 霓虹灯简介 霓虹灯是电光源产品的个分支,属冷阴极辉光放电光源峨据考证,它的名称是 从“n e o nl a m p ”( 一说“n e o ns i g n ”) 翻译而来,这里的“n e o n ”词指的是稀 有气体元素氖。在早期制作的霓虹灯内充入的稀有气体是氖( n e o n ) ,因此n e o n a m p 按意译可译为氖气灯,音译为霓虹灯。霓虹灯起源于1 9 1 0 年,法国人克洛德做成了世界 上第一用于商业照明的霓虹灯管,二十世纪二十年代,霓虹灯技术传入上海,从此,霓 虹灯技术在中国大地上生根发芽,得到了蓬勃地发展【2 l 。 霓虹灯的幅射光谱具有极强的穿透大气的能力,色彩鲜艳绚丽、多姿,发光效率明 显优于普通的白炽灯,它的线条结构表现力丰富,可以加工弯制成任何几何形状,满足 设计要求,通过电子程序控制,可变幻色彩的图案和文字,受到人们的欢迎。霓虹灯的 亮、美、动特点,是目前任何电光源所不能替代的,在各类新型光源不断涌现和竞争中 独领风月登习。 目前,霓虹灯装饰工程的设计一般按照下列程序进行: ( 1 ) 设计构思:征询客户绘出初步草图,需要考虑霓虹灯广告显示的主题内容、结 构的尺寸与形状、选择的颜色、字体风格等; ( 2 ) 概要设计阶段:设计人员根据双方初步达成的协议进行精细的画面设计,并作 出效果图,提出工程造价预算; 鳓详细设计阶段:进行具体的图案、灯管、框架与衬底金属字或灯箱设计,供生 产实施的图案应以1 :1 的比例绘制出来,灯管的所有加工尺寸与包络线,以 及灯管的连接,应准确地定位在图样上。此阶段所涉及的主要为霓虹灯的制作、 安装工艺。 其中绘制效果图即霓虹灯的设计是非常重要的一个环节。从广义上讲,霓虹灯的效 果泛指动态或静态效果,而事实上通常所指的霓虹灯效果其实是指动态霓虹灯效果。动 态效果设计是霓虹灯达到理想视觉广告效果、引起人们注意的关键步骤之一,优秀的动 态效果可以使霓虹灯广告产生动静结合、行云流水的艺术效果。而如何能方便快捷地设 计并表达出设计方案,这也是霓虹灯产业一直研究的一个重要课题。 虽然目前霓虹灯在制作、安装工艺方面已经有了极大的进步,但是霓虹灯效果设计 方面却仍不够理想。目前多数都是利用现成的广告设计或动画软件,加上自行添加的一 些功能,进行霓虹灯广告的设计。最常用的软件有f l a s h 、p h o t o s h o p 、3 d s m a x 等,这些 软件在计算机动画业都拥有较多的用户,对于只有少数对象的普通计算机动画是非常适 合的,也可以比较方便与逼真地演示出动画效果;但是霓虹灯动画的特点是多个对象的 2霓虹灯c a d 一网格编辑 颜色同时变化,之间有关联但又各不相同,这些软件一般又很难进行实时设计,设计方 案一般要在设计人员与客户之间经过多次周转才能最终确定,如果再加上中间商,则周 转时间更长,严重影响效率,此外还或多或少存在一些诸如成本高、样式单一等缺点。 因此,市场迫切需要一种简单易用,针对性强,能够简便实现常用效果并能够动态 演示最终效果的霓虹灯设计软件,霓虹灯c a d 软件将会有着广阔的市场。 1 2 霓虹灯c a d 的软件现状 目前国内市场上已经有了几款霓虹灯c a d 系统,比如深圳川田电子有限公司的 n e o n 系列、北京宇通霓虹科技有限公司的字通霓虹c a d 系统,为我们提供了不少宝贵 的经验。 川田n e o n 是个实用化几年的软件,经历了几个版本演变,采用网格文件和绘制 图形两部分分开的方式,网格文件用来记录抽象的灯管颜色变换序列,绘制图形部分绘 制出实际的灯管样式。支持多种常见的霓虹灯效果,支持普通扫描、渐变扫描两种扫描 方式,提供常用的矢量图形绘制功能并可以导入位图文件。其特色的地方在于,川田n e o n 支持将定义好的网格文件转换为自己的程控器中使用的代码,从而可以直接将设计好的 动画效果烧录到程控器中,减少对程控器的编程时间。 宇通霓虹c a d 采用了类似f l a s h 的方式绘制图形并设置颜色变换序列,内置了部 分简单动画效果,提供简单的矢量图形绘制功能并提供比较强大的排布工具和填充工具, 使用实际长度单位来绘制图形。其特色在于可以制作出非常复杂的动画效果。 但是目前的霓虹灯c a d 软件还处于探索阶段,还没有形成套完整的规范。我们 希望能够设计个软件,在参考现有软件的基础上,综合各个软件的优点,并将软件的 操作尽可能贴近现有的同类设计工具的操作方式,使得软件操作人员可以很容易上手; 支持图形元件库,保证已有的设计尽可能的能够被再次利用:增加一些实用的工具,使 编辑更加便捷。 1 3 本文的主要工作 在和霓虹灯设计人员的交流中得知,对于霓虹灯c a d 软件的使用者来说,易用性 和操作的便捷性是非常重要的,用户的操作习惯也是需要考虑的要点之一。 本文在总结现有霓虹灯c a d 软件的经验以及目前所存在的问题的基础上,参考了 其它编辑类软件的设计方式以及操作方式,以面向对象的方法设计了一个扩展性较强, 操作简便,重用程度高,功能适合的霓虹灯c a d 系统,该系统主要分为网格编辑和图 形绘制两个部分,本文着重于探讨网格编辑部分的问题和解决办法,主要研究设计工作 如下: 第1 章绪论 ( 1 ) 系统分析与设计,包括霓虹灯颜色变化序列的描述方式,用户通过动作与数据 进行交互等。 ( 2 ) 动作方向的参数抽象,将用户指定的动作方向抽象成易于统一编码的相应参 数,文中详细描述了抽象的过程及其方法。 ( 3 ) 花样分层,针对霓虹灯动态效果的特点,提出了花样分层的概念,易于理解, 而目对提高系统效率有很大帮助。 ( 用户自定义花样,由于系统内置花样有限,不能满足用户的全部需求,因此系 统提供了自定义花样供用户使用,文中详细描述了自定义花样的实现方法。 ( 5 ) i n d o 依e d o 的实现方法。 旧u i 设计中碰到的问题及解决办法。 1 4 本文的内容及其结构 本文分为五个部分: 第章为绪论,主要总结现有霓虹灯设计方法的发展概况及现有霓虹灯c a d 系统, 指出本文要解决的问题和所做工作; 第二章介绍了系统实现时用到的一些主要的原理、技术; 第三章阐述了系统的设计思路及整体架构; 第四章详细描述了网格编辑模块的具体实现,包括实现过程中的难点及其解决办 法; 第五章对网格编辑模块的设计实现进行了总结,并提出了下步的研究方向。 4霓虹灯c a d 一网格编辑 第2 章相关原理、技术 2 1 c + + 及s ,i l c h 是当今最流行的高级程序设计语言之一,应用十分广泛。它也是一门复杂的语 言,与c 语言兼容,既支持结构化的程序设计方法,也支持面向对象的程序设计方法, 这是a h 语言成功流行的个重要原因。 c + + 标准演变了许多年。c 模板是近几年来对此语言的种扩展,模板是根据类 型参数来产生函数和类的机制,有时也称模板为“参数化的类型”。使用模板,可以设计 一个对许多类型的数据进行操作的类,而不需要为每个类型的数据建立个单独的类。 标准模板_ | 车( m d a r d t e m l ) a l t cl i b r a r y ,s a x ) 就是基于这个c + + 语言扩展。 s t l 是数据结构和算法的个框架,数据结构包括矢量、列表和映射等,算法包括 这些数据结构的查找、拷贝和排序等。1 9 9 4 年7 月,a n s 玑s oa 斗标准委员会投票决 定接受s t l 为a 斗标准库的部分,这个建议是根据a l e xs t e p a n o v 、m e n gl e e 和d a v i d m u s s e r 这三人的编程和软件库研究提出的。s t l 的产生是为了满足通用性的设计目标, 而不是为了提高性甜6 j 。 在系统具体实现时,选择c + + 作为编程语言,其原因在于: ( 1 ) 性能:性能有个两方面,算法速度和机器代码效率。算法与语言是独立的,所 以在编程之前必须设计算法,编写一个快速程序的第一个步骤是设计良好的算 法,能以最少的操作步骤得出问题的答案;第二个步是选择语言,这也影响程 序的速度。可供选择的除c + + 夕 ,还有j a v a 、c 叛c 语言等。从性能及编码效 率的角度考虑最终选择了c + + 。 ( 2 ) 错误处理:c 卜+ 中的“异常处理”对错误处理提供了良好的支持。 ( 3 ) 最小的依赖性:c + 是种编译语言,即c + + 代码在执行之前已转换为机器码。 只要此代码不依赖于外部的动态链接库u 0 ,c h 就可以在不需要安装额外程 序的情况下移动到运行同样操作系统的其他机器和微处理器上,而运行j a v a 程 序则需要先安装j a v a 运行时库,雠需要n e tf r a m e w o r k ,这也是选择a 斗而放 弃i a v a 、饼的一个原因。 ( 4 ) 利用现有代码:系统实现中主要用到的现有代码就是s t l 中的v e c t o r ,v e d o l - 可以看作是一个动态数组,主要是因为动画的总帧数需要动态增长,又需要随 机访问,动态数组v e c t o r 既可动态增长,随机访问时效率接近于数组。 第2 章相关原理、技术 2 2g d i 及d i r e c t d r a w g d i 是g r a p h i c s d e v i c ei n t e r f a c e 的缩写,含义是图形设备接口,它的主要任务是负 责系统与绘图程序之间的信息交换,处理所有w m d o w s 程序的图形输出。在w m d o w s 操作系统下,绝大多数具备图形界面的应用程序都离不开g d i ,我们利用g d i 所提供的 众多函数就可以方便的在屏幕、打印机及其它输出设备上输出图形,文本等操作。g d i 的出现使程序员无需要关心硬件设备及设备驱动,就可以将应用程序的输出转化为硬件 设备上的输出,实现了程序开发者与硬件设备的隔离,大大方便了开发工作。 g d i + 是w i n d o w s2 0 0 0 及以后版本的一个子系统,同原有的g d i ( 图形设备接口) _ 一 样,主要负责对显示器和打印机进行管理。g d i + 为我们提供了在编程时使用的应用程序 接口a p t ( a p p l i c a t i o np r o g r a m m i n gi n t e r f a c e ) ,通过这些a p i 函数,g d i + 让程序员在设计 程序中不必考虑具体的显示器或打印机,直接使用由g d i + 提供的类的方法便可以调用 显示器或打印机,真正做到与设备无关。另外g d i + 还提供了许多新功能:矢量图形输 出、光栅图形输出和文字排版掣”。 尽管g d i + 相比g d i 有如此多的优点,但是一个最重要的缺点就是性能,其绘图速 度慢。 而霓虹灯动态效果对绘图性能有较高要求,因此系统实 现时采用的g d i 进行绘图。尽管这样,为了进步提高性能,系统中还采用了d i r e c t d r a w 来进行绘图。 d i i e c t i ) i a ! w 是d i r e c t x 的显示组件,该d i r c c t x 允许硬件设计者直接操纵显示内存、 硬件位块转移、硬件重叠和交换表面。d i r e c t d r a w 为游戏和w m d o w s 子系统软件提供一 个设备独立的方法,例如3 - d 图形包和数字视频编码译码器,来获取特定显示设备的特 性嘲。 d i r e c t d r a w 在一个直接的3 2 位路径里提供设备独立的存取给特定设备显示功能。 它在一个直接访问显示卡的驱动程序里存取其重要的功能,而不用w m d o w sg d i 或d i b 引擎的介入。通过利用这个直接路径,游戏和另外的显示加强应用程序运行更快目避免 撕裂,一个撕裂是由一幅被同时显示和写入的图象引起的屏闪烁,直接存取允许游戏性 能只被显卡性能限定。d i l e c t d r a w 也使用页交换来提供平滑的动画。d i r e c t d m w 通过在 一个3 2 位的驱动程序里处理设备独立的硬件加速器功能增强了g d i 。 2 3 解释器 解释器与编译器都是用来翻译并执行源程序,但编译器的编译和程序的运行分成两 个独立的阶段,如果修改了源程序必须重新编译,而解释器则不同,可以在边翻译边运 行,不用重新编译,即可实时反映源程序的变化。要实现个编译器的难度要比解释器 大的多,虽然经过编译的代码在执行效率上要比动态解释的代码高,但是解释型的语言 6霓虹灯c a d 一网格编辑 具有更快的加载速度和扩展性,况且基于虚拟机的动态语言的盛行也证实了解释型语言 的强大生命力。在本系统中,根据实际需要选择了解释器用来解释并执行用户自定义花 样。 源程序的分析是经过词法分析、语法分析和语义分析三个步骤实现的嘲。词法分析 由词法分析程序( 又称为扫描程序) 完成,其任务是识别单词( 即标识符、常数、保留 字,以及各种运算符、标点符号等) 、造符号表和常数表,以及将源程序换码为编译程序 易于分析和加工的内部形式。语法分析程序是编译程序的杨心部分,其主要任务是根据 语言的语法规则,检查源程序是否合乎语法。如不合乎语法,则输出语法出错信息;如 合乎语法,则分解源程序的语法结构,构造中间语言形式的内部程序。语法分析的目的 是掌握单词是怎样组成语句的,以及语句又是如何组成程序的。语义分析程序是进一步 检查合法程序结构的语义正确性,其目的是保证标识符和常数的正确使用,把必要的信 息收集和保存到符号表或中间语言程序中,并进行相应的语义处理。 在实际应用中,解释器对源程序的分析、执行通常是交错执行( 如一些脚本解释语 言) ,但是由于本系统中的解释器比较简单,而且为了提高程序的运行效率,解释器在系 统初始化时完成对用户自定义花样的解析,并将相关信息保存在内存中,在执行时直接 在内存中读取数据。 第3 章解决方案 7 第3 章解决方案 3 1 整体架构 针对霓虹灯的动态效果的特点,本系统分为三个部分:网格编辑部分、效果图设计 部分、播放器,如图3 1 所示。 图3 1 霓虹灯c a d 系统结构图 网格编辑部分是指生成网格序列,网格序列描述的是霓虹灯的颜色随时间的变化。 输入可以是本程序生成的色盘文件和网格文件,其他内容由用户手动以及预置的效果组 合生成;输出色盘文件和网格文件( 其中网格文件中保存的是网格序列,色盘文件保存 的是调色盘中的数据,调色盘是进行网格编辑的一个辅助性工具,关于调色盘参见 4 2 2 ) 。 效果图部分是指生成最后演示时能够看到的图案,并将图案中的各个甫软件绘制的 图元对象( 不包含导入的图片) 与网格对应起来。输入网格文件以及本软件生成的效果 图文件,输出最终包含播放所需所有信息的效果图文件;同时可以从效果图文件中抽取 网格文件并输出。 播放器是指能够根据效果图部分生成的文件进行演示。系统的输入包括图片以及自 身生成的文件,最主要的还是操作人员利用本系统提供的功能,生成新的数据。 软件的效果图部分的具体功能如下: 提供自绘制图形,以及导入图片的功能,能够将希望做成的霓虹灯的样式表现出来; 并且可以为每个图形指定个随时间( 帧) 而变化的颜色序列( 也就是网格编辑中生成 的某个网格) ,从而使得在演示的时候,每个图形都可以随着帧的变化而改变颜色或明 暗,形成霓虹灯的效果。还需要提供些便利性的工具,比如为一组图形指定属性,设 定与网格的关联并自动对网格进行偏移等;以及一些常用的阵列分布等功能。 网格编辑部分的功能如下: 编辑组网格,每个网格有个颜色,并会随着时间( 帧) 变化而变化。可以一帧 8 霓虹灯c a d - - 网格编辑 帧地对任意个网格进行处理,并可以进行演示。同时提供一系列的快速生成网格模 式的方法( 花样) ,提高编辑速度。 3 2 模块的相互关系 系统中的霓虹灯经过简化,有两个属性:形状和颜色,网格编辑模块中的网格即为 忽略掉形状属性的霓虹灯,此霓虹灯只具有一个属性:颜色。效果图设计部分控制霓虹 灯的形状,是静态的,网格编辑部分控制霓虹灯的颜色变化,是动态的,动静的分离使 得用户可以专注于某一方面的设计,减少其他元素的干扰,提高设计的效率,也便于已 有设计的重用。 网格编辑模块和效果图设计模块均可独立运行。其中网格编辑模块中,个格子可 以关联到一个或多个效果图设计模块所绘制的图形,通过控制网格的颜色变化来实现各 种各样的扫描方式,从而生成霓虹灯的动态效果。网格编辑模块作为一个独立的模块, 也具备播放功能,以使用户可以实时的观察霓虹灯颜色变化的扫描方式,对生成的最终 效果先有一个初始的印象,而最终通过播放器实现霓虹灯和网格的关联,生成最终的霓 虹灯动态效果。播放器可以与网格编辑模块或效果图设计模块合并到起,简化设计过 程。 第4 章网格编辑模块的实现 9 第4 章网格编辑模块的实现 4 1 网格编辑模块的结构 网格编辑模块的功能主要是控制霓虹灯颜色的变化,即霓虹灯动态效果的扫描方 式,目前常见的霓虹灯扫描方式有拉幕、堆积木、放光芒等,这些在系统中都以花样类 动作的方式存在。网格编辑模块主要分为三个部分: 数据:主要存放霓虹灯需要显示的颜色,并提供接口来对数据进行存取。 动作:主要功能是完成对数据的添加、修改、删除等操作。此部分难点在于花样的 算法设计和u n d o r e d o 的正确实现,是网格编辑模块工作量最大的部分。 u h 是用户与数据进行交互的接口,接受用户输入,解析并执行用户的指令;其中 包括数据的显示、磁盘文件的存取等。此部分的主要难点在于逻辑控制,包括对数据以 及用户输入的合法性校验等。 4 2 数据 数据为u i 和动作的操作对象,也是最终呈现给用户的对象,作为网格编辑模块的 核心而存在,所有其他部分都直接或间接对数据进行操作。 本模块的核心数据即为由霓虹灯抽象、简化而来的网格( 只有颜色属性的霓虹灯) , 用帧序列来描述网格颜色随时间的变化。 每一个格子代表一个或多个霓虹灯,这由效果图设计部分的图形与网格的关联确 定;每叫贞包含个m n 的格子方阵,记录某刻各个格子的颜色状态;而个帧序 列则包含多个这样的帧用以描述霓虹灯颜色的动态变化。 除杨0 数据即帧序列外,数据还包括环境变量、调色盘等非核心数据。 霓虹灯c a d - - 网格编辑 环境变量:( 类似于v c 编译器中头文件的存储路径) 存放本系统运行时的一些设置, 如:当前操作区域( 格子方阵的某个区域) 、当前色( 系统更改单元格颜色时使用) 、当 前操作模式( 行、列、格子) 等。 调色盘:存储颜色序列,主要是由m o v e 、p a t t e r n 等动作来使用,实现对于生成多 帧网格时所使用颜色的自动跟进。 4 2 1 帧序列 作为网格编程模块的核心数据,除了正确性,帧序列的效率是需要考虑的首要问题。 其类图结构如图4 2 所示。 图4 2 帧序列类图 数据类型g 喇c c d o f 描述的是格子颜色,之所以定义此数据类型而没有直接使用g d i 中的c o l o r r e f ,是因为霓虹灯灯管的发色数有限,用新的数据类型可以为程序优化 进行数据压缩:c c e l l 即格子,其中存放此格子的颜色,存放的数据是霓虹灯的颜色( 在 实际绘图时需要将其中数据转换成c o l o r r e f ) ;c f x a m e 为帧,存放格子方阵, c f r a m e s c q u c n c e 为帧序列;c b l o c k s e q u e n c e 是为c o p y p a s t e 而设,仅提供读取格子颜色 的接口,不允许修改其中的数据。 在生成c f r a m e 对象的时候必须指定帧的宽、高,对象生成后不允许更改其大小, 因此c f r a m e 中的c c d l 数量不会动态变化。而c f r a m e s e q u e n c e 中帧的数量会动态变化, 因此使用了s e l l 中的动态数组v e c t o r ( 此处使用了s t l 中的容器v e c t o r 而没有使用l i s t 主要是因为经常要执行的添加、删除等操作所选择的帧在帧序列中的位置具有任意性, 第4 章网格编辑模块的实现 即常需要随机存取) ,又由于v e c t o r 对添加、删除等操作需要移动大量元素,效率比较差, 所以在v e a 【0 r 中仅存放帧的指针,这样在效率上找到个平衡点;而当前索引没有使用 s t d :i t c r a t o r 主要是因为u i 要显示当前是第几帧,由此选用了j m 类型,这也可以认为是 用v c g ,g x 而不用l i s t 的另一个原因。 由于c f r a m e 可作为一个独立的个体存在。必须有自己的宽、高;为保证中帧的一 致性,帧序列中也需要有宽、高( 即为每帧的宽、高) ,这样就带来了数据冗余,增加 了出错的可能性,但是这是不可避免的( 系统中由帧序列提供的添加帧的接口函数来校 验数据合法性) 。 另外,针对对效率的要求以及动作的多样性,c f m m c s c q u c n c c 还提供了丰富的接口, 如:帧加倍、删除奇数,偶数帧等;针对具体的需求,还增加了对帧指针进行操作的接口 ( 即仅仅是将其从帧序列中删除,帧本身还存在) ,此类接口函数名均以“p ”结尾。 添加、删除帧等操作所涉及的一个重要问题就是更改当前帧索引。以删除连续多帧 为例: 假设要删除的帧索引为i 到j ,当前帧索引为c u r : ( 1 ) 如果j s c u r ,贝l j c g l r 一一; ( 2 ) 如果f c 押s j ,则翻r i ,如果c u r 超过了帧序列的总帧数,则删,一一。 注意:如果此时帧序列为空,则c u r 为1 ,由于1 本身作为帧序列为空时的个非 法索引( 即初始值) ,所以此时无需再进行其他处理。 如果要删除的是单帧,则通过调用删除多帧的接口来实现,仅限定i 与i 相等。至 于删除某段连续帧中的奇数或偶数帧时,其基本思想与删除连续多帧一样,其区别主要 是当前帧在所要删除段中的时候,需要针对当前帧是否被删掉分情况考虑,如果被删掉 了,当前帧索引指向其后面第一个未被删除的帧,否则将索引值置为当前帧在操作完成 后的位置。 在进行指针操作的时候,如果需要删除多帧,而且不连续,如删除指定段中的奇数 偶数帧,并且获取其索引( 目前没有提供相应接口) ,当前是循环调用删除单帧来实现, 这必然在效率上存在一些问题,如有必要将在下步工作中考虑进行优化,将删除的所 有帧存放到一个新的c f r a m e s e q u e n c c 中返回。 帧序列的序列化以类的继承关系为基础分层实现,每层都要实现序列化,这样有 利于代码扩展,在更改继承关系树中某层的具体实现或帧序列的分层结构时,不必关 心其他类中序列化的实现。需要注意的是,序列化和反序列化的数据存取顺序必须完全 对应,否则序列化、反序列化功能会失效,甚至使程序崩溃。 4 2 2 调色盘 调色盘作为用户使用的一种辅助性工具,可以在很大程度上实现一些操作的自动 霓虹灯( _ d 一网格编辑 化,避免重复操作,减轻工作量,它虽非核心数据,但其重要性却不亚于帧序列,所有 的动作都有可自渺及到调色盘,即便调色盘无效,部分花样还是要用到调色盘,如果 调色盘为空,则不能生成这部分花样,可以说调色盘是这些花样的基础。 如上文所说,相对帧序列来说,调色盘比较简单,其数据成员仅为一个颜色序列和 当前色的索引,并提供接口对其进行添加、删除和修改。其序列化、反序列化仅是其中 颜色序列的存取,比较简单,这里就不再详细说明。相对帧序列而言,调色盘中的数据 比较稳定,不会经常变化,因此仅提供了在当前、尾部位置添加、删除颜色等相关接口。 c p a l l e t t e mn c u r l n d e x 。i n t - m _ v e c t c o l o r d a t a :s t d :v e c t o r + g e t c o l o i ni n d c x :i n t ) :g t _ i d c o l o r + a d d c o l o r a t t a i l ( i nn e w c o l o r :g r i d c o l o t ) :b o o ! + d e l c o l o r a t t a i l ( ) b o o l + d e l c o l o r ( i ni n d e x :i n t ) b o o l 图4 3 调色盘 虽然调色盘的数据比较简单,但动作和u i 部分与调色盘的关联却比较复杂,甚至 u 中有很大部分与调色盘有关,如自绘控件、颜色库、调色盘的预览等( 参见4 4 4 ) 。 4 2 3 环境变量 环境变量中成员比较多,如当前色、操作块、操作模式、动作增量、播放速度等, 多与帧序列关系不大,主要由动作部分使用,又比较多,因此独立出来作为环境变量存 在,以便管理维护。其中操作块指的是网格的当前操作区域,动作部分中绝大部分都是 在操作块中执行。默认操作块是整个网格。下文对其中大多数都有涉及,这里暂且略过。 4 3 动作 动作作为个独立单元,除修改数据外,个重要作用就是实现u n d o r e d o ,而此功 能是一个具有编辑功能的软件所不可缺少的,此功能有三种实现; 单步撤消:即只能撤消上个动作。 有限撤消:即只能撤消有限步动作。 无限撤消:即可以撤消做过的所有动作。 要撤消,恢复动作,就要保存相应的一些数据,比如:这个动作删除了哪些数据、 修改了哪些数据等等。而要支持无限级撤消,需要保存的信鼠就会无限的膨胀,这就要 求设计时每步动作保存的数据尽可能少。 基本思想:通过一个动作管理器来管理所有动作,其中维护一个动作序列和一个当 前动作指针,而每做个动作都要在动作序列中进行记录,每个动作需要保存的数据有 动作参数、修改前的数据等,这要视具体动作而定。 第4 章阿格编辑模块的实现 1 3 在将动作记入动作序列中时遵循的个原则就是:凡是影响到杨心数据即帧序列序 列化结果的动作才记入动作序列,否则不记入动作序列。这是从用户的角度出发制定的 一个规则,比如:对环境变量的修改,这种操作就不应记入动作序列,对于这种操作, 用户认为并没有修改数据( 对用户而言,数据只有帧序列) ,u n d o 时不应撤消这类操作。 因此这类操作不通过动作管理器来管理,严格来讲就不能算做动作了。这一类操作需 要u l 与数据部分直接进行交互。这样做也使得系统新建文档时可以很容易判断旧数据 是否需要保存,只需判断保存以后是否做了新的动作即可( 不包括撤销了的动作) 。 4 3 1 动作管理器 动作管理器也可以看作一个类似栈的结构,当前动作索引指向当前栈顶,用户做一 个动作,就进行压栈操作,u n d o 时做弹栈操作( 并不真正弹栈,而是更改当前索引) 。 动作管理器提供的对外接口主要有执行动作的d 0 0 、撤消动作的u n d 0 0 、恢复动作的 r e d 0 0 ,还有内部使用的u n d o s i n 孚e o 和r e d o s i n g l e 0 。 c a t l i o n m a n a g t r - m _ n c u r | n d c x :i m - mv e c t p a c t i o n :s l d :v e c l o r + d o ( i n p a c t i o n :c a c t i o n ) :b o o l + u n d 0 0 :b o o l + r e d 0 0 :b o o i u n d o s i n g l e o :b o o l - r e d o s i n g t e 0 :b o o l :丫 l c a c t i o n l - r e _ b j u m p :b o o l l + i n i t 0 :b o o ! l + d o a c t i o n 0 :b o o l l + u n d o a c t i o n 0 :b o o l 图4 4 动作管理器 其中u n d o s i n g l e 删o s i n g l e 供u n d o r e d o 调用,因为u n d o r e d o 可能撤消或恢复 多个动作,这与动作的j u m p 标记有关,j u m p 标记主要为u n d o r e a o 连续多个动作而设, 在r e d o u n d o 时跳过j u m p 标记为真的动作,这主要是由于用户认为某些操作是一个动 作,而实际可能做了多个动作( 参见4 4 2 ) 。 动作管理器内部有两种实现方式,种是u i 将要执行的动作类型( 即动作的d ) 和执行动作所需参数传递给动作管理器,动作管理器根据参数生成动作并执行,这种方 案可以降低u i 和动作的耦合,u 只需告诉动作管理器要做什么,但这样增加了程序的 复杂性,其中参数的合法性就难于判断,还必须为每个动作规定参数的结构,而这是u i 所必须知道的,对此种方案的一种改进是利用环境变量类似的方法,取所有动作需要的 参数的一个并集,做成一个参数池,u i 部分根据用户操作修改参数池中相应参数的值, 1 4 霓虹灯c a d 一网格编辑 然后将动作d 传递给动作管理器,动作管理器根据动作d 读取参数池中相应参数,生 成动作并执行,这样必须赋予u i 任意修改参数池中所有数据的权利,但是无法保证u i 给动作所需所有参数都赋予了正确的值,目前来讲在本系统中采用此种方法最合适,在 系统版本更新时予以考虑;另外一种,即最终采用的方案,就是u i 生成动作对象,将 其传递给动作管理器,由动作管理器来执行,这样动作管理器里面的逻辑就比较简单了, 也充分利用了面向对象的特性,动作管理器中d o ( c a c d o n * p a 血o n l n ) 的执行流程如图 4 5 所示: u i 动作管理器 一。4 0 o 。 。- - - - 一- - - o 图4 5 动作管理器执行动作流程 可以看出,申请、释放资源都由u i 来完成,前面也讲述了由u i 生成动作对 象的原因,而动作管理器得功能仅仅是管理动作。另外,由于记入动作w - n 的动作必定 修改了帧序列的内容,所以执行成功后u 一般需要重绘。 u n d o r e d o 是动作管理器的杨0 ,虽然内部逻辑比较简单,但u n d o r e d o 的实现关 系到动作管理器的正确性,而动作管理器的正确性则直接决定了整个系统的正确性。 u n d o 的孰行步骤: ( 1 ) u n d o 单个动作; ( 2 ) 当前索引前移; ( 3 ) 如果当前动作的j u m p 标记为假,则转到( 1 ) : ( 4 ) 完成; r e d o 的执行步骤: ( 1 ) r e d o 当前动作; ( 萄当前动作索引后移; ( 3 ) 如果当前动作j u m p 标记为真,转到( 1 ) ; 第4 章网格编辑模块的实现1 5 ( 4 ) 完成。 要保证u n d o r e d o 的正确性,对于j u m p 标记得判定必须严格对应,简单来讲就是 执行u n d o 后再执行r e d o ,系统状态必须完全相同。 4 3 2 动作及其分类 在动作管理器中的执行动作、撤消动作都由具体动作实现,c a c t i o n 作为所有动作 的基类,规定了相应的接口函数原型,包括“t o 、d o a c t i o n 0 、u n d o a c t i o n o 等。 其中h l i t 0 的主要作用是对操作对象进行必要的检查以及保存相关数据,由动作管理 器第一次执行动作前调用,一个动作要想正确u n d o r e d o 必须记录很多内容,主要包括 以下几个方面: ( 1 ) 参数:这是必须要保存的,也是一个动作的杨山数据; ( 2 ) 帧序列中的内容:个动作修改了帧序列中哪些内容也是必须要保存的,否则 u n d o 无法正确实现; ( 3 ) 用到的调色盘、环境变量中的内容:因为这些非核心数据随时可能由于用户的 操作而发生变化,如果不记录这些内容,则无法正确实现r e d o 。 l n i t o 与d o a c t i o n 0 的分离为动作管理器内的简单逻辑提供了基础,动作管理器在第 一次执i 劲作时只需简单的调用这两个接口函数,而r e d o 时则只需d o a c t i o n ( ) & p 可;对 于动作本身这样也便于维护。 对于操作对象,即系统中的数据,系统实现时将其作为c a c d o n 的静态数据成员主 要基于效率的原因。假如将操作对象当作参数进行传递会增加系统开销,不但降低运行 效率,编码效率也将受到影响,有个别动作参数就达5 、6 个,如果再加上操作对象基本 不可忍受。 其中有个问题就是既然操作对象是c a c t i o n 的静态成员,那么如果用户要同时操 作多个帧序列怎么办。目前网格编辑模块是一个单文档程序( s d i ) ,动作管理器及数据 对象均由文档类生成,然后调用c a c t i o n :s e t o p o b j e c t ( ) 设置动作管理器操作对象,假 如以后需要扩展成多文档程序( 1 v i d i ) ,只需在切换文档时重新设置操作对象即可。而且 这样做也可以减少数据冗余,不必每个动作对象都保存一份操作对象。 由于动作的多样性及其分层特点,实现时充分利用了面向对象的继承、多态等特性, 动作可以分成两大类:算法类动作,如m o v e 类动作、花样类动作;非算法类动作,如 添加删除帧、剪切粘贴等。下面分另介绍。 霓虹灯c a d - - 网格编辑 4 3 3m o v e 类动作 图4 6 动作分类 m o v e 类动作所完成的功能就是筒单移动,一个矩阵中的网格由一个状态m o v e 到 另个状态,此类动作有三种m o v e 的方式: ( 1 ) 循环:移进的颜色即为移出的颜色; ( 2 ) 原始:移进的颜色为网格的原始颜色; ( 3 ) 当前:移进当前色。 而每种动作又有四个方向,用w 、s 、a 、d 表示,如直向移动有向左、向右、 向上、向下四个方向( 方向作为动作的一个属性而存在) 。此类动作列表如下: 表4 1m o v o 类动作,q 表 动作名称 类名方向 如此共有7 x 4 x 3 = 8 4 种动作,如此繁多的动作必须找到一种统一的方式进行描述, 否则工作量太大,测试、除错将占用大量时间,会严重影响项目进度,在设计时就要考 虑犯错的可能性,用个良好的设计来减少错误的发生,这样虽然设计阶段所占时间可 能适当延长,但跟潜在的额外测试、除错所占的时间相比,还是非常值得的。在设- r ;i - 类 的时候既要考虑动作的多样性,包括每种动作自身的特点,又要考虑统性以方便管理 维护,经过实践,最终解决方案如下: 作为所有m o v e 类动作的基类,c a c t i o n m o v e 负责实现c a c l i o n 中规定的i n i 的、 i ) 0 a c t i o n 0 、u n d o a c t i o n 0 等接口,并规定了具体动作必须实现的m o v e 0 接n 的原型,而 第4 章网格编辑模块的实现 d c 成痂哟通过调用m o v e 0 来实现“m o v e ”,其原型如下: v i r t u a le _ e r t o r n om o v e ( c f r a m e p s r c f r a n e , c f r a m e p d s t f r a m e ) = 便 p s r c f r a m e 为源帧的指针,在此帧基础之e 执行“m o v e , p d s t f r a m e 为目的帧指针, 存放“m o v e ”的结果,所有内存资源的申请、释放由d o a c t i o n 0 负责。 将控制逻辑全部放到基类c a c t i o n m o v e 的d ( ) a c t i 0 中,包括所涉及到的环境变量 中的动作增量、帧增量,而尽量使具体动作仅完成个简单的具体功能,即“m o v e ”, 这样如果有新的需求,需要添加一个新的m o v e 类动作,则此动作仅需实现m o v c ( ) 接口 即可。m o v e 类动作还涉及两个环境变量: 动作增量:即每个动作“m o v e ”的格子数,如直向移动中右移几个格子。 帧增量:即每个动作生成的新帧被复制多少份插入到当前位置。 m o v e 类动作d o a c t i o n 0 的流程( 在实际代码中出错处理占了很

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论