return 值近似 sin/cosin 曲线的简单方法,而不使用三角函数?
Simple way to return values approximating a sin/cosin curve, without using trigonometry?
提前为一个难以解释的问题道歉,答案可能只是“否”...
我有值-1 >= n <= 1
我想增加它的振幅,比如增加 2:2*n
我也想调整它的相位,比如 .5: 2*n + .5
我怎样才能做到这一点,以便当 n 增加超过 1 时,它翻转符号并减少自身,例如:当 n 增加到 1.1 时,结果实际上是 .9。
我知道这可以使用三角函数来完成,但是我很难增加它的振幅和改变它的相位 - 当我完成这两项操作时,我得到了这个表达式:
Math.sin(n*1.57 + Math.PI/4)
对于那个表达式,我仍然需要执行额外的 calcs/rounding 以获得我的最终值;表情变得复杂臃肿。
我想知道是否有更简单的方法来获得所需的 range/values,完全避免触发? 我想象一个类似于模的运算符,除了而不是"resetting" 到 0,它的价值降低了...
你可以在一个周期的情况下显式写出公式,对基本周期以外的值使用递归。
例如
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 的锯齿信号。你还需要处理负数:练习留给提问者 ;-)
编辑: 在我误用上面的术语 "sawtooth wave" 之后,我想到了这一点。我描述的函数是连续的,我应该使用的术语是 "triangle wave." 也就是说,我对 @calipoop 的回答非常满意。
事实证明,三角波解决了我的问题。它给出类似于正弦的振荡值(毫不费力),它避免了 Math.trig 并简化了我的公式。我扩展了 this SO answer as well as these wikipedia formulas 中给出的公式。
Fried Brice 的回答表明锯齿波是正确的 - 但三角波更适合我,1 线公式让我的眼睛感觉更好。
提前为一个难以解释的问题道歉,答案可能只是“否”...
我有值-1 >= n <= 1
我想增加它的振幅,比如增加 2:2*n
我也想调整它的相位,比如 .5: 2*n + .5
我怎样才能做到这一点,以便当 n 增加超过 1 时,它翻转符号并减少自身,例如:当 n 增加到 1.1 时,结果实际上是 .9。
我知道这可以使用三角函数来完成,但是我很难增加它的振幅和改变它的相位 - 当我完成这两项操作时,我得到了这个表达式:
Math.sin(n*1.57 + Math.PI/4)
对于那个表达式,我仍然需要执行额外的 calcs/rounding 以获得我的最终值;表情变得复杂臃肿。
我想知道是否有更简单的方法来获得所需的 range/values,完全避免触发? 我想象一个类似于模的运算符,除了而不是"resetting" 到 0,它的价值降低了...
你可以在一个周期的情况下显式写出公式,对基本周期以外的值使用递归。
例如
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 的锯齿信号。你还需要处理负数:练习留给提问者 ;-)
编辑: 在我误用上面的术语 "sawtooth wave" 之后,我想到了这一点。我描述的函数是连续的,我应该使用的术语是 "triangle wave." 也就是说,我对 @calipoop 的回答非常满意。
事实证明,三角波解决了我的问题。它给出类似于正弦的振荡值(毫不费力),它避免了 Math.trig 并简化了我的公式。我扩展了 this SO answer as well as these wikipedia formulas 中给出的公式。
Fried Brice 的回答表明锯齿波是正确的 - 但三角波更适合我,1 线公式让我的眼睛感觉更好。