0

ある範囲から別の範囲に変換する必要がある範囲のセットが 2 つあります。

最初の範囲は-100 ↔ 100デフォルト0です。

2 番目の範囲は0.0 ↔ 10.0デフォルト1です。

私は最初の範囲で AS3 で作業しており、2 番目の範囲は Python クラスであり、これらの数値を揃える必要があります。

動画の明るさをスライダーでリアルタイムに調整しています。ビデオ フィルタは、 の間の値を受け入れます-100 ↔ 100。次に、その値を取得してPythonスクリプトに渡す必要がありますが、次の値のみを受け入れます0.0 ↔ 10.0

ネットで見つけたこの関数を試してみましたが、この特定のケースでは値が正しく変換されません。

private function convertRange(originalStart:Number,originalEnd:Number,newStart:Number,newEnd:Number,value:Number):Number
{
    var originalRange:Number = originalEnd - originalStart;
    var newRange:Number = newEnd - newStart;
    var ratio:Number = newRange / originalRange;
    var newValue:Number = value * ratio;
    var finalValue:Number = newValue + newStart;
    return finalValue;
}       

これは可能ですか?私の質問が明確であることを願っています。明確化が必要な場合はお知らせください。

これは私が参照している python クラスです: https://github.com/dubhater/vapoursynth-adjust AS3 が最初の範囲を使用するのに対し、2 番目の範囲を使用します。

4

2 に答える 2

1

この問題には根本的な問題があります。ある範囲の 3 点を別の範囲に当てはめようとしています。簡単に 2 つの終点を一致させることに興味がある場合は、線形補間を使用するy = 10 * (x+100) /200か、単純にy = (x+100)/20または同等に使用できますy=x/20+5。問題は、これがデフォルト値と一致せず、x=0 -> 5 であることです。

これはあなたが望む解決策かもしれません。ただし、デフォルト値が一致することが重要な場合は、非線形ソリューションを使用する必要があります。多くの可能な解決策があります。if ステートメントが必要な akmozo ソリューションのような区分線形ソリューションを使用できます。if x<0 then y = x/100+1 else y = 1 + 9 x /100. これの問題は、スムーズな応答が得られないことです。スライダーを最小から最大に調整することを検討してください。最初は明るさが非常にゆっくりと増加し、ゼロを超えると非常に速く増加し始めます。

範囲の前半と後半の大きな違いは、指数型のソリューションを示唆しています。y = A exp(b x). 中心点と上端をy = exp(x * ln(10)/100)一致させると、下端はゼロではなく 0.1 で少し高くなります。y = A exp(b x)-c3 つの点すべてに一致する指数関数的な解が見つからない場合は、これで問題ないかもしれません。

別の可能性は、力を使用することです。のような方程式y = A pow(x,n)。少し計算するとy=10 pow(x/200+0.5),3.321928095)、3 つの点すべてが一致します。定数 3.321928095 = ln(0.1)/ln(0.5)。

4 つの異なるソリューション

図では、黒い曲線は単純な線形ソリューションです。赤い曲線は区分線形曲線、緑は指数関数曲線、青はべき乗曲線です。

于 2015-09-29T05:14:40.337 に答える