我试图借助kd-tree的前几个节点在2D空间中构建边界框。例如,直到我得到8个边界框时才构建树。因此,深度为0的根节点将这些点分为2个区域。深度为1的左右孩子将整个区域划分为4个盒子,最后深度为3的节点将区域划分为8个盒子。
我可以在build_kdtree函数中使用以下内容构建树和边界框:
val minX = points.map(p => p._1).min()
val minY = points.map(p => p._2).min()
val maxX = points.map(p => p._1).max()
val maxY = points.map(p => p._2).max()
val ll_A = (minX, minY)
val ur_A = if (axis == 0) (median._1, maxY) else (maxX, median._2)
val ll_B = if (axis == 0) (median._1, minY) else (minX, median._2)
val ur_B = (maxX,maxY)
其中,“ ll”,“ ur”是指构成边界框的左下和右上点。并且,A和B表示每个点将区域划分为2个子区域或框的事实。另外,请注意,对于axis = 0,该区域将分为左右边界框,对于axis = 1,它将被分为上下边界框。
此代码的问题是,从深度1和2的点获得的“ ll”和“ ur”坐标会缩小空间一点,因为每次迭代中给出最小值,最大值的点可能不可用。
例如,我得到的输出是:
Depth 0:
Root node=(0.566325879,0.574899707)
ll_A, ur_A, ll_B, ur_B=(0.0,0.0),(0.566325879,1.0),(0.566325879,0.0),(1.0,1.0)
Depth 1:
Left=(0.340983325,0.740971924)
ll_A, ur_A, ll_B, ur_B=(0.0,0.0),(0.491409668,0.740971924),(0.0,0.740971924),(0.491409668,0.982352539)
Right=(0.412548242,0.714853613)
ll_A, ur_A, ll_B, ur_B=(0.0,0.509733984),(0.412548242,0.982352539),(0.412548242,0.509733984),(0.491409668,0.982352539)
在上面,左孩子和右孩子的maxY应该是1而不是0.98。
当我尝试构建更多的边界框(如8、16或64)时,我会失去更多的空间,因为最小值和最大值还取决于节点的父级和祖父母级。
我无法对每个深度都进行硬编码,因此在每次递归中都将树作为边界来构建边界框。但是,我无法提出一种适用于树的所有级别并给出构成整个区域的边界框的算法。
在这方面欢迎任何帮助。谢谢。