3

現在、さまざまな鋭さ(または感度)を適用する機能を追加する必要があるコントロールがあります。この問題は、次の図に示すのが最適です。

グラフ http://img87.imageshack.us/img87/7886/control.png

ご覧のとおり、X 軸と Y 軸があり、どちらも 100 の任意の制限があります。この説明ではこれで十分です。現在、私のコントロールは赤い線 (線形動作) ですが、他の 3 つの曲線 (またはそれ以上) の機能を追加したいと思います。つまり、コントロールがより敏感な場合、設定は線形設定を無視して 1 つに進みます。三行のうち。始点は常に 0 で、終点は常に 100 です。

指数関数が急すぎることはわかっていますが、先に進む方法がわかりません。何か提案はありますか?

4

6 に答える 6

3

あなたが描いた曲線は、ガンマ補正曲線によく似ています。範囲の最小値と最大値は入力と同じままですが、グラフのように中央が曲がっているという考えがあります (コサイン実装から得られる円弧ではないことに注意してください)。

グラフ的には、次のようになります。

代替テキスト
(出典: wikimedia.org )

それで、それをインスピレーションとして、ここに数学があります...

x 値の範囲が 0 から 1 の場合、関数はかなり単純です。

y = f(x, gamma) = x ^ gamma

スケーリング用に xmax 値を追加すると (つまり、x = 0 から 100)、関数は次のようになります。

y = f(x, gamma) = ((x / xmax) ^ gamma) * xmax

または代わりに:

y = f(x, gamma) = (x ^ gamma) / (xmax ^ (gamma - 1))

ゼロ以外の xmin を追加したい場合は、これをさらに一歩進めることができます。

ガンマが 1 の場合、線は常に完全な線形 (y = x) です。x が 1 未満の場合、曲線は上向きに曲がります。x が 1 より大きい場合、曲線は下向きに曲がります。ガンマの逆数値は、値を元に戻します (x = f(y, 1/g) = f(f(x, g), 1/g))。

自分の好みやアプリケーションのニーズに応じて、ガンマの値を調整するだけです。ユーザーに「感度向上」の複数のオプションを提供したいので、-4 (最も感度が低い) から 0 (変化なし) から 4 (最も感度が高い) の範囲の線形スケールでユーザーに選択肢を与えることができます。 )、内部ガンマ値を累乗関数でスケーリングします。つまり、ユーザーに (-4、-3、-2、-1、0、1、2、3、4) の選択肢を与えますが、それをガンマ値 (5.06、3.38、2.25、1.50、1.00) に変換します。 、0.67、0.44、0.30、0.20)。

C# でコーディングすると、次のようになります。

public class SensitivityAdjuster {
    public SensitivityAdjuster() { }
    public SensitivityAdjuster(int level) {
        SetSensitivityLevel(level);
    }
    private double _Gamma = 1.0;
    public void SetSensitivityLevel(int level) {
        _Gamma = Math.Pow(1.5, level);
    }
    public double Adjust(double x) {
        return (Math.Pow((x / 100), _Gamma) * 100);
    }
}

これを使用するには、新しい SensitivityAdjuster を作成し、ユーザーの好みに応じて感度レベルを設定し (コンストラクターまたはメソッドを使用して、おそらく -4 から 4 が適切なレベル値になります)、Adjust(x) を呼び出して調整された出力値を取得します。 . 妥当なレベルの範囲を広げたり狭めたりする場合は、SetSensitivityLevels メソッドでその 1.5 の値を増減します。もちろん、100 は x の最大値を表します。

于 2009-06-24T21:40:28.800 に答える
0

0から1までのグラフはy = x^p、1(赤い線が表示されます)から上に向かって変化するときに、必要なことを実行します。増加するにつれて、曲線はますます「押し込まれ」ます。整数である必要はありません。xppp

(0から100になるようにスケーリングする必要がありますが、それを解決できると確信しています)

于 2009-06-24T19:43:34.403 に答える
0

おそらく多項式補間のようなものを探しているでしょう。二次/三次/四次補間は、質問に表示される種類の曲線を提供するはずです。あなたが示す3つの曲線の違いは、おそらく係数を調整するだけで実現できます(間接的に勾配を決定します)。

于 2009-06-24T19:32:28.980 に答える