,VB   工具软件   办公软件   操作系统   网络安全   设计在线   程序开发   教程宝典   软件下载   软件论坛,VB
您的位置:软件 > 开发者网络 > 开发工具 > 开发专栏 > VB > 正文
VB设计有语音报时和报警功能的闹钟
[文章信息]
作者:潇潇
时间:2004-05-18
出处:Yesky开发者网络
责任编辑:方舟
[文章导读]
经常在论坛上看到很多刚刚想要步入编码领域的爱好者问道:我数学学的不好,能学好编程吗?
advertisement
热点推荐
· 深入探讨SQL Server 2000对XML的支持
· Swing(空)
· 3DS Stodio Max 宝典
· 中小企业服务器配置方案--前 言
· 中小企业服务器配置方案--代理接入服务器(3)
[正文]

上一页  1 2 3 4 5 6 7 8 9 10 11 12  下一页

  4、三角函数

  我们知道,三角函数主要有这样几个公式:

   sin(a) = 对边a / 斜边c

   cos(a) = 底边b / 斜边c (其中角度a,可以是任意角度)

  如下图所示:



  由图可知,在一周之内,角度a可以在从0度到360度取值而对于钟表来说,每个刻度之间的度数差别为360度除以60个刻度,等于6度,也就是说公式里的角度a已经知道了.而且可知边a实际上就是圆上任意一点在y轴上的坐标,而边b是加上就是圆上任意一点在x轴上的坐标,半径r由我们所要画出的圆形的大小决定的,所以我们可以得到圆上任意一点在坐标系中的x , y轴上的取值.公式如下:

  x = sin(a) * r

  y = cos(a) * r

  而且在vb中,也有这样的函数可供使用.

  1、cos函数

  作用:返回一个Double,指定一个角度的余弦值

  格式: Cos(number)

  2、sin函数

  作用:返回一个Double,指定一个角度的正弦值
  
  格式: Sin(number)

  下面我们通过示例来看看具体的用法。

  首先,我们将用这些知识来画出一个正弦:

  下面是代码:

'=======================

'说明,x从0到form1的最右面

'y值中,因为i是从0变到form1的最右面

'所以i/form1.scalewidth 就从0 变到1

'所以,i/form1.scalewidth*2*3.1415926既是o*2pi 到1* 2pi

'所以,cos(i/form1.scalewidth*2*3.1415926),就从1到-1,在变到1

'所以,1-cos(i/form1.scalewidth*2*3.1415926),就从0到2,在变到0

'所以y 就从0到form1.scaleheight,在变到0

'即可画出cos曲线

'=======================

Private Sub huacos ( ) ‘自定义了一个名为huacos的过程
 Dim x As Double
 Dim y As Double

 For i = 0 To Form1.ScaleWidth ‘设定周期为Form1 . ScaleWidth
  x = i
  y = (1–Cos(i/ Form1.ScaleWidth * 2 * 3.1415926 ) ) * Form1.ScaleHeight/2
  ‘ 因为三角函数中的角度的增长方向,和计算机中相反,所以要用1减去cos值
  PSet(x,y)
 Next i
End Sub

Private Sub Form _ Activate ( )
 Huacos ‘调用huacos 过程
End Sub

  下图为运行结果:



  余弦和它相似,代码如下:

Private Sub huasin ( ) ‘自定义了一个名为huasin的过程

 Dim x As Double
 Dim y As Double

 For i = 0 To Form1 . ScaleWidth ‘设定周期为Form1 . ScaleWidth
  x = i
  y = (1–Sin(i/Form1.ScaleWidth*2*3.1415926)) * Form1.ScaleHeight / 2
  ‘ 因为三角函数中的角度的增长方向,和计算机中相反,所以要用1减去sin值
  PSet (x, y)

 Next i
End Sub

Private Sub Form _ Activate ( )
 huasin ‘调用huasin过程
End Sub

  下图为运行结果:



  有了这些基础,画出一个正圆也就没问题了。请看下面的代码。

Private Sub huayuan( )
 Dim x As Double
 Dim y As Double

 For i = 0 To 360
  x=(1–Sin(i/360*2*3.1415926))*(Form1.ScaleHeight/2–100)+100
  y=(1–Cos(i/360*2*3.1415926))*(Form1.ScaleHeight/2–100)+100
  Pset(x,y)
 Next i
End Sub

Private Sub Form _ Activate( )
 huayuan
End Sub

  上面的代码不难,好好思考一下吧.下面是运行结果:



  上面的例子里,我们使用360个点组成了一个密集度挺高的圆形,可是既然vb中已给我们提供了现成的画圆形的函数,为什么不用呢?但通过上面的例子,我们应该想到,如果我们将360个点,变成60个点,那不就正好是一个钟表的刻度吗?!这样的话我们只需要改动两个地方,一个是点的个数,另一个是点与点之间的弧度,应该为360度的60分之一,也就是每60度画一个点。代码如下:

Private Sub huabiaopan ( )
 Dim x As Double
 Dim y As Double

 For i = 0 To 60
  x=( 1 – Sin(i/60*2*3.1415926))*(Form1.ScaleHeight/2–100)+100
  y=( 1 – Cos(i/60*2*3.1415926))*(Form1.ScaleHeight/2–100)+100
  PSet(x,y)
 Next i

End Sub

Private Sub Form _ Activate ( )
 huabiaopan
End Sub

  下面是运行结果: (为了看得清楚些,我将颜色设为了红色,大家可以随喜好自行修改,方法当然是在Pset函数中了)



  看来我们距离成功越来越近了。对于钟表里的三个针来说,每一时刻都会指向其中一个刻度,所以我们只要在其中添加代码,让它实现从圆心到所指刻度画直线就可以实现钟表里的三个针了。

  下面是关于其中一个针的走动,代码如下:

Private Function huamiao ( a As Integer )

 '用同背景相同的颜色,在前一次的位置上,从新画直线,抹除前一次画的线

 x =(1–Sin((a+1)/60*2*3.1415926))*(Form1.ScaleHeight/2–200)+200
 y =(1–Cos((a+1)/60*2*3.1415926))*(Form1.ScaleHeight/2–200)+200

 Line(Form1.ScaleHeight/2,Form1.ScaleHeight/2)-(x,y),QBColor ( 7 )

 '然后开始画後一秒的线

 x =(1–Sin(a/60 * 2 * 3.1415926 ) ) * (Form1.ScaleHeight/2–200)+200
 y =(1–Cos(a/60 * 2 * 3.1415926 ) ) * (Form1.ScaleHeight/2–200)+200

 Line(Form1.ScaleHeight/2,Form1.ScaleHeight/2)-(x,y),QBColor ( 1 )

 huamiao = a - 1

End Function

Private Sub Timer1 _ Timer ( )

 mz =Second(time)
 mz =60–mz ‘因为三角函数中,角度的变化方向,正好与钟表的方向相反,

 ‘所以60减去就相当于将角度变为负值,也就是说,和原来的角度增长方向正好相反,与钟表的增长方向相同。

 mz = huamiao ( mz )

End Sub

  下面是运行效果:



  好了,现在我们可以加上,分针和时针了.下面是源代码和运行结果:

' = = = = = = = = = = = = = = = = = = = = = =
' 以下语句能画出表盘
‘ 六十个点表示六十个刻度,
' = = = = = = = = = = = = = = = = = = = = = =

Private Sub huayuan ( )
 Dim x As Double
 Dim y As Double

 For i = 0 To 60
  x = ( 1 – Sin ( i / 60 * 2 * 3.1415926 ) ) * ( Form1.ScaleHeight / 2 – 100 ) + 100
  y = ( 1 – Cos ( i / 60 * 2 * 3.1415926 ) ) * ( Form1.ScaleHeight / 2 – 100 ) + 100
  PSet ( x , y ) , QBColor ( 12 )
 Next i
End Sub

‘ = = = = = = = = = = = = = = = = = = = = = = = = = =

‘下面代码作用是画出时针走的路线

‘时针是12个刻度,表示是12个钟点

‘ = = = = = = = = = = = = = = = = = = = = = = = = = =

Private Function xianshishi ( a As Integer )

 '抹除前一次画的线

 x = (1–Sin((a+1)/12*2*3.1415926)) * ( Form1.ScaleHeight/2–800)+800
 y = (1–Cos((a+1)/12*2*3.1415926)) * ( Form1.ScaleHeight/2–800)+800

 Line (Form1.ScaleHeight/2,Form1.ScaleHeight/2)-(x,y),QBColor(7)

 '开始画後一秒的线

 x = (1–Sin(a/12*2*3.1415926))*(Form1.ScaleHeight/2–800)+800
 y = (1–Cos(a/12*2*3.1415926))*(Form1.ScaleHeight/2–800)+800

 Line (Form1.ScaleHeight/2,Form1.ScaleHeight/2)-(x,y),QBColor ( 1 )
 xianshishi=a-1
End Function

‘ = = = = = = = = = = = = = = = = = = = = = = = = = =

‘下面代码作用是画出秒针走的路线

‘秒针是六十个刻度,表示是六十个秒点

‘ = = = = = = = = = = = = = = = = = = = = = = = = = =

 Private Function xianshimiao ( a As Integer )

 '抹除前一次画的线

 x =(1–Sin((a+1)/59*2*3.1415926))*(Form1.ScaleHeight/2–200)+200
 y =(1–Cos((a+1)/60*2*3.1415926))*(Form1.ScaleHeight/2–200)+200

 Line(Form1.ScaleHeight/2,Form1.ScaleHeight/2)-(x,y),QBColor(7)

 '开始画後一秒的线

 x = (1–Sin(a/59*2*3.1415926))*(Form1.ScaleHeight/2–200)+200
 y = (1–Cos(a/60*2*3.1415926))*(Form1.ScaleHeight/2–200)+200

 Line ( Form1.ScaleHeight/2 ,Form1.ScaleHeight/2)-(x,y),QBColor(1)
 xianshimiao = a - 1
End Function

 ‘ = = = = = = = = = = = = = = = = = = = = = = = = = =

 ‘下面代码作用是画出分针走的路线

 ‘分针是六十个刻度,表示是六十个分点

 ‘ = = = = = = = = = = = = = = = = = = = = = = = = = =

Private Function xianshifen ( a As Integer )

 '抹除前一次画的线

 x =(1–Sin((a+1)/59 * 2 * 3.1415926)) * ( Form1.ScaleHeight/2–400)+400
 y =(1–Cos((a+1)/60 * 2 * 3.1415926)) * ( Form1.ScaleHeight/2–400)+400

 Line (Form1.ScaleHeight/2,Form1.ScaleHeight/2)-(x,y),QBColor(7)

 '开始画後一秒的线

 x =(1–Sin(a/59*2*3.1415926)) * (Form1.ScaleHeight/2–400) + 400
 y =(1–Cos(a/60*2*3.1415926)) * (Form1.ScaleHeight/2–400) + 400

 Line (Form1.ScaleHeight/2, Form1.ScaleHeight/2)-(x,y),QBColor(1)

 xianshifen = a - 1

End Function

‘ = = = = = = = = = = = = = = = = = = = = = = = =

‘ 每秒钟触发一次此事件,从而获取当时的时间,并调用相应的函数,画出三个针的位置

‘ = = = = = = = = = = = = = = = = = = = = = = = =

Private Sub Timer1 _ Timer ( )

 miao = Second (time)
 miao = 60 – miao
 fen = Minute (time)
 fen = 60 - fen
 shi = Hour (time)

 If shi > = 12 Then ‘因为一天之内时针要走二十四个钟头,也就是要走两圈,所以将下午和晚上的时间减去十二,就可以确定时针准确的位置

  shi = shi - 12

 End If

 shi = 12 - shi
 miao = xianshimiao ( miao )
 fen = xianshifen ( fen )
 shi = xianshishi ( shi )

End Sub

‘ = = = = = = = = = = = = = = = =

‘此事件,在窗体最初载入时触发,主要作用是画出表盘和刻度

‘ = = = = = = = = = = = = = = = =

Private Sub Form _ Load ( )

 Form1.Width = Form1.Height-250
 Huayuan ‘画刻度
 Form1.Circle(Form1.ScaleHeight/2,Form1.ScaleHeight/2),Form1.ScaleHeight/2-30

End Sub

  运行效果如下图所示:




上一页  1 2 3 4 5 6 7 8 9 10 11 12  下一页

发表评论推荐给朋友我想参加相关培训打印我对此感兴趣订阅电子杂志
,VB相关内容,VB焦点新闻
  • 用VB6.0编程禁止网上下载文件
  • VB6.0应用程序界面设计探讨
  • VB中控件大小随窗体大小变化而变化
  • Visual Basic实现对I/O端口操作
  • 利用API函数实现图像淡入淡出
  • FVD刺激高清碟机加速商业化 抢占商机最重要
  • 3家搜索引擎集体诉讼8848 吕春维未敢出席
  • 杨元庆:没有准备不会获批的备用方案
  • 军队信息化诞生新领域 电子军务呼之欲出
  • 世界经济论坛公布信息化程度全球最新排名
  • 2004政务绩效评估:政府门户尚处于发展阶段
  • 甲骨文出资5.15亿美元 意图收购RetekInc
  • 技术并购:帮你突破传统增长的“天花板”
  • ,VBAdvertisement