我想创建一个按钮,允许用户点按它,从而设置每分钟节拍。我也会在它上下移动以更快更慢地调整。 (我已经解决了这个问题)。
有什么方法可以让用户点击按钮的时间来获得按下之间的平均时间,从而达到节奏。
答案 0 :(得分:3)
您最好使用time()
中的time.h
而不是NSDate
。以节拍的速度创建NSDate
的开销可能导致严重的精度损失。
我相信time_t
保证具有双精度,因此您可以安全地将time()
与difftime()
结合使用。
使用整个屏幕,不要只给用户1个小按钮。
将所有时间存储在数组中。
修剪结果。从开头和结尾删除超过平均值的元素。
从剩余值中获取平均值。那是你的速度。
如果它接近公共值,请使用它。
使用2个变量。一个称为speed
,另一个称为error
。
在前2次节拍计算估计速度后,将error
设为speed
。
每次击败后
queue = Fifo(5) # First-in, first-out queue. Try out
# different values for the length
currentBeat = now - timeOflastBeat
currentError = |speed - currentBeat|
# adapt
error = (error + currentError) / 2 # you have to experiment how much
# weight currentError should have
queue.push(currentBeat) # push newest speed on queue
# automatically removes the oldest
speed = average(queue)
只要error
小于某个阈值,您就可以停止并告诉用户您已确定速度。
疯狂的界面。每当用户点击时,屏幕都会闪烁。水龙头的额外火花几乎与预期时间相同。
使背景颜色与错误相对应。错误越小,使其越亮。
答案 1 :(得分:0)
每次按下该按钮,都会存储当前日期/时间([NSDate date]
)。然后,在下次按下时,您可以使用-[previousDate timeIntervalSinceNow]
计算差异(因为它从前一个减去当前日期,所以为负值),这将为您提供秒数。