有效地绘制星图

时间:2015-10-17 08:05:51

标签: algorithm plot astronomy

我想要想象出可以包含数十万个条目的天文星目录。目录通常只包含一个恒星列表,每个恒星都有球坐标和其他数据。球面坐标是指右上升(0-360度或0-24小时)和赤纬(-90度到+90度)。这对应于经度和纬度,仅在天球而不是地球表面。

我想绘制目录中位于特定视野内的所有星星,由中心(球面坐标)和视野大小(以度为单位)和投影(例如立体投影)。

通过浏览整个目录绘制星星,只检查每颗星是否在视野范围内是非常低效的。

我怎样才能提高效率?是否有针对此类问题的良好算法或数据结构?

1 个答案:

答案 0 :(得分:1)

  1. 对于现代gfx卡,300K(及以上)星的数字仍然可以管理......

    所以你可以尝试将它们全部加载到gfx作为VBO / VAO,并将渲染/剪辑单独留给gfx。我以这种方式使用 Hipparcos(118322星)而没有任何问题,而每颗星都是透明的Quad。您只需要预先计算四边形以在渲染之前查看位置(仅一次)。这是我的一个应用程序的屏幕截图,其中 Hipparcos 以这种方式用作背景星(在RT中)

    ConnectionProvider

    您还可以使用几何着色器来缓解很多事情(只能发送点数甚至Hipparcos VBO而不是Quads),但这会将Target gfx HW限制为仅支持几何着色器的那些。

  2. 如果您有更多星星,那么您的HW可以处理然后使用已排序的数据集

    大多数目录按Ra,Dec,Distance排序。您可以通过以下方式使用它:

    1. 选择查看区域Ra or Dec
    2. 假设您的数据按min(Ra,Dec),max(Ra,Dec)升序
    3. 排序
    4. 首先找到Ra星号[i0] .Ra> = min.Ra
      • 使用二元搜索!!!
    5. 找到第一个i0,其中star [i1] .Ra> = max.Ra
      • 使用二元搜索!!!
    6. 流程明星i1
    7. 测试是否为i0<=i<i1,如果是,则进行渲染。

    8. 如果这还不够快,您需要使用空间细分

      因此,将数据集划分为较小的数据集。在根据所选视图区域进行渲染之前,仅使用该区域附近的数据集。这将显着降低处理数据的数量。