0

我正在尝试为后效表达式编写此代码,该表达式将在 n 帧数上将对象移动计算的 x 距离。每帧上的移动是抛物线而不是线性的,所以我使用第 n 个根代码来确定对象应该在每帧上移动多少。我将第 n 个根中的每一个放入一个数组中,以便稍后在设置每次移动的位置时访问。

我仍然主要为AE学习javascript,所以如果这里有我不完全理解的东西,请多多包涵。我想我明白了,这就是为什么我不确定我是否得到了某些 n 值的未定义输出。这是代码:

//get Nth root
function nthroot(x, n) {
  ng = n % 2;
  if ((ng == 1) || x < 0)
    x = -x;
  var r = Math.pow(x, 1 / n);
  n = Math.pow(r, n);

  if (Math.abs(x - n) < 1 && (x > 0 === n > 0))
    return ng ? -r : r;
}

distance=1515; //will be determined by another portion of the AE expression
frames=6; //will be set by expression control in AE
const myArray = [];
let i = 1;
while (i <= 6) {
  myArray.push(nthroot(distance,i++));

}

console.log(myArray);
document.getElementById("demo2").innerHTML = myArray

我在这里把它变成了小提琴。我究竟做错了什么?提前感谢您的帮助!

4

1 回答 1

0

您的“nthroot”函数不会一致地返回值:如果您查看函数的末尾,您会发现这部分:

if (Math.abs(x - n) < 1 && (x > 0 === n > 0))
   return ng ? -r : r;

如果您注意到,只有当 if 语句中的条件被满足时,您才会返回一个值,否则您不会返回任何值。在 JavaScript 中,不返回任何值的函数会返回“未定义”。

换句话说,当

Math.abs(x - n) < 1 && (x > 0 === n > 0)

为真,您将返回“r”或“-r”,但当条件为假时,您不会返回任何值,因此函数返回“未定义”。

你必须处理虚假案件。

于 2021-10-29T14:59:47.877 回答