2017-10-19 67 views
0

我正在嘗試查找鼠標點擊和最近的一組廣告牌之間的距離。我的代碼如下:Cartesian3.distance - 返回NaN?

var smallestDistance = -1; 
var currentDistance = -1; 
var nearestPeak; 
var peakPosition; 
var mousePosition = new Cesium.Cartesian3(ev.clientX, ev.clientY, 0.0); 
for (var i = 0; i < peaks.length; i++) { 
    peakPosition = peaks[i].position; 
    currentDistance = Cesium.Cartesian3.distance(mousePosition, peakPosition); 
    console.log('CESIUM: Distance to ' + peaks[i].name + ': ' + currentDistance + ' units.'); 
    if (currentDistance < smallestDistance) { 
     smallestDistance = currentDistance; 
     nearestPeak = displayedPeaks[i]; 
    } 
} 
console.log('CESIUM: nearest peak is peak ' + nearestPeak.peakId); 
if (smallestDistance != -1 && smallestDistance < 100000) { 
    selectedPeak = nearestPeak; 
} 

問題出現在第一的console.log語句,在此它顯示:

CESIUM: Distance to peak 1: NaN units. 

根據銫的文檔,它應該返回一個數字。我可以發誓我在過去的項目中做了類似的事情,並沒有這個問題。我有強烈的懷疑,我失蹤和/或忘記了一些非常基本的東西。任何人都可以建議嗎?

編輯: 我做了一些進一步調試,我發現peakPosition.x和peakPosition.y都是未定義的,其中peakPosition =峯[I] .POSITION。峯[i]仍然呈現爲地球上的廣告牌,並且peakPosition是一個對象。根據Cesium文檔,它應該是Cartesian3類型的對象,它應該有x和y成員。那麼爲什麼這些成員是不確定的?

編輯2: 我試圖替換這一行:

peakPosition = peaks[i].position; 

與此:

peakPosition = new Cesium.Cartesian3(this.peaks[i].position.x, this.peaks[i].position.y, 0.0); 

和其x,y和z成員總是0,0,和0我無法想象這是爲了我的生活。

+0

從快速看一下他們的文檔,'distance'是一個靜態方法。那麼在通話前面的'新'可以獲得距離嗎? – CRice

+0

新關鍵字用於構造對象。嘗試刪除它。 – Amy

+0

@謝謝,我補充說,在我開始遇到問題作爲一個錯字(我已經離開mousePosition = new Cesium.Cartesian3(ev.clientX,ev.clientY,0.0); line當我將它添加到距離線上時,我最初得到了NaN作爲結果,現在我已經修復了它,我再次得到了NaN,但我確實錯過了一些非常基本的東西,但是不幸的是,它並沒有導致正確的結果 –

回答

1

因此,根據我們的討論,我們發現:

peaksCesium.Entity秒的陣列。

一個Cesium.Entityposition字段是Cesium.PositionProperty,它是有一個方法getValue,接受Cesium.JulianDate作爲第一個參數的接口。因此,把所有的一起,你需要的唯一的變化是:

peakPosition = peaks[i].position; 

peakPosition = peaks[i].position.getValue(new Cesium.JulianDate()); 
+0

這大部分都是正確的,但要注意這裏有'new'的內存分配,所以你不想在60fps下運行這個代碼。如果您有Cesium查看器或時鐘,則可以使用'position.getValue(viewer.clock.currentTime)'代替。如果你可以保證這個位置實際上是一個'ConstantPositionProperty',你根本不需要一次性傳遞,只需調用'.getValue()'。 – emackey