您说明的曲线看起来很像伽马校正曲线。那里的想法是范围的最小值和最大值与输入保持相同,但中间像您在图表中一样弯曲(我可能会注意到这不是您从余弦实现中得到的圆弧)。
从图形上看,它看起来像这样:
(来源: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,可以更进一步。
当 gamma 为 1 时,该线始终是完全线性的 (y = x)。如果 x 小于 1,则曲线向上弯曲。如果 x 大于 1,则曲线向下弯曲。gamma 的倒数会将值转换回原始值 (x = f(y, 1/g) = f(f(x, g), 1/g)。
只需根据自己的口味和应用需求调整 gamma 的值即可。由于您希望为用户提供多个“灵敏度增强”选项,因此您可能希望在线性范围内为用户提供选择,例如从 -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 值。