Javascript - 在没有运算符重载的情况下生成表达式

标签 javascript three.js

我在 js 项目中使用 three.js,我正在尝试计算一个向量是否仍在这样的区域中

var THRESHOLD = 10;
if(!is_in_rect(camera.position - forward * THRESHOLD)))
   // do something

其中 camera.position 和 fowward 是 THREE.Vector3对象。

上述方法的问题虽然非常可读,但它不起作用,因为 js 不支持运算符重载。我必须写类似的东西

if(!in_rect(camera.position.clone().add(forward.clone().multiplyScalar(THRESHOLD)))

我觉得有点丑。

在我缺少的 js 中还有其他惯用的方法吗?

最佳答案

从您链接到的页面:

.addScaledVector ( v, s )

Adds the multiple of v and s to this vector

更好一点的是:

camera.position.clone().addScaledVector(forward,THRESHOLD)

此外,没有真正的理由向前克隆,因为它不会改变。

如果我关注@T.J.如果 idomatic 意味着使用 +-,如果我们是严格遵守JS。您可以构建自己的框架来使事情变得简单,例如通用加法运算符:

var add = function(x,y):
    try {
         var sum = x + y;
         if ( s != undefined ) { return sum; }
         #otherwise
         sum = x.clone().add(y);
    } catch {
        #Otherwise threw something
        sum = x.add(y) #maybe another exception? nest try/catch.
    }
}

但这需要大量工作,因为 JS 可以随意添加内容,因此您必须进行大量类型检查。只是试图返回 x+y 通常是未定义的。在我的示例中,也许在简单添加之前测试添加函数可能更好。

这样你就可以创建你喜欢的 idiom,如果你认为它是值得的,并使用你的 add 来做所有事情(而不是 + 在我的例子中)。可能会随着您编写代码而增长。

关于Javascript - 在没有运算符重载的情况下生成表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45028469/

相关文章:

javascript - 为什么这段代码返回未定义?

javascript - 在网站页面之间传输数据

json - Three.js:减少模型文件大小的方法?

javascript - 使用 Three.js 时 Windows 上缺少线宽的解决方法

javascript - 如何将 Raycaster 与组合相机一起使用?

reactjs - react 三纤维锁定 Canvas 中的对象位置

three.js - 动态 build 房间

javascript - date-fns 中的 parse 函数返回前一天的值

javascript - 如何修复显示/隐藏子菜单的错误?

javascript - 添加一天到 Javascript 日期 + 独特的格式?