雨雪天气的计算机仿真.docx
- 文档编号:27017351
- 上传时间:2023-06-25
- 格式:DOCX
- 页数:36
- 大小:1.39MB
雨雪天气的计算机仿真.docx
《雨雪天气的计算机仿真.docx》由会员分享,可在线阅读,更多相关《雨雪天气的计算机仿真.docx(36页珍藏版)》请在冰豆网上搜索。
雨雪天气的计算机仿真
本科毕业论文(设计、创作)
题目:
雨雪天气的计算机仿真
学生姓名:
钱海东学号:
0321002054
所在院系:
信息与通信技术专业:
电子信息工程
入学时间:
2010年9月
导师姓名:
傅有亮//朱亮职称/学位:
副教授/硕士//讲师/硕士
导师所在单位:
完成时间:
2014年5月
安徽三联学院教务处制
雨雪天气的计算机仿真
摘要:
雨雪天气是自然环境中的重要组成部分。
在计算机仿真领域,对天气情况的仿真一直是热门而又极具挑战性的课题。
雨雪天气是很常见的天气状况,用计算机来仿真雨、雪的落下的过程,能更好的了解雨雪天气对一些场景的影响,例如雨雪天气对路面交通情况的影响等。
尤其是对雨滴、雪花的实时仿真,其数量大且运动轨迹具有随机性,因此对于雨、雪的建模是计算机仿真中的难点之一。
本文就雨、雪的运动轨迹进行了简单的建模。
首先将雨滴、雪花看成一个点,通过点的运动来模拟实时的动态情况。
对于雨滴、雪花的形状,运动模式后面会做详细介绍。
关键词:
雨雪天气;计算机仿真;随机;建模
Thecomputersimulationoftherainandsnow
Abstract:
Theweatherofrainandsnowisanimportantpartofthenaturalenvironment.Inthefieldofcomputersimulation,thesimulationontheweatherisalwaysahotandchallengingtopic.Rainansnowareverycommonweatherphenomenon.Usingthecomputertosimulatethefallingprocessoftherainandsnow,itwillhaveabetterunderstandingfortheeffects,whichrainandsnowweatherforsomescenes.Forexample,theeffectsofrainandsnowonroadtrafficconditions.Especiallythereal-timesimulationofrainandsnowisdifficult,becauserainandsnowareirregularobjects.Therainandsnowhavethefeatureofhugeamountandthetrajectoryisrandom.So,forthemodelingofrainandsnowisoneofthedifficultiesincomputersimulation.Thispapergivesasimplemodelingonthetrajectoryofrainansnow.Theraindroporsnowisequivalenttoamasspointtosimulatethereal-timerainingandsnowing.Iwilldetailtheshapeofrainandsnow,motionmodeinthefollowingpages.
Keywords:
weatherofrainandsnow;computersimulation;random;modeling
目录
第1章绪论1
1.1研究背景1
1.2计算机仿真方法1
第2章计算机仿真的概念及重要性3
2.1计算机仿真的概念3
2.2计算机仿真的重要性3
第3章雨雪天气的计算机仿真方法及如何实现4
3.1雪花的形成4
3.2雪花的制作方法6
3.3雪花的运动模式7
第4章雨雪天气的计算机仿真的程序设计8
4.1程序的设计8
4.2程序的验证及效果图12
第5章结论15
附录A程序的部分源代码16
附录B程序运行环境33
致谢34
参考文献35
第1章绪论
1.1研究背景
随着计算机的广泛应用和发展,计算机仿真技术在人们生活等各方面发挥着重要作用,当所研究的系统造价昂贵、实验的危险性大或需要很长的时间才能了解系统参数变化所引起的后果时,计算机仿真则是很有效的一种手段。
利用计算机仿真技术来模拟这些真实的场景,能很大程度上提高计算机仿真的能力,可以直观的了解这些场景中各个元素之间的关系及其基本属性。
例如常见的雨雪天气,但是雪花的微观形象大多数人都不甚了解,故若能用计算机仿真技术很好的实现雨雪天气的实时模拟,就可以让更多的人了解雪花的本质,也有助于对雨雪天气的实时反馈,提前做出对策,防止一些自然灾害造成的损失。
例如要战争中的一场战役,就要考虑天气和气象的影响,下雨、下大雨、下大雪、刮大风等不同的气象条件下,作战方案和兵力部署都是不一样的,这在站前的计算机仿真中都要充分考虑到,要把气象条件加到仿真系统中去。
同时雨雪天气比较复杂,每个时刻都在变化着,常常受到来自其他因素的影响,要能够进行实时的模拟确实不易。
1.2计算机仿真方法
计算机仿真方法就是通过仿真模型模拟实际系统的运动来找到一种规律的一种研究方法。
著名的“阿波罗”登月就运用到了计算机仿真,包括混合计算机、月球环境仿真器、驾驶舱、宇航员的视角系统等等【1】。
首先我们需要建立系统模型,系统模型通常是通过一些数学逻辑方程来反映系统的本质,在建立系统模型的过程中,我们一般需要忽略次要的因素的影响,故系统模型只是一种简化的模型【2】。
如我们的GPS系统【3】,是仿真系统的一个典型的例子。
同样的对于某些离散的系统我们就需要用到数字计算机仿真方法,其运算对象都是二进制数码因而能反映出离散的形式。
面对这种方法我们要求对连续的数学运算转换为离散的数值计算【4.5】。
针对于雪花的模拟很早就有人做过了,用一种简单的几何方法来模拟雪花,其方法随机性给雪花的形态也就多种多样。
从雪花的建模到运动,直至最后的沉积,依据的是时间和空间上的关系【6】。
第2章
计算机仿真的概念及重要性
2.1计算机仿真的概念
计算机仿真又称为计算机模拟或计算机实验。
计算机仿真就是建立系统模型的仿真模型进而在计算机上进行系统模型实验的过程。
计算机仿真技术经历了模拟计算机仿真、混合计算机仿真、专用数字计算机仿真和通用数字计算机仿真等阶段,目前已步入高性能计算机仿真阶段。
计算机仿真作为分析和研究一些复杂系统的一种重要方法,广泛应用在工程设计、科学研究、航天技术等课题中【7】。
2.2计算机仿真的重要性
现代计算机仿真技术综合了计算机、网络、图形图像、软件以及自动控制等领域的知识,是系统的分析与研究的重要手段。
计算机仿真技术具有良好的可靠性和安全性,可多次重复等特点,近年来发展非常迅速,已经成为众多领域科技进步的一种基本手段【8】。
与传统数学方法和物理实验方法相比,计算机仿真技术具有自己独特的优越性,人们可以通过计算机对一些在实际当中无法实现的实验研究进行模拟实验。
例如计算机仿真技术为许多科学研究、飞行员的训练、军事演习的实施等各种难题指标的确定节约了资金和时间并提高了效率,甚至于一些人不可及的危险场合的研究成为可能。
计算机在一些研究中可以弥补人在能力及效率上的不足,运用计算机仿真乃大势所趋。
第3章
雨雪天气的计算机仿真方法及如何实现
3.1雪花的形成
(1)简介:
雪花是一种晶体,结构随温度的变化而变化,又名未央花和六出。
(2)形成原因:
雪花是由小冰晶增大变来的,而冰的分子以六角形的为最多,因而形成雪花多是六角形的,并且每一片雪花的形状没有一模一样的。
雪花形状的多种多样,则与它形成时的水汽条件有密切的关系。
对于六角形片状冰晶来说,由于它面上、边上和角上的弯曲程度不同,相应地具有不同的饱和水汽压,其中角上的饱和水汽压最大,边上次之,平面上最小。
在实有水汽压相同的情况下,由于冰晶的面、边、角上的饱和水汽压不同,其凝华增长的情况也不相同。
如果云中水汽不太丰富,实有水汽压仅大于平面的饱和水汽压,水汽只在面上凝华,这时形成的是柱状雪花;如果水汽稍多,实有水汽压大于边上的饱和水汽压,水汽在边上和面上都会发生凝华,由于凝华的速度还与弯曲程度有关,弯曲程度大的地方凝华较快,所以在冰晶边上凝华比面上快,这时多形成片状雪花;如果云中水汽非常丰富,实有水汽压大于角上的饱和水汽压,这样在面上、边上、角上都有水汽凝华,但尖角处位置突出,水汽供应最充分,凝华增长得最快,所以多形成枝状或星状雪花如图1,故又名六出。
图1雪花的微观特写
再加上冰晶不停地运动,它所处的温度和湿度条件也不断变化,这样就使得冰晶各种部分增长的速度不一致,形成多种多样的雪花。
(3)形成过程:
雪花的形状极多,而且十分美丽.如果把雪花放在放大镜下,可以发现每片雪花都是一幅极其精美的图案,连许多艺术家都赞叹不止。
但是,各种各样的雪花形状是怎样形成的呢?
雪花大都是六角形的,这是因为雪花属于六方晶系。
云中雪花"胚胎"的小冰晶,主要有两种形状。
一种呈六棱体状,长而细,叫柱晶,但有时它的两端是尖的,样子像一根针,叫针晶。
另一种则呈六角形的薄片状,就像从六棱铅笔上切下来的薄片那样,叫片晶。
原来,在冰晶增长的同时,冰晶附近的水汽会被消耗。
所以,越靠近冰晶的地方,水汽越稀薄,过饱和程度越低。
在紧靠冰晶表面的地方,因为多余的水汽都已凝华在冰晶上了,所以刚刚达到饱和。
这样,靠近冰晶处的水汽密度就要比离它远的地方小。
水汽就从冰晶周围向冰晶所在处移动。
水汽分子首先遇到冰晶的各个角棱和凸出部分,并在这里凝华而使冰晶增长。
于是冰晶的各个角棱和凸出部分将首先迅速地增长,而逐渐成为枝叉状。
以后,又因为同样的原因在各个枝叉和角棱处长出新的小枝叉来。
与此同时,在各个角棱和枝叉之间的凹陷处。
空气已经不再是饱和的了。
有时,在这里甚至有升华过程,以致水汽被输送到其他地方去。
这样就使得角棱和枝叉更为突出,而慢慢地形成了我们熟悉的星状雪花。
上面说的实际上是一个典型的星状雪花的形成过程。
它的相当部位,不论形状或大小,都应当是相同的。
这种典型的星状雪花只有在一个理想的、平静的环境中(譬如在实验室内)才能形成。
在大气中,它不能象上面说的那样有步骤地增大,所形成的形状也就不能那样典型。
这是因为冰晶逐渐在下降着,而且有时在旋转着,各个枝叉接触水汽的多少有所不同,而那些接触水汽较多的枝又便增长得较多。
因此,我们平常所看到的雪花虽大体上一样但又互不相同。
以上所述都是单个雪花的情况。
在雪花下降时,各个雪花也很容易互相攀附并合在一起,成为更大的雪片。
雪花的并合大多在以下三种情况下出观。
(1)当温度低于0℃的时候,雪花在缓慢下降的途中相撞。
碰撞产生了压力和热,使相撞部分有些融化而彼此沾附在一起,随后这些融化的水又立即冻结起来。
这样,两个雪花就并合到一起了。
(2)在温度略高于0℃的时候,雪花上本来已覆有一层水膜,这时如果两个雪花相碰,便借着水的表面张力而沾合在一起。
(3)如果雪花的枝叉很复杂,则两个雪花也可以只因简单的攀连而相挂在一起。
雪花从云中下降到地面,路途很长,在条件适合时,可以经多次攀连并合而变得很大。
在降大雪的时候,有时有一些鹅毛般的大雪片,就是经过多次并合而成的。
但是,有时雪花互碰时不是互相并合在一起,而是给碰破了,这时便产生一些畸形的雪花。
例如,在降雪的时候,有时会见到一些单个的"星枝",就属于这种情况。
3.2雪花的制作方法
雪花属于离散系统,对其进行模拟的方法我们可以用到数学模型中的随机数,在了解了雪花的形成过程之后,我们开始对雪花的形状进行模拟【9.10】。
由于单个雪花的大小通常在0.05~4.6毫米之间,重量只有0.2~0.5克。
它在飘落的过程中成团攀联在一起,形成雪片,也就是我们日常生活中看到的雪。
为了能对雪花的运动效果进行模拟【11】,我们采用最简单的几何体来表示雪花,构造方法:
采用简单且最常见的一些雪花的形态(如图2)。
取图2中位置对应大小均30像素×30像素的图片进行与运算后得到的图片作为雪花的形态。
其中的原理来自于RGB色彩模式,电脑屏幕上所有的颜色,都由红色绿色蓝色这三种色光按照不同的比例混合而成的【12】。
例如若以8bit的一个二进制编码来表示一种颜色,黑色为11111111,白色为00000000。
二者做与运算得出的结果为00000000即白色。
我们就用这种方法来取图为雪花的形态。
图2雪花的常见形态
3.3雪花的运动模式
因为在自然界中,雪花的大小形态各异,所以其运动模式也会有所差别。
鉴于本人的编程能力有限,我们只做一些简单的操作:
在纵坐标方向(Y轴)给定的一个雪花的速度y=y+5,即每次以5个像素点的速度下落;在横坐标方向(X轴),设定雪花的一个摆动幅度,幅度在5以内取随机数,这里的单位同样是像素点。
左摆为x=x-rand()%5,右摆为x=x+rand()%5。
同时想着有限时间内雪花会产生堆积,打算给其一个堆积效果,在做出效果过后发现雪花堆叠的感觉比较生硬。
此段有待进一步改善。
4.下雨的模拟和雪花类似,只是雨滴的形态如下图3所示,在此就不再说明。
图3雨滴的形态
第4章雨雪天气的计算机仿真的程序设计
4.1程序的设计
通过上面的介绍对雪花、雨滴的模拟方法后,而且有很多相似的例子,所以此程序以常见的雪花模拟程序为基础的改进程序,其中使用了init函数,还有ontimer函数以及一段实现双刷新的代码[13]。
Init函数的主要作用是初始化,应用如下:
BOOLCTSnowDlg:
:
Init0()
{
//分配每一个成员变量空间
CDC*pDC=GetDC();
m_mdc2=newCDC;
m_mdc1=newCDC;
m_bitmap=newCBitmap;
m_bgbmp=newCBitmap;
m_tempbmp=newCBitmap;
m_mdc1->CreateCompatibleDC(pDC);//第一级缓存
m_mdc2->CreateCompatibleDC(pDC);//第二级缓存
//利用pDC创建一个空白位图
m_tempbmp->CreateCompatibleBitmap(pDC,m_cr.Width(),m_cr.Height());
//m_mdc2作为第二级缓存操作此空白位图
m_mdc2->SelectObject(m_tempbmp);
m_bgbmp->m_hObject=(HBITMAP):
:
LoadImage(NULL,"res\\this.bmp",IMAGE_BITMAP,
m_cr.Width(),m_cr.Height(),LR_LOADFROMFILE);
m_bitmap->m_hObject=(HBITMAP):
:
LoadImage(NULL,"res\\snow2.bmp",IMAGE_BITMAP,
300,108,LR_LOADFROMFILE);
if(m_bitmap->m_hObject==NULL||m_bgbmp->m_hObject==NULL){
ReleaseDC(pDC);
returnFALSE;
}
m_snowSize.cx=30;
m_snowSize.cy=30;
ReleaseDC(pDC);
returnTRUE;
}
ontimer的作用是类似于一个定时器,其中最主要的是双刷新,实现过程就是先制造一个空白位图:
//取其长宽
BITMAPbm;
snow.GetObject(sizeof(BITMAP),&bm);
m_snowSize.cx=bm.bmWidth;
m_snowSize.cy=bm.bmHeight;
//制造蒙板进行透空屏蔽
if(!
mask.CreateBitmap(bm.bmWidth,bm.bmHeight,1,1,NULL)){
MessageBox(_T("CreateBitmap()错误!
"));
returnFALSE;
}
CDC*pDC=GetDC();//必须与ReleaseDC搭配使用
CDCmaskDC,snowDC;//创建2个暂存DC
maskDC.CreateCompatibleDC(pDC);//将maskDC转化成与pDC兼容的DC
snowDC.CreateCompatibleDC(pDC);//将snowDC转化成与pDC兼容的DC
//以下2句分别把对应的位图数据加载入对应的DC内
CBitmap*pOldMask=(CBitmap*)maskDC.SelectObject(&mask);
CBitmap*pOldSnow=(CBitmap*)snowDC.SelectObject(&snow);
snowDC.SetBkColor(RGB(255,0,0));//设置snowDC的背景色,用于透空处理
maskDC.BitBlt(0,0,bm.bmWidth,bm.bmHeight,&snowDC,0,0,SRCCOPY);
//Nowmakedestbmpfordisplaying.
bg.GetObject(sizeof(BITMAP),&bm);
//给dest创建建立与pDC兼容的CBitmap对象
if(!
dest.CreateCompatibleBitmap(pDC,m_cr.Width(),m_cr.Height())){
ReleaseDC(pDC);
returnFALSE;
}
//给temp创建建立与pDC兼容的CBitmap对象
if(!
temp.CreateCompatibleBitmap(pDC,m_cr.Width(),m_cr.Height())){
ReleaseDC(pDC);
returnFALSE;
}
snowDC.SelectObject(&temp);//将背景选入snowDC作为第一级缓冲
maskDC.SelectObject(&bg);//将背景选入maskDC作为第一级缓冲
snowDC.SetStretchBltMode(HALFTONE);//设置拉伸贴图模式,使得拉伸图像不失真
//把maskDC的内容载入snowDC
snowDC.StretchBlt(0,0,m_cr.Width(),m_cr.Height(),&maskDC,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
//1.把背景位图数据载入maskDC
//2.maskDC与snowDC进行融合
maskDC.SelectObject(&dest);
maskDC.BitBlt(0,0,m_cr.Width(),m_cr.Height(),&snowDC,0,0,SRCCOPY);
//选回旧对象指针,用于释放资源
maskDC.SelectObject(pOldMask);
snowDC.SelectObject(pOldSnow);
ReleaseDC(pDC);//必须与GetDC搭配使用
//所有都完成,设置标志为TRUE.
m_bOK=TRUE;
returnTRUE;
}
以上是对空白位图的处理,此空白位图的大小与客户区的大小一样而且是跟踪客户区的,就是达到与客户区同步的效果。
同步效果:
voidCTSnowDlg:
:
OnMove(intx,inty)
{
CDialog:
:
OnMove(x,y);
//使用MoveWindow函数,当拖动顶层窗体,底层随之移动
//而且,必须用BringWindowToTop将窗体提前好让CStatic之类截取对应的区域背景
if(m_pDlg){
CRectrcWindow;
GetWindowRect(rcWindow);
m_pDlg->MoveWindow(&rcWindow);
m_pDlg->BringWindowToTop();
this->SetFocus();//让主界面处于激活状态
}
}
然后将空白位图透空覆盖在客户区上,雪花飘落的部分可以说都是在此透空的蒙板上进行的这样就可以不用没次贴图都得重新刷新了,节省了时间和内存。
4.2程序的验证及效果图
根据上面的方法,我们在微机上运行程序得到如下图4、图5、图6、图7所示的效果图。
图4.网上下载的背景图
图5下雪图
图6底部产生堆积的图
图7下雨图
第5章结论
雨雪天气的仿真一般较为复杂,因为其受到多方面因素的影响,规律性与随机性并存,用计算机来仿真雨雪天气在自然灾害的检测方面有重要作用。
本文通过VC++编程来实现雨雪天气的仿真,让我们更加熟练的使用C语言以及计算机仿真的应用。
总之,在现今的科技发展迅速的背景下,计算机仿真对众多领域都有着不可替代的意义。
同时仿真技术的应用能为实验和观测科学提供了另一种可行的选择。
鉴于此次毕业设计(雨雪天气的计算机仿真)所实现的效果与现实场景中的还有差距,使用的模型以及运动方程较为粗糙等等。
后续我将对以上的不足之处加以改进,同时增加一些碰撞等等来提高模拟的真实感。
致谢
在本次论文设计过程中,感谢我的学校,给了我学习的机会,在学习中,老师从选题指导、论文框架到细节修改,都给予了细致的指导,提出了很多宝贵的意见与建议,老师以其严谨求实的治学态度、高度的敬业精神、兢兢业业、孜孜以求的工作作风和大胆创新的进取精神对我产生重要影响。
他渊博的知识、开阔的视野和敏锐的思维给了我深深的启迪。
这篇论文是在老师的精心指导和大力支持下才完成的
感谢所有授我以业的老师,没有这些年知识的积淀,我没有这么大的动力和信心完成这篇论文。
感恩之余,诚恳地请各位老师对我的论文多加批评指正,使我及时完善论文的不足之处。
同时感谢我的家人,感谢他们这么多年来全心全意为我提供最好的鼓励和支持。
谨以此致谢最后,我要向百忙之中抽时间对本文进行审阅的各位老师表示衷心的感谢。
参考文献
[1]王正中,系统仿真技术[M].科学出版社,1986.
[2]陈义华,数学模型[M].重庆大学出版社,1995.
[3]王明亮,GPSSworld模拟仿真系统实验教程[M].西南交通大学出版社,2010.
[4]NarsinghDeo,SystemSimulationWithDigitalComputer,PrenticeHallofIndiaPrivateLimited.NewDel
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 雨雪 天气 计算机仿真