Какой алгоритм делает такую ​​кривую (img) и это можно сделать в JavaScript для flot? - PullRequest
5 голосов
/ 13 августа 2010

А можете привести пример алгоритма? альтернативный текст http://ryancalderoni.com/archive/ideal_curve.jpg

РЕДАКТИРОВАТЬ: И тогда как бы я рассчитать математику с помощью Javascript? Кто-нибудь может это добавить? Извините, что не включили этот контекст изначально ..

ПРИМЕЧАНИЕ: я использую 'flot' для построения графика, а вход для flot - это массив javascript, подобный этому:

[[х, у], [х, у], [х, у] ...]

Итак, учитывая значения, которые меняют кривую, я выводю все точки в массив с циклом и выплевываю его для перехода к графику.

Ответы [ 7 ]

4 голосов
/ 13 августа 2010

Типичной сигмовидной кривой является кривая tanh (x).

По определению,

  tanh(x) = sinh(x) / cosh(x) =
          = [(1/2) (e^x - e^-x)] / [(1/2) (e^x + e^-x)] =
          = (e^x - e^-x) / (e^x + e^-x) = 
          = (e^(2x) - 1) / (e^(2x) + 1)

http://privat.rejbrand.se/tanh.png
(в высоком разрешении)

Обратите внимание, что линии симметрии смещены относительно вашего образца изображения.Чтобы график тана больше походил на ваш пример, просто переместите его вверх и вправо:

y = 1 + (e^(2x - 6) - 1) / (e^(2x - 6) + 1)

http://privat.rejbrand.se/tanh2.png
(в высоком разрешении)

В JavaScript вы наиболее эффективно реализуете это выражение как

exp2x = Math.exp(2*x)
y = (exp2x - 1) / (exp2x + 1)

Update (снова)

OK, если вы хотите, чтобы y находилось в диапазоне от 0 до 100, а x - в диапазоне отОт 0 до 100, чем вы можете попробовать

y = 50 + 50*tanh((x−50)/10)

, который выглядит как

http://privat.rejbrand.se/tanh3.png
(высокое разрешение)

Теперь

y = 50 + 50 * tanh((x−50)/10)
  = 50 + 50 * (e^((x−50)/5) - 1) / (e^((x−50)/5) + 1)

Функция ошибки, erf, выглядит довольно похоже, но намного сложнее для вычисления (если в JavaScript нет встроенной функции erf).


Райан (OP) добавляет: реализовано!

var y = 50 + 50 * tanh((n-50)/10);

function tanh (arg) {
    return (Math.exp(arg) - Math.exp(-arg)) / (Math.exp(arg) + Math.exp(-arg));
}
3 голосов
/ 13 августа 2010

Если вы хотите одну аналитическую функцию, тогда ArcTangent и Hyperbolic Tangent имеют эту форму, вам просто нужно немного ее сместить.Если вы хотите, чтобы он начинался только с начала координат и был плоским, посмотрите на Exp [-1 / x ^ n], для n> = 1.Это создает кривую, которая является чрезвычайно плоской в ​​начале координат.

2 голосов
/ 13 августа 2010

Попробуйте поискать сигмовидную функцию, она очень похожа.

alt text http://ulcar.uml.edu/~iag/CS/Sigmoid-function.GIF

1 голос
/ 13 августа 2010

Могу ли я Sugggest:

  • Функция ошибки (erf(x) в C)
  • Нормальная совокупная функция распределения (0.5 * erfc(-x/sqrt(2)))
  • Логистическая функция (1.0 / (1.0 + exp(-x)))
  • Любая другая сигмовидная функция
1 голос
/ 13 августа 2010

A Кривая Безье ?Соответствующий алгоритм для его рисования будет алгоритм де Кастельжау .

0 голосов
/ 15 августа 2010

Все это прекрасно, но есть еще одна мысль:

Предположим, что полином третьего порядка:

альтернативный текст http://www.equationsheet.com/latexrender/pictures/8d042b424361b16bfd1c090dd1fc79a8.gif

У вас есть четыре граничных условия:

альтернативный текст http://www.equationsheet.com/latexrender/pictures/c3dc28e52481d1a840cc053aa4c54912.gif альтернативный текст http://www.equationsheet.com/latexrender/pictures/92ceaf735e53c4afdf27a03bc87ae061.gif альтернативный текст http://www.equationsheet.com/latexrender/pictures/4acfd37f5a11d5d25b46acc2a41d2efb.gif альтернативный текст http://www.equationsheet.com/latexrender/pictures/a785bd3b5739f5ca9ae107f5ee6f3de9.gif

Если вы подставите их в уравнение и отработаете алгебру, вы получите следующий результат:

альтернативный текст http://www.equationsheet.com/latexrender/pictures/d418a85eb8a1496e585401bf8fb87325.gif

где

альтернативный текст http://www.equationsheet.com/latexrender/pictures/beb02d38c3481bd50aead656ecfafe83.gif

и

альтернативный текст http://www.equationsheet.com/latexrender/pictures/f912827654a96fc5cc8e66c79123e653.gif

Это может быть не точно, но вы можете легко приблизить его на основе значений, которые вы знаете: альтернативный текст http://www.equationsheet.com/latexrender/pictures/2e3b3b42bd7570d517e5b20bab76a9b6.gif

0 голосов
/ 13 августа 2010

То, что вы ищете, называется сигмоидальной функцией.Вы можете посмотреть это в Википедии.Некоторые функции, которые используются для этого, являются функцией ошибки или логистической функцией.Они чаще всего используются для нейронных сетей.

...