2012-02-06 18 views
2

クリック数の計算をどのように計算するかを考えています(たとえば、クリックしたウィンドウのあるアプリでスピードメーターが表示されます1秒あたりのクリック数における「クリック数」の「スピード」の値)。何らかの理由でアルゴリズムが私を逃しています。実行中のクリック数/秒値(スピードメーター)を計算するアルゴリズム

1秒ごとに何回クリックが発生したかを1秒ごとに把握するだけであれば、1秒あたりのクリック数を把握したいのかどうかは簡単にわかります。しかし、どこが厄介なのは、1秒間に1回のクリックがあった場合、0〜2秒で0回クリックし、2回目に1回クリックすることです。おそらく2秒間に2回のクリックとなります。時間をかけてそれを平均化したものです。秒間の10回のクリックに40秒間0回のクリックが続いた場合、秒/秒ではなく0回のクリックでなければなりません。

明らかに私は、クリックがパターンの一部であるか、少なくとも最後のものに関連付けられていると思われる何らかのウィンドウが必要です。しかし、それは私にとって意味をなさないだけです。

私は、このためにopenframeworksを使用して、その一回/秒(たとえば30X /秒)以上呼び出された更新()関数を持っている、と私は追跡する変数をインクリメントすることを可能にするのmousePressed()関数を持っていますクリック私はdifftime()とtime()を使って、ちょうど新しい秒を越えたかどうかを追跡し、fmod()を使ってより大きな間隔をちょうど越えたかどうかを調べることができます。

ご迷惑をおかけして申し訳ございません。

+0

だからあなたの問題は何ですか?そして最後のものと関連していることは何を意味していますか? – LihO

+0

は 'associated'によって意味しています。つまり、以前のクリックからのクリックを含むパターンの最新のクリック部分、または0時のクリック数/時間速度です。この最新のクリックが新しい速度の開始点ですか?私の問題はこのアルゴリズムを洗い出していて、助けを求めていました。擬似コード、C++、物語のアイデア...これをどのようにするかを示唆するどのようなタイプであれ、参考になるでしょう。 – mix

+0

スライド10秒のウィンドウ、または10秒の連続ウィンドウが必要ですか?後者ははるかに簡単です。 –

答えて

3

クリック1秒あたりの実行平均を計算したいと思います。 30秒のウィンドウには、例えば30の長さのカウンターの循環バッファーを使用します。 1秒あたりの平均クリック数は、カウンターを30で割った合計です。 インデックスは現在のカウンターを指しており、インデックスは1秒ごとにモジュロ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; 
} 
+0

実際に循環バッファーが典型的なアプローチです。私は 'difftime'と' ++ last; 'ステートメントの使用の間に矛盾があると思います。後者は、通常の操作が 'time_t'で利用可能であると仮定していることを意味しますが、この場合、' now-last'を使って違いを計算してみてはいかがですか? –

+0

@MatthieuM。同意 –

+1

循環バッファの全内容の合計を保持し、循環バッファからポップアップした項目を差し引き、追加したばかりの値を追加することで、平均をより速く維持することができます。 –

0

これは擬似コードですが、私はそれはあなたが求めている何をすると思います。

onUpdate() { 
    if (currentTime() - lastClickTime > idleTimeout) { 
     // reset the clickometer to zero 
    } else { 
     // calculate the speed 
    } 
} 

onMouseClick() { 
    lastClickTime = currentTime(); 
    // and whatever else needs to happen 
} 

を基本的にはあなただけの最後のクリックの時間を追跡し、必ずそれはあなたのidleTimeout、内起こっ作っています明らかに時間の範囲内で定義する必要があります。

関連する問題