您所描绘的曲线很像
伽玛校正曲线。其想法是,范围的最小值和最大值保持与输入相同,但中间部分被弯曲,就像你在图表中所示的一样(我要注意的是,这并不是从余弦实现中得到的圆弧)。
以图形方式表示,如下所示:
![alt text](https://istack.dev59.com/3xxrW.webp)
(来源:
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(最敏感),并使用幂函数缩放内部gamma值。换句话说,让用户选择(-4、-3、-2、-1、0、1、2、3、4),但将其转换为gamma值(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值。