2017-07-11 20 views
1

我使用three.js所的JS項目,我想如果計算矢量仍處於的區域等這樣使用Javascript - 沒有操作符重載生成表情

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

你可以做的是將一個字符串傳遞給函數is_in_rect(),並將字符串分解爲你看起來很醜的語法。有點像你可以傳遞字符串到PHP的日期。一些工作只爲可讀性,但如果它變得複雜,也許這是值得的 – Kaddath

+0

有點像https://www.sweetjs.org/可能會幫助你 – Bergi

+0

不能用* valueOf *爲此? –

回答

1

從你的頁面鏈接到:

.addScaledVector(V,S)

添加V和S的倍數,這個矢量

這麼好一點是:

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

此外,沒有真正的理由克隆轉發,因爲將不會改變。

如果我下面什麼@ T.J。是說,你想更多的東西一般,比我的答案是否定的,如果使用+-idomatic手段,如果我們嚴格執行JS。你可以建立自己的框架,以使事情idomatic,如一般的加法運算:

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的一切(而不是在我的例子+)。可能隨着代碼的增長而增長。

+0

這並不回答這個問題,即:有沒有更好的方法來做這些表達式(通常)。這可能是一個有用的*評論*。 –

+0

@ T.J.Crowder我不同意,但現在它獲得了意見。 'addScaledVector'更適合添加縮放矢量,並且還可以刪除多餘的克隆調用。 – kabanus

+0

是的,但是,這不是問題。這是一個說明問題的例子。 –

1

是否有任何其他地道的方式在js中這樣做,我失蹤了?

不是真的,沒有;你基本上必須自己寫一個表達式解析器,或者使用一個已經寫好的解析器。

上有兩點要注意:

  1. 這樣做,可能是更容易一點ES2015 +的template literals and tagged template functions,因爲它會做一些解析的爲您服務。舉例來說,你也許能夠給自己的標籤功能,它可以讓你寫:

    if(!is_in_rect(threval`${camera.position} - ${forward} * ${THRESHOLD}`))) 
    

    threval將收到該模板中的原始字符串數組,然後是camera.positionforwardTHRESHOLD值。所以你可以使用這些信息來建立序列。但這將是不平凡的。

  2. 你可以自己寫一個Babel插件,使你的表達一流的作品,並transpile。這樣做的好處是Babel提供了強大的解析基礎結構和工具支持。