我想可视化包含数十万条目的天文星表。目录通常只包含一个恒星列表,每颗恒星都有球坐标和其他数据。球面坐标是指赤经(0-360 度或 0-24 小时)和赤纬(-90 度到 +90 度)。这对应于经度和纬度,只是在天球上而不是地球表面。
我想绘制目录中位于特定视野内的所有恒星,由中心(球坐标)和视野大小(以度为单位)和投影(例如立体投影)。
通过遍历整个目录来绘制星星并仅检查每颗星星是否在视野内是非常低效的。
我怎样才能使它更有效率?这种问题有什么好的算法或者数据结构吗?
最佳答案
对于现代 gfx 卡,300,000(及更多)星数仍然是可控的...
因此,您可以尝试将它们作为 VBO/VAO 全部加载到 gfx,并将渲染/剪辑留给 gfx。我以这种方式使用 Hipparcos (118322 stars) 没有问题,而每颗星都是透明的四边形。您只需要在渲染之前预先计算四边形以查看位置(只需一次)。这是我的一个应用程序的屏幕截图,其中 Hipparcos 以这种方式用作背景星(在 RT 中)
您还可以使用几何着色器来简化很多事情(可以只发送点甚至
<Ra,Dec,Distance
而不是四边形)但这会将您的目标 gfx HW 限制为仅支持几何着色器。如果你有更多的星星,那么你的硬件可以处理然后使用排序的数据集
大多数目录按
Ra or Dec
排序.您可以通过以下方式使用它:- 选择查看区域
min(Ra,Dec),max(Ra,Dec)
- 假设您的数据按
Ra
排序升序 - 先找
i0
其中 star[i0].Ra>=min.Ra- 使用二分查找!!!
- 先找
i1
其中 star[i1].Ra>=max.Ra- 使用二分查找!!!
- 进程星
i0<=i<i1
测试是否
min.Dec <= star[i].Dec <= max.Dec
如果是,则渲染它。- 选择查看区域
如果这还不够快,您需要使用空间分割
因此将您的数据集分成较小的数据集。在根据选定的 View 区域进行渲染之前,仅使用该区域附近的数据集。这将显着降低处理的数据量。
关于algorithm - 有效地绘制星图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33184329/