我正在试图弄清楚如何计算每秒的点击量(例如,一个应用程序有一个我点击的窗口,它会给我一个类似于速度计的值,以每秒的点击量为单位)。由于某种原因,这个算法让我摸不着头脑。
如果我在每一秒都报告最后一秒发生了多少次点击,那么就很容易弄清楚我是否只想计算每秒的点击量。但棘手的是,如果在1秒内有一次点击,那么在2-9秒内点击0次,在10秒内点击1次。据推测,这将是每秒的.2点击量--尽管实际上只有当它保持下去并随着时间的推移平均达到这个数字时才会出现。如果在10秒的点击之后是40秒的0点击,那么它应该是0点击/秒,而不是.04点击/秒。
因此,很明显,我需要某种窗口,在这个窗口中,我愿意假设点击是模式的一部分,或者至少与最后的点击相关联。但这对我来说没什么意义。
为此,我使用openframeworks,因此有一个每秒调用一次以上的更新(例如30x/秒)函数,还有一个mousePressed()函数,它允许我递增一个变量来跟踪点击。我可以使用difftime()和time()来跟踪我是否刚刚进入了一个新的秒数,然后使用fmod()来判断我是否刚刚跨越了某个更大的间隔。
如有任何建议,欢迎光临。
发布于 2012-02-06 15:04:57
我认为你想要计算每秒点击的运行平均值。对于30秒的窗口,您将使用长度为30的计数器的循环缓冲区。每秒的平均点击次数是计数器的总和除以30。索引指向当前计数器,该索引每秒以30为模递增,并且新位置处的计数器被设置为零。
示例:
const unsigned BUFFER_SIZE = 30;
unsigned counters[BUFFER_SIZE];
unsigned current = 0;
time_t last;
void init() {
time(&last);
}
void update() {
time_t now;
time(&now);
while (now - last >= 1) {
++last;
current = (current+1)%BUFFER_SIZE;
counters[current] = 0;
}
}
void mousePressed() {
++counters[current];
}
float average() {
float sum = 0;
for (int i = 0; i < BUFFER_SIZE; ++i) {
sum += counters[i];
}
return sum/BUFFER_SIZE;
}发布于 2012-02-06 14:24:20
这是伪代码,但我认为它会实现您所要求的功能:
onUpdate() {
if (currentTime() - lastClickTime > idleTimeout) {
// reset the clickometer to zero
} else {
// calculate the speed
}
}
onMouseClick() {
lastClickTime = currentTime();
// and whatever else needs to happen
}基本上,你只是跟踪最后一次点击的时间,并确保它发生在idleTimeout内,显然你必须在一段时间内定义它。
https://stackoverflow.com/questions/9156224
复制相似问题