版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、武汉理工大学学士学位论文目 录摘 要9abstract101绪论112系统环境132.1系统所用关于visual c+知识介绍132.1.1 mfc工程文件中自动生成类142.1.2 使用点、刷子、笔、位图152.2 太阳系简介163 系统总体设计173.1 功能设计173.2 系统界面设计183.2.1侧视界面183.2.2 俯视界面183.2.3 工具条183.3 系统模块设计183.3.1放大模块183.3.2 缩小模块183.3.3 左移模块183.3.4 右移模块183.3.5 上移模块193.3.6 下移模块193.3.7 运行模块193.3.8 暂停模块193.3.9 还原模块1
2、93.4 测试设计194 系统界面设计204.1 侧视界面204.1.1 过程设计204.1.2 数据结构204.1.3 模块实现及伪代码214.1.3 侧试界面效果图244.2 俯视界面244.2.1 过程设计244.2.2 数据结构254.2.3 模块实现及伪代码254.2.2 界面效果图275 功能模块设计285.1 放大模块285.1.1 模块实现及伪代码285.1.2 效果图295.2 缩小模块315.2.1 模块实现及伪代码315.2.2 效果图325.3 左移模块345.3.1 模块实现及伪代码345.3.2 效果图355.4 右移模块375.4.1 模块实现及伪代码375.4.
3、2 效果图385.5上移模块405.5.1实现代码405.5.2效果图415.6下移模块435.6.1实现代码435.6.2效果图445.7运行模块465.7.1模块实现及伪代码465.7.2效果图475.8暂停模块505.8.1模块实现及代码505.8.2效果图505.9还原模块515.9.1模块实现及伪代码516 总结与展望52参考文献53致 谢54附 录55摘 要本次设计的内容是太阳系概貌模拟系统。主要功能包括:近日、远日行星的显示,放大、缩小、左(右、上、下)移动功能,多视角观察太阳系概貌,行星运行、静止以及初始状态复原。在这个系统中有二种视角来观看太阳系,分别为:俯视和侧视。每种视角
4、下都可以实现放大、缩小、平移、静止和运行功能。实现此系统的第一个难点就在于对行星运动的处理,想让行星在轨道上动起来,就要知道这个行星下个时刻的坐标是什么,在放大、缩小和上(下,左,右)移动轨道后,运行轨道的参数相应变化了,要想使行星随着轨道的变动还能准确的在轨道上运行的话,就得对行星下个位置的坐标的计算公式做变型,也就是加上或减去一些偏差值。第二个难点就在于对行星的动和静的处理。在单线程的情况下,线程开始执行后,直到结束我们是没法手动去干涉它的,那么想在行星动的时候让它静下来,并且再次动的时候是接着上次停下来的地方运行的话,只使用一个线程的话是很难做到的,所以在这点儿的处理上我用到了多线程。主
5、线程中来处理轨道的参数,辅线程运行的时候让行星运动起来。本系统比较好的完成了所要求的任务,综合考虑了用户使用的方便,尽量做到了界面的美观和功能的实用。关键词:多线程,行星运动,多视角abstractmy graduation design is the system of the design and implementation of solar system. the function mainly includes: display the planets far from the sun, display the planets near the sun, zoom the solar
6、 system in (out), move the solar system left(right, up and down) ,overview the solar system from multi-angle, planet run and stop. through this system ,we can see the global profile of the solar system and the distant solar system become real with the computer.there are two kinds of angle to watch t
7、he solar system. one is looking from up to down and the other is looking from side. both angle can realize all the function: zoom the solar system in (out), move the solar system left(right, up and down) , planet run and stop.one difficulty to implement this system is handling the movement of the pl
8、anet. if you want the planet run on the orbit currently you must know the coordinate that the planet will arrive. as the orbit is a ellipse we can use the ellipse formula to calculate the coordinate .however ,when you zoom the ellipse out or move the orbit left the parameter of the ellipse will chan
9、g. to make the planet run currently on the orbit we have to do variations on the formula. that is ,parameters plus or minus some offset to make sure the planet can find its orbit. another difficulty to implement this system is how to stop the running planet. as we know in the case of single thread w
10、hen the thread begins running it will not stop until the thread end. it is very difficult to stop the running thread in the case of single thread. so it is necessary to use multithread to handle it. the main thread is used to set the parameters of orbit. assistant thread is used to control the plane
11、ts action. if we want the planet to move we need to create assistant thread. if we want the planet to stop we need to cancel the assistant thread.the system complete the requested task. considering the convenience of the user i try my best to prettify the interface of the system and prefect the func
12、tion.key words: multithread , the movement of planets,multi_angle1绪论随着计算机技术的不断进步,计算机的应用已经渗透入人们生活的方方面面,现在几乎所有的邻域都离不开计算机。在生活中人们需要用计算机来进行普通的计算,办公,娱乐,以及存储。在高科技中,那就更离不开计算机了,发射导弹,飞船上天,预测天体运行等等,这些高科技离不开计算机,计算机也离不开高科技,计算机可以使很繁锁的任务变得简单,人们日益增多的需求也促进了计算机的发展。我这次所做的系统是有关计算机模拟方面的应用。计算机模拟是指用电子计算机对科学问题或社会问题进行模仿性试验研
13、究,从而建立真实系统的模型,并通过计算来观察系统随时间变化的行为或系统表现出来的特性。计算机模拟是以相似原理、模型理论、系统技术、信息技术以及其应用领域的有关专业技术为基础,以计算机系统、与应用相关的物理效应设备及仿真器为工具,利用系统模型参与已有或设想的系统进行研究、分析、设计、加工生产、试验、运行、评估、维护、和报废(全生命周期)活动的一门多学科的综合性技术。半个多世纪来,计算机模拟技术在各类应用需求的牵引及有关学科技术的推动下,已经发展形成了较完整的专业技术体系,并迅速地发展为一项通用性、战略性技术。它已成功地应用于航空航天、信息、生物、材料、能源、先进制造等高新技术和工业、农业、商业、
14、教育、军事、交通、社会、经济、医学、生命、娱乐、生活服务等众多领域。人们认为,模拟技术与高性能计算一起,正成为继理论研究和实验研究之后第三种认识、改造客观世界的重要手段。我们每个人从小时候起都对茫茫地宇宙充满无限的好奇与向往,但是人类相对于整个宇宙来说太渺小了,就连我们想飞离我们的地球都是一件难事儿。每个小孩或许都会问他们的父母宇宙长的什么样,作为我们该怎么回答他们呢,如果没有一个完备的演示系统我们恐怕难以回答他们的问题。科学家要想发射飞船,或着说实现太空行走,都是要以他们非常了解太阳系为前提,那么他们如何向其它的科学家描述太阳系的状况呢,他们也必须借助计算机来逼真的模拟太阳系的运行情况才能和
15、其它科学家合作来解决有关宇宙的问题。在天体运行中,我们要处理大量的数据,还有这些数据都是非常大的浮点型数,如果单纯通过人工操作计算,那么即使我们都会计算,那也不能保证这些数据的准确性,更何况人根本不可能手工处理这么宠大的数据,所以完善的高质量的太阳系模拟系统应运而生了。这次我所要做的太阳系概貌的模拟系统就是用来模拟太阳系运行时最主要最基本的特征,实现太阳系各行星运动概貌的模拟。让用户可以全面的看到整个太阳系的全貌,并且看到太阳系各星体的运行状况,满足那些普通用户的需求,但是此系统不能完成像科学实验中的那些关于星体运行的计算。但是通过太阳系概貌的模拟系统我们可以看到太阳系的全貌,以及太阳系运行时
16、最主要最基本的特征,实现太阳系各行星运动概貌的模拟,让用户可以多方面多视角的观看太阳系【1】。这可以满足用户想逼真观看太阳系的需求,让我们仿佛置身宇宙中,仿佛站在太阳系的上方看到太阳系的动态效果。当然这是了解太阳系的第一步,这也为以后精确认识太阳系的各种其它特性,为以后对太阳系的精确研究并且预测末来太阳系的运行打下基础。本系统使用vc+来设计与实现。为了使效果看起来更逼真,我从网上下载太阳系各大行星的图片来进行处理【2】。在此系统中,用户可以体验二种视角来观赏太阳系的运行,不仅如此用户还可以放大、缩小,上(下,左,右)移动太阳系,并且还可以将运行的行星暂停,还原等一系列功能。该系统的设计从头到
17、尾都是采用软件工程学的设计方法,向读者展示了一个模拟系统的设计过程。现在简单地介绍本论文的组织内容,让读者对本系统的设计与开发有个大概的了解,能清楚地知道每节将要向读者介绍那些内容。2 系统环境:本章向大家介绍有关visual c+方向的知识,以及太阳系的基本资料。3 系统的总体设计:此章开始从需求分析介绍,确定系统的功能模块,设计系统的界面。 4 系统的界面设计:由于此系统是模拟系统,所以对界面的要求比较高,我将用一章来说明我的系统界面。5 系统的功能模块设计:此章介始各模块的实现方法,以及里面比较经典的算法。6总结与展望总结了本此设计心得体会,并对未来作了初步的展望。2系统环境2.1系统所
18、用关于visual c+知识介绍visual c+是microsoft公司的visual studio开发工具箱中的一个c+程序开发包。visualstudio提供了一整套开发internet和windows应用程序的工具,包括visualc+, visual basic, visual foxpro, visual interdev, visual j+以及其他辅助工具,如代码管理工具visual sourcesafe和联机帮助系统msdn。visual c+包中除包括c+编译器外,还包括所有的库、例子和为创建windows应用程序所需要的文档。 从最早期的1.0版本,发展到最新的6.0版本
19、,visual c+已经有了很大的变化,在界面、功能、库支持方面都有许多的增强。最新的6.0版本在编译器、mfc类库、编辑器以及联机帮助系统等方面都比以前的版本做了较大改进。visual c+一般分为三个版本:学习版、专业版和企业版,不同的版本适合于不同类型的应用开发。实验中可以使用这三个版本的任意一种。visual c+6.0不仅是一个c+编译器,而且是一个基于windows操作系统的可视化集成开发环境(integrated development environment,ide)。visual c+6.0由许多组件组成,包括编辑器、调试器以及程序向导appwizard、类向导class w
20、izard等开发工具。 这些组件通过一个名为developer studio的组件集成为和谐的开发环境。visual c+它大概可以分成三个主要的部分: 1 developer studio这是一个集成开发环境,我们日常工作的99%都是在它上面完成的,再加上它的标题赫然写着“microsoft visual c+”,所以很多人理所当然的认为,那就是visual c+了。其实不然,虽然developer studio提供了一个很好的编辑器和很多wizard,但实际上它没有任何编译和链接程序的功能,真正完成这些工作的幕后英雄后面会介绍。我们也知道,developer studio并不是专门用于vc
21、的,它也同样用于vb,vj,vid等visual studio家族的其他同胞兄弟。所以不要把developer studio当成visual c+, 它充其量只是visual c+的一个壳子而已。这一点请切记! 2 mfc从理论上来讲,mfc也不是专用于visual c+,borland c+,c+builder和symantec c+同样可以处理mfc。同时,用visual c+编写代码也并不意味着一定要用mfc,只要愿意,用visual c+来编写sdk程序,或者使用stl,atl,一样没有限制。不过,visual c+本来就是为mfc打造的,visual c+中的许多特征和语言扩展也是为
22、mfc而设计的,所以用visual c+而不用mfc就等于抛弃了visual c+中很大的一部分功能。但是,visual c+也不等于mfc。 3 platform sdk这才是visual c+和整个visual studio的精华和灵魂,虽然我们很少能直接接触到它。大致说来,platform sdk是以microsoft c/c+编译器为核心(不是visual c+,看清楚了),配合masm,辅以其他一些工具和文档资料。上面说到developer studio没有编译程序的功能,那么这项工作是由谁来完成的呢?是cl,是nmake,和其他许许多多命令行程序,这些我们看不到的程序才是构成vis
23、ual studio的基石。要想学好vc+需要有好的c/c+基础,学习visual c+集成环境,理解windows的消息机制,一定要理解mfc中消息映射的作用,记住一些常用的消息名称和参数的意义。并且要善于利用向导。向导是一个通过一步步的帮助引导你工作的工具。developer studio中包含三个向导,用来帮助程序员开发简单的windows程序,它们是: (1)appwizard:用来创建一个windows程序的基本框架结构。appwizard向导会一步步向程序员提出问题,询问他所创建的项目的特征,然后appwizard会根据这些特征自动生成一个可以执行的程序框架,程序员然后可以在这个框
24、架下进一步填充内容。appwizard支持三类程序:基于视图/文档结构的单文档应用、基于视图/文档结构的多文档应用程序和基于对话框的应用程序。也可以利用appwizard生成最简单的控制台应用程序(类似于dos下用字符输入输出的程序)。 (2)classwizard:用来定义appwizard所创建的程序中的类。可以利用classwizard在项目中增加类、为类增加处理消息的函数等。classwizard也可以管理包含在对话框中的控件,它可以将mfc对象或者类的成员变量与对话框中的控件联系起来。 (3)activex control wizard:用于创建一个activex控件的基本框架结构。
25、activex控件是用户自定义的控件,它支持一系列定义的接口,可以作为一个可再利用的组件。2.1.1 mfc工程文件中自动生成类我所做系统是基于mfc的c+编程。创建一个mfc工程文件后,会自动生成几个类,分别为:(1)cmainframe主框架窗口类: 从mfc的cframewnd框架窗口类派生,对应于主窗口,管理主程序窗口,包含菜单、工具条、状态条的设定等。此系统有用到工具条。(2)cgraphicsapp应用程序类:从mfc的cwinapp windows应用程序类派生,对应于应用程序,用来控制应用程序的所有对象(文档、视图以及边框窗口),并完成应用程序的初始化和最后的清除工作。在一个程
26、序执行时,系统首先创建一个应用程序对象,然后对该对象进行初始化操作。一般将应用程序运行过程中需记录的变量定义为本类的属性,将应用程序中关系到整个应用程序的菜单的响应程序等写在本类中。我所做的系统对此类也没有编写代码。(3)cgraphicsdoc文档类:从mfc的cdocument文档类派生,对应于应用程序所处理的文档,用于存取文档数据,一般将对文档的修改程序写在本类中,通常将应用程序中“编辑”等菜单的响应程序写在本类中。本系统没有用到文档所以没有对此类编码。 (4)cgraphicsview视图类:从mfc的cview视图类派生,对应于应用程序所显示的视图,用来显示文档数据,处理用户输入和管
27、理视图窗口,一般将所有与输入、显示及打印有关的操作写在本类中,通常将应用程序中“视图”菜单的响应程序写在本类中。此系统的代码几乎都是在此类中,所以对本系统来说此类非常重要。(5) caboutdlg“关于”对话框类:从mfc的cdialog派生,一般不需对其增写程序,每当加入一个新的对话框时,系统就会从cdialog类派生出一个新的类,供编程这在其中编写此对话框的处理程序。本系统中没有用到对话框,所以末对此类进行编码。2.1.2 使用点、刷子、笔、位图在本系统中,行星的轨道是自己画出来的所以要学习如何用刷子,笔进行绘制椭圆。用位图处理显示图片。cdc:设备文本(或者设备描述表),从cobjec
28、t类派生,是windows应用程序与设备驱动程序与输出设备之间的连接桥梁。所有的绘图函数都在cdc类中定义。在视图客户区中进行绘制的设备文本类是从cdc派生的cclientdc类。cclientdc:是cdc的派生类,对应于特定窗口的用户区,可用窗口对象指针初始化对象,如:cclientdc dc(this); 即用当前窗口对象指针this对cclientdc对象dc进行初始化。crect:用来表示矩形的类,拥有四个成员变量:top left bottom right。分别表示左上角和右下角的坐标。可以通过以下的方法构造: crect(int l,int t,int r,int b),其中的
29、l, t, r, b分别指明crect的四个顶点坐标。其成员函数主要为:int width( ) const; 得到宽度 int height( ) const; 得到高度 csize size( ) const; 得到尺寸 cpoint& topleft( ); 得到左上角坐标 cpoint& bottomright( ); 得到右下角坐标 cpoint centerpoint( ) const; 得到中心坐标 crect可以用来定义一个矩形区域,在画椭圆的时候会用到。cpen:定义画笔类型,通过selectobject(&pen)为dc选择画笔对象。画笔决定所画图形的线条的样式。cbrus
30、h: 画刷。如果需要用颜色或者图案对一个封闭的图形内部进行填充,就要使用画刷,画刷是cbrush类的对象,明智来填充封闭图形内部的工具。cbitmap: 位图。类cbitmap封装了windows图形设备接口(gdi)中的位图,并且提供了操纵位图的成员函数。使用cbitmap对象之前要先构造cbitmap对象,调用其中的一个初始化成员函数设置位图对象的句柄。此后就可以调用其它成员函数了。宏rgb:用来定义颜色,包括红,绿,蓝三种颜色分量,取值范围为(0255),例如:rgb(0, 0, 0)为黑色,rgb(255, 255, 255)为白色。用以设置填充色。2.2 太阳系简介太阳系(solar
31、 system)就是我们现在所在的恒星系统。主要由太阳、8颗大行星(原先有九大行星,因为冥王星被剔除为矮行星)以及无数的小行星、彗星及陨星所组成。行星由太阳起往外的顺序是:水星(mercury)、金星(venus)、地球(earth)、火星(mars)、木星(jupiter)、土星(saturn)、天王星(uranus)、海王星(neptune)。这些行星都以太阳为中心以椭圆轨道公转,虽然除了水星的十分接近于圆。行星轨道中或多或少在同一平面内(称为黄道面并以地球公转轨道面为基准)。黄道面与太阳赤道仅有7度的倾斜。冥王星的轨道大都脱离了黄道面,倾斜度达17度。太阳系中的八大行星都朝同一方向绕太阳
32、公转。除金星以外,其他行星的自转方向和公转方向相同。水星::平均日距 57,910,000 km (0.38天文单位) ,直径 4,878 km ,质量 3.30e23 kg ,密度 5.43 gm/cm ,重力 0.376 g ,公转 87.97 地球天。 金星: 平均日距 108,200,000 km (0.72天文单位) ,直径 12,103.6 km ,质量 4.869e24 kg ,密度 5.24 gm/cm,重力 0.903 g ,公转 224.7 地球天。地球: 平均日距 149,600,000 km (1.00天文单位) ,直径 12,756.3 km ,质量 5.976e24
33、 kg,密度 5.52 gm/cm,重力 1 g(9.8 m/s2) ,公转 365.26 地球天。火星:平均日距 227,940,000 km (1.52天文单位),直径 6,794 km,质量 6.4219e23 kg,密度 3.94 gm/cm,重力 0.38 g,公转 686.98 地球天。木星:平均日距 778,330,000 km (5.20天文单位),直径 142,984 km (equatorial),质量 1.900e27 kg,密度 1.31 gm/cm,重力 2.34 g,公转 11.86 地球年。土星:平均日距 1,429,400,000 km (9.54天文单位),直
34、径 120,536 km (equatorial),质量 5.688e26 kg ,密度 0.69 gm/cm,重力 1.16g,公转 29.46 地球年。天王星:平均日距 2,870,990,000 km (19.218天文单位),直径 51,118 km (equatorial),质量 8.686e25 kg,密度 1.28 gm/cm,重力 1.15g,公转 84.81 地球年。海王星:平均日距 4,504,000,000 km (30.06 天文单位),行星直径:49,532 km,质量: 1.0247e26 千克 (为地球质量的17.22倍),公转周期:约164.8个地球年 平均密度
35、:1.66g/cm3。3 系统总体设计3.1 功能设计第一:系统是单用户的,这里的单用户是指不需要用户名和密码,用户进入系统可以直接对系统进行操作。第二:系统有多视角。第三:太阳系是可以放大、缩小的,并且保证放大、缩小后行星照样能正确的运行。第四:太阳系可以进行上、下、左、右的平移,并且平移后行星照样能正确地运行。第五:有专门的初始化工具。第六:有对应的工具按钮。系统为模拟系统,外观要逼真才比较好,所以我需要从网下下载关于行星的图片,这样看起来比较逼真。真实的太阳系是三维空间的,不同的视角下观看的结果是不一样的,所以在系统要实现从二种视角来观看太阳系,分别为:俯视和侧视。这二种视角看到太阳系的
36、感觉是完全不一样的。选定了一种视角后就可以在这种视角下观看太阳系各行星的运行,当然也可以放大,缩小,左(右,上,下)移动整个太阳系,在太阳系运行过程中,当然也可以来暂停行星的运行,使太阳系处于静止状态,再次点击运行行星会接着动起来。如果想回到最初状态,也可以点一下复原按钮,整个太阳系又回到了此视角下的最初始的状态。如果想换个换角来看太阳系,直接点击你想要的视角的按钮,这二种视角下可以行使的功能是一样的。根据功能的划分,我将系统划分为以下9个功能模块和二大界面,以及在工具栏上设置工具按钮。太阳侧视模块俯视模块平移模块放大缩小模块运动静止模块还原模块平移模块放大缩小模块运动静止模块还原模块图1 系
37、统模块图3.2 系统界面设计3.2.1侧视界面在此种界面下的视觉像是在太阳系的旁边观看太阳系运行,给人一种立体的感觉。在对图像进行处理的时候,前面的像要挡住后面的像,这样可以出现立体的效果。3.2.2 俯视界面在此种界面下的视觉像是在太阳系的正上方观看太阳系运行。此时各个轨道看起来像是一系列同心的椭圆,各行星在上面运行时不会出现遮挡的效果。看起来没有侧视有立体感。3.2.3 工具条工具条里面存放各种功能的工具,方便用户的操作,实现交互。当然如果不想点击工具栏上的按钮的话,也可以通过相应的键来实现相应的功能,具体各功能对应什么键在下面的模块设计中有详细介绍。3.3 系统模块设计3.3.1放大模块
38、功能:放大整个太阳系,并保证放大后行星依然可以正确地在轨道上运行。在工具条上设置此功能相应的工具,并且可以用home键来进行触发。3.3.2 缩小模块功能:缩小整个太阳系,并保证缩小后行星依然能正确地在轨道上运行。在工具条上设置此功能对应的工具,并且可以用end键来进行触发。3.3.3 左移模块功能:左移整个太阳系,并保证左移后行星依然能正确地在轨道上运行。在工具条上设置此功能对应的工具,并且可以用左光标键来进行触发。3.3.4 右移模块功能:右移整个太阳系,并保证右移后行星依然能正确地在轨道上运行。在工具条上设置此功能对应的工具,并且可以用右光标键来进行触发。3.3.5 上移模块功能:上移整
39、个太阳系,并保证上移后行星依然能正确地在轨道上运行。在工具条上设置此功能对应的工具,并且可以用上光标键来进行触发。3.3.6 下移模块功能:下移整个太阳系,并保证下移后行星依然能正确地在轨道上运行。在工具条上设置此功能对应的工具,并且可以用下光标键来进行触发。3.3.7 运行模块功能:运行此模块时,行星可以在自自的轨道上运行在工具条上设置相应的工具,并且可以用回车键来进行触发。3.3.8 暂停模块功能:运行此模块时,行星可以停住。在工具条上设置相应的工具,并且可以用空格键来进行触发。3.3.9 还原模块功能:运行此模块时,可以将太阳系还原来初始状态。在工具条上设置相应的工具,并且可以用dele
40、te键来进行触发。3.4 测试设计测试主要围绕行星是否能准确在轨道上运行来进行,首先看在初始化妆态行星是否准确运行,切换视角后能否正准运行,对太阳系进行上下左右平移变换后是否能准确运行,进行放大缩小变换后是否能准确运行,并且在这些情况下是不是能让运行的行星停下来,能让静止的行星运动起来。4 系统界面设计4.1 侧视界面4.1.1 过程设计侧视界面组成:界面有太阳图片,九大行星图片,以及背景图片,以及自己所绘椭圆行星轨道所组成。主要思想:(1)映射模式: mmtext。在此映射模式下,坐标被映射到了象素,x值向右方向递增,y值向下递增,所以用它来表示设备坐标系是再合适不过了。(2)轨道:行星的运
41、行轨道是用gdi对象画出来的。画轨道时用到的gdi对象有:cbrush,刷子定义了一种位图形式的象素,得用它可对域内部填充颜色;cpen,笔是一种用来画线及绘制有形边框的工具,我们可以指定它的颜色及厚度,并且可以指定它画实线,点线或虚线。可以自己构造一个cgdiobject 派生类的对象,用selectobject()将自己构造的对象选进来;也可以使用库存的gdi对象,用selectstockobject()选入。在选进自己的gdi对象的同时,须将原来的gdi对象也保存起来,当任务完成后,再将原来的对象恢复,这样就可以将自己的gdi对象删除。当然也可以使用另外一种更加方便的方法:可以直接选择库
42、存的gdi对象,这样原来的对象将会被自动分离出来。(3)图片:将基于资源的图片转换成gdi位图来进行处理,gdi位图只不过是另外一种gdi对象。首先,我们必须创建一个位图,然后再把它选进设备环境中,当我们使用完了以后,还必须将它从设备环境中选出来,然后再把它删掉。在显示位图的时候,我们必须先利用函数cdc:createcompatibledc,为位图创建一个特殊的内存设备环境,然后再利用cdc的stretchblt成员函数,将内存设备环境中的各个位复制到真正的设备环境中去。在侧视中,太阳要挡后轨道的后面,但前面不能挡住,我采用了这种方法,太阳最先显示,轨道在太阳后显示,然后最后再将太阳的上半部
43、分显示一次,这样太阳就可以挡住它后面的像了,看起来比较立体。4.1.2 数据结构每个图形都有自己的位置坐标,在程序中的不同功能模块中会被不断改变,必须通过变量来标识这些坐标。图片的加载涉及到图片的加载位置,和图片大小的问题,而只要知道了图片的左上角和右下角的坐标,那么图片的大小自然也就可以计算出来了,于是采用如下的数据结构:int left0,top0;/太阳外接矩形的左上角坐标int left01,top01;/第1个行星的左上角坐标int left02,top02;/第2个行星的左上角坐标int left03,top03;/第3个行星的左上角坐标int left04,top04;/第4个行
44、星的左上角坐标int left05,top05;/第5个行星的左上角坐标int left06,top06;/第6个行星的左上角坐标int left07,top07;/第7个行星的左上角坐标int left08,top08;/第8个行星的左上角坐标int left1,top1,right1,bottom1;/最里面轨道的外接矩形的左上角和右下角的坐标int left2,top2,right2,bottom2;/第2条轨道外接矩形的左上角和右下角的坐标int left3,top3,right3,bottom3;/第3条轨道外接矩形的左上角和右下角的坐标 int left4,top4,right4,
45、bottom4;/第4条轨道外接矩形的左上角和右下角的坐标int left5,top5,right5,bottom5;/第5条轨道外接矩形的左上角和右下角的坐标int left6,top6,right6,bottom6;/第6条轨道外接矩形的左上角和右下角的坐标int left7,top7,right7,bottom7;/第7条轨道外接矩形的左上角和右下角的坐标int left8,top8,right8,bottom8;/第8条轨道外接矩形的左上角和右下角的坐标int upoffset;/向上或下移动距离int leftoffset;/向左或右移动的距离int wideoffset;/放大缩小
46、时宽度增加的大小int highoffset;/放大时上下增加的大小int highoffset1;/第一上轨道放大缩小时高度更改的大小 int fushitoceshi/标记此时界面是侧视还是俯视,为0表示侧视,为1表示俯视4.1.3 模块实现及伪代码本系统采用单文档界面(sdi)即可实现。因为系统绘图操作比较多,所以,此模块的功能都写在了视图模块里面。视图类作为了系统功能实现的全局区域,所以为了数据传递的方便,一些接口间经常传递的数据需要以成员变量的形式使用。首先初始化所有图形坐标的变量,然后加载位图。在绘制图形的过程中,因为会出现闪屏的问题,而兼容dc和兼容位图可以解决此问题,于是声明了
47、成员变量pdcmemory0(cdc *型), m_pbitmap(cbitmap *型)。为了使图片美观,采用拉伸绘图的方式。void loadbgmap(cdc *pdc);此函数将位图加载进内存,而图片加载进入内存只用一次就行了,所以这个函数内部只用来进行绘图,图片的加载则在另外的函数进行。virtual void ondraw(cdc* pdc);在需要重绘的地方调用。例如放大、缩小太阳系或平移太阳系都需要调用这个函数。(1)变量的初始化left0(650),top0(235),left1(550),top1(285),right1(850),bottom1(315),left2(50
48、0),top2(280),right2(900),bottom2(340),left3(450),top3(275),right3(950),bottom3(365),left4(400),top4(270),right4(1000),bottom4(390),left5(300),top5(267),right5(1100),bottom5(467),left6(225),top6(264),right6(1175),bottom6(514),left7(150),top7(261),right7(1250),bottom7(561),left8(75),top8(258),right8(1
49、325),bottom8(608),left01(840),top01(292),left02(885),top02(295),left03(935),top03(305),left04(990),top04(320),left05(1085),top05(352),left06(1160),top06(374),left07(1235),top07(396),left08(1310),top08(420),upoffset(0),leftoffset(0),wideoffset(0),highoffset(0),highoffset1(0),fushitoceshi(0)(2)伪代码pseu
50、docode begincdc *pdcmemory0 = new cdc ;/设备环境指针cbitmap *bitmap0 = new cbitmap;cbitmap bitmapmemr;bitmapmemr.creatediscardablebitmap(pdc,width,height);/函数创建与指定设备兼容的位图cdc dcmemr;dcmemr.createcompatibledc(pdc);dcmemr.selectobject(&bitmapmemr);/背景图片bitmap0-loadbitmap(idb_bitmap_back);/加载位图dcmemr.stretchb
51、lt(0,0,width,height,pdcmemory0,0,0,m_sizesource.cx,m_sizesource.cy,srccopy);/将内存中的位图显示到屏幕上,并且占据整个屏幕/太阳bitmap0-loadbitmap(idb_bitmap_sunlittle);/加载太阳位图dcmemr.stretchblt(left0,top0,bm.bmwidth,bm.bmheight,pdcmemory0,0,0,bm.bmwidth,bm.bmheight,srccopy);其它行星的显示方法与太阳的处理类似,但是要行星的显示顺序为内轨道的先显示,外轨道的后显示,这样在运行的
52、时候会出现遮挡,比较符合常规。在侧视中,太阳要挡后轨道的后面,但前面不能挡住,我采用了这种方法,太阳最先显示,轨道在太阳后显示,然后最后再将太阳的上半部分显示一次,这样太阳就可以挡住它后面的像了,看起来比较立体。/轨道cpen newpen(ps_dashdotdot,1,rgb(166,202,240);/创建画笔,淡蓝画笔dcmemr.selectstockobject(null_brush);/选择画刷,不对椭圆填充颜色dcmemr.selectobject(&newpen);/选择画笔dcmemr.ellipse(crect(left1,top1,right1,bottom1);/第一
53、条轨道dcmemr.ellipse(crect(left2,top2,right2,bottom2);/第二条轨道dcmemr.ellipse(crect(left3,top3,right3,bottom3);/第三条轨道dcmemr.ellipse(crect(left4,top4,right4,bottom4);/第四条轨道dcmemr.ellipse(crect(left5,top5,right5,bottom5);/第五条轨道dcmemr.ellipse(crect(left6,top6,right6,bottom6);/第六条轨道dcmemr.ellipse(crect(left7,
54、top7,right7,bottom7);/第七条轨道dcmemr.ellipse(crect(left8,top8,right8,bottom8);/第八条轨道 end pseudocode4.1.3 侧试界面效果图图2 太阳系侧视效果图4.2 俯视界面4.2.1 过程设计俯试界面组成:界面有太阳图片,九大行星图片,以及背景图片,以及自己所绘椭圆行星轨道所组成。算法思想:(1)映射模式: mm-text。在此映射模式下,坐标被映射到了象素,x值向右方向递增,y值向下递增,所以用它来表示设备坐标系是再合适不过了。(2)轨道:行星的运行轨道是用gdi对象画出来的。画轨道时用到的gdi对象有:cb
55、rush,刷子定义了一种位图形式的象素,得用它可对域内部填充颜色;cpen,笔是一种用来画线及绘制有形边框的工具,我们可以指定它的颜色及厚度,并且可以指定它画实线,点线或虚线。可以自己构造一个cgdiobject 派生类的对象,用selectobject()将自己构造的对象选进来;也可以使用库存的gdi对象,用selectstockobject()选入。在选进自己的gdi对象的同时,须将原来的gdi对象也保存起来,当任务完成后,再将原来的对象恢复,这样就可以将自己的gdi对象删除。当然也可以使用另外一种更加方便的方法:可以直接选择库存的gdi对象,这样原来的对象将会被自动分离出来。(3)图片:
56、将基于资源的图片转换成gdi位图来进行处理,gdi位图只不过是另外一种gdi对象。首先,我们必须创建一个位图,然后再把它选进设备环境中,当我们使用完了以后,还必须将它从设备环境中选出来,然后再把它删掉。在显示位图的时候,我们必须先利用函数cdc:createcompatibledc,为位图创建一个特殊的内存设备环境,然后再利用cdc的stretchblt成员函数,将内存设备环境中的各个位复制到真正的设备环境中去。4.2.2 数据结构int left0,top0;/太阳外接矩形的左上角坐标int left01,top01;/第1个行星的左上角坐标int left02,top02;/第2个行星的左上角坐标int left03,top03;/第3个行星的左上角坐标int left04,top04;/第4个行星的左上角坐标int left05,top05;/第5个行星的左上角坐标int left06,top06;/第6个行星的左上角坐标int left07,top07;/第7个行星的左上角坐标int left08,top08;/第8个行星的左上角坐标int left1,t
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 丰子恺杨柳课件
- 孟子成语 课件
- 第二单元(复习)-二年级语文上册单元复习(统编版)
- 西京学院《融媒体新闻编辑》2023-2024学年第一学期期末试卷
- 西京学院《剧本创作》2021-2022学年第一学期期末试卷
- 西京学院《工程定额原理》2021-2022学年第一学期期末试卷
- 西华师范大学《语文学科教学论》2023-2024学年第一学期期末试卷
- 《画世界名画》少儿美术教育绘画课件创意教程教案
- 西华师范大学《数学物理方法》2021-2022学年第一学期期末试卷
- 西华师范大学《软件及应用》2022-2023学年期末试卷
- 绵阳市高中2022级(2025届)高三第一次诊断性考试(一诊)数学试卷(含答案逐题解析)
- 牛津译林版英语2024七年级上册全册单元知识清单(记忆版)
- 2024小学道德与法治新教材培训:教材解读及教学建议
- (正式版)SHT 3046-2024 石油化工立式圆筒形钢制焊接储罐设计规范
- 生涯职业发展展示
- 志愿服务证明(多模板)
- 通过10种营销技巧成为行业龙头
- 警校生大学生涯规划
- 初中历史期中考试分析报告
- 楼体亮化施工设计方案
- 《企业员工薪酬激励问题研究10000字(论文)》
评论
0/150
提交评论