2016-06-02 3 views
3
function get_map_zoom_level(distance) { 
    var zoom = 1; 
    if (distance == 0) 
     zoom = 11; 
    else if (distance == 1) 
     zoom = 15; 
    else if (distance > 880 && distance <= 1760) 
     zoom = 14; 
    else if (distance > 1760 && distance <= 3520) 
     zoom = 13; 
    else if (distance > 3520 && distance <= 7040) 
     zoom = 12; 
    else if (distance > 7040 && distance <= 14080) 
     zoom = 11; 
    else if (distance > 14080 && distance <= 28160) 
     zoom = 10; 
    else if (distance > 28160 && distance <= 56320) 
     zoom = 9; 
    else if (distance > 56320 && distance <= 112640) 
     zoom = 8; 
    else if (distance > 112640 && distance <= 225280) 
     zoom = 7; 
    else if (distance > 225280 && distance <= 450560) 
     zoom = 6; 
    else if (distance > 450560 && distance <= 889120) 
     zoom = 5; 
    else if (distance > 889120 && distance <= 1718240) 
     zoom = 4; 
    else if (distance > 1718240) 
     zoom = 3; 
    return zoom; 
} 

このコードでは他に多くのことを避ける方法があるかどうかを知りたいと思います。 基本的には、距離に基づいてズームレベルを調べたいので、このコードは完全に機能していますが、これを行うにはもっと良い方法が必要です。コード内に他のコードがある場合は避けてください。

+1

間隔条件付きのスイッチ? マップのズームと距離の間には論理があるので、ズーム値を見つけるために数式を検索する必要があります。 – AxelH

+2

@KartikeyaKhosla OKあなたは 'if'文は少ないですが、オブジェクトを破る' case'ステートメントと同じ数で終わります。 – Rhumborl

+0

@Juhana 'switch(true)'しかし、OPは範囲の配列とループを定義する方が優れていますそれを介して – PeeHaa

答えて

2

あなたが好きなオブジェクトを持つことができます:

var zooms = [ { min:1480 , max:28160} , // array index is zoom level 
       // ... 
       { min:880 , max:1760} ]; 

、その後、あなたが比較if文の数が多い場合はズームが

for(var z = 1 ; z <= MAX_ZOOM ; z++) { 
    if (distance > zooms[z].min && distance <= zooms[z].max) { 
     return z; 
    } 
} 

In Java, it would be easier.

3

を発見されるまでそれを繰り返しますあなたと同じデータがある場合、通常の方法は配列を作成することです。各エントリには比較するデータとその結果が含まれていますr単語は最小距離、最大距離、およびズームレベルです。

比較するには、forループを使用して配列を調べ、それぞれの値を確認します。一致するエントリが見つかった場合は、結果とbreakをループから外します。

これはこれまでのやり方よりも効率的ですばやいものではありませんが、任意の数のオプションがあり、実際のコードが大きくなったり複雑になったりすることはありません。ここで

は、あなたがあなたでこれを行うことができる方法である。

function get_map_zoom_level(distance) { 

    // create the array of values. Each entry can be either an array or an object, doesn't matter too much. 
    // I'll use an array set up as [minDistance, maxDistance, zoom] 
    var zoomLevels = [ 
     [880, 1760, 14], 
     [1760, 3520, 13], 
     [3520, 7040, 12], 
     [7040, 14080, 11], 
     // ... etc. 
    ] 

    var zoom = 1; 
    // special cases 
    if (distance == 0) 
     zoom = 11; 
    else if (distance == 1) 
     zoom = 15; 
    else if (distance > 1718240) 
     zoom = 3; 
    else { 
     for (var i = 0; i < zoomLevels.length; i++) { 
      var zoomLevel = zoomLevels[i]; 
      if (distance > zoomLevel[0] && distance <= zoomLevel[1]) { 
       zoom = zoomLevel[2]; 
       // found a match - stop the loop 
       break; 
      } 
     } 
    } 

    return zoom; 

} 

ところで、ズームレベル11は7040と1480が一致しない、それにエラーを持っているようです。

3

これは動作するはず:

function get_map_zoom_level(distance) { 
var zoom = 15; 
var temp=880; 
if (distance == 0) 
    zoom = 11 
while (distance > temp){ 
    temp=temp*2; 
    zoom--; 
} 
return zoom; 
} 
+0

私はちょうど言うつもりでした。あなたがしなければならないのは乗算だけです。これは最も洗練されたソリューションです。 – beingalex

+1

くそ、同じ答え^^私は例を作成する時間がありません:P教師は正しい、数学は未来に私たちを保存しようとしています;) – AxelH

+0

あなたのソリューションは非常に理解しやすく正確ですが、レベル5と4では2つのラジオはありませんが、リストを作成してループを使ってnとn + 1の要素をチェックし、距離がこれらの間にある場合、ズームレベルをそれに応じて戻しますズームレベル。ありがとう –

0

次のコードは正確に同じエッジケースを保持する(明示的、例えば、距離が0 - >ズームが11であり、暗黙、例えば、距離は42である - >ズームは1)あなたのコードの順序も同じですが、エッジケースを扱っていない場合は、範囲の上限を含む昇順で距離の配列を使用して適用可能な中間範囲を決定します。排他的な下限は、値が昇順であるため、最初から配列を反復することによって処理されます。

function get_map_zoom_level(distance) { 
    var distanceBreakpoints = [1760, 3520, 7040, 14080, 28160, 56320, 112640, 225280, 450560, 889120, 1718240]; 
    var zoom = 1; 
    if (distance == 0) 
     zoom = 11; 
    else if (distance == 1) 
     zoom = 15; 
    else if (distance > 880 && distance <= 1718240) { 
     for (var i = 0; i < distanceBreakpoints.length; ++i) { 
      if (distance <= distanceBreakpoints[i]) { 
       zoom = 14 - i; 
       break; 
      } 
     } 
    } else if (distance > 1718240) 
     zoom = 3; 
    return zoom; 
} 
関連する問題