2017-10-19 4 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. 

が、それは数を返すべきです。私は過去のプロジェクトで同様のことをやったことを誓うことができ、この問題はなかった。私は、非常に基本的なことを忘れている、あるいは忘れているという強い疑いを持っています。誰も助言することはできますか?

EDIT: 私はさらにいくつかのデバッグをした、と私はpeakPosition.xとpeakPosition.yの両方が未定義であることを、ピーク位置=ピーク[I] .positionを見つけています。 peaks [i]はまだ地球上のビルボードとしてレンダリングされており、peakPositionはオブジェクトです。セシウムの文書によると、xとyのメンバーを持つべきCartesian3型のオブジェクトであるべきです(SHOULD)。だからなぜそれらのメンバーは未定義ですか?

EDIT 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

peakPosition = peaks[i].position; 

そのドキュメントで簡単に見から、 'distance'は静的メソッドです。だから距離を得るための呼び出しの前に「新しい」と言えるだろうか? – CRice

+0

新しいキーワードはオブジェクトの作成に使用されます。削除してください。 – Amy

+0

@CRice - ありがとう、私は、私がtypoとして問題に遭遇した後でそれを追加しました(私はmousePosition = new Cesium.Cartesian3(ev.clientX、ev.clientY、0.0);私がそこに追加したときに私は距離線にも追加しました。最初はNaNを結果として取得しましたが、今度はNaNをもう一度得て固定しました。 –

答えて

1

だから、私たちの議論につき、我々は発見した:

peaksCesium.Entityの配列です。 Cesium.Entity

positionフィールドは、最初のパラメータとしてCesium.JulianDateを受け入れる方法getValueを有するインタフェースである、Cesium.PositionPropertyあります。だから、一緒にすべてのことを入れて、あなたが必要とする唯一の変更は、次のとおりです。

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

これは大抵の場合正しいですが、ここでは 'new'にメモリ割り当てがあるので、このコードを60fpsで実行する必要はありません。セシウムビューアや時計がある場合は、代わりに 'position.getValue(viewer.clock.currentTime)'を使うことができます。そして、その位置が実際に 'ConstantPositionProperty'であることを保証できるなら、' .getValue() 'を呼び出すだけで、時間を渡す必要はありません。 – emackey

関連する問題