VB设计有语音报时和报警功能的闹钟(3)
2008-04-09 04:44:42来源:互联网 阅读 ()
我们知道,三角函数主要有这样几个公式:
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
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:用VB6.0编程禁止网上下载文件
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash
