目前我有一个控件,我需要添加工具来应用各种锐度(或灵敏度)。这个问题最好用一张图片来说明:

图http://img87.imageshack.us/img87/7886/control.png

正如您所看到的,我的 X 轴和 Y 轴都具有 100 的任意限制 - 这足以解释这个问题。目前,我的控制是红线(线性行为),但我想添加其他 3 条曲线(或更多)的功能,即如果控件更敏感,则设置将忽略线性设置并选择三行之一。起点始终为 0,终点始终为 100。

我知道指数太陡,但似乎无法找到前进的方向。请问有什么建议吗?

有帮助吗?

解决方案

你所描绘的曲线看起来很像 伽玛校正 曲线。其想法是范围的最小值和最大值与输入保持相同,但中间像图表中那样弯曲(我可能注意到的是 不是 从余弦实现中得到的圆弧)。

从图形上看,它看起来像这样:

alt text
(来源: 维基媒体网站)

所以,以此为灵感,这是数学......

如果 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)。

只需根据自己的喜好和应用需求调整伽玛值即可。由于您希望为用户提供“灵敏度增强”的多个选项,因此您可能希望为用户提供线性选择,例如范围从 -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-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,π/ 2],而不是[0,1],遗憾的范围初始的错误。

您可能正在寻找类似多项式插值。的二次/三次/四次插值应该给你的曲线你的问题显示排序。三条曲线您显示之间的差异很可能只是通过调节系数(其间接确定陡度)。

来实现

y = x^p用于x从0到1中的图将你想要做什么,你从1变化p(这将给红线)向上。随着p增加了越来越多的曲线将被“推入”。 p不必是整数。

(你必须按比例获得0至100,但我敢肯定,你可以工作了这一点)

我投RAX Olgud的总体思路,其中一个修饰:

y = alpha * x + (1-alpha)*(f(x/100)*100)

替代文字http://www4c.wolframalpha.com /计算/ MSP / MSP4501967d41e1aga1b3i00004bdeci2b6be2a59b?MSPStoreType =图像/ GIF&S = 6

其中f(0)= 0,F(1)= 1,F(x)是超线性的,但我不知道这个 “四分之一圆” 想法的由来为什么1-cos(x)的会一个很好的选择。

我建议F(X)= X ķ其中,k = 2,3,4,5,任何给你的陡度为&阿尔法= 0所需degre挑选对于k的值作为固定数字,然后变化α以便选择特定的曲线。

对于这样的问题,我会经常收到一条曲线几个点,并通过曲线拟合程序把它。有一群人在那里。 这里有一个具有7天的免费试用。

我已经通过尝试不同的模型学到了很多东西。通常你可以得到一个非常简单的表达式来接近你的曲线。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top