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

math graph plot

417 观看

6回复

53 作者的声誉

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

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

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

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

作者: user68528 的来源 发布者: 2009 年 6 月 24 日

回应 (6)


0

114332 作者的声誉

你可能正在寻找像多项式插值这样的东西。二次/立方/四次插值应该为您提供问题中显示的各种曲线。您显示的三条曲线之间的差异可能只是通过调整系数(间接确定陡度)来实现。

作者: Noldorin 发布者: 24.06.2009 07:32

0

52894 作者的声誉

的图形y = x^px从0至1会做你想要什么,你改变p从1以上(这将给红线)。随着p增加,曲线将越来越多地被“推入”。p不必是整数。

(你必须扩展到0到100,但我相信你可以解决这个问题)

作者: AakashM 发布者: 24.06.2009 07:43

1

17154 作者的声誉

我提出一个简单的公式,(我相信)捕捉你的要求。为了拥有一个完整的“四分之一圈”,这是你的极端情况,你会使用(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],遗憾的初始错误。

作者: Roee Adler 发布者: 24.06.2009 08:37

0

107644 作者的声誉

我投票支持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的值作为固定数,然后改变α来选择你的特殊曲线。

作者: Jason S 发布者: 24.06.2009 08:57

3

703 作者的声誉

决定

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

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

替代文字
(来源: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值。

作者: Paul Hooper 发布者: 24.06.2009 09:40

0

59459 作者的声誉

对于这样的问题,我经常会从曲线中得到几个点并将其抛出曲线拟合程序。那里有很多人。这是一个为期7天的免费试用版。

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

作者: Nosredna 发布者: 24.06.2009 10:52
32x32