如何使时钟秒针以每秒 4 次跳动/滴答声移动?
Posted
技术标签:
【中文标题】如何使时钟秒针以每秒 4 次跳动/滴答声移动?【英文标题】:How do I make a clock second hand move with 4 jumps/ticks per second? 【发布时间】:2018-03-22 23:22:19 【问题描述】:编辑:需要帮助才能准确地获得每秒 3 个滴答声,但由于分数,这是不可能的。仔细检查现实生活中的时钟,我意识到它实际上每秒移动 4 个滴答声,我认为四分之一秒是均匀的,应该能够准确。更新了问题,因为我也无法让它工作:
我正在构建一个时钟,它具有秒针如何移动的三个选项。我已经成功地使秒数每秒移动 6°(每秒 1 个“滴答声”)和一个无缝扫描选项(每毫秒 0.006°)。但我无法让我的公式适用于我的第三个选项:让秒针每秒准确移动 4 次,即每四分之一秒移动 1.5°。
这是秒针的代码行(我稍后使用 CGAffiateTransform,因此是弧度):
let quarterSecond = round(millisecond * 4.0 / 1000.0)
let tickingSeconds = (((1.5 * π / 180) * quarterSecond) + ((6.0 * π / 180) * second))
这是我想要的,但我不喜欢round
,因为它使运动不精确。整个计时器间隔设置为 0.001,我很难相信如果不时不时地做一些不均匀的抽搐,就不能让秒针每秒精确移动 4 个“滴答”。
有什么想法吗?
【问题讨论】:
round
将使手在 +0.125、+0.325、+0.625、+0.875 处移动。您可能想使用 round(.down)
来获得 +0.00、+0.25、+0.50、+0.75。否则它不会与您在second
上的移动完美同步。
请注意,round(.down)
是整数除法的行为(对于正数),因此您最好使用整数来计算 quarterSecond
。
【参考方案1】:
您直观地认为滴答声是您的表达式更改值的频率。
在这里,除了second
之外,您的整个表达式都是不变的。这意味着你的表情只有在second
改变时才会改变。如果是整数,只能每秒变化一次。
您需要一个每秒更改三次的变量,您可以使用 millisecond
和截断(以删除小数部分)来近似:
let thrice_a_second = (millisecond * 3.0 / 1000.0).round()
只有这样,您才能使用该表达式来计算新的位置,知道它每秒增加 1 三次。
【讨论】:
谢谢!我让它与那个常数一起工作。但是,我想当秒针移动时,我偶尔会看到一个非常微小、不均匀的抖动。round(...)
位可以对此负责吗?我有点担心常数不准确。我需要每三次非常精确的运动,round(...)
会阻止它吗?
“我有点担心常数不准确” - 三分之一秒是 333.333... 毫秒,因此您的舍入将一秒分为 333 毫秒、334 毫秒和 333 毫秒部分。您面临一个事实,即十进制分数不能精确地表示 1/3(并且您的十进制分数实际上是二进制分数),因此您永远无法精确。您可以从纳秒开始......但是,您的“偶尔”可能更多地取决于非实时操作系统中时间的变幻莫测,而不是分数的任何差异。
我已经编辑了我的问题,因为我意识到我实际上是经过 4 步而不是每秒 3 步。 0.25 甚至我还没有接受这是不可能实现的。如何使表达式每 0.25 秒更改一次值?以上是关于如何使时钟秒针以每秒 4 次跳动/滴答声移动?的主要内容,如果未能解决你的问题,请参考以下文章