2016-04-11 7 views
-1

私が持っている:Javascriptで最も近いエンティティを取得するにはどうすればよいですか?

array = [{ 
    'id': <an id like -45283etc>, 
    'x': 7, 
    'y': 10, 
    'z': 5 
}, 
{ 
    'id': <random id, too>, 
    'x': 19, 
    'y': 6, 
    'z': 4 
}, 
{ 
    'id': <random id, too>, 
    'x': 2, 
    'y': -7, 
    'z': -5 
} 
] 

配列[0]私は[0]([2]配列[1]や配列)配列に最も近いエンティティのかを知ることができますどのようにプレイヤー

です?

for(var closest = 1, var i = 1; i < array.length; i++){ 
    if(array[i] is closer to player than closest){ 
    var closest = array[i] 
    } 
} 
return array[i] 

if文で何を書いてください。

+2

「近い」と定義しない限り、この質問に答えることはできません。 'array [1]'は索引によって自明に近くなります。実際のオブジェクトのプロパティを数値として比較する場合は、使用するプロパティと、L1、L2、またはL-無限大のノルムを必要とするかどうかを判断する必要があります。 – Paulpro

+0

質問は明確ではありません。 ** 'x、y、z'値に基づいてより近く**? – Manwal

+0

@Paulproいいえ、それは正しくありませんでした。私はそのコメントを削除しました。少なくとも、オフセット(array [0]のx、y、z座標)を作成し、それらを使用して計算(オフセット値の差)をオフセットする必要があります。 –

答えて

1

あなたがポイントとしてそれらを扱いたいと仮定して、(ユークリッド距離)L2ノルムを使用して、あなたが使用することができます意味「最も近い」によって:

var minDistanceSquared = Infinity; 
for(var closest = 1, i = 1; i < array.length; i++){ 
    var distanceSquared = Math.abs( 
     Math.pow(array[i].x - array[0].x, 2) + 
     Math.pow(array[i].y - array[0].y, 2) + 
     Math.pow(array[i].z - array[0].z, 2) 
    ); 
    if (distanceSquared < minDistanceSquared) { 
     closest = i; 
     minDistanceSquared = distanceSquared; 
    } 
} 

これはあなたの中に擬似コードループの基づいていますプレイヤーがインデックス0にいることに依存します。

+0

数学の観点から見た解決策に関する私の石畳の考えよりも明らかに優れています。このコードに加えて**私は代替ソリューション**として提案していますが、単にOPのようにそれらをループするのではなく、コールバックで配列の並べ替えメソッドを使用することです。 OPが求めているものではないかもしれませんが、このシナリオでは、最も近いものを単に戻すのではなく、配列または配列のコピーをプレーヤーまでの距離でソートするのに役立ちます。それにもかかわらず、素晴らしい解決策。 –

関連する問題