求一道VB题的解析

Constx0=1200,y0=1200,radius=1000Dima,b,len1,len2PrivateSubCommand1_Click()Timer1.Enab... Const x0 = 1200, y0 = 1200, radius = 1000Dim a, b, len1, len2Private Sub Command1_Click() Timer1.Enabled = TrueEnd SubPrivate Sub Command2_Click() Timer1.Enabled = FalseEnd SubPrivate Sub Form_Activate() 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 a = 90 b = 90 len1 = Line1.Y1 - Line1.Y2 len2 = Line2.Y1 - Line2.Y2End SubPrivate 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不明白之处是全文中的sin 和 cos两个函数的用法,按正余弦知识我理解为每处的sin和 cos都是调换的,就是搞不明白。 展开
 我来答
syx54
2017-08-22 · TA获得超过7378个赞
知道大有可为答主
回答量:6567
采纳率:83%
帮助的人:2746万
展开全部

首先分析在程序启动部分,绘制钟表表面的刻度;见图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度)

。。。。。。

往后的原理都相同,仅仅是数学上的问题了,不再赘述。

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式