我在 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/