简单VB小程序之虚拟时钟
代表时间的点,然后就是在钟盘的中心位置绘制时针、分针和秒针,当绘制完以上所有内容时,静态的虚拟时钟就算绘制完毕。第二部分则是如何让时针、分针和秒针动起来,并能准确地显示当前的时间,这个过程的虚拟时钟可以称之为动态时钟,它完全可以模拟现实里的时钟。这个动态的过程是程序编写的重点所在,需要分别对时针、分针和秒针做数学分析,建立数据公式,然后利用得到的公式进行编程,实现这个最终的动态过程。
二、建立公式
首先是对秒针的分析,秒针在时钟上一共走了60下,所以相当于把一个圆分成60份,每一份的弧度是2π÷60=,秒针在60个刻度上走过时所对应的弧度分别为:
于是,不难看出,当确定了秒针在刻度上的位置iSec时,该位置对应的弧度为-iSec*。所以推出当前秒针位置对应的坐标点的坐标值分别为x=cos(-iSec*),y=sin(-iSec*),这里我们暂时把圆的半径看做是1,而在程序中圆的半径我们可以自行调整。
其次,对分针的分析,同秒针一样,分针也走60下,所以也是把一个圆等分成60份,用同样的推理方法最后得到了和秒针一样的公式,既坐标点的坐标值分别为x=cos(-iMin*),y=sin(-iMin*),这里不在重复叙述,其中iMin代表分针在刻度上的位置。
最后,对时针的分析,时针一共有12个点,因此在理论上,时针把一个圆等分12份,每份的弧度是2π÷12=,时针在12个刻度上走过时所对应的弧度分别为:
最后得到的公式为:当确定时针在刻度上的位置iHour时,该位置对应的弧度为-iHour* ,进而推出当前时针位置对应的坐标点的坐标值为x=cos(-iHour*),y=sin(-iHour*)。但是这个公式只能使时针就在12个坐标点上移动,过于简单,也不符合实际情况,所以要进一步完善这个公式。为了时针的移动更加接近实际情况,我引入一个时针移动余量的概念。钟盘上一共有12个时针可以移动的坐标点,既12个刻度,在每两个相邻刻度之间再加上3个等距离的坐标点,这样以来,这3个坐标点把相邻的两个刻度分成4等份,每等份都称为时针移动余量。其实,时针移动余量取决于分针在钟盘上的位置,4个余量等于分针一圈的距离,也就是说把分针一圈4等份,分针在哪一个区域就对应了时针在哪一个余量上,这样以来就解决了时针在余量上移动的设想。4个余量与分针区域的一一对应关系为:第一余量,0-15;第二余量,16-30;第三余量,31-45;第四余量46-60;可以看出,当取得当前分针位置iMin时,那么它对应的时针移动余量为,(iMin+1) Mod 15,每个余量对应的弧度为 [(iMin+1)Mod 15] * [2π÷12÷4],既*((iMin+1)\15)。
结合之前得到的坐标点的坐标值,进一步完善公式为:
x=cos(-iHour*-*((iMin+1)\15)),
y= sin(-iHour*-*((iMin+1)\15))。
这样以来,时针就可以在余量上移动了,可以更加完美的模拟现实时钟时针的移动。
‘定义常亮π
Private Const Pi = 3.14
‘定义绘制时钟框架的过程
Private Sub DrawClockFrame()
Picture1.DrawWidth = 8
Picture1.ForeColor = vbBlack
Picture1.PSet (0, 0)
Dim x As Single, y As Single, i As Integer
For i = 1 To 12
y = 9 * Sin(Pi * i / 6)
x = 9 * Cos(Pi * i / 6)
Picture1.PSet (x, y)
Next i
End Sub
Private Sub Command1_Click()
Timer1.Enabled = True
End Sub
Private Sub Command2_Click()
Timer1.Enabled = False
End Sub
Private Sub Form_Activate()
DrawClockFrame
End Sub
Private Sub Form_Load()
Form1.Caption = “簡单VB程序之虚拟时钟”
Picture1.Width = Picture1.Height
Picture1.Scale (-10, 10)-(10, -10)
Picture1.BackColor = vbWhite
Command1.Caption = “开始”
Command2.Caption = “结束”
Timer1.Interval = 1000
Timer1.Enabled = False
End Sub
Private Sub Timer1_Timer()
Picture1.Cls
‘绘制时钟框架
DrawClockFrame
‘绘制秒针
Dim iSec As Integer
iSec = Second(Now())
x = 9 * Cos(Pi * (15 - iSec) / 30)
y = 9 * Sin(Pi * (15 - iSec) / 30)
Picture1.DrawWidth = 2
Picture1.ForeColor = vbRed
Picture1.Line (0, 0)-(x, y)
‘绘制分针
Dim iMin As Integer
iMin = Minute(Now())
x = 7 * Cos((15 - iMin) / 30 * Pi)
y = 7 * Sin((15 - iMin) / 30 * Pi)
Picture1.DrawWidth = 3
Picture1.ForeColor = vbBlue
Picture1.Line (0, 0)-(x, y)
‘绘制时针
Dim iHour As Integer
iHour = Hour(Now())
x = 5 * Cos(Pi / 2 - Pi / 6 * iHour - Pi / 24 * ((iMin + 1) \ 15))
y = 5 * Sin(Pi / 2 - Pi / 6 * iHour - Pi / 24 * ((iMin + 1) \ 15))
Picture1.DrawWidth = 6
Picture1.ForeColor = vbGreen
Picture1.Line (0, 0)-(x, y)
End Sub
四、运行与测试
1.程序编写完成后,运行程序,点击开始按钮后,結果如图所示
2.点解结束按钮后,时钟停止,再点击开始按钮后,时钟按照正确的当前时间显示。
结语
此程序成功得模拟了现实时钟的运行,并能正确地显示当前的时间。之所以能实现从现实到虚拟的转化,关键取决于对问题的正确分析,进而建立数据模型,利用用数据模型编程,最终实现了虚拟时钟。如果前期的分析不正确,是不会实现虚拟时钟的。通过此程序使我从面对实际问题到转化为计算机语言问题,再到编程解决问题得到了很好的锻炼,相信在以后生活中会更加容易利用VB去面对并解决诸如此类的问题,会使编程水平得到更好的提高,开发出一些更具意义的好程序。
上一篇:仿生理论在供应链绩效评价中的应用