求一道VB题的解析
首先分析在程序启动部分,绘制钟表表面的刻度;见图1:
见上图所示:
圆心坐标为:O(x0,y0)
圆半径为:R
分析绘制钟面的刻度程序;
For k = 0 To 359 Step 30
x = radius * Cos(k * 3.14159 / 180) + x0
y = y0 - radius * Sin(k * 3.14159 / 180)
Form1.Circle (x, y), 20
Next k
是每间隔30度,绘制一个小圆作为刻度;
图中的半径 R 就是程序代码中的 radius 值;
分析:
第1个小圆的圆心坐标:(x1,y1)
k = 0,Cos(0度) = 1,所以,得到 x1 = radius + x0
k = 0,Sin(0度) = 0,所以,得到 y1 = y0
第2个小圆的圆心坐标:(x2,y2)
k = 1,Cos(30度) = 1.732/2,所以,得到 x2 = radius * 1.732/2 + x0
k = 1,Sin(30度) = 1/2,所以,得到 y1 = y0 - radius * 1/2
第3个小圆的圆心坐标:(x3,y3)
k = 2,Cos(60度) = 1/2,所以,得到 x2 = radius * 1/2 + x0
k = 2,Sin(60度) = 1.732/2,所以,得到 y1 = y0 - radius * 1.732/2
第4个小圆的圆心坐标:(x4,y4)
k = 3,Cos(90度) = 0,所以,得到 x2 = 0 + x0
k = 3,Sin(90度) = 1,所以,得到 y1 = y0 - radius
这样分析了四个刻度小圆的绘制程序,其他就不再赘述。
再来分析指针的运动;
初始状态;两个指针是垂直放置的,所以有:a = 90,b = 90
表示夹角为90度起,开始运动,同样也是每次转动30度角度;
分析代码:
Private Sub Timer1_Timer()
a = a - 30
Line1.X2 = len1 * Cos(a * 3.14159 / 180) + x0
Line1.Y2 = y0 - len1 * Sin(a * 3.14159 / 180)
b = b - 30 / 12
Line2.X2 = len2 * Cos(b * 3.14159 / 180) + x0
Line2.Y2 = y0 - len2 * Sin(b * 3.14159 / 180)
End Sub
len1和len1分别是长短指针的长度,len1=1000,下面用图分析长针的转动过程,Line1控件的坐标变化规律;
可以知道初始状态:Line1.x1 = Line1.x2 = 1200,Line1.y1 = 1200,Line1.y2 = 200,(因为半径是1000)
转过30度以后;a = 90 - 30 = 60度,这里是指长针的位置与坐标系的X轴的正向夹角为60度;
见下图:
注意:因为指针的一段是固定在一点(就是圆心坐标),不变化的,所以每次只需要计算另一个端点坐标的变化就可以了。
所以有:
Line1.X2 = len1 * Cos(60度) + x0
Line1.Y2 = y0 - len1 * Sin(60度)
同理:
再转过30度;
Line1.X2 = len1 * Cos(30度) + x0
Line1.Y2 = y0 - len1 * Sin(30度)
。。。。。。
往后的原理都相同,仅仅是数学上的问题了,不再赘述。