javascript - 计算递减值的算法,接近极限

标签 javascript math calculus

我一直在努力寻找我不久前在 LPC 中使用(未编写)的便捷方法的 Javascript 版本,它被称为 dimval(),它采用以下形式:

NAME
     dimval() - returns values with a reduced increase in output
                as input values grow larger.

SYNOPSIS
     float dimval(float input, float max_input, float max_output,
                  float min_input, float min_output, float rate);

DESCRIPTION
     Returns (as a float) a value between min_output and max_output,
     with values increasing at a reduced rate as they move from
     min_input toward max_output.

     Input is the input value.

     Max_input is the maximum acceptable input. Any higher input
     value will be capped to this.

     Max_output is the maximum value returned.

     Min_input is the (optional) minimum input. Default is zero.

     Min_output is the (optional) minimum output. Default is zero.

     Rate determines how quickly the cost increases to achieve
     greater return values. Higher numbers are faster, lower numbers
     are slower.

read this article ,但它似乎并没有捕捉到我想要的东西(一开始看起来要简单得多)。我也是read this SO question并且...好吧,我认为这可行...但老实说,数学超出了我的范围。我理解上面的描述以及参数如何协同工作以产生我想要的那种结果。

如果有人能在 Javascript 中提供具有上述约束的方法,我将不胜感激。

干杯!

编辑:原始方法的示例输出。

  • eval 返回 dimval(5.0, 100.0, 100.0, 0.0, 0.0, 1.0) => 22.360680
  • eval 返回 dimval(10.0, 100.0, 100.0, 0.0, 0.0, 1.0) => 31.622776
  • eval 返回 dimval(50.0, 100.0, 100.0, 0.0, 0.0, 1.0) => 70.710678

  • eval 返回 dimval(10.0, 100.0, 100.0, 0.0, 0.0, 2.0) => 15.811388

  • eval 返回 dimval(10.0, 100.0, 100.0, 0.0, 0.0, 10.0) => 3.162278

  • eval 返回 dimval(200.0, 100.0, 100.0, 0.0, 0.0, 10.0) => 10.000000

  • eval 返回 dimval(200.0, 100.0, 100.0, 0.0, 0.0, 1.0) => 100.000000

  • eval 返回 dimval(1.0, 100.0, 100.0, 10.0, 0.0, 10.0) => 0.000000


如果您想让我运行更多样本,请告诉我。

最佳答案

也许是这样的?

function dimval(n, min_in, max_in, min_out, max_out, exponent) {
  // unscale input
  n -= min_in
  n /= max_in - min_in

  n = Math.pow(n, exponent)

  // scale output
  n *= max_out - min_out
  n += min_out
  return n
}

0 < exponent < 1先快速增加,再小的增加,exponent > 1反过来。

例子:

> dimval(0, 0, 1, 0, 100, 2)
0
> dimval(0.1, 0, 1, 0, 100, 2)
1.0000000000000002
> dimval(0.2, 0, 1, 0, 100, 2)
4.000000000000001


> dimval(0, 0, 1, 0, 100, 0.5)
0
> dimval(0.1, 0, 1, 0, 100, 0.5)
31.622776601683793
> dimval(0.2, 0, 1, 0, 100, 0.5)
44.721359549995796
> dimval(0.3, 0, 1, 0, 100, 0.5)
54.77225575051661
> dimval(0.4, 0, 1, 0, 100, 0.5)
63.245553203367585
> dimval(0.5, 0, 1, 0, 100, 0.5)
70.71067811865476
> dimval(0.6, 0, 1, 0, 100, 0.5)
77.45966692414834
> dimval(0.7, 0, 1, 0, 100, 0.5)
83.66600265340756
> dimval(0.8, 0, 1, 0, 100, 0.5)
89.44271909999159
> dimval(0.9, 0, 1, 0, 100, 0.5)
94.86832980505137
> dimval(1, 0, 1, 0, 100, 0.5)
100

关于javascript - 计算递减值的算法,接近极限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10088412/

相关文章:

Javascript DOM - 将文本元素对齐到中心?

javascript - NGXS:将操作分离到单独的文件中

javascript - For循环是否在预期> 1时返回1 for count

javascript - Highcharts 增加/减少输入数据

haskell - Haskell 中的偏导数

algorithm - 为图表的 Y 轴选择有吸引力的线性比例

android - 如何在android studio中编写平方根

c++ - 1 2 3 4 的组合

java - 算法错误,寻找线条之间的区域

javascript - 如何计算接近无穷大或 0 的极限?