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