2015-03-02 62 views
0

我的項目(450)的列表,與地圖上的X/Y位置,在一個SQLite數據庫 (看起來像這樣https://imagizer.imageshack.us/v2/991x240q90/912/VIkE4j.png排序由X/Y位置,通過最近的項目

的地圖平,看起來像這樣http://imagizer.imageshack.us/a/img537/1814/bUoiKP.jpg

我想按X/Y位置排序此列表,所以下一個項目是最接近前一個項目的1。

我該如何對它們進行排序?

(也將是不錯的知道,但並不重要:我一個人也做這樣的一個SQLite查詢?)

+0

X/Y是指球體(3d)上還是平坦表面(2d)上的座標?在平坦的表面上,Pytagoras會是你的朋友。對於全球你將需要更多的計算,Google會成爲你的朋友。 (或者我,但是你需要先告訴我你已經做了什麼。)還有,從你測量到所有地點的距離並對它們進行排序的地方,還有一個起點嗎? – 2015-03-02 12:23:13

+0

平坦的表面,我猜。沒有Z,它看起來像這樣http://imagizer.imageshack.us/a/img537/1814/bUoiKP.jpg – hanshenrik 2015-03-02 12:26:09

+0

看起來像地球儀。最近的研究已經證明,這不是一個平坦的表面。 (如果你向西走得太遠,你也不會從地球上掉下來)。要得到準確的距離,你必須相應地計算。 – 2015-03-02 12:28:29

回答

0

這似乎工作。 https://github.com/divinity76/onlinkshit/commit/15d24a48c73ea4a9298805bbfa3a6aa2d80e2460 有人看到有什麼問題嗎?

function sort_by_xy_distance($input_list) 
    { 
     $ret = array(); 
     $a = $input_list[0]; 
     array_push($ret, $input_list[0]); 
     $input_list[0] = null; 
     $i = 1; 
     for ($i = 1; $i < count($input_list); ++$i) { 
//   if ($input_list[$i] == null) { 
//    echo 'already added to list..'; 
//    continue; 
//   } 
      $ii = 1; 
      $tmpdistance = 0; 
      $nearest = array(
       'index' => -1, 
       'distance' => PHP_INT_MAX 
      ); 
      for ($ii = 1; $ii < count($input_list); ++$ii) { 
       if ($input_list[$ii] == null || $ii == $i) { 
        //echo 'already added to list..'; 
        continue; 
       } 
       $tmpdistance = abs($input_list[$ii]['x'] - $a['x']) + abs($input_list[$ii]['y'] - $a['y']); 
       if ($tmpdistance < $nearest['distance']) { 
        $nearest['index'] = $ii; 
        $nearest['distance'] = $tmpdistance; 
       } 
      } 
      assert($nearest['index'] != -1); 
      array_push($ret, $input_list[$nearest['index']]); 
      $a = $input_list[$nearest['index']]; 
      $input_list[$nearest['index']] = null; 
     } 
     return $ret; 
    } 

這裏完全複製真實的數據&膏可運行testcode:

http://pastebin.com/raw.php?i=ST3saHj2(太大張貼在計算器以其30000字符/後限制)

看着兩張貼由數字PHP,並在遊戲中看結果,它看起來像一切正確排序。找到最短的路徑。

相關問題