2011-02-14 30 views
2

我正在考慮一些合適的模型來存儲經絡和parallles。經絡和相似之處應該保持一致。經絡和平行的數據模型

可能模式:

A)「拓撲」模型 每個點存儲指向北,南,東,西點。

class Point 
{ 
    private: 
      double lat; 
      double lon; 
      Point *north; 
      Point *south; 
      Point *east; 
      Point *west; 
      ... 
}; 

class Meridian 
{ 
    private: 
      double longitude; 
      Point *start; 
      Point *end; 
      unsigned int points_total; 
}; 

class Parallel 
{ 
    private: 
      double latitude; 
      Point *start; 
      Point *end; 
      unsigned int points_total; 
}; 

優點:

  • 我們可以遍歷在南北方向各有經穴,反之亦然。我們可以在東西方向上穿越每個平行線,反之亦然。
  • 我們確定每個點是在子午線還是平行線內(使用指針)。
  • 小的存儲需求...

缺點:

  • 每子午線/並行點只有順序訪問
  • 與拷貝構造函數和operator =問題。一組點的副本應該分幾個階段完成:創建一個新的點實例,使用std :: map添加點之間的拓撲關係,更改子午線/平行線的端點......它相當慢...

第二個缺點導致我放棄了模型。 B)點數列表。 Meridian /平行商店列表中的點,沒有拓撲關係。

class Point 
{ 
    private: 
      double lat; 
      double lon; 
}; 

class Meridian 
{ 
    private: 
      double longitude; 
      std::vector <Point> points; 
}; 

class Parallel 
{ 
    private: 
      double latitude; 
      std::vector <Point> points; 
}; 

優點:

  • 我們可以遍歷在南北方向各有經穴,反之亦然。我們可以在東西方向上穿越每個平行線,反之亦然。
  • 複製構造函數和運算符沒有問題=
  • 順序和直接訪問每個點。

缺點:

  • 我們不能確定每個點是否屬於任何子午線/並行(使用指針)或沒有。
  • 較大的存儲需求。
  • 在任何時候,我們是不是能夠找到一個/下一個經絡/並行的時候,我們沒有指針...

最後的缺點可能會導致模型的遺棄,導致我去思考拓撲模型的一個修改後的變體....

我正在執行一些空間模擬和代表結果在幾個cartografic投影,所以高效的數據存儲對我來說非常重要。

也許有人可以提出更好的模型:-)。感謝您的回答...

回答

1

如果您在地球的曲面上存儲經線和緯線,您可能有興趣查看一些計算幾何中用來表示封閉的二維座標的數據結構,二維流形。像quad-edgewinged-edge這樣的結構專門設計爲允許通過添加或刪除新邊緣的方式快速查找靠近給定邊,點或扇區的邊緣,點或扇區。我不確定這將在您的特定應用程序中有多大用處,但我認爲它們可能是一個很好的起點。在C++中,這些結構肯定有很好的實現,儘管我不知道我的頭腦是否有問題。