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 | 运行效果如下图所示:

|