2010-07-10 90 views
2

我有一公里多,我將它分成兩百米在它的正面和反面..這是最有效的方法嗎?

  __________y__________ 
     |   |   | 
     |   |   | 
     |   |   | 
     |---------|---------| x 
     |   |   | 
     |   |   | 
     |_________|_________| 

基本上我正在做一個正方形就像上面的一個。我在x軸的正方向和負方向上將它分成100米的正方形。然後我繪製每個點在他們各自的合作伙伴中,我打算通過一堆if/else語句(至少50,最多100)拋出一個(x,y)值,但我關心的是如何這將是昂貴的。有沒有更有效的方式來做我想做的事情?

這裏是我計劃如何做一個例子...

   if(tlat < lat && tlat > lat - 89930.7){ 
      //point is within 100 meters on lat 
      //On the NEGATIVE SIDE. 
      if(tlng > lng && tlng < lng + 147999.8){ 
      //point is within 100 meters on lat NEGATIVE && 
      //withing 100 meters on lng POSITIVE 
       layers.addcube(highlng100p, lowlng100p, yhigh, ylow, highlat100p, lowlat100p); 
       highlng100p = highlng100p + 5; 
       lowlng100p = lowlng100p + 5; 
       highlat100p = highlat100p + 5; 
       lowlat100p = lowlat100p + 5; 
      }else if(tlng < lng && tlng > lng - 147999.8){ 
       //point is within 100 meters on lat NEGATIVE && 
       //withing 100 meters on lng NEGATIVE 
       layers.addcube(highlat100n, lowlat100n, yhigh, ylow, highlng100n, lowlng100n); 
       highlat100n = highlat100n + 5; 
       lowlat100n = lowlat100n + 5; 
       highlng100n = highlng100n + 5; 
       lowlat100n = lowlat100n + 5; 
      }else if(tlng > lng && tlng < lng + 295999.6){ 
       //point is within 200 meters on lat NEGATIVE && 
       //withing 200 meters on lng POSITIVE 
       layers.addcube(highlat200n, lowlat200n, yhigh, ylow, highlng200p, lowlng200n); 
       highlat200n = highlat200n + 5; 
       lowlat200n = lowlat200n + 5; 
       highlng200p = highlng200p + 5; 
       lowlng200p = lowlng200p + 5; 
      }else if(tlng < lng && tlng > lng - 295999.6){ 
       //point is within 200 meters on lat NEGATIVE && 
       //withing 200 meters on lng NEGATIVE 
       layers.addcube(highlat200n, lowlat200n, yhigh, ylow, highlng200n, lowlng200n); 
       highlat200n = highlat200n + 5; 
       lowlat200n = lowlat200n + 5; 
       highlng200n = highlng200n + 5; 
       lowlng200n = lowlng200n + 5; 
      }else if(tlng > lng && tlng < lng + 443999.4){ 
       //point is within 300 meters on lat NEGATIVE && 
       //withing 300 meters on lng POSITIVE 
       layers.addcube(highlat300n, lowlat300n, yhigh, ylow, highlng300p, lowlng300p); 
       highlat300n = highlat300n + 5; 
       lowlat300n = lowlat300n + 5; 
       highlng300p = highlng300p + 5; 
       lowlng300p = lowlng300p + 5; 
      }else if(tlng < lng && tlng > lng - 443999.4){ 
       //point is within 300 meters on lat NEGATIVE && 
       //withing 300 meters on lng NEGATIVE 
       layers.addcube(highlat300n, lowlat300n, yhigh, ylow, highlng300n, lowlng300n); 
       highlat300n = highlat300n + 5; 
       lowlat300n = lowlat300n + 5; 
       highlng300n = highlng300n + 5; 
       lowlng300n = lowlng300n + 5; 
      } else if(tlng > lng && tlng < lng + 591999.2){ 
       //point is within 400 meters on lng 
       //on the POSITIVE SIDE 
       layers.addcube(highlat400n, lowlat400n, yhigh, ylow, highlng400p, lowlng400p); 
       highlat400n = highlat400n + 5; 
       lowlat400n = lowlat400n + 5; 
       highlng400p = highlng400p + 5; 
       lowlng400p = lowlng400p + 5; 
      }else if(tlng < lng && tlng > lng - 591999.2){ 
       //point is within 400 meters on lng 
       //on the NEGATIVE SIDE 
       layers.addcube(highlat400n, lowlat400n, yhigh, ylow, highlng400n, lowlng400n); 
       highlat400n = highlat400n + 5; 
       lowlat400n = lowlat400n + 5; 
       highlng400n = highlng400n + 5; 
       lowlng400n = lowlng400n + 5; 
      }else if(tlng > lng && tlng < lng + 739999){ 
       //point is within 500 meters on lng 
       //on the POSITIVE SIDE 
       layers.addcube(highlat500n, lowlat500n, yhigh, ylow, highlng500p, lowlng500p); 
       highlat500n = highlat500n + 5; 
       lowlat500n = lowlat500n + 5; 
       highlng500p = highlng500p + 5; 
       lowlng500p = lowlng500p + 5; 
      }else if(tlng < lng && tlng > lng - 739999){ 
       //point is within 500 meters on lng 
       //on the NEGATIVE SIDE 
       layers.addcube(highlat500n, lowlat500n, yhigh, ylow, highlng500n, lowlng500n); 
       highlat500n = highlat500n + 5; 
       lowlat500n = lowlat500n + 5; 
       highlng500n = highlng500n + 5; 
       lowlng500n = lowlng500n + 5; 
      } 
      } 

如果有人可以幫助我做什麼,我想要做的更有效的我會感激! 謝謝,

+15

我建議你不要擔心效率問題,並開始擔心「不要重複自己」。 – Stephen 2010-07-10 13:32:20

+0

你能澄清你想要做什麼嗎?我不明白你的意思是什麼「然後我將每個點繪製在各自的共同點上」 – SpoonMeiser 2010-07-10 13:34:11

+0

你不能直接計算,將x和y數字縮放到網格並使用「floor」來使他們成爲一體?我錯過了什麼嗎? – 2010-07-10 22:46:12

回答

3

一種方法是做一個網格的單元格,並使用距離原點和單元格大小的點的距離來確定點進入哪個單元格。計算單元格的公式是O(1) - 因此它的效率不取決於網格的大小。這是一些代碼粗糙刺 - 未編譯的和未經考驗的,所以你可能需要修改它來得到它的工作:

public class SquareGrid 
{ 
    /** Lower, left corner of the grid */ 
    private Point2D m_origin; 
    private double m_cellSize; 
    private List<List<List<Point2D>>> m_cells; 

    public SquareGrid(Point2D origin, int numberOfCellsPerSide, double cellSize) 
    { 
     m_origin = origin; 
     m_cellSize = cellSize; 
     m_cells = new ArrayList<List<List<Point2D>>>(numberOfCellsPerSide); 

     for (int i = 0; i < numberOfCellsPerSide; i++) 
     { 
      List<List<Point2D>> row = new ArrayList<List<Point2D>>(numberOfCellsPerSide); 
      m_cells.add(row); 

      for (int j = 0; j < numberOfCellsPerSide; j++) 
      { 
       row.add(new ArrayList<Point2D>>()); 
      } 
     } 
    } 

    public void add(Point2D point) 
    { 
     int xCell = Math.floor((point.getX() - m_origin.getX())/m_cellSize); 
     int yCell = Math.floor((point.getY() - m_origin.getY())/m_cellSize); 

     m_cells.get(xCell).get(yCell).add(point); 
    } 
} 

如果你想在網格中間的起源,你將需要調整加算法,並決定如何處理每邊奇數個單元格。

專業人士可能會使用R-Tree或其他可用於構建高效空間索引而不是網格的數據結構。

+0

這是什麼? '私人列表<列表<列表 >> m_cells;'有沒有可能用字典代替? – 2010-07-10 22:46:00

+0

它是一個使用Java泛型定義列表中條目類型的列表。如果您使用的是不支持泛型的Java版本(例如1.4),則可以省略類型規範,但可能需要將從列表中刪除的對象轉換爲正確的類型。 – richj 2010-07-11 13:25:05

+0

如果您使用的是Java 1.2或更高版本,則可以使用Dictionary或Map。它在存儲和性能方面的效率會稍微低一些,編碼也會稍微困難一點,所以這樣做沒有優勢。 – richj 2010-07-11 13:31:27

相關問題