VB可视化编程的设计方案.doc_第1页
VB可视化编程的设计方案.doc_第2页
VB可视化编程的设计方案.doc_第3页
VB可视化编程的设计方案.doc_第4页
VB可视化编程的设计方案.doc_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

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

文档简介

VB可视化编程的设计方案第一章 绪 论面状符号的填充在地理信息系统、计算机图形学中都有充分的提到。信息是用文字、数字、符号、语言、图像等的内容、数量或特征,从而向人们(或系统)提供关于现实世界新的事实和知识,作为生产、建设、经营管理、分析和决策的依据。信息技术是当今世界高技术群的代表,它可以帮助人们收集情报、揭示问题和预测未来,极大地扩大和增强人类适应自然的能力,为人类社会带来更大的益处。地理信息系统是一种十分重要的空间信息系统,它是在计算机硬件、软件系统的技术支持下,对整个或部分地球表层空间的地理分布数据进行采集、储存、管理、运算、模拟、分析、显示和描述的技术系统。由郭志达主编的地理信息系统原理与应用一书中的第6章中讲到了符号及空间资料的可视化。计算机图形学是人类近30年来在科学技术领域中取得的一项重大成就。国际标准化组织给计算机图形学做出了如下定义:“计算机图形学是研究通过计算机将数据转换为图形,并在专用显示设备上显示的原理、方法和技术的学科。”在发达国家中,计算机图形学已经广泛地应用于工程技术与社会生活的各个领域之中,如机械、电子、建筑、航空航天、交通运输等等。由焦永和主编的计算机图形学教程(第二版)一书中详细地介绍了有关区域填充的问题,同时,由孙家广主编的计算机图形学中也有相关的介绍。像上面提到的介绍面状符号的填充的书籍不胜枚举,在这里,我就想大家介绍这几本。下面就具体地说说我是如何实现面状符号的填充的。在地图中,往往需要用一区域表示地物、地貌,所以要对区域进行填充颜色或图案以示区别。在这次设计中,我用的是编程的方法来实现这一目的的,更进一步讲是用VB编程来实现的。VB是众多编程语言中比较容易理解、掌握的一门语言。本次设计的具体做法是:首先,先画出一任意多边形(设计当中我是用五边形为例的),然后求出该多边形的最小外接矩形,再对最小外接矩形进行划分,将其划分为n个小矩形,求出这些小矩形的中心坐标,然后判断哪些小矩形是位于多边形的内部的,做这一判断有很多种方法,在这次设计中介绍了三种方法:求交法、栅格法、面积法。最后,对位于多边形内部的小矩形进行填充,比如说以小矩形的中心为中心画圆,在这里还得判断个别小矩形的中心离多边形边的距离是否大于所填圆的半径,对那些小于半径的小矩形不予以填充,至此,整个设计就结束了。由于设计者的水平有限,所以设计的结果不是很完美,仍然存在着缺陷,像设计程序仅仅适用于凸多边形,而对于凹多边形就不适用了,这是因为在判断哪些小矩形位于多边形内部时,我用的是面积法,面积法是位于多边形内部的点与多边形各顶点连接构成的三角形的面积和等于多边形的面积,而面积法不适用于凹多边形。第二章 Visual Basic的基础知识第一节 Visual Basic简介一、 Visual Basic概述Visual Basic(简称VB)是美国微软(Microsoft)公司推出的Windows环境下的软件开发工具,使用VB可以既快又简单地开发Windows应用软件。 Visual是指开发图形用户界面(GUI)的方法。Visual的意思是“视觉的”或“可视的”,也就是直观的编程方法。在VB中引入了控件的概念,如各种各样的按钮、文本框、复选框等。VB把这些控件模式化,并且每个控件都由若干属性来控制其外观、工作方法。这样,采用Visual方法无需编写大量代码去描写界面元素的外观和位置,而只要把预先建立的控件加到屏幕上。 Basic是指BASIC(Beginners All-purpose Symbolic Instruction Code)语言,之所以叫做“Visual Basic”就是因为它使用了BASIC语言作为代码。 随着微型计算机技术的飞速发展,美国微软公司的Microsoft Windows以其具有多任务性,图形用户界面,动态数据交换,对象链接与嵌入等强大功能,而成为当今微型计算机操作系统的主流产品。众多的软件开发者已从原来的DOS软件开发转向Windows。许多商用软件公司为适应这一趋势推出了不少Windows环境下的软件开发工具,如Visual C+、Visual Basic、Borland C+、Delphi、PowerBuilder等等。使用VB不仅可以感受到Windows带来的新技术,新概念和新的方法,而且VB是目前众多Windows软件开发工具中效率最高的一个。另外VB系列产品得到了计算机工业界的承认,得到了许多软件开发商的大力支持。二、 Visual Basic的发展过程 早在1991年,为了简化Windows应用程序的开发,微软公司推出了Visual Basic 1.0它极大地改变了人们对Windows的看法以及使用Windows的方法。1992年,经过对Visual Basic 1.0的修改后,微软推出了Visual Basic 2.0。 1993年经再次修改完善后,Visual Basic 3.0上市了。从这一版开始,Visual Basic 在Windows中几乎是无所不能的了。 1995年,随着Windows 95轰轰烈烈的发布,Visual Basic 4.0也随之问世了。 1997年,微软公司开始推出Windows开发工具套件Microsoft Visual Studio 1.0,其中包括了Visual Basic 5.0,1998年发布的Microsoft Visual Studio 98 则包括了Visual Basic 6.0。 Visual Basic 5.0以前的版本主要应用于DOS和Windows 3.x环境中16位程序的开发,从Visual Basic 5.0以后的版本则只能运行在Windows 95或Windows NT操作系统下,是一个32位应用程序的开发工具。 VB 6.0是微软推出的VB家族最新成员,它共有3个版本:标准版,专业版,企业版。三、 Visual Basic的特点VB是目前所有开发语言中最简单,最容易使用的语言。作为程序设计语言,VB程序设计具有以下特点。1. 可视化的设计平台用传统程序设计语言编程时,需要通过编程计算来设计程序的界面,在设计过程中看不到程序的实际显示效果,必须在运行程序的时候才能观察。如果对程序的界面不满意,还要回到程序中去修改,这一过程常常需要反复多次,大大影响了编程的效率。VB提供的可视化设计平台,把Windows界面设计的复杂性“封装”起来。程序员不必再为界面的设计而编写大量的程序代码,只需按设计的要求,用系统提供的工具在屏幕上“画出”各种对象,VB自动产生界面设计代码,程序员所需要编写的只是实现程序功能的那部分代码,从而大大提高了编程的效率。2. 面向对象的设计方法 VB采用面向对象的编程方法(OOP),把程序和数据封装起来作为一个对象,并为每个对象赋予相应的属性。在设计对象时,不必编写建立和描述每个对象的程序代码,而是用工具“画”在界面上,由VB自动生成对象的程序代码并封装起来。3. 事件驱动的编程机制 VB通过事件执行对象的操作。在设计应用程序时,不必建立具有明显开始和结束的程序,而是编写若干个微小的子程序,即过程。4. 结构化的设计语言 VB是在结构化的BASIC语言基础上发展起来的,加上了面向对象的设计方法,因此是更具有结构化的程序设计语言。5. 充分利用Windows资源 VB提供的动态数据交换(DDE)编程技术,可以在应用程序中实现与其他Windows应用程序建立动态数据交换,在不同的应用程序之间进行通信的功能。 VB提供的对象链接与嵌入(OLE)技术则是将每个应用程序都看作一个对象,将不同的对象链接起来,嵌入到某个应用程序中,从而可以得到具有声音,影像,图像,动画,文字等各种信息的集合式文件。 VB还可以通过动态链接库(DLL)技术将C/C+或汇编语言编写的程序加入到VB的应用程序中,或是调用Windows应用程序接口(API)函数,实现SDK所具有的功能。6. 开放的数据库功能与网络支持 VB具有很强的数据库管理功能。不仅可以管理MS Access格式的数据库,还能访问其他外部数据库。另外,VB还提供了开放式数据库链接(ODBC)功能,可以通过直接访问或建立连接的方式使用并操作后台大型网络数据库。在应用程序中,可以使用结构化查询语言(SQL)直接访问Server上的数据库,并提供简单的面向对象的库操作命令,多用户数据库的加锁机制和网络数据库的编程技术,为单机上运行的数据库提供SQL网络接口,以便在分布式环境中快速而有效地实现客户/服务器(Client/Server)方案。第二节 VB可视化编程的基本概念 传统的编程方法使用的是面向过程、按顺序进行的机制,其缺点是程序员始终要关心什么时候发生什么事情,处理Windows环境下的事件驱动方式工作量太大。VB采用的是面向对象、事件驱动编程机制,程序员只需编写响应用户动作的程序,而不必考虑按精确次序执行的每个步骤,编写的代码相对较少。另外,VB提供的多种“控件”可以快速创建强大的应用程序而不需涉及不必要的细节。 VB使用的“可视化编程”方法,是“面向对象编程”技术的简化版。在VB环境中所涉及到的窗体、控件、部件和菜单项等均为对象,程序员不仅可以利用控件来创建对象,而且还可以建立自己的“控件”,这是Windows环境下的编程新概念。一、 对象的属性、事件和方法 在现实生活中,任何一个实体都可以视为一个对象(Object)。 在VB中,常用的对象有工具箱中的控件、窗体、菜单、应用程序的部件以及数据库等。从可视化编程的角度来看,这些对象都具有属性和方法。简单地说,属性用于描述对象的一组特征,方法为对象实施一些动作,对象的动作则常常要触发事件,而事件又可以修改属性。1. 对象的属性 每个对象都有一组特征,称之为属性。不同的对象有不同的属性。在可视化编程中,每一种对象都有一组特定的属性。许多属性可能为大多数对象所共有,还有一些属性只局限于个别对象。每一个对象属性都有一个默认植,如果不明确地改变该值,程序就将使用它。通过修改对象的属性能够控制对象的外观和操作。对象属性的设置一般有两种途径:(1) 选定对象,然后在属性窗口中找到相应的属性直接设置。这种方法的特点是简单明了,每当选择一个属性时,在属性窗口的下部就显示该属性的一个简短提示,缺点是不能设置所有所需的属性。(2) 在代码中通过编程设置,格式为对象名.属性名=属性值如Label1.Caption=”轻松轻松学用VB6.0”2. 对象的事件 事件就是对象上所发生的事情。 在VB中,事件是预先定义好的、能够被对象识别的动作,如单击(Click)事件、双击(DblClick)事件、装载(Load)事件、鼠标移动(MouseMove)事件等,不同的对象能识别不同的事件。当事件发生时,VB将检测两条信息,即发生的是哪种事件和哪个对象接受了事件。 每种对象能识别一组预先定义好的饿事件,但并非每一种事件都会产生结果,因为VB只是识别事件的发生。为了使对象能够对某一事件做出响应,就必须编写事件过程。 事件过程是一段独立的程序代码,它在对象检测到某个特定的事件时执行。一个对象可以响应一个或多个事件,因此可以使用一个和多个事件过程对用户或系统的事件作出响应。程序员只需编写必须响应的事件过程,而其他无用的事件过程则不必编写。3. 事件的方法 一般来说,方法就是要执行的动作。用户对具体实现过程并不关心,关键是最终收到的效果。 VB的方法与事件过程类似,它可能是函数,也可能是过程,它用于完成某种特定功能而不能响应某个事件。每个方法完成某个功能,但实现步骤和细节用户既看不到、也不能修改,用户能做的工作就是按照约定直接调用它们。 方法只能在代码中使用,其用法依赖于方法所需的参数的个数以及它是否具有返回值。当方法不;不需要参数并且也没有返回值时,可用下面的格式调用对象方法。 对象名.方法名 如图片框有刷新显示方法,在事件过程代码中调用该方法的代码为:Picture1.Refresh二、 VB的控件控件是预先定义好的、程序中能够直接使用的对象,每个控件都有大量的属性、事件和方法可在设计时或在代码中修改和使用。利用控件编程使程序员免除了大量重复性的工作,能够以最快的速度和效率开发具有良好用户界面的应用程序。 VB中的控件通常分为3种类型:(1) 内部控件。默认状态下工具箱中显示的控件都是内部控件,这些控件被“封装”在VB的EXE文件中,不可从工具箱中删除。(2) ActiveX控件。这类控件单独保存在.ocx类型的文件中,其中包括各种版本VB提供的控件。(3) 可插入的对象。 工具箱中的每个控件都用一个图形按钮来表示,主要包括表2-1列出的19个内部控件。表2-1 VB的内部控件图片框控件用于显示图形文件或文本文件,也可以作为其他控件的容器 标签控件创建一个标签对象,用于保存不希望用户改动的文本,如复选框上面或图形下面的标题文本框控件创建用于显示和输入数据的文本框对象,用户可以在其中输入或更改文本框架控件用于美化其他控件并提供分组功能命令按钮控件创建命令按钮对象,用于执行命令复选框控件创建复选框对象,允许用户选择开关状态,或显示多个选项,用户可从中选择多个选项选项按钮控件创建选项按钮组对象,用于显示多个选项,用户只能从中选择一个选项组合框控件创建组合框或下拉列表框对象,用户可以从列表项中选择一项或人工输入一个值列表框控件创建列表框对象,用于显示供用户选择的列表项。当列表项很多,不能同时显示时列表可以滚动水平滚动条与垂直滚动条控件用于提供简便的定位。还可以模拟当前所在的位置计时器控件创建计时器对象,以设定的间隔捕捉计时器事件。此控件运行时不可见驱动器列表框控件显示当前可用的驱动器,供用户选择文件列表框控件显示当前路径下的文件名列表,供用户选择形状控件创建形状对象,设计时用于画各种类型的形状。线条控件创建线条对象,设计时用于在窗体上画各种类型的线条图像控件创建图像对象,在窗体上显示位图、图标、JPEG、GIF等图形文件。单击时,其动作类似于命令按钮数据控件用于连接数据库,并在窗体的其他控件中显示数据库信息OLE容器控件创建OLE容器对象,用于把其他应用的数据嵌入到VB的应用程序中 三、 窗体对象 窗体也就是平时所说的窗口,它是VB编程中最常见的对象,也是程序设计的基础。1. 窗体的结构同Windows环境下的应用程序窗口一样,VB中的窗体也有控制菜单、标题栏、最大化/复原按钮、最小化按钮、关闭按钮以及边框,如图2-1所示 图2-1 窗体的结构创建新窗体的步骤如下:(1) 从“工程”菜单中选择“添加窗体”菜单项。(2) 缺省情况下系统将显示如图2-2所示的“添加窗体”对话框。(3) 该对话框的“新建”选项卡用于创建一个新窗体,列表框中列出了各种新窗体的类型,其中选择“窗体”选项时,建立一个空白的新窗体,选择其他选项时则建立一个预定义了某些功能的窗体。(4) 单击“打开”按钮,一个新的空白窗体被加入到当前工程中,同时会显示在屏幕上,如图2-3所示。图2-2 “添加窗体”对话框图2-3 添加新窗体2. 窗体的属性常用的窗体属性如表2-2所示。 表 2-2 常用的窗体属性属性用 途Name决定窗体的名字,同时也是磁盘上的窗体文件名,扩展名为.FrmCaption决定标题栏中显示的文本Backcolor用于确定窗体的背景颜色Boderstyle用于决定窗体的边框风格ControlBox决定窗体是否具有控制菜单MaxBotton决定窗体的标题栏中是否具有最大化按钮Movable决定控制窗体是否可移动WindowState通过取值决定窗体是正常、最小化还是最大化状态第三节 VB可视化编程的环境一、 属性窗口 在VB集成环境的默认视图中,属性窗口位于工程窗口的下面。按键,或单击工具栏中“属性窗口”按钮,或选取“视图”菜单中的“属性窗口”子菜单,均可打开属性窗口,如图2-4所示。图2-4 属性窗口二、 工程窗口工程窗口类似于Windows下的资源管理器,在这个窗口中列出了当前工程中的窗体和模块,其结构用树状的层次管理方法显示。如图2-5所示。 图2-5 工程窗口三、 代码窗口 “代码窗口”也称“代码编辑器”,在“代码窗口”中有“对象下拉列表框”和“代码区”,如图2-6所示。图2-6 代码窗口第三章 符号第一节 地图符号及其分类空间要素以其位置和属性为特征。为了在地图上表示某一空间要素,我们用地图符号来指示该要素的位置,并用该符号与一个或一组视觉变量的组合来显示该要素的属性数据。比如,用红色粗线代表州际公路,而用黑色细线代表州级公路。在此二例中,线状符号均表征了公路的位置,而线的宽度和色彩这两种视觉变量与线状符号一起,将州际公路和州级公路区分开来。选择合适的地图符号和视觉变量是数据显示主要关注的一个方面。对栅格数据而言,地图符号的选择已不是一个问题,因而无论被描述的空间要素是点、线或多边形,地图符号都由像元组成。然而,对矢量数据而言,常用的地图符号像要素类型分类一样,也分为点、线、面三类。从而,为矢量数据选择地图符号的通用法则如下:点状符号适用于点状要素,线状符号适用于线状要素,面状符号适用于面状要素。 对上述数据-符号法则也有例外。一个GIS项目通常会用到诸如高程、气温和降雨量等立体或三维数据,然而却没有相应的立体符号,只得用点、线和面状符号表示这些立体数据。另一个常见的例外是用多边形标识位置上的点状符号来显示合计数据,如县或州的人口总数。地图符号系统中的视觉变量包括形状、大小、纹理、图案、色相、色值和彩度。例如,一幅地图可用大小不同的圆圈来表示不同规模等级的城市。另一方面,图案(符号斑纹的类型)则更适合于表征标称或定性数据。比如,一幅地图可用不同的面状图案代表不同的土地利用类型。现实世界尽管形态各异,千变万化,但是在空间资料抽象表达时,将其分为点状地物、线状地物和面状地物,因而表达地物的符号也相应地有点状符号、线状符号和面状符号一、 点状符号 点状符号是不依比例尺表示的小面积地物(如油库、水井)或点状地物(如测量控制点)等。点状符号的特点是:图形固定,不随它在图面上的位置的变化而变化;符号都有确定的定点位和方向;点状符号图形大多比较规则,由简单几何图形构成。 对点状符号可采用直接编码和间接编码两种方法。 直接编码法是直接以每一步的走步方向的代码构成信息块。例如,编写西文字母“B”的信息块,可其分解成不同方向的步数,并按一定的规则排列,加上相应的抬落笔编号,就可构成西文字母“B”的信息块。 间接编码法是以位移网格代码构成信息块的,绘图时经转换得到走步方向和步数。它可分为格点编码法和非格点编码法。这里只介绍计算机地图制图中较适用的格点编码法。格点编码法是:对任意范围内所设的正交网格交点赋予一定内容的数码,然后用手工方法在该范围内画符号,将符号线划通过的网格交点的数码按一定的顺序排列,就得到符号的信息块。一般地说,网格越精细,符号质量越高,但信息块数据量就越的大。网格的精细度取决于所绘符号的复杂程度。用编程的方法绘制点状符号也是经常用的方法。现以圆的绘制说明其算法。任何一个圆都可以用一个正多边形逼近它,其边数越多,圆弧就越显光滑。然而,多边形边数太多,则绘图时会因墨水笔或纤维笔渗透过多的墨水而使圆周不清晰,当然也会浪费时间。因此,只要保持正多边形与圆周之间的拱高在某一限差之内,使其多边形看起来光滑即可。但是,随着计算机的飞跃发展,在VB中,绘制圆仅仅需要调用VB提供的绘图方法可以更加灵活地绘制图形。Circle方法可以画圆、椭圆、弧。语法为:.CircleStep(x,y),color,start,end,aspect说明:(1)(X,Y)圆、椭圆、弧的中心坐标。(2)指定圆、椭圆、弧的半径。(3) color可选,如果被忽略,则使用ForeColor属性值。(5) start和end指定弧或扇形的起点以及终点位置。(6) aspect为垂直半径与水平半径之比.(7) 可以省略语法中的某个参数,但不能省略分隔参数的逗号。画圆的程序代码如下:Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)Dim x1 As Single, y1 As Singlex1 = Xy1 = YCircle (x1, y1), 500End Sub运行结果如图3-1 图 3-1二、 线状符号线状符号是长度依比例尺表示而宽度不依比例尺表示的符号,用于表示呈线状(如边界线)或细条带状延伸的地物(如河流、道路)。线状符号的特点是:都有一条有形或无形的定位线;符号可进一步划分为曲线、直线、虚线、并行线、沿定位线连续配置点符号等;符号进一步分解为单一特征的线状符号,即一线状符号可由若干条具有单一特征的线状符号组成。线状符号采用对重复元进行编码。重复元是指组成线状符号的基本单元,对它亦可类似上述方法编码,绘制时须按中轴线位置和走向逐点变换后,连续配置成完整的土堤符号。当符号图形复杂时,上述编码不能适用,可直接用伴有抬落笔码的坐标矢量的有序集合作为信息块。完整的信息块还应包括符号色代码等。 该方法是由绘图子程序按符号图形参数计算绘图矢量并操纵绘图笔绘制地图符号的方法。对每一个地图符号或同一类型的一组地图符号编一个绘图子程序,这些程序组成一个程序库。在绘图时按程序(即符号)的编号调用库中相应的程序,输入适当的参数,该程序将根据已知数据和参数计算绘图矢量,并产生驱动绘图机的命令,从而完成地图符号的绘制。这种方法一般只适用于那些能用数学表达式描述的地图符号。编程的过程是,先建立描述符号的数学模型,然后设计流程图和编写源程序,最后上机调试并确认优化后入库。应注意的是,尽量用一个程序能绘制多个符号,如绘圆和椭圆就可用一个程序完成。程序功能的大小完全取决于对要素的精心分类和选择适当的参数。三、 面状符号 面状符号是指在二维平面上能按一定比例尺表示地物分布范围的符号,用于表示面状分布物体或地理现象。面状符号的特点是:有一条封闭的轮廓线,多数面符号是在轮廓线范围内配置不同的点状符号、绘阴影线或涂色。这些符号的共同点就是在面状符号范围线内填绘不同方向、不同间隔、不同粗细的晕线,或填绘呈一定规律分布的个体符号,花纹或颜色来反映这些现象的质量特征或数量上的差异。 实际上,点、线、面符号不是孤立的,他们之间存在一定的联系。线符号中往往包含点符号,面符号中也可能包含线、点符号。 在下面的一章节中,我们主要讨论有关区域填充的问题,即面状符号的填充。第四章 区域填充 区域填充是指在一个有界区域内填充某种颜色或图案,如机械制图中的45度剖面线。区域填充分为两类:一类叫多边形填充,一类叫种子填充。两者的前提条件不同,多边形的填充需要提供多边形各顶点的坐标及填充色或图案;而种子填充则要求给出边界颜色特征及区域内的一个点(即种子点)的坐标。第一节 多边形填充 一种常用的填充方法是按扫描线顺序,计算扫描线与多边形的相交区间,再用要求的颜色或图案显示这些区间的像素,从而完成多边形的填充。多边形填充首先需要求出扫描线与边界的交点,利用边的相关性可以简单有效地解决这个问题。当一条扫描线与多边形的某一条边线有交点时,其相邻扫描线一般也与该边线相交,而且扫描线与该边线的交点,很容易从前一条扫描线与该边的交点求出。利用边的这种相关性,不必算出边线与各条扫描线的全部交点,只需以边线为单位,对每条边建立一个边记录,其内容包括:该边Y的最大值,该边底端的X坐标值,从一条扫描线到下一条扫描线间的X增量值,以及指示下一个边记录地址的指针。 下面用编程(VB)的方法实现对多边形(五边形)进行符号的填充(填充圆圈)。第二节 对任意多边形填充符号第一步:画一任意多边形,在这用五边形为例。在VB中,建立应用程序用户界面,选择“新建”工程,双击窗体的空白部分,进入到代码编辑窗口,单击“对象”下拉列表框右边的箭头按钮,从中选择Form对象,在:“过程”下拉列表框中选择MouseDown事件,再选择Load事件,在代码窗口中输入下列代码:Private Sub Form_Load() sum = 0End SubPrivate Sub Form_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single) If sum = 1 Then Line (your(sum - 1).x, your(sum - 1).y)-(your(sum).x, your(sum).y) End If If sum = 4 Then Line (your(0).x, your(0).y)-(your(4).x, your(4).y) End If sum = sum + 1 End IfEnd Sub运行结果如图4-1: 图 4-1第二步:求出该五边形的最小外接矩形。进入窗体设计器,在窗体中增加2个命令按钮Command1-2。设置对象的属性,如表4-1 表 4-1 对象属性属性值说明Command1Captionqz按钮的标题Command2Captionzxjx按钮的标题在代码窗口中输入下列代码:Private Sub Command1_Click() max.x = your(0).x min.x = your(0).x max.y = your(0).y min.y = your(0).y Dim i As Integer i = 0 求各顶点的最大、最小值 Do While i max.x) Then max.x = your(i).x End If If (your(i).y max.y) Then max.y = your(i).y End If If (your(i).y min.y) Then min.y = your(i).y End If If (your(i).x min.x) Then min.x = your(i).x End If i = i + 1 LoopEnd SubPrivate Sub Command2_Click() Line (min.x, min.y)-(max.x, max.y), , B 画最小外接矩形End Sub运行结果如图4-2:图 4-2第三步:将最小外接矩形进行划分。在窗体设计器中增加2个命令按钮和2个文本框,文本框用于输入小矩形的长度和宽度。设置对象的属性,如表4-2表 4-2对象属性属性值说明Command3Captionsx按钮的标题Command4Captionhx按钮的标题Text1Caption500文本的内容Text2Caption500文本的内容在代码窗口中输入下列代码:Private Sub Command3_Click() Dim k As Integer 沿x轴方向划分最小外接矩形 Dim j As Integer j = 1 p = Val(Text1.Text) k = (max.x - min.x) p sx(0) = min.x Do While j = k sx(j) = sx(j - 1) + p j = j + 1 Loop sx(j + 1) = max.x k = 0 Do While k = j + 1 Line (sx(k), min.y)-(sx(k), max.y) k = k + 1 Loop End SubPrivate Sub Command4_Click() Dim k1 As Single 沿y轴方向划分最小外接矩形 Dim j1 As Integer j1 = 1 q = Val(Text2.Text) k1 = (max.y - min.y) q hx(0) = min.y Do While j1 = k1 hx(j1) = hx(j1 - 1) + q j1 = j1 + 1 Loop hx(j1 + 1) = max.y k1 = 0 Do While k1 = j1 + 1 Line (min.x, hx(k1)-(max.x, hx(k1) k1 = k1 + 1 LoopEnd Sub运行结果如图4-3:图 4-3第四步:判断哪些小矩形位于五边形内,哪些在五边形外,对此只需判断这些小矩形的中点的坐标是否在五边形内。判断小矩形在五边形内还是外有三种方法,现分别介绍如下:第一种方法是求交法。经过所有小矩形的中点画一条线,判断这条线与五边形的关系,首先排除与五边形不相交的那些线。对于相交的那些线,求出它们与五边形的交点,判断这些交点是位于该中心点的两侧还是一侧,若交点位于中心点的两侧,则该中心点位于五边形内;若交点是位于中心的一侧的话,那么该中心点就不在五边形内,即在五边形外。如图4-4所示,1号点与五边形的交点位于1号点的同一侧,所以可以得出1号点不位于五边形的内部,而2号点与五边形的交点位于2号点的两侧,所以2号点位于五边形的内部。图 4-4 第二种方法是将五边形的五条边栅格化。将五边形的五条边分别与小矩形进行求交,对每条边所经过的小矩形进行赋值(假设设为5),对五边形内部也进行赋值(假设设为0),对所有0值的小矩形进行填充,直到遇见属性为5的小矩形为止停止填充。如图4-5所示。55555500055500000555000000550000005500000555550055555图 4-5第三种方法是面积法。如果小矩形的中心点与五边形的各个顶点连接组成的三角形的面积之和等于五边形的面积,那么该中心点就位于五边形内;如果小矩形的中心点与五边形的各个顶点连接组成的三角形的面积之和不等于五边形的面积,那么该中心点就位于五边形外。(五边形的面积用辛普森法求得,三角形面积用公式m=s,s=(a+b+c)/2,a、b、c为三角形的边长)。如图4-6所示,1号点位于多边形的内部,它与多边形的各个顶点连接组成的三角形的面积之和等于多边形的面积;而2号点位于多边形的外部,它与多边形各个顶点连接组成的三角形的面积之和不等于多边形的面积。图 4-6此方法仅仅适用于凸多边形,对于凹多边形就会发生错误,因为即使中心点位于多边形内,但是它与多边形的各个顶点连接组成的三角形的面积之和也有可能不等于多边形的面积。如图4-7所示,2号虽然位于多边形的内部,但它与多边形的各个顶点连接组成的三角形的面积之和并不等于多边形的面积。由此可知面积法在这种情况下是不适用的。图 4-7这里为了对多边形进行填充用的是第三种方法,即面积法。具体的实施步骤如下:在窗体设计器中增加4个命令按钮Command5-8,设置对象的属性,如表4-3 表 4-3对象属性属性值说明Command5Captiondqmj按钮的标题Command6Captionqzd按钮的标题Command7Captionqjl按钮的标题Command8Captionsqmj按钮的标题在代码窗口输入下列代码:Private Sub Command5_Click() Dim i As Integer, area1 As Double 用辛普森法求多边形的面积 Dim j As Integer s = 0 Do While i 4 area1 = (your(i).y + your(i + 1).y) * (your(i).x - your(i + 1).x) / 2 s = s + area1 i = i + 1 Loop area1 = (your(4).y + your(0).y) * (your(4).x - your(0).x) / 2 s = s + area1 s = Abs(s) Do While j 4 求多边形各边长的长度 bc(j) = Sqr(your(j).x - your(j + 1).x) 2 + (your(j).y - your(j + 1).y) 2) j = j + 1 Loop If j = 4 Then bc(4) = Sqr(your(4).x - your(0).x) 2 + (your(4).y - your(0).y) 2) End IfEnd SubPrivate Sub Command6_Click()Dim i As Integer, j As Integeri = 0Do While i 50 求划分得到的小矩形的中心坐标 j = 0 Do While j 50 zd(i, j).x = sx(i) + p / 2 zd(i, j).y = hx(j) + q / 2 j = j + 1 Loop i = i + 1LoopEnd SubPrivate Sub Command7_Click() Dim i As Integer, j As Integer, k As Integer, n As Integer i = 0 求小矩形中心到各顶点的距离 Do While i 50 j = 0 Do While j 50 n = 0 Do While n 5 L(i, j, n) = Sqr(your(n).x - zd(i, j).x) 2 + (your(n).y - zd(i, j).y) 2) n = n + 1 Loop j = j + 1 Loop i = i + 1 Loop End SubPrivate Sub Command8_Click() Dim bzc As Double Dim m As Double Dim k As Integer Dim i As Integer Dim j As Integer i = 0 用三角形法求多边形面积 Do While i 50 j = 0 Do While j 50 k = 0 m = 0 Do While k 4 bzc = (bc(k) + L(i, j, k) + L(i, j, k + 1) / 2 mj(i, j, k) = Sqr(bzc * (bzc - bc(k) * (bzc - L(i, j, k) * (bzc - L(i, j, k + 1) m = m + mj(i, j, k) k = k + 1 Loop bzc = (bc(4) + L(i, j, 4) + L(i, j, 0) / 2 mj(i, j, 4) = Sqr(bzc * (bzc - bc(4) * (bzc - L(i, j, 4) * (bzc - L(i, j, 0) m = m + mj(i, j, 4) mjz(i, j) = Abs(m) j = j + 1 Loop i = i + 1 LoopEnd Sub第五步:对位于多边形内部的小矩形进行填充。在这里是对这些小矩形填充小圆圈。对于有些小矩形,虽然它的中心点也位于多边形的内部,但是它到多边形的一条边的距离小于所要填充的小圆圈的半径,这种情况下,这些小矩形不进行填充,那么就需要判断小矩形的中心点到多边形的边的距离是否大于所填小圆圈的半径。在窗体设计器中增加一个命令按钮Command9,设置对象的属性,如表4-4 表 4-4对象属性属性值说明Command9CaptionCircle按钮的标题在代码窗口输入下列代码:Private Sub commang11_Click() Dim i As Integer, j As Integer, k As Integer, flag As Integer qp = Val(Text3.Text) 填充圆 i = 0 Do While i 50 j = 0 Do While j 50 If Abs(s - mjz(i, j) 0.000001 Then k = 0 flag = 1 Do While k 5 If (2 * mj(i, j, k) / bc(k) p / qp Then flag = 0 End If k = k + 1 Loop If flag = 1 Then Circle (zd(i, j).x, zd(i, j).y), p / qp End If End If j = j + 1 Loop i = i + 1 LoopEnd Sub运行结果如图4-8 图 4-8 第三节 设计使用说明书在VB中,建立应用程序用户界面,选择“新建”工程,双击窗体的空白部分,进入到代码编辑窗口,单击“对象”下拉列表框右边的箭头按钮,从中选择Form对象,在:“过程”下拉列表框中选择MouseDown事件,再选择Load事件,编写画任意多边形的代码,如图4-9。 图 4-9进入窗体设计器,在窗体中增加2个命令按钮Command1-2,设置对象属性,到代码窗口编写画多边形最小外接矩形的代码;在窗体设计器中增加2个命令按钮和2个文本框,文本框用于输入小矩形的长度和宽度,设置对象属性,到代码窗口编写划最小外接矩形的代码;在窗体设计器中增加4个命令按钮Command5-8,设置对象的属性,编写判断小矩形是否位于多边形内部的代码以及进行填充,如图4-10。图 4-10运行程序,点击“运行”的图标,在运行界面依次点击各控件按钮,如图4-11。 图 4-11最后,就可以出现上一节那样的结果,详细见上一节。结 束 语第一章主要介绍了有关VB的基础知识。随着微型计算机的快

温馨提示

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

评论

0/150

提交评论