【问题标题】:Plotting a star chart efficiently高效地绘制星图
【发布时间】:2015-10-17 08:05:50
【问题描述】:

我想可视化包含数十万个条目的天文恒星目录。目录通常由简单的恒星列表组成,其中包含每颗恒星的球坐标和其他数据。球坐标是指赤经(0-360 度或 0-24 小时)和赤纬(-90 度到 +90 度)。这对应于经度和纬度,只是在天球而不是地球表面上。

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

通过查看整个目录来绘制星星并仅检查每颗星星是否在视野内是非常低效的。

我怎样才能提高效率?这类问题有好的算法或数据结构吗?

【问题讨论】:

    标签: algorithm plot astronomy


    【解决方案1】:
    1. 对于现代 gfx 卡,像 300K(及更多)星​​这样的数字仍然可以管理...

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

      您还可以使用几何着色器来简化很多事情(可以只发送点甚至Ra,Dec,Distance 而不是四边形),但这会将您的 Target gfx HW 限制为仅支持几何着色器的那些。

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

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

      1. 选择查看区域min(Ra,Dec),max(Ra,Dec)
      2. 假设您的数据按Ra升序排序
      3. 首先找到i0,其中star[i0].Ra>=min.Ra
        • 使用二分查找!!!
      4. 首先找到i1,其中star[i1].Ra>=max.Ra
        • 使用二分查找!!!
      5. 流程星i0<=i<i1

      测试是否min.Dec <= star[i].Dec <= max.Dec,如果是则渲染它。

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

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

    【讨论】:

    • 我喜欢对数据集进行排序的想法!你对空间细分技术有什么建议吗?我想我听说有人为此使用 HEALPIx。
    • @naavis 我不对星星使用空间细分,因为我的数据集与单个 VBO 一样快(与大气散射、地形等的较慢渲染相比)。无论如何,您可以将您的集合划分为具有足够小网格大小的球形网格。例如,您可以选择网格单元大小10deg x 10deg为每个网格单元创建星表。然后只渲染那些靠近选定视图区域的单元格。您应该对单元格大小进行一些调整,以最大限度地提高性能。
    猜你喜欢
    • 2017-03-21
    • 1970-01-01
    • 1970-01-01
    • 2021-09-05
    • 1970-01-01
    • 1970-01-01
    • 2015-07-08
    • 1970-01-01
    • 2011-11-14
    相关资源
    最近更新 更多