李道煒
摘要:針對(duì)下雨和下雪常見的天氣現(xiàn)象,利用VB的可視化編程技術(shù),實(shí)現(xiàn)對(duì)下雨和下雪的動(dòng)畫模擬。
關(guān)鍵詞:下雨下雪計(jì)算機(jī)模擬
0 引言
冬天是下雨和下雪較多的季節(jié),目前很多都是用Flash軟件來模擬下雪和下雨的過程,Microsoft Visual Basic是廣泛應(yīng)用的通用的可視化編程軟件開發(fā)工具,具有非常強(qiáng)大的圖形處理功能,加之VB 簡(jiǎn)單易學(xué),使用方便,有許多功能強(qiáng)大的處理圖形圖像的控件與函數(shù),便于實(shí)現(xiàn)較為逼真的軟件模擬環(huán)境。同時(shí)實(shí)現(xiàn)此功能的VB程序代碼實(shí)現(xiàn)比較容易,而且采用面向?qū)ο蟮木幊谭椒?,可以很方便地進(jìn)行擴(kuò)展。
1 實(shí)現(xiàn)方法
由于是在計(jì)算機(jī)屏幕上模擬下雨和下雪現(xiàn)象,因此當(dāng)“雨滴”或“雪花”到達(dá)屏幕底部時(shí)要進(jìn)行復(fù)原,用Rangomize初始化隨機(jī)數(shù)發(fā)生器,并采用兩種不同的方法觸發(fā):在模擬“下雨”的程序中,利用一個(gè)計(jì)時(shí)器,通過不斷地繪制不同圓心和半徑的小圓來表示“雨滴”。在模擬“下雪”的程序中,采用無限循環(huán),并利用DoEvents函數(shù),當(dāng)雙擊鼠標(biāo)左鍵時(shí),才使模擬程序中斷循環(huán),并返回。具體實(shí)現(xiàn)流程如圖1和圖2所示。
2 程序?qū)崿F(xiàn)和模擬效果
定義全局?jǐn)?shù)組Snow(1000,1)表示“雪花”在屏幕上的坐標(biāo),Scolor(1000)表示坐標(biāo)點(diǎn)的顏色,Snumber為設(shè)定的“雪花”數(shù)量。Rain(1000,1)表示“雨滴”在屏幕上的坐標(biāo),Rsize(1000)為“雨滴”大小,Rdelta(1000)為間隔。主要程序如下:
Dim Snow(1000, 1),Scolor(1000), Snumber As Integer
Private Sub Form_Load()
Fsnow.Show
DoEvents
Randomize: Snumber = 400
For j = 1 To Snumber
Snow(j, 0) = Int(Rnd * Fsnow.Width)
Snow(j, 1) = Int(Rnd * Fsnow.Height)
Scolor(j) = 10 + (Rnd * 20)
Next j
Do While Not (DoEvents = 0)
For ls = 1 To 10
For i = 1 To Snumber
oldx = Snow(i, 0)
oldy = Snow(i, 1)
Snow(i, 1) = Snow(i, 1) + Scolor(i)
If Snow(i, 1) > Fsnow.Height Then
Snow(i, 1) = 0
Scolor(i) = 5 + Rnd * 30
Snow(i, 0) = Int(Rnd * Fsnow.Width)
oldx = 0
oldy = 0
End If
coloury = 8 * (Scolor(i) - 10)
coloury = 60 + coloury
PSet (oldx, oldy), QBColor(0)
PSet (Snow(i, 0), Snow(i, 1)), RGB(coloury, coloury, coloury)
Next i
Next ls
Loop
End Sub
Private Sub Form_DblClick()
End
End Sub
運(yùn)行后得到的效果如圖3所示:
■
Dim Rain(1000,1), Rdelta(1000), Rsize(1000) ,Rnumber As Integer
Private Sub Form_Load()
Randomize
Rnumber=1000
For i = 1 To Rnumber
Rx1 = Int(FRain.Width * Rnd)
Ry1 = Int(FRain.Height * Rnd)
Rdelt1 = Int(500 - (Int(Rnd * 499)))
Rsize1 = 25 * Rnd
Rain(i,0) = Rx1
Rain(i,1) = Ry1
Rdelta(i) = Rdelt1
Rsize(i) = Rsize1
Next
End Sub
Private Sub Timer1_Timer()
For i = 1 To Rnumber
Circle (Rain(i,0), Rain(i,1)), Rsize(i), BackColor
Rain(i,1) = Rain(i,1) + Rdelta(i)
If Rain(i,1) >= Frain.Height Then
Rain(i,1) = 0:
Rain(i,0) = Int(Frain.Width * Rnd)
End if
Circle (Rain(i,0), Rain(i,1)), Rsize(i)
Next
End Sub
Private Sub Form_DblClick()
End
End Sub
運(yùn)行后得到的效果如圖4所示:
■
3 結(jié)束語
將常見的天氣現(xiàn)象用圖形化的編程語言實(shí)現(xiàn)計(jì)算機(jī)模擬,取得了較好的效果,本文只是對(duì)較普通的現(xiàn)象進(jìn)行了模擬。由于天氣現(xiàn)象變化無常,要準(zhǔn)確及時(shí)模擬各種天氣現(xiàn)象,還需要設(shè)計(jì)復(fù)雜的算法和進(jìn)行高級(jí)的編程??傊ㄟ^計(jì)算機(jī)模擬天氣現(xiàn)象,對(duì)自然界的現(xiàn)象有了進(jìn)一步的理解和認(rèn)識(shí),為今后進(jìn)一步的開發(fā)研究奠定了基礎(chǔ)。
參考文獻(xiàn):
[1]汪洋.基于VB的模擬仿真技術(shù)的實(shí)現(xiàn)[J].荊門職業(yè)技術(shù)學(xué)院學(xué)報(bào),2007年6月.
[2]馮宏偉,羅宏.基于VB的自動(dòng)繪制立面圖程序的設(shè)計(jì)[J].城市勘測(cè),2012年1期.
[3]陳錦昌等.VB計(jì)算機(jī)繪圖教程[M].華南理工大學(xué)出版社,2003.
[4]薛建忠.基于VB語言的物理實(shí)驗(yàn)?zāi)M[J].江蘇技術(shù)師范學(xué)院學(xué)報(bào),2003年12月.