目前我有一个控件,我需要添加设施以应用各种锐度(或灵敏度)。这个问题最好用图片说明:
Graph http://img87.imageshack.us/img87/7886/control.png
正如你所看到的,我有X和Y轴都有任意限制100 - 这应该足以解释这个问题。目前,我的控制是红线(线性行为),但我想添加其他3条曲线(或更多)的能力,即如果控件更敏感,那么设置将忽略线性设置并选择一个三条线。起点始终为0,终点始终为100。
我知道指数过于陡峭,但似乎无法想象前进的方向。有什么建议吗?
答案 0 :(得分:3)
您说明的曲线看起来很像gamma correction曲线。这个想法是,范围的最小值和最大值与输入保持一致,但是中间像你在图中一样弯曲(我可能会注意到不是你想要的圆弧得到余弦实现)。
从图形上看,它看起来像这样:
(来源: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,则曲线向下弯曲。伽玛的倒数值将该值转换回原始值(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值。
答案 1 :(得分:1)
我提出了一个简单的公式,(我相信)可以捕捉您的要求。为了获得完整的“四分之一圈”,这是您的极端情况,您可以使用(1-cos((x*pi)/(2*100)))*100
。
我建议您在y = x和y =(1-cos((x * pi)/(2 * 100)))* 100之间取加权平均值。例如,要非常接近线性(99%线性),请执行:
y = 0.99*x + 0.01*[(1-cos((x*pi)/(2*100)))*100]
或者更一般地说,线性度水平是L,并且它在区间[0,1]中,你的公式将是:
y = L*x + (1-L)*[(1-cos((x*pi)/(2*100)))*100]
编辑:我将cos(x/100)
更改为cos((x*pi)/(2*100))
,因为因为cos结果在[1,0]范围内,X应该在[0,pi / 2]范围内而不是[0,1],抱歉最初的错误。
答案 2 :(得分:0)
你可能正在寻找像polynomial interpolation这样的东西。二次/立方/四次插值应该为您提供问题中显示的各种曲线。您显示的三条曲线之间的差异可能只是通过调整系数(间接确定陡度)来实现。
答案 3 :(得分:0)
y = x^p
x
从0到1的图表将按照您的要求进行,因为您将p
从1(将给出红线)向上变化。随着p
的增加,曲线将越来越多地被“推入”。 p
不必是整数。
(你需要扩展到0到100,但我相信你可以解决这个问题)
答案 4 :(得分:0)
我投票支持Rax Olgud的一般想法,只做了一次修改:
y = alpha * x + (1-alpha)*(f(x/100)*100)
其中f(0)= 0,f(1)= 1,f(x)是超线性的,但我不知道这个“四分之一圈”的想法来自何处或者为什么1-cos(x)将是一个不错的选择。
我建议f(x)= x k 其中k = 2,3,4,5,无论是什么,给你所需的陡度为& alpha = 0。选择一个值对于k作为固定数,然后改变α以选择您的特定曲线。
答案 5 :(得分:0)
对于这样的问题,我经常会从曲线中得到几个点并将其抛出曲线拟合程序。那里有很多人。 Here's one with a 7-day free trial.
我通过尝试不同的模型学到了很多东西。通常你可以得到一个非常简单的表达式来接近你的曲线。