我有一些 2D 数据,其中包含被光栅化为像素的边缘。我想实现一个有效的数据结构,它返回位于非轴对齐二维三角形中的所有边缘像素。
该图像显示了问题的可视化,其中白色表示光栅化边缘,红色表示查询三角形。结果将是位于边界上或红色三角形内的所有白色像素。
进一步查看图像时,我们注意到我们有稀疏的布尔数据,这意味着如果我们用 0 表示黑色像素,用 1 表示白色像素,则数据中 1 的数量远低于 0 的数量。因此,栅格化红色三角形并检查其内部的每个点是白色还是黑色并不是最有效的方法。
除了数据的稀疏性;由于白色像素来自边缘,因此它们本质上是连接在一起的。但是,在与其他线路的交汇处,它们有两个以上的邻居。位于交界处的像素只能返回一次。
数据必须实时处理,但没有 GPU 帮助。对于不同的三角形内容会有多次查询,每次查询后,可能会从数据结构中删除点。但是,在数据结构初始填充后,将不再插入新点。
当光栅化边缘到达时,查询三角形是已知的。
查询三角形比数据边多。
有许多可用的空间数据结构。但是我想知道,哪一个最适合我的问题。我愿意实现一个高度优化的数据结构来解决这个问题,因为它将是项目的核心元素。因此,也欢迎数据结构的混合或缩写!
R-trees似乎是迄今为止我为这个问题找到的最好的数据结构,因为它们支持基于矩形的查询。我将检查查询三角形的 AABB 内的所有白色像素,然后检查每个返回的像素是否位于查询矩形内。
但是,我不确定 R-tree 的表现如何,因为基于边缘的数据不容易分组为矩形,因为这些点在窄线上聚集在一起而不是导出。
我也不确定使用有关查询三角形的信息预先构建 R-tree 的结构是否有意义,这些信息将在结构填充后立即生成(如前所述,查询三角形是已知的当数据到达时)。
扭转问题似乎也是一个有效的解决方案,我使用二维间隔树为每个白色像素获取包含它的所有三角形的列表。然后,它可以存储在所有这些结果集中,并在查询到达时立即返回。但是,我不确定这是如何执行的,三角形的数量高于边缘的数量,但仍低于白色像素的数量(因为边缘主要分为 ~20-50 像素)。
一种利用白色像素最常见的白色像素作为邻居的数据结构似乎是最有效的。但是,直到现在我还没有找到任何关于这种事情的信息。