3

我正在寻找一个产生类似于钟形曲线的数学函数(想想)。我在这里非常不了解。我认为高斯函数可能是我需要的,但我不知道如何为我的目的正确应用它。

我将使用该函数对一系列对象进行动画处理:

在此处输入图像描述

我想通过将每个对象偏移到前一个对象来模拟此动画的加速和减速的外观,直到中间点,之后偏移量增加回原始值:

在此处输入图像描述

一旦实现,我希望该函数接受我在 x 轴上的起点和终点,以及需要容纳的对象数量。然后它应该返回一系列值,这些值将成为每个对象的 x 原点。

例如:

开始:0 结束:100 对象:20

平面分布:0、5、10、15、20、25、30、35、40、45、50、55、60、65、70、75、80、85、90、95

所需结果:0、10、19、27、34、40、44、45、46、47、48、49、50、51、55、60、66、73、81、90

对曲线轮廓进行一些控制也会很好 - 例如,我上面的估计值是一个相当“平坦”的钟形(项目 7-14 具有相同的偏移量)。

4

3 回答 3

3

考虑以下三次多项式:

f(x,a) = 4ax^3 - 6ax^2 + 2ax + x

x in [0:1]在保持常数的域上进行评估,a并从区间“[0:1]”中选择。

这将生成从零开始到一结束的绘图。如果a==0,你得到一条直线。如果a==1,你会得到一个很深的曲线。对于a介于两者之间的某个地方,你会得到介于两者之间的东西。

一旦为 选择了一个好的值a,您只需在 0 到 1 之间的任意多个点进行评估。然后您缩放这些值以适合您想要的范围。


此电子表格的屏幕截图提供了两个示例。列 A 和 F 保存值a,列 B 和 G 保存值x(如果您想使用平面分布中的确切值,您可以更改xto的每个用法x/100)。C 列和 H 列保存 的结果f(x,a)。D 列和我持有f(x,a)*100.

电子表格屏幕截图

于 2012-10-26T17:39:35.193 回答
2

这是用于生成正常偏差的 Java 实现:

/** generation of a Gaussian deviates (variants) by the ratio of uniform method */
final public static double generateNormalDeviate( final double mean, final double std_deviation ){
    double u, v, x, y, q;
    do {
        u = random.nextDouble();
        v = 1.7156 * ( random.nextDouble() - 0.5 );
        x = u - 0.449871;
        y = (v < 0 ? v * -1 : v) + 0.386595;
        q = x*x + y * (0.19600 * y - 0.25472 * x);
    } while( q > 0.27597 &&
            (q > 0.27846 || v*v > -4d * Math.log(u) * u*u));
    return mean + std_deviation * v / u;
}

有关更多信息和 C 版本,请参阅 Press Numeric Recipes。

于 2012-10-26T17:28:26.577 回答
0

IIRC [-1..1] 中 N 个独立随机数的总和很好地近似于中心为 0 的高斯曲线,我不记得色散是什么。

编辑:不明白这个问题。您似乎需要实现这个的东西,确切地说是“逆误差函数”,您可能希望在代码中实现它的近似值,因为函数本身是一个整数,不能在基本函数中进行评估。一旦你得到函数为钟形曲线点提供正确的近似值,你就可以清楚地将 0-1 数字作为基数(这将定义钟形曲线的平坦度),将其命名为 B,然后将你的 N 个数字均匀分布在 (-1+ B)和(1-B),然后将该函数的输出作为钟形曲线位置,然后对其进行归一化,使最左边的位置在开始,最右边的位置在结束。

于 2012-10-26T17:02:33.333 回答