高效检查一个点是否在二维的大量三角形内
Efficient checking of whether a point is inside a large number of triangles in 2D
我已经实现了一种算法,通过调用这个问题中的第一个算法来检查一个点是否在二维三角形内:how to determine if a point is inside a 2d triangle。
这个算法可行,但我认为如果我对三角形进行预处理并使用智能数据结构,我可以提高效率。我正在使用大约 1000 万个三角形。我认为加快速度的一种方法是计算三角形的边界矩形并在矩形检查中做一个点,但我觉得即使是这种情况也可以通过使用某些数据结构来仅检查附近的矩形来加快速度。
有这样的数据结构和算法吗?
计算几何学的经典方法是三角化,然后进行点定位,但使用 k-d tree 更容易,将与内部树节点的分割线相交的三角形放在该节点中以便在下落到树叶的途中检查它们。
构造k-d树是一个递归的过程。给定一个三角形列表和一个要关注的坐标(x 或 y,与每一层交替),通过随机抽样、取中位数或某种组合或抽样并取中间模糊地找到一条分隔线一个中位数。收集所有点都严格小于分离坐标的三角形,并用它们构造左子树。收集点都严格大于分离坐标的三角形,并用它们构造右子树。将剩余的三角形(与坐标线相交的三角形)存储在根中。
查询,测试点是否属于根中的任意一个三角形。然后,如果该点小于分离坐标,则检查左子树。如果点数更大,就勾选右边
我已经实现了一种算法,通过调用这个问题中的第一个算法来检查一个点是否在二维三角形内:how to determine if a point is inside a 2d triangle。
这个算法可行,但我认为如果我对三角形进行预处理并使用智能数据结构,我可以提高效率。我正在使用大约 1000 万个三角形。我认为加快速度的一种方法是计算三角形的边界矩形并在矩形检查中做一个点,但我觉得即使是这种情况也可以通过使用某些数据结构来仅检查附近的矩形来加快速度。
有这样的数据结构和算法吗?
计算几何学的经典方法是三角化,然后进行点定位,但使用 k-d tree 更容易,将与内部树节点的分割线相交的三角形放在该节点中以便在下落到树叶的途中检查它们。
构造k-d树是一个递归的过程。给定一个三角形列表和一个要关注的坐标(x 或 y,与每一层交替),通过随机抽样、取中位数或某种组合或抽样并取中间模糊地找到一条分隔线一个中位数。收集所有点都严格小于分离坐标的三角形,并用它们构造左子树。收集点都严格大于分离坐标的三角形,并用它们构造右子树。将剩余的三角形(与坐标线相交的三角形)存储在根中。
查询,测试点是否属于根中的任意一个三角形。然后,如果该点小于分离坐标,则检查左子树。如果点数更大,就勾选右边