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

可能的型号:

A)“拓 flutter ”模型
每个点都存储指向北,南,东和西点的指针。

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添加点之间的拓 flutter 关系,更改子午线/平行线的端点...这相当慢...

  • 第二个缺点使我放弃了该模型。

    B)点列表。经络/平行存储点列表,没有拓 flutter 关系。
    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;
    };
    

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

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

  • 最后一个缺点可能会导致模型的放弃,并让我考虑拓 flutter 模型的修改形式...。

    我正在执行一些空间仿真,并以多个嫁接的投影表示结果,因此有效的数据存储对我来说非常重要。

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

    最佳答案

    如果将子午线和纬线存储在地球的曲面上,则可能有兴趣查看一些用于计算几何体以表示闭合二维流形的数据结构。像quad-edgewinged-edge这样的结构经过专门设计,可以快速查找靠近给定边缘,点或扇区的边缘,点或扇区,并可以通过添加或删除新边缘轻松地对其进行更新。我不确定这对您的特定应用程序有多有用,但是我认为它们可能是一个很好的起点。在C++中肯定有这些结构的良好实现,尽管我不知道有什么可以解决的。

    10-08 15:54