2

我正在考虑一些合适的模型来存储经络和平行线。经线和纬线应保持为线。

可能的型号:

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;
};

优点:

  • 我们可以沿南北方向遍历每条子午线,反之亦然。我们可以沿东西方向遍历每个平行线,反之亦然。
  • 我们确定每个点是在子午线内还是平行(使用指针)。
  • 小存储需求...

缺点:

  • 仅顺序访问每个子午线/平行点
  • 复制构造函数和运算符 = 的问题。一组点的副本应该分几个阶段完成:创建一个新的点实例,使用 std::map 添加点之间的拓扑关系,更改子午线/平行线的端点......这相当慢......

第二个缺点导致我放弃了这个模型。

B) 点列表。经络/并行存储点列表,没有拓扑关系。

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;
};

优点:

  • 我们可以沿南北方向遍历每条子午线,反之亦然。我们可以沿东西方向遍历每个平行线,反之亦然。
  • 复制构造函数和运算符 = 没有问题
  • 顺序和直接访问每个点。

缺点:

  • 我们无法确定每个点是否属于任何经线/平行线(使用指针)。
  • 更大的存储需求。
  • 在任何时候我们都无法找到子午线/平行线的上一个/下一个点,我们没有指针......

最后一个缺点可能导致模型的放弃,并导致我考虑拓扑模型的修改变体......

我正在执行一些空间模拟并在几个地图投影中表示结果,因此高效的数据存储对我来说非常重要。

也许有人可以提出一个更好的模型:-)。谢谢你的回答...

4

1 回答 1

1

如果您在地球的曲面上存储经线和纬线,您可能有兴趣查看计算几何中用于表示闭合二维流形的一些数据结构。像四边形翼形边这样的结构专门设计用于快速查找靠近给定边缘、点或扇区的边缘、点或扇区,并且可以通过添加或删除新的边缘。我不确定这在您的特定应用程序中会有多大用处,但我认为它们可能是一个很好的起点。在 C++ 中,这些结构的在线实现肯定有很好的实现,尽管我不知道有什么在我脑海中。

于 2011-02-15T01:23:58.167 回答