2017-01-15 7 views
1

Извиняюсь заранее за трудных для объяснения вопрос, на который ответ не может быть просто «не» ...Простой способ вернуть значения, аппроксимирующие кривую sin/cosin, без использования тригонометрии?

У меня есть значение, -1 >= n <= 1

Я хотел бы, чтобы увеличить амплитуду , скажем, 2: 2*n

Я хотел бы также отрегулировать его фазу, скажем, .5: 2*n + .5

Как я могу сделать это так, что, когда п возрастает прошлое 1, он переворачивается знаки и сводится, для примера le: когда n увеличивается до 1,1, результат на самом деле .9.

Я знаю, что это может быть сделано с помощью тригла, но у меня возникают трудности, увеличивая его амплитуду и смещает фазу - к тому времени я закончу делать как я получаю это выражение:

Math.sin(n*1.57 + Math.PI/4)

И для этого выражения мне еще нужно выполнить дополнительные вычисления/округление, чтобы получить мои окончательные значения; выражение становится сложным раздутым.

Мне интересно, есть ли более простой способ получить желаемый диапазон/значения, избегая триггеров? Я представляю себе оператор, подобный модулю, кроме как «сброс» на 0, он уменьшает значение ...

+0

Не могли бы вы добавить более длинную последовательность желаемого результата, от 5 до 10 элементов? – LutzL

+1

Вы хотите, чтобы приблизительные значения синуса/косинуса для (pi * x), такие как [Bhaskara I's] (https://en.wikipedia.org/wiki/Bhaskara_I's_sine_approximation_formula) или функция зуба пилы с периодом 4? – traktor53

+0

Спасибо @ Traktor53 - Формула Bhaskara I была очень интересной для чтения/теста. Я думаю, что я просто хотел убедиться, что не было причудливого оператора (например,%), которого я пренебрегаю. Кажется, использование триггера - самый простой способ сделать то, что я хочу. – calipoop

ответ

1

Оказывается, треугольная волна решает мою проблему. Он дает колебательные значения, подобные синусоиде (без простоты), и он избегает Math.trig и упрощает мою формулу. Я расширил формулу, указанную в this. Ответ так же, как и эти wikipedia formulas. Ответ

Triangle wave with period 4 and amplitude 2

Fried Brice в предлагая пилообразной был на правильном пути - но треугольник волны лучше всего подходит для меня, и формула 1-линия делает мои глаза чувствовать себя лучше.

1

Вы можете явно выписать формулу в случаях за один период и использовать рекурсию для значений вне фундаментальный период.

E.g.

function notTrig(x) { 
    switch (true) { 
    case (x >= 0 && x < 1): 
     return x 
    case (x >= 1 && x < 2): 
     return 2 - x 
    default: 
     notTrig(x - 2) 
    } 
} 

Это должно дать вам пилообразный сигнал со средним значением 1/2, 1/2 амплитуды и периода 2. Вам нужно обрабатывать негативы, а также: упражнения слева Аскер ;-)

Редактировать : Это происходит со мной после того, как я злоупотребляю термином «пилообразная волна» выше. Функция, которую я описываю, является непрерывной, и термины, которые я должен использовать, являются «треугольной волной». Тем не менее, я очень доволен ответом @ calipoop.

+1

Спасибо за ответ. См. Мой комментарий выше re Traktor53 - хотя ваше решение, скорее всего, будет работать, я надеялся узнать о новом секретном операторе или коротком 1-лайнере, который может упростить мое уравнение! В конце концов, я думаю, что мой оригинальный код может быть лучшим, что я сделаю. – calipoop

+0

Да, я заметил, что вы спрашивали о примитивном операторе. Я не думаю, что в Javascript есть что-то подобное, или, в общем, в математике, кроме того, что он сам определяет кусочно. Ура! –

 Смежные вопросы

  • Нет связанных вопросов^_^