如何在kd-tree中表示线段



我在2D中有大量的线段。我想把它们都表示成d树结构,然后找到a附近的线段特定线段。对如何用kd-tree做到这一点有什么想法吗?

段应该在它相交的每个kd-tree叶子中。也就是说,假设一条线段由一对点(p1, p2)表示,你应该在kd树节点中存储对这条线段的引用。这个线段应该保存在它所经过的每一个kd-tree节点中,这与处理点的时候不同,每个点只存储在1个kd-tree节点内。

当分割kd树节点时,在水平或垂直线上分割。如果至少有一个端点在左子树中,则线段位于"左"子树中。右子树也是一样

您应该通过对线段的端点进行类似于点查询的操作来找到附近。也就是说,查看查询端点附近的所有kd树叶子。

然后,对于这些箱子中的潜在段,您可以通过查看从查询端点到候选段的垂直线的长度来进行精确的长度比较,反之亦然(将候选行端点与查询行进行比较)。

如何做到这一点的细节在这里回答:点和线段之间的最短距离。你应该做4个测试,从一条线的端点到另一条线的端点,反之亦然,然后取最小值。注意忽略点投射到线段外的距离。

这是有效的,因为直线不弯曲,所以两直线之间最近的点必须位于其中一个端点。

不能用段实现kd-tree。Kd-tree是专门为k向量空间设计的,段不属于向量空间。我们的想法是用超平面来划分kd-tree空间,如果你不在一个kd-vector空间,那就不理想了。

但是,您需要的可能是Bounding Volume Hierarchy, https://en.wikipedia.org/wiki/Bounding_volume_hierarchy,一种用于碰撞检测的技术。

最新更新