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