看起来像一个简单的图形问题

时间:2009-06-24 19:28:14

标签: math graph plot

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

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

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

我知道指数过于陡峭,但似乎无法想象前进的方向。有什么建议吗?

6 个答案:

答案 0 :(得分:3)

您说明的曲线看起来很像gamma correction曲线。这个想法是,范围的最小值和最大值与输入保持一致,但是中间像你在图中一样弯曲(我可能会注意到不是你想要的圆弧得到余弦实现)。

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

alt text
(来源: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)

alt text http://www4c.wolframalpha.com/Calculate/MSP/MSP4501967d41e1aga1b3i00004bdeci2b6be2a59b?MSPStoreType=image/gif&s=6

其中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.

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