2016-08-12 6 views
0

簡単に言えば、ループ遅延にイージングを適用する方法を理解しようとしています。ループ遅延に緩和を適用する

for (i := 0; i < 114; i++) { 
    // do a task 
    time.Sleep(//delay before next job) 
} 

これは読めるので、これは非常に基本的なものです。 3秒でループ全体を完了したいとしましょう(ジョブ完了時間は無視できます、t <= us)。 Penner's Equationsの適切な方法は、それぞれの反復に対して、適切に緩和された遅延を計算するものですか?

したがって、ゼロ速度からの加速をシミュレートするには、ループの各反復でtパラメータを使用してスリープするための適切な遅延を作成する方法を教えてください。

私がこのことについてお手伝いできるなら、私は非常に感謝しています。方程式はこれまでのところ問題ではありませんが、代わりにユースケースでそれらを使用する方法があります。

私の質問は最初は次のようになります。Applying easing to setTimeout delays, within a loop しかし、これはループの合計時間を考慮していません。

しかし、私は[0,1]範囲で、パラメータを1つだけ使用するように書き換えられた方程式を使用する方が良いかもしれないと思う:https://gist.github.com/rezoner/713615dabedb59a15470

私の理解から、私は「パーセントの時間が経過し、」抽象を計算する必要が何らかの形でこの値をイージング関数で補間します。

このノードプロジェクトはちょうどそれを行うようです:https://github.com/CharlotteGore/animation-timer、しかし再び私はそれを再現する方法を見つけることができません。

答えて

1

Penner's Equationsは、現在の進行状況と可能な進捗状況の2つのパラメータを基本的に必要とします。ただし、代わりに、total-percent-progressを1つのパラメータ(0〜1の値)として指定することもできます。これは、現在と合計を使用して計算するためです。

元のコードを使用して、3秒以内に114回の反復を実行するのが最も簡単な方法は、現在の進捗状況として反復インデックスを使用し、合計として114を使用し、計算された遅延係数に合計期間3.0秒。

Penner's Equationsは、各ステップの相対変位ではなく、開始位置からの変位の合計を計算するので、実際にはその差を自分で計算する必要があります。

func DoStuffWithEasing() { 
    iterations := 114 
    runTime := 3 * time.Second 

    for i := 1; i <= iterations; i++ { 
     // do a task 
     time.Sleep(easeInQuadDelay(i, iterations, runTime)) 
    } 
} 

func easeInQuadDelay(c, t int, dur time.Duration) time.Duration { 
    if c <= 0 || t == 0 { // invalid cases 
     return 0 
    } 

    // This return can be a single-liner, but I split it up for clarity 
    // Note that time.Durations are fundamentally int64s, 
    // so we can easily type convert them to float64s and back 

    this := math.Pow(float64(c)/float64(t), 2) 
    last := math.Pow(float64(c-1)/float64(t), 2) 
    return time.Duration((this - last) * float64(dur)) 
} 

https://play.golang.org/p/TTgZUYUvxW

Graph of the easing

+0

うわー、おかげで、あなたはそれをはっきりと作った。ですから、別のイージング関数を使うには、同じパラメータで 'this'と' last'をどのように計算するのかを変えなければなりませんか? –

+0

正確に。ちなみに、必要に応じて、少しでも機能的なプログラミングを使って動的に行うこともできます。例:https://play.golang.org/p/JQCIOWwxEs – Kaedys

+0

申し訳ありません。あなたが遅れを計算する方法によると思われますが、 'inOutQuad'の式(http://easings.net/fr#easeInOutQuad)のグラフによると、遅れは増加するのではなく減少の減少になるはずですフレーム57-58減少時に停止する。 –

0

と思いますが、時間はお使いいただけます。

numLoops := 144 
timePerIteration := time.Duration(3) * time.Second/time.Duration(numLoops) 
ticker := time.NewTicker(timePerIteration) 
for i := 0; i < numLoops; i++ { 
    // your code 
    <-ticker.C 
} 
ticker.Stop() 
+0

ティッカーまたはタイマーを使用していない。したがってこの反復の遅延は、この反復のための全変位(遅延)マイナス最後の反復の合計変位でありますしかし、代わりにペナーのイージング方程式の復帰を実装する方法。 –

関連する問題