本科毕业设计-绘图软件的设计

上传人:痛*** 文档编号:206522167 上传时间:2023-05-04 格式:DOC 页数:64 大小:3.74MB
返回 下载 相关 举报
本科毕业设计-绘图软件的设计_第1页
第1页 / 共64页
本科毕业设计-绘图软件的设计_第2页
第2页 / 共64页
本科毕业设计-绘图软件的设计_第3页
第3页 / 共64页
点击查看更多>>
资源描述
编号本科生毕业设计(论文)题目: 绘图软件的设计 学院 计算机科学与技术专业学 号 学生姓名 指导教师 二 年 月摘 要随着多媒体技术的普及和发展,绘图软件在生活工作中的使用越来越频繁.现在各类绘图软件数不胜数,但大多要么功能太简单,不能满足画图需要,要么设计太复杂,功能累赘,缺乏易用性.Windows自带的画图软件(开始附件画图),是一款简单,易用的画图软件,能满足一些画点、画线、画矩形、画圆等的简单功能.根据所学的计算机图形学的知识,使用Visual Basic 作为开发工具,设计一个画图软件.基本实现windows系统画图软件的所有功能.可以为左右键分别指定颜色,同时使用两种颜色画图.可添加坐标轴及刻度,可以绘制简单函数曲线,可控制各图形的精准位置和尺寸.可以使用纯色或多种材质使用喷枪或填充图形.可以实时截取全屏幕或动态窗口图片加以编辑,保存.可以实现图形的复制、剪切、粘贴、删除,文件的打开和保存.设计有快速启动页,可打开最近文件,提高效率;多窗口操作,界面美观,操作方便.关键词: Visual Basic;随机文件读写;填充;贝塞尔;BresenhamAbstractABSTRACTWith the popularization and development of multimedia technology, the use of drawing software in the life and work are increasingly frequent.There are numerous of the various types of drawing software, but most of them either function is too simple that can not meet the need of drawing or design is too complex, functional burden, lack of ease of use. Paint software that comes with Windows (Start - Accessories - Paint), is a simple, easy-to-use and meets the simple function of the draw point, draw lines, draw a rectangle, circle, etc.According to the knowledge of the computer graphics, using Visual Basic as a development tool to design a drawing software. Basically all the features of the Microsoft Paint will be included in this drawing software. For the left and right arrow keys to specify a color,you can use both color drawing. Can be added to the axis scale, and can draw the curve of the simple function, and you can control the precise location and size of the graph. You can use a solid color or a variety of materials to use the gun or filled shapes. You can be capture real-time interception of full-screen or dynamic window picture to edit, save. Graphics to copy, cut, paste, delete, open and save files. The design of the Quick Start page to open the file, increase efficiency; multi-window operation, beautiful interface, easy to operate.Keywords: Visual Basic; Random file read and write; fill; Bezier; Bresenham目录目 录第1章 绪论11.1 课题背景11.2 目前现状11.3 绘图软件概述21.3.1 基本介绍21.3.2 语言简介21.3.3 研究内容21.3.4 预期目标2第2章 开发技术与环境介绍32.1 visual bisic32.1.1 VB语言的特点32.1.2 属性、方法和事件32.1.3 对象与类42.2 开发环境介绍4第3章 二维图形生成技术53.1 直线扫描转换算法53.1.1 直线DDA算法63.1.2 中点画线算法73.1.3 Bresenham画线算法83.2 圆的扫描转换算法103.2.1 圆的性质103.2.2 中点画圆算法103.2.3 Bresenham画圆算法123.3 填充技术133.3.1 种子填充算法133.3.2扫描线填充算法143.4 bezier曲线163.4.1 Bezier曲线的定义163.4.2 Bezier曲线的离散生成18第4章 界面设计与编码194.1 界面设计194.1.1 主界面194.1.2 展示屏幕204.1.3 快速启动页204.1.4 新建文档214.1.5 菜单栏预览214.1.6 工具选项栏224.1.7 其他窗体234.2 编码实现244.2.1 直线-Bresenham画线算法244.2.2 画圆算法254.2.3 贝赛尔曲线284.2.4 填充-扫描线填充算法314.2.5 更新画布UpdateArea334.2.6 各类编辑操作344.2.7 裁剪394.2.8 图形的翻转424.2.9 截屏444.2.10 打开保存454.2.11 最近打开记录-随机文件读写474.3 成果展示51第5章 结论与展望555.1结论555.2不足之处及未来展望55参考文献56致 谢575757第1章 绪论1.1 课题背景视觉是人类最重要的感觉手段,图形又是视觉的基础,随着多媒体技术的普及和发展,人们对画面的要求越高,对画图工具也提出了更高更全面的要求.对于一个人用户来说,开发一个基本的图形绘制处理系统,为用户提供一些基本的图形绘制功能,可以方便用户的使用.图形和图像有很大的不同,到目前为止,计算机图形学和数字图像处理还是作为两门课程分别讲授的,计算机图形学是将点、线、面、等实体生成物体的模型存放在计算机里,并可以进行修改、处理、操作和显示的一门学科.随着多媒体技术的普及和发展,绘图软件在生活工作中的使用越来越频繁.现在各类绘图软件数不胜数,但大多要么功能太简单,不能满足画图需要,要么设计太复杂,功能累赘,缺乏易用性.Windows自带的画图软件(开始附件画图),是一款简单,易用的画图软件,能满足一些画点、画线、画矩形、画圆等的简单功能.所以,开发一个绘图软件,能满足大部分用户的使用需求,方便用户使用,实属必要.该软件通过微软的开发工具Visual Basic结合计算机图形学的知识设计与开发.计算机图形学的基本含义是使用计算机通过算法和程序在显示设备上构造出图形.计算机图形学中的图形是指可以用数学方法描述的并且需要在计算机上显示的图形,也就是说,计算机图形学中的图形是人们通过计算机设计和构造出来的,不是通过如数码相机或扫描仪等设备输入的图像,所设计和构造的图形可以使现实世界中已经存在的物体,也可以是完全虚无的物体.1.2 目前现状随着计算机科学技术的发展,近30年来,计算机图形学得到迅猛发展,人们已经可以通过计算机高速、有效、真实地生成图形,计算机图形学作为利用计算机生成图形的技术,已经越来越广泛地在各个领域等到了应用.计算机图形学应用领域的拓宽和应用水平的提高,使得人们越来越重视对计算机图形学的研究和利用.当今,计算机图形学已经成为了计算机科学技术领域的一个重要研究方向,并被广泛地应用于科学计算、工程设计、医药、工业、艺术、娱乐业、广告业、教育与培训、商业及政府部门等.计算机图形技术是随着计算机技术在图形处理领域中的应用而发展起来的一 门新技术,是伴随着电子计算机及其外围设备的发展而产生的,现已成为计算机应用科学中的一个重要分支,在许多行业中起着越来越大的作用.计算机的运算能力的提高,图形处理速度的加快,使得图形学的各个研究方向得到充分发展,大量价格低、简单易用的图形应用程序促使具有图形处理功能的计算机进入家庭. 图形学已广泛应用于计算机辅助设计与制造、计算机动画、科学计算可视化、虚拟现实、影视娱乐等各个领域.这必然促使计算机专业人员、广大非计算机专业的应用人员,从计算机图形学的理论高度和计算机绘图的实用角度来研究和开发计算机图形的生成技术及软件.1.3 绘图软件概述1.3.1 基本介绍该绘图软件参照Windows系统自带画图,在其基础上,优化界面,添加功能,加以实现,以达到,功能齐全,界面简洁,使用方面的目的1.3.2 语言简介Visual Basic是一种由微软公司开发的包含协助开发环境的事件驱动编程语言.从任何标准来说,VB都是世界上使用人数最多的语言不仅是盛赞VB的开发者还是抱怨VB的开发者的数量.它源自于BASIC编程语言.VB拥有图形用户界面(GUI)和快速应用程序开发(RAD)系统,可以轻易的使用DAO、RDO、ADO连接数据库,或者轻松的创建ActiveX控件.程序员可以轻松的使用VB提供的组件快速建立一个应用程序通过几年的发展,它已成为一种专业化的开发语言和环境.用户可用Visual Basic快速创建Windows程序,现在还可以编写企业水平的客户端/服务器程序及强大的数据库应用程序.VB会吸引更多的赞誉和批评,也会继续为广大的用户和程序员使用.它非常适合用来开发拥有友好界面的程序(比如针对终端的数据),但是不适合开发其它程序(比如联合计算程序).1.3.3 研究内容通过参考现有的各类绘图软件(主要参考了Windows画图的功能)并详细了解绘图的主要功能及应用完成系统的需求分析;根据需求分析完成系统的结构设计图;根据系统的结构设计图完成系统的结构设计,包括系统的界面设计以及功能模块设计;根据设计文档,设计系统界面,完成各模块编码;完成单元测试和系统测试,及功能测试.1.3.4 预期目标软件预期完成以下功能:(1) 基本实现windows系统画图软件的所有功能.(2) 可以为左右键分别指定颜色,同时使用两种颜色画图.(3) 具有基本的图形绘制功能,例如:矩形、圆形、点、线等.(4) 可添加坐标轴及刻度,可以绘制简单贝塞尔曲线,可控制各图形的精准位置和尺寸.(5) 可以使用纯色或多种材质使用喷枪或填充图形.(6) 对于每一种图形的绘制,可以选择不同的颜色,不同的线条.(7) 可以实时截取全屏幕或动态窗口图片加以编辑,保存.(8) 可以实现图形的复制、剪切、粘贴、删除,文件的打开和存储.(9) 设计有快速启动页,可打开最近文件,提高效率;多窗口操作,界面美观,操作方便.绘图软件的设计第2章 开发技术与环境介绍2.1 Visual BisicVisual Basic(简称VB)是近年来在国内外得到迅速推广应用的可视化程序设计语言,具有简单易学,功能强大,软件费用支出低,见效快等特点.它提供了开发Windows应用程序最迅速,最简捷的方法,不但是专业人员得心应手的开发工具,而且易于被非专业人员掌握使用.目前,全世界数以百万计的程序设计人员正在用Visual Basic开发各种类型的软件.2.1.1 VB语言的特点(1) 可视化Visual Basic是可视化的程序设计语言,开发人员只需要按照设计要求对屏幕进行布局,用集成开发环境来直接拖和画出各个菜单、按钮、滚动条、窗口等不同类型的对象.(2) 面向对象在Visual Basic中,窗体及控件都称为对象,有这些对象构成了用户界面,Visual Basic是面向对象的程序设计语言,它是将代码和数据结合在每个对象中,用户只需要了解每个对象能完成什么任务,不必知道对象是如何工作的,而程序设计人员只要编写实现程序功能的那部分代码,这样大大提高了程序设计的效率,但是Visual Basic里面没有多态等面向对象的特性,所以有人称Visual Basic是准面向对象程序设计语言.(3) 事件驱动Visual Basic通过事件来执行对象的操作,一个对象可能会产生多个事件,每个事件都可以通过一段程序来响应,而各个事件之间却不一定有联系,这样的应用程序代码较短,使程序既易于编写又易于维护.(4) 沿用结构化的程序设计的思想Visual Basic具有丰富的数据类型,众多的函数,并采 用了结构化的程序 设 计方法,简单易学.(5) 易学易用的集成开发环境 Visual basic提供了易学易用的集成开发环境,在该开发环境中,用户可设计用户界面,编写代码,调试程序,直至把应用程序编译成可执行文件使其直接在windows环境下运行 (6) Visual Basic支持多种数据库的访问 采用了对象的链接与嵌入(OLE,Object linking and embedding)技术可以很方便的开发出集声音、图像、动画、子处理、web等对象于一体的应用程序.2.1.2 属性、方法和事件在Visual Basic中,可以通过属性、方法和事件来说明和衡量一个对象的特征.事件(Event)事件是指发生在某一对象上的事情.事件又可分为鼠标事件和键盘事件.例如,在命令按钮(Command Button)这一对象上可能发生鼠标单击(Click)、鼠标移动(Mouse Move)、鼠标按下(Mouse Down)等鼠标事件,也可能发生键盘按下(Key Down)等键盘事件.总之,事件指明了对象“什么情况下做?”,常用于定义对象发生某种反映的时机和条件.方法(Method)方法是用来控制对象的功能及操作的内部程序.例如,人具有说话、行走、学习、睡觉等功能,在visual Basic中,对象所能提供的这些功能和操作,就称作“方法”.以窗体为例,它具有显示(show)或隐藏(hide)的方法.总之,方法指明了对象“能做什么?”,常用于定义对象的功能和操作.属性(Property)属性是指用于描述对象的名称、位置、颜色、字体等特征的一些指标.可以通过属性改变对象的特性.有些属性可以在设计时通过属性窗口来设置,不用编写任何代码;而有些属性则必须通过编写代码,在运行程序的同时进行设置.可以在运行时读取和设置取值的属性成为读写属性,只能读取的属性成为只读属性.总之属性指明了对象“是什么样的?”,常用于定义对象的外观.2.1.3 对象与类(1) 对象(object)Visual basic 具有“面向对象”的特性,Visual Basic 应用种程序的基本单元是对象,用Visual Basic 编程就是用“对象”组装程序.这种“面向对象”的编程方法与传统的全部用代码编制程序的方法有很大区别,就像用集成电路芯片组装电视机和用三极管,二极管组装电视机的区别一样.显然,“面向对象”的编程方法比传统的编程方法更简单,更方便,并且编写出的程序也更加稳定.因此,“对象”可以被看做 Visual Basic 程序设计的核心. 在 Visual Basic 程序设计中,对象中还可以包含头,手,腿,脚等部位,其中的每个部位又可以单独作为作为被研究的对象.在 Visual Basic 程序设计中,整个应用程序就是一个对象,应用程序中又包含着窗体(Frame),命令按钮(Command),菜单(Menu)等对象.(2) 类(Class)在 Visual Basic 中,对象是由类创建的,因此对象可以说是类的具体实例,这就好比是蛋糕和做蛋糕的模具之间的关系.各种不同的对象分属于各种不同的种类.同一类对象可能具有一些不同的特征(或是说同一类对象不一定具有完全相同的特性);具有某些相同的特性的对象,不一定是同一类对象,这就好比是人和猴子虽然都有身高、性别等特征,但二者之间还存在着智商、语言等特性差异,这两个对象之间的特性相差很多,根本就不能算是同一类对象.而男人和女人,有着性别、生理等方面的差异,但他们绝大部分特性相同,可以算是同一种类.由此,可以归结为一句话:同一类对象的绝大部分特性相同.2.2 开发环境介绍操作系统:Windows XP开发语言:Visual Basic开发工具:Microsoft Visual Basic 6.0 中文版第3章 二维图形生成技术在显示器上生成一个图形,实质上市往显示器缓存的相应单元中填入数据.将计算机中表示的向量图形在显示器上显示的过程称为图形的扫描转换俗称光栅化.图形扫描转换的关键是寻找合适的算法,利用计算机中图形的向量表示和图形的数学表示,计算出落在或充分接近图形的像素,并以此像素的集合近似代替图形.例如话一条从点(X0,Y0)到点(X1,Y1)的直线,实质上是一个发现最佳逼近直线的像素序列,并按直线的颜色属性填入色彩的过程.由于一个复杂图形是由许多基本的图形构成的,在一个图形中,可能包含成千上万个基本图形,所以要求进行图形扫描转换时应尽可能地高效率、速度快.又由于图形的扫描转换一般是由硬件直接完成的,因此,所涉及的扫描转换算法,应该便于硬件实现.图形的扫描转换首先需要确定图形像素的位置,然后再设置图形的颜色或其他属性.3.1 直线扫描转换算法数学意义上的直线式指没有宽度的、由连续的无数个点构成的集合,因此显示器只能近似地显示直线.对直线进行扫描转换时,需要在显示器的有限像素中,确定最佳逼近该直线的一组像素,对这些像素进行写操作,这个过程称为直线的扫描转换.一下介绍一个像素宽度的3种常用的直线绘制算法,即直线DDA算法,中点画线算法及Bresenham画线算法.在介绍这3种常用算法之前,首先介绍直线的直接画线算法.xOkby图3-1 直线的表示如图3-1所示的直线方程为: (3-1)其中k为直线斜率,b为直线与y轴的交点.如果已知直线段的两个端点(x0, y0)和(x1, y1 ),直线也可以用两点式表示: (3-2)通过两点式,可以得到直线的斜率是: (3-3)利用直线方程,已知直线两个端点(x0,y0)和( x1,y1 )的直线段,如给出直线上某一点的x坐标值,可以计算出该点的y值.这就是直线的直接画图算法.为了便于计算机的计算,我们让x坐标从x0变化到x1 ,每一步递增1,这样可以保证x坐标落在对应的栅格上,进而计算对应的y坐标,并舍入取整.用这种方法既直观,又可行,然而效率较低.这是因为每步运算都需要一个浮点乘法与一个舍入运算.直线的浮点运算占用大量的计算机资源,且运算速度慢,所以直线的直接画线算法没有实际的应用价值.3.1.1 直线DDA算法DDA是数字微分分析式(Digital Differential Analyzer)的缩写.设直线段的两个端点(x0, y0)和(x1, y1),直线扫描转换的最简单方法是先算出直线的斜率,然后,从直线的起点开始,确定最佳逼近于直线的y坐标.(xi , yi)(xi +1, yi+k)(xi +1, round(yi+k)(xi ,round(yi) 图3-2 直线数值微分示意图假定端点坐标均为整数,表示端点恰在栅格上,让x从起点变化到终点,每步递增Dx,,利用直线方程可以计算出对应的y坐标:(3-4)取Dx=1时,有yi+1 = yi + k,即当x每递增1时,y递增的值是直线斜率k.DDA算法取直线起点( x0, y0 )作为初始坐标,每一步x递增1,通过上式计算出y坐标,这样就可以写出直线扫描转换的数值微分算法.用直线微分算法绘制的直线如图3-2. 算法中的变量说明与前面的分析保持一致,算法主体是一个循环,每一次循环中,变量x 递增1,y递增k.注意上述分析和算法仅适用于k1的情形.这种情况下,x每增加1, y最多增加1,从而保证在迭代循环的过程中,当x方向递增1时,y方向不可能有像素的跳跃.如果直线的端点为(100,100)和(101,200),采用上面的算法将只画出了两个像素,显然不能表示出我们要画的一条直线.当直斜率k的绝对值超过1时,必须把x、y在算法中的地位交换,即循环变量改为y,y每增加1, x相应增加 1/k,算法的实现可以通过前面的k1情形下的DDA算法改写.数值微分算法的本质,是用数值方法解微分方程,通过同时对x和y各增加一个小增量,计算下一步的x、y值.在一个迭代算法中,如果每一步的x、y值是用前一步的值加上一个增量来获得的,那么,这种算法就称为增量算法.因此,DDA算法是一个增量算法.增量算法通过循环简化了比较复杂的问题,在图形学中有较多的应用.DDA方法计算像素位置,消除了直线方程中的乘法,在x和y方向使用合适的增量来逐步沿直线推出各像素位置,比直接使用直线方程快.但浮点增量误差的连续叠加积累会使长线段所计算的像素位置有所偏离.而且程序中的k与y 必须用浮点数表示,每一步运算必须对y进行舍入取整,取整操作和浮点运算十分耗时,不利于在硬件中实现.3.1.2 中点画线算法不失一般性,在对中点画线法的讨论中,假定直线斜率在0、1之间.如图3-3所示,若直线在x方向上增加一个单位,则在y方向上的增量只能在0、1之间.假设x坐标为xi的与直线最近的像素已经决定为P(xi, yi), 则下一个与直线最接近的像素只能是正右方的P1点(xi+1,yi)或右上方P2点(xi+1,yi +1).P2 (xi+1 , yi+1)QMP (xi , yi)P1 (xi+1 , yi)图3-3中点画线法中直线与中点、侯选点的关系以M(xi+1,yi+0.5)表示P1与 P2 的中点,用Q表示理想直线与x=xi+1直线的交点.很明显,当M在Q的下方,表明P2离直线更近,应该取P2 为下一个直线上的点; 当M在Q的上方, 表明P1离直线更近, 应该取P1 为下一个直线上的点,如果M与Q重合,可以任取P1、P2中的一点.这就是中点画线的基本思想.中点画线的算法实现,关键是建立判别式判断M和Q的位置关系, 以及如何合理方便地利用增量算法计算判别式.假设直线的起点和终点分别是(x0,y0)和(x1,y1),如果直线方程采用隐式方程表示为: (3-5)通过简单计算, 直线隐式方程中的a、b、c分别为:由于假定直线斜率在0、1之间, 且x0 x1, 所以a0; 如果一个点(x,y)在直线的下面,有F(x,y)0,取正右方像素P1,令再下一个像素的判别式为d1:(3-7)此时表示判别式的增量为a. 当d0,取右上方像素P2,令再下一个像素的判别式(3-8)此时表示判别式的增量为a+b.直线的最左端是端点(x0,y0), 所以d的初始值计算是:(3-9)上式的推导中考虑到了(x0,y0)在直线上,所以F(x0, y0)=0.在实际使用中我们只关心d的符号,又因为a、b都是整数,因此在算法实现中以2d的正负代替d的正负,这样可以化简掉d的初始值中得小数,写出仅包含整数运算的算法.中点画线算法中,只包含整数变量和加法运算,不包含浮点数和乘除法,适合硬件实现.3.1.3 Bresenham画线算法Bresenham算法是计算机图形学领域使用最广泛的直线扫描转换算法,是一个更好的算法.为了说明简便,仍然假定直线斜率在0到1之间.该方法采用了类似于中点画线算法的思想,用一个判别式的符号决定下一个像素点.算法原理如下:过各行各列像素中心构造一组虚拟网格线.按直线从起点到终点的顺序计算直线与各垂直网格线的交点,然后确定该列像素中与此交点最近的像素.该算法的在采用增量计算的同时,对于每一列,只需检查一个误差项的符号,就可以确定该列的所求像素.P1 (xi+1 , yi)P (xi , yi)图3-4 Bresenham算法设直线方程为: (3-10)假设已经确定的像素为P(xi yi).那么下一个像素如图3-4所示,可选择的像素点为 (xi1, yi)和(xi1, yi1) )两者中的一个,在x=xi1处直线上点y=k(xi1)+b,,该点到点到(xi1, yi)和(xi1, yi1)的距离分别令为d1和d2:两个距离的差是:若此差值为正,则d1d2,下一个像素点应取(xi1, yi1);若此差值为负,d10;对于圆内的点(x, y), F(x, y)0 .P(xi , yi)MP2(xi +1, yi-1)图3-6 中点画圆算法中当前像素与下一像素的候选关系与中点画线法一样,构造判别式: (3-14)若 则应取P1为下一像素,再下一像素的判别式为:(3-15)若, 则应取P2为下一像素,而且下一像素的判别式为:(3-16)这里讨论的是按顺时针方向生成第二个八分圆.则第一个像素是(0,R),判别式d的初始值为: (3-17)现在我们已经得到了一个画圆的增量算法,但考虑到判别式的初值d0中有浮点数将一直参与算法运算.为了将浮点算法化为整数算法,令ei=di - 0.25代替di.此时,di0等同于ei0等同于ei-0.25. 同时考虑到初始值e0=1-R是整数,且e的每一次迭代变量也为整数,所以ei-0.25等价于ei0;ei-0.25等价于ei0.归纳中点画圆算法,判别条件为:如果ei0,(Di)0将判别式改写为:如果di0 选择Di; 如果di0, 可以将上式作为判别式, 分析情况时的判别条件同样适用.分析情况 , 通过图上分析,应选择Di.此时Hi在圆外,Di在圆外或在圆上;所以,(Hi)0,(Di)0, 同样满足判别式的判别条件;所以我们选用 作为整个算法的判别式.下面我们用增量递推得方法,简化di的计算(3-18)如果di0,应选择Di,则下一点 ( xi+1,yi-1)的判别式是(3-20)对于初值d0, x0=0, y0=R, d0的计算是:(3-21)到此,我们已经得到了完整的基于整数的Bresenham画圆算法.3.3 填充技术在图形学的应用中,常常需要在指定的区域内填充上某种颜色或图案,一个封闭区域确定以后,填充要解决的问题是如何确定填充的像素以及如何高效地填充.3.3.1 种子填充算法区域的定义有两种,一种是区域采用边界定义,即区域边界上所有像素均具有某个特定值,区域内部所有像素均不取这一特定值,而边界外的像素则可具有与边界相同的值;另一种是区域内的像素用同一种颜色表示.在许多填充算法中,种子填充法是一种比较直观简单的方法,基本的思想是在一个封闭区域内部有一已知像素,由此出发通过某种方法找到区域内的所有像素.在讨论种子填充算法前,先讨论区域的连通性.区域的连通性是指从区域上一点出发,通过几个方向移动的组合,在不越出区域的前提下,到达区域的任意像素.区域可以分为四向连通区域和八向连通区域两种:四向连通区域指的是从区域上一点出发,可通过四个方向,即上、下、左、右移动的组合,到达区域的任意像素;八向连通区域指的是从区域内每一个像素,可通过八个方向,即上、下、左、右、左上、右上、左下、右下这八个方向的移动的组合来到达.图3-9 左图为四向连通区域,右图为八向连通区域种子填充法要求被填充区域是连通的,只有在连通区域内,才有可能将区域内的一点扩散到区域内的其它像素.种子填充法中允许从四个方向寻找下一像素的,称为四向算法;允许从八个方向探索下一像素的,称为八向算法.八向算法可以填充八向连通区域,也可以填充四向连通区域.但四向算法只能填充四向连通区域,而不能填充八向连通区域.如果图3-9中右边的是一个八向连通区域,按四向连通区域则是两个分离的区域,用四向算法可以将两个区域填成不同的颜色,而用八向算法会使两个区域填上同一颜色.以下我们只讨论四向算法.只要把搜索方向从四个改变成八个,即可得到八向算法.简单的种子填充算法可以采用递归算法.递归的基本方法是设种子像素为(x,y)是四向连通区域内的一点,old_color为区域内的原有像素的颜色,new_color是要填充的颜色,递归填充的过程是如果种子像素是区域内原有颜色old_color,说明该种子像素在区域内,则将像素置为被填充颜色new_color,同时将种子像素的上、下、左、右像素当作种子递归调用填充递归算法;否则说明该像素已被填充,不再处理. 3.3.2扫描线填充算法递归算法的原理和程序都很简单,但由于多次递归,费时、费内存,计算机的效率将非常低.因此可以使用栈结构来实现简单的种子填充算法.算法原理如下:种子像素入栈;当栈非空时重复执行如下三步操作:(1) 找顶像素出栈;(2) 将出栈像素置成填充色;(3) 按某一个顺序如左、上、右、下检查与出栈像素相邻的四个像素,若其中某个像素还是区域中原有颜色,或不为边界,则把该像素入栈.如图3-10所示,像素1到9 是一个区域,具有同一种颜色.用简单的种子填充算法对该区域进行填充,如图3-11表示了像素的入栈和出栈顺序和栈的变化.最下面一行表示出栈顺序,每一列表示栈的变化情况.从中看到有些像素反复出现,说明它们被重复入栈,也就重复出栈时需要判断后决定是否填充.这一方面降低了算法的效率,另一方面还要求很大的存储空间以实现栈结构,改进的方法是扫描线填充算法,基本思想是在任意一个扫描线与边界的相交区间(含若干个连续像素)中,只取一个种子像素,一次填充操作针对区域内扫描线上连续的像素.算法原理如下.54312S11698图3-10 种子填充图3-11 种子填充(堆栈)种子像素入栈;当栈非空时作如下四步操作:(1) 栈顶像素出栈;(2) 沿扫描线对出栈像素的左右像素进行填充,直至遇到边界像素为止,即每出栈一个像素,就对包含该像素的整个区间进行填充;(3) 上述区间内最左、右的像素分别记为xl 和xr ;(4) 在区间检查与当前扫描线相邻的上下两条扫描线的有关像素是否全为边界像素或已填充的像素,若存在非边界,未填充的像素,则把每一区间的最右像素取作种子像素入栈.3.4 Bezier曲线1962年,法国雷诺汽车公司的P.E.Bezier构造了一种以逼近为基础的参数曲线和曲面的设计方法,并用这种方法完成了一种称为UNISURF的曲线和曲面设计系统.Bezier方将函数逼近同几何表示结合起来,使得设计师在计算机上就象使用作图工具一样得心应手.Bezier曲线的形状是通过一组多边折线(特征多边形)的各顶点唯一地定义出来的.在这组顶点中:(1) 只有第一个顶点和最后一个顶点在曲线上;(2) 其余的顶点则用于定义曲线的导数、阶次和形状;(3) 第一条边和最后一条边则表示了曲线在两端点处的切线方向.3.4.1 Bezier曲线的定义Bezier曲线是由多项式混合函数推导出来的,给定空间n+1个点的位置矢量Pi(i=0,1,2,n),则定义一个 n次Bezier参数曲线,其各点坐标的插值公式是:其中,Pi构成该Bezier曲线的特征多边形,BENi,n(t)是n次Bernstein基函数.Bezier曲线如图3-12所示:P2P2P0P1P3P1P0P3图3-12 三次Bezier曲线Bernstein基函数具有如下形式:这里规定:00=1,0!=1.则t=0时,k=0 ,BENk,n(t)=1,k0 ,BENk,n(t)=0.t=1时,k=n ,BENk,n(t)=1,kn ,BENk,n(t)=0.(1) 一次Bezier曲线(n=1) n=1时,有2个控制点P0和P1,Bezier多项式是一次多项式:一次Bezier曲线是连接起点P0和终点P1的直线段.(2) 二次Bezier曲线(n=2)n=2时,有3个控制点P0、P1和P2,Bezier多项式是二次多项式:二次Bezier曲线是一条抛物线,如下图所示.P0PmP2P(1/2)P(1/2)P1 图3-13 二次Bezier曲线(3) 三次Bezier曲线(n=3) n=3时,有4个控制点P0、P1、P2和P3,Bezier多项式是三次多项式:其中,它们是三次Bezier曲线的基函数,它们均为三次曲线,任何三次Bezier曲线都是这4条曲线的线性组合.由于每个基函数的参数t在整个(0,1)的开区间内不为零,使得Bezier曲线不可能对曲线的形状进行局部控制,如果改变任一控制点的位置,整个曲线受到影响.将三次Bezier曲线表示为矩阵形式:其中,Mbe是三次Bezier曲线的系数矩阵,为常数,Gbe是4个控制点的位置矢量.3.4.2 Bezier曲线的离散生成要计算Bezier曲线上的点,可用Bezier曲线方程,但使用de Casteljau提出的递推算法则要简单的多.该算法把一个复杂的几何计算问题转化为一系列的线性运算,所以计算稳定可靠,具有通用性,易于在计算机上实现.下面用几何作图的过程来对该算法进行说明,如下图所示.)3/1(30PP=011/30P1P2P3P10P11P12P20P21P图3-14 几何作图法求Bezier曲线已知控制点,称为,构成n条边的控制多边形.首先依次对控制多边形进行定比分割,分割比例为t:(1-t),得到第一级递推的中间顶点.然后再对这些中间顶点构成的控制多边形进行同样的定比分割,得到第二级递推的中间顶点.如此继续,直到n次分割得到中间顶点,即为所求的Bezier曲线P(t).以上的递推过程可以用公式表示为:de casteljau算法递推出的呈直角三角形,对应结果下图所示.从左向右递推,最右边点即为曲线上的点. 0P1P2P3P10P11P12P20P21P30P图3-15 Bezier曲线的递推过程第4章 界面设计与编码4.1 界面设计4.1.1 主界面本程序主窗体采用Visual Basic中的MDI窗体,可新建多个窗体作为其子窗体,以实现多文档同时操作的功能.主界面由菜单栏,工具栏(左侧),工具选项栏(菜单栏下侧),调色板区(右侧),下侧的进度条(需要时显示)以及中央的文档区构成.新建图片文件后,在中央文档区显示.如图4-1所示.菜单栏通过菜单编辑器添加,设置菜单的名称,在代码中实现对应的功能.工具栏,工具栏选项区,调色板区就是三个PictureBox,其中的按钮和色块也均是PictureBox,修改PictureBox的Picture属性显示按钮的图片,在代码中通过在PictureBox中画线,实现按钮的按下效果.图4-1 EasyDraw主界面4.1.2 展示屏幕展示屏幕其实是一个无边框窗体,在程序打开时运行,在程序加载的过程中显示加载进度,展示软件作者、版本等信息图4-2 EasyDraw展示屏幕4.1.3 快速启动页快速启动页中有一个选项卡,默认启动为“新建”选项卡,该选项卡页上有一个列表,显示最近打开和保存的文件,双击列表项,可重新打开,若文件不存在,可按提示删除记录.也可以点击“创建新文件”按钮新建图片文件.打开选项卡中内嵌了Windows打开菜单,可以快速打开计算机中的各类图片.图4-3 EasyDraw快速启动页4.1.4 新建文档在菜单栏的“文件”里点击“新建”或在快速启动页里点击“创建新文件”均可创建新文档.文档窗体包括一个PictureBox控件作为画布,承载图片.下侧和右侧各有一个VScroll和HScroll控件,在代码中编辑事件,实现画布的滚动.标题中显示当前文档标题和当前缩放倍数.图4-4 新建文档4.1.5 菜单栏预览图4-5 菜单栏4.1.6 工具选项栏工具选项栏在菜单栏下侧,选择左侧工具栏里的工具时,工具选项栏里会加载相应的属性选项,右侧是当前状态显示,前半部分显示当前鼠标在画布上的逻辑坐标,后半部分显示当前图形的长和宽即规格.图4-6 工具选项栏图4-7为各工具对应的选项栏图4-7工具选项4.1.7 其他窗体图4-8为EasyDraw工程中窗体和模块视图图4-8 窗体和模块图4-9 其他窗体4.2 编码实现画图过程均分为两部分,图形模拟部分和画图落实部分,即先通过操作图形控件模拟画图的过程,然后再在画板上画出相应的图形.例如画线,先用VB中的直线控件,通过鼠标的MouseMove事件实时设定控件的终点坐标,以模拟画线的动态过程;然后在MouseUp事件中实现画图过程.4.2.1 直线-Bresenham画线算法参数说明:Area:PictureBox类型,指定要画线的控件.x1,y1:Single类型,指定直线相对Area的起始点坐标x2,y2:Single类型,指定直线相对Area的终点坐标color:Long类型,指定直线的颜色Public Sub LineB(Area As PictureBox, ByVal x1 As Single, ByVal y1 As Single, ByVal x2 As Single, ByVal y2 As Single, ByVal color As Long) 变量定义省略 在起始点画点Area.PSet (x1, y1), color If x1 = x2 And y1 = y2 Then Exit Sub End If dx = Abs(x2 - x1) dy = Abs(y2 - y1) 如果直线斜率1即dx dy,交换起始点和终点 If dx 0 Then tX = 1 Else tX = -1 End If If (y2 - y1) 0 Then tY = 1 Else tY = -1 End If curx = x1 cury = y1 inc1 = 2 * dy inc2 = 2 * (dy - dx) d = inc1 - dx While (curx x2) curx = curx + tX If d 0 Then d = d +
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!