p5.js中如何临时对向量执行乘法运算且不修改原向量?
问题原因与解决方案
错误根因
- JS 没有自定义对象运算符重载规则,
p5.Vector是封装好的向量类对象,直接用*和数字/向量/数组相乘都会触发隐式类型转换,最终得到NaN,所以调用add方法时会抛出参数不是有限数字的报错,这也是你修改speedFactor类型依旧无法运行的核心原因。 - 你尝试的
Object.assign、JSON序列化拷贝方式都无法得到完整的p5.Vector实例:前者只能拷贝可枚举自有属性,后者会丢失所有函数属性,拷贝结果是普通对象,既无法调用向量类方法,也不符合add方法的参数要求。 - 直接调用向量实例的
mult方法会修改原向量本身,确实会破坏速度的原始值,不符合需求。
最佳实现方式
p5.Vector本身内置了安全的拷贝和运算方法,以下两种写法都可以实现需求,全程不会修改原velocity值:
写法1:使用实例的copy方法
先复制得到独立的临时向量,再进行缩放:
update() { // copy()会返回和原velocity值完全相同的新p5.Vector实例 const scaledVelocity = this.velocity.copy().mult(speedFactor); this.position.add(scaledVelocity); }
写法2:使用p5.Vector静态mult方法
静态运算方法会直接返回新的向量,无需手动拷贝,写法更简洁:
update() { this.position.add(p5.Vector.mult(this.velocity, speedFactor)); }
内容的提问来源于stack exchange,提问作者LololoTheGreat
相关产品推荐
相关产品推荐

