редактировать (после обновления):
С вашими изменениями, вы просите функцию восходящей и что-то похожее на y = 1/x.
Шкала вашей функции может быть изменена в соответствии с вашими точными координатами, хотя кривая наклоняется намного круче в начале.
y = 154 - 10100/(20 * x + 100) @ Wolfram Alpha
Plot of 154 - 10100/(20 * x + 100) from x=0 to x=500 @ Wolfram Alpha
отмечая целочисленные решения, мы используем решение х = 96, у = 149, чтобы изменить формулу, масштабирование этих значений в ваш диапазон координат. Это даст нам что-то более близкое к вашей обновленной кривой, которая наклоняется немного мягче.
y = 158 - 2625/(x + 25) @ Wolfram Alpha
Plot of 158 - 2625/(x + 25) from x=0 to x=500 @ Wolfram Alpha
Вот сюжет вашей версии, для сравнения.
y = -1500/(x + 15) + 153 @ Wolfram Alpha
Оригинал ответа (до вашего обновления)
Я думаю, вы увидите некоторые странные сходимостей по отношению к вашему цвету назначения, если вы используете нелинейную шкалу, но, тем не менее, вы может использовать общую формулу и решить, какой полином или показатель дает наилучшие результаты.
Во-первых, алгебраическая/полиномиальная функция.
A * X^N + B = Y
Эта общая формула может быть решена в системе, чтобы дать вам полином порядка N, что соответствует кривой между двумя известными точками. В этом случае мы решаем для < X = 0, Y = 153 > - < X = 500, Y = 53 >.
Подставляя первую пару координат, легко получить Б.
A * (0)^N + B = (153)
0 + B = (153)
B = 153
Теперь, подставляя вторую пару, мы можем найти А.
A * (500)^N + 153 = (53)
A * (500)^N = -100
A = -100/(500^N)
Если вы хотите линейную шкалу, вы заменяете N = 1, что дает A = -0.20.
-0.20 * X + 153 = Y
Если вы хотите квадратичный масштаб, то заменить N = 2, и что дает нам = -0.0004.
-0.0004 * X^2 + 153 = Y
Вы можете также использовать некоторые не целое значение N, между 1 и 2 (попробуйте 1.5 или 1.6), который я думаю, вероятно, даст вам лучшие результаты. Также обратите внимание, что по мере увеличения этой функции она в конечном итоге опустится ниже нуля, но только после того, как кривая пройдет через вторую точку.
Вот экспоненциальная функция. Я использую e в качестве базы здесь, хотя вы можете изменить его на что-либо большее, чем 1. Чтобы соответствовать кривой между двумя точками, мы получим наилучшие результаты, если обе точки имеют значения Y над нолем. В противном случае нам нужно будет добавить смещение и определить, где мы хотим, чтобы базовая линия была. Для целей здесь мы предположим, что базовый уровень равен Y = 0. Это означает, что по мере увеличения X Y в конце концов достигнет, но фактически не достигнет 0, после того, как он пройдет через вторую точку.
A * e^(B * X) = Y
Опять же, решите для первой координаты.
A * e^(B * 0) = 153
A * e^(0) = 153
A * 1 = 153
A = 153
Замените, чтобы получить B, со второй координатой.
153 * e^(B * 500) = 53
e^(B * 500) = 53/153
B * 500 = ln(53/153)
B = ln(53/153)/500
ln (val) - это естественный журнал, который является инверсным для e^val. Мой калькулятор говорит, что B примерно равен -0.0021202920156806272577911119053782, или, может быть, -0.0021 будет работать лучше всего. Если вы хотите разрешить это для других базиса экспоненты, используйте идентификаторы экспоненты/логарифма таким же образом, чтобы решить любую другую базу, а также изменить базу логарифма на ln() [log() в js] или log() [log()/Math.log10e в js].
Указанное вами уравнение является квадратичным. Экспонента имела бы показатель x в экспоненте. –
Может быть лучше на http://www.mathoverflow.net/ – Yacoby
@ Donnie Спасибо, я удалил часть уравнения примера. –