我在js项目中使用了three.js,我正在尝试计算一个向量是否仍然在这样的区域
var THRESHOLD = 10;
if(!is_in_rect(camera.position - forward * THRESHOLD)))
// do something
其中camera.position和foward是THREE.Vector3个对象。
上述方法的问题虽然非常易读,但由于js不支持运算符重载,因此无法正常工作。我必须写一些类似
的内容if(!in_rect(camera.position.clone().add(forward.clone().multiplyScalar(THRESHOLD)))
对我来说看起来有点难看。
在我失踪的js中是否有其他惯用的方法?
答案 0 :(得分:1)
从您关联的页面:
.addScaledVector(v,s)
将v和s的倍数添加到此向量
所以更好一点:
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
用于所有内容(而不是我的示例中的+
)。在编码时可能会增长它。
答案 1 :(得分:1)
在我失踪的js中是否有其他惯用的方法?
不是,不是;你基本上必须自己写一个表达式解析器,或者使用已经写过的解析器。
关于这一点的几点说明:
使用ES2015 +的template literals and tagged template functions这样做可能会更容易一些,因为它会为你做一些解析。例如,您可以给自己标记功能,让您写:
if(!is_in_rect(threval`${camera.position} - ${forward} * ${THRESHOLD}`)))
threval
会在该模板中收到一组原始字符串,然后是camera.position
,forward
和THRESHOLD
的值。因此,您可以使用该信息来构建序列。但这不是一件轻而易举的事。
您可以自己编写一个Babel插件,让您的表达式成为一流的作品,然后进行转换。这样做的好处是Babel提供了强大的解析基础架构和工具支持。