El siguiente código arroja un error en la línea con reduce:
let vectors function setup() { createCanvas(400,400); vectors = []; vectors.push(createVector(100,100)); vectors.push(createVector(100,0)); vectors.push(createVector(0,100)); let s = vectors.reduce(p5.Vector.add, createVector(0,0));//error! console.log(sx,sy); } function draw() { vectors.forEach(v => line(0,0,vx,vy)); } El error parece ocurrir en el código p5.js para el método de add de vectores. El mensaje de error comienza:
p5.js says: There's an error as "set" could not be called as a function (on line 91666 in p5.js [https://cdn.jsdelivr.net/npm/p5@vv1.4.0/lib/p5.js:91666:22]).
Lo que parece más desconcertante de este error es que el código funciona sin errores si la línea ofensiva se reemplaza por:
let s = vectors.reduce((u,v) => p5.Vector.add(u,v), createVector(0,0)); Esto es suficiente para mi aplicación prevista, pero me gustaría entender el error en lugar de simplemente encontrar una forma torpe de eludirlo. Mi pregunta es: ¿por qué el intento de usar reduce directamente con p5.Vector.add falla pero tiene éxito envolviéndolo en una función anónima?
Parece que p5.Vector.Add puede aceptar un tercer argumento opcional:
p5.Vector.add(v1, v2, [target])
En ese ejemplo, define el objetivo como tal:
p5.Vector: el vector para recibir el resultado (Opcional)
En su versión original, está pasando argumentos de la función de reducción a p5.Vector.Add . Sin embargo, el tercer argumento para reduce es currentIndex , un número entero.