algorithm - 有效地绘制星图

标签 algorithm plot astronomy

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

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

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

我怎样才能使它更有效率?这种问题有什么好的算法或者数据结构吗?

最佳答案

  1. 对于现代 gfx 卡,300,000(及更多)星​​数仍然是可控的...

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

    Hipparcos VBO

    您还可以使用几何着色器来简化很多事情(可以只发送点甚至 Ra,Dec,Distance 而不是四边形)但这会将您的目标 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. 如果这还不够快,您需要使用空间分割

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

关于algorithm - 有效地绘制星图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33184329/

相关文章:

c++ - GJK碰撞检测从2D到3D的实现

python - matplotlib 中的多步直方图

javascript - 如何实现持久的、变化的时间周期

python - 月亮/月相算法

algorithm - 词消歧算法(Lesk算法)

algorithm - 为什么我们在约翰逊算法中只运行 Dijkstra 算法 V 次?

matlab - 如何使 MATLAB 的 xlim 自动且围绕 0 对称?

javascript - 尝试用 Javascript 编写一些来自维基百科的数学(太阳位置计算)

Java:使用 Java 8 API 对非连续字符串字符的子集进行排序的更快方法是什么

python - 绘图遮盖了 matplotlib 中的其他绘图