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