数学与生活[2]–时钟的原理

王 茂南 2017年10月5日16:24:10
评论
1 2284字阅读7分36秒
摘要在这里我们会使用mathematica来实现一个时钟,希望通过这篇文章大家可以了解到关于mathematica里一些动态函数的使用方法。

时钟的原理--使用 Mathematica 制作时钟

在这里我会使用 Mathematica 来制作一个时钟,顺便讲一下关于每个针走动的情况,也算数学与生活相互结合啦。这部分的内容参考自,如何制作一个时钟

 

基础数学知识

我们观察一下时钟,首先想到的是与角度有关。再有是,秒针,分针,时针之间的进位关系。

在讲解这两点之前,先考大家一个问题,4点15时,分针与时针之间的夹角是多少呢?(这可是鹅厂某年的面试题之一)

  • 我们都知道1s = 1 / 60min,1min = 1 / 60h;
  • 观察任意一款手表或时钟,我们会发现,通常时钟的表盘会被分成12个大格,5*12=60个小格,而整个表盘是360°,也就是说每个小格是6°。换句话说,秒针和分针每动一下,都会走过1小格,走过了6°,而时针动一下,则走过了一大格,5*6°=30°;因此,秒针和分针移动的基值是6°,时针是30°;
  • 另外在分针走动的时候,时针也不是静止不动的,而是不甘寂寞的默默向前移动,也就是说当分针动一下,走了6°时,时针实际上也挪动了1 / 60 * 30°。所以,计算时针角度时不要忽略了分针对其的影响。(虽然秒针对分针也有着同样的影响,但几乎看不出来,所以,通常我们会将其忽略)

 

确定各指针的角度

综上两个知识点,我们可以将各指针的角度表示为:

  1. sdegree = - nSeconds * 6 + 90;
  2. mdegree = - nMinutes * 6 + 90;
  3. hdegree =- ( (nHour%12) * 30 + Math.floor((nMinutes/60)*30) ) + 90;
  4. (-90,是因为rotateZ角度旋转规则,默认是从水平开始,逆时针为+,顺时针为-)

 

图形解释

我们首先看一下默认的角度圆,可以看到是沿着逆时针角度增加的。

数学与生活[2]–时钟的原理

 

我们可以看一下增加 (45/6)s,即增加 45 度后的样子:从下面的图中我们可以看到要使用 -(0+45) 才是顺时针的旋转,但是我们表盘是从图上 90 的地方开始旋转的,我们再修改一下。

数学与生活[2]–时钟的原理

 

我们使用 -(0+45)+90 来修改,使得指针能从 0 处开始旋转。

数学与生活[2]–时钟的原理

到这里我们已经知道里表盘上每个指针的运转情况了,下面开始来编程实现了。

 

Mathematica编程

从 0 开始实现

可以关注一下下面代码中的 Refresh,下面代码是很好的写动态的范例,如果觉得这个太长,可以看下面那个系统自带函数版本。

  1. DynamicModule[{t = (t = None)},
  2. Column[{
  3. Dynamic[
  4. ActionMenu[
  5. "Update Time:", {"On" :> (t = (UpdateInterval -> 1);),
  6. "Off" :> (t = None;)}]],
  7. Dynamic[
  8. Refresh[
  9. x = TimeObject[];
  10. Graphics[{
  11. {Dashed, Red, Circle[]},(*画出表盘*)
  12. Black, PointSize[Large], Point[{0, 0}],(*加入表盘中间的一个点*)
  13. {Text[Style["12", Bold, Blue, Italic, 24], {0, 1}],
  14. Text[Style["3", Bold, Blue, Italic, 24], {1, 0}],
  15. Text[Style["6", Bold, Blue, Italic, 24], {0, -1}],
  16. Text[Style["9", Bold, Blue, Italic, 24], {-1, 0}]},(*画出钟上的数字*)
  17. Text[x, {0, -.5}],(*下方显示具体时间*)
  18. Arrow[{{0, 0}, {Cos[(-(DateList[x][[-1]]*6) + 90) Degree],Sin[(-(DateList[x][[-1]]*6) + 90) Degree]}}],(*模拟秒针的走动*)
  19. Arrow[{{0,0}, .7*{Cos[(-(DateList[x][[-2]]*6) + 90) Degree], Sin[(-(DateList[x][[-2]]*6) + 90) Degree]}}],(*模拟分针的走动*)
  20. Arrow[{{0, 0}, .5*{Cos[(-(Mod[DateList[x][[-3]], 12]*30 + Floor[DateList[x][[-2]]/2]) + 90) Degree], Sin[(-(Mod[DateList[x][[-3]], 12]*30 +Floor[DateList[x][[-2]]/2]) +90) Degree]}}](*模拟时针的走动*)
  21. }], t]
  22. ]}, Center]
  23. ]

我们来看一下效果:其实还是不错的。

数学与生活[2]–时钟的原理

使用自带函数--ClockGauge

Mathematica 真的是函数太全了,竟然还有专门画表盘的函数 ClockGauge,下面我们来改进一下代码。

  1. DynamicModule[{t = (t = None)},
  2. Column[{
  3. Dynamic[
  4. ActionMenu[
  5. "Update Time:", {"On" :> (t = (UpdateInterval -> 1);),
  6. "Off" :> (t = None;)}]],
  7. Dynamic[
  8. Refresh[
  9. ClockGauge[AbsoluteTime[],
  10. PlotLabel -> Style["当地时间", Large, Bold]], t]
  11. ]
  12. }, Center
  13. ]
  14. ]
数学与生活[2]–时钟的原理

从效果上我们可以看到,其实就是表盘变好看了,但是其中的原理是不变的。

  • 微信公众号
  • 关注微信公众号
  • weinxin
  • QQ群
  • 我们的QQ群号
  • weinxin
王 茂南
  • 本文由 发表于 2017年10月5日16:24:10
  • 转载请务必保留本文链接:https://mathpretty.com/8304.html
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: