2011-01-22 4 views
0

Androidで構築しているJavaアプリケーションでアルファ値を調整しようとしています。 rateOfChangeがmaxAlphaより大きくすることはできません任意の整数であるライン上の数値を正弦曲線上で変調する式に変更するにはどうすればよいですか?

if (goingUp) { 
    newAlpha = oldAlpha + rateOfChange; 
    if (newAlpha > maxAlpha) { 
     newAlpha = maxAlpha; 
     goingUp = false; 
    } 
} else { 
    newAlpha = oldAlpha - rateOfChange; 
    if (newAlpha < minAlpha) { 
     newAlpha = minAlpha; 
     goingUp = true; 
    } 
} 

:今のところはこのようになります。この式はスレッド内のすべてのティックを評価し、時間とは無関係です。

与えられた変数+ Math.PIと他のMath要素(私はMath.Sineがそこにあると仮定しています)を使ってnewAlphaをSine上の数値にする方法はありますか?

私はminとmaxがwaveのアンプになり、rateOfChangeがSine関数の積になると思っていますが、どういった方法で一緒に行くのか分かりません。

答えて

1

あなたの方程式は次のようになります。

alt text

yは時刻tにおける垂直位置で、Aは振幅であり、fは周波数であり、tは時間(またはAndroidのクロックのティックであります)。

+0

これは正しい方向に私を指摘するものです。ありがとう。 – prodaea

0

なぜこれを考慮しないでください。あなたのクラス定義の上部に

...、含まれます: -

import java.lang.*; 

...とあなたの関数内で、newAlphaに割り当てた後、

newAlpha = Math.sin(newAlpha%(2*Math.PI)); 

ご希望の場合newAlphaの範囲であることが[-1,1]罪()関数は、内...

OR

あるようnewAlphaに代入した後、あなたの関数、

newAlpha = Math.asin(newAlpha%3 - 1); 

あなたは範囲内であることがnewAlphaをご希望の場合は[-1,1]罪()関数は

であるように私は何のデータ型はよく分かりませんnewAlphaはありますが、この式の答えには影響しないと仮定します。たとえば、newAlphaはdouble型です。

一般的には、特定の範囲内の数値を取得する方法です。つまり、あなたが持つ式に係数を適用します。 expr%Nは[0、N-1]の範囲内の数値を生成します。

これが役に立ちます。

+0

データ型はPaint.setAlpha(int)としてintであり、範囲は[0,255]なので、範囲を[-1,1]から[0,255]に変更したいと思います。また、oldAlphaを使用することを意味しましたか? – prodaea

0

ダフィモの一般的な方程式に基づいて、私はTI-83日間(文字通り、自分の携帯電話にアプリケーションを置く)に戻っていった。しかし、それはこのように見てしまったので、私は一緒にすべてのピースを置くことができました:

newAlpha = (int)((alphaMax - alphaMin) * 0.5 * Math.sin(rateOfChange * ticks + randomPhaseOffset) + (alphaMin + (alphaMax - alphaMin) * 0.5)) 

FMI:http://en.wikipedia.org/wiki/Sine_wave

関連する問題