细分3D曲面的算法

时间:2019-04-16 12:40:20

标签: c++ geometry voronoi q-learning

背景

我有一个3D场景,我想离散化它的空间,以便每个坐标(x, y, z)都属于一个特定的单元格。
彼此接近的坐标属于同一单元。输入位于我的一个三维对象(主要是球体)的表面上的坐标时,需要检索它所属的单元格。
对于熟悉强化学习的人员,此操作将用于Q学习,以将状态(取决于坐标的单元格)映射到Q值
这是我要达到的目标的一个示例:

enter image description here

可能的解决方案

我知道Voronoi图可以帮助实现这一点,但是我也读到从头开始实现它很复杂。我在C ++中找到了一些库来处理此问题,但是它们主要是Voronoi 2D(CGAL)。 我不是特别需要Voronoi,我只需要以合理的方式离散空间,并为偶然发现Voronoi图的它寻找库/实现。

问题 有没有人熟悉库或公共实现以实现C ++中的离散化?

1 个答案:

答案 0 :(得分:1)

根据您的要求,可能有很多解决方案。我能想到的最简单的方法是使用统一的网格划分空间。然后,点(x,y,z)的单元格就是(floor(x),floor(y),floor(z))。您可以缩放坐标以获得更精细的网格。如果您需要一个索引,请使用哈希函数或在边界框内为有限网格的所有单元编制索引。不需要库,但是它不适应区域中的点数。

Voronoï图是另一种可能的解决方案,但是如果您想要所有单元的精确形状,则实现起来要复杂得多。如果您只需要找到最近的站点,请使用Kd-Trees,因为它们易于实施并且可以为您提供所需的信息。您可以在GEOGRAM中找到这两种算法的实现,这是一个免费且开放的(可以在商业应用中使用)C ++库,用于进行快速几何计算。它工作得很好,并且易于使用。它也是便携式的,可在Linux,Windows,Mac OSX和Android上运行。