如何最好地存储kd树中的行

时间:2010-10-28 23:20:02

标签: data-structures raytracing kdtree

我知道kd-tree传统上用于存储点,但我想存储行。是否最好在每个交叉点拆分kd-tree的分割线?或者只将端点存储到kd-足以找到最近邻居?

3 个答案:

答案 0 :(得分:1)

kd-tree本身是为 point 对象设计的。甚至不包括盒子,球体或类似的东西。我相信你可以以某种方式使用存储minx, maxx, miny, maxy, minz, maxz的6d树;但我不完全确定如何正确查询。

R*-tree (Wikipedia)可能是更好的选择。它实际上是为具有空间扩展的对象而设计的。如果你查阅相关的出版物,他们甚至会尝试不同的近似复杂对象;例如,它是否能够使它们三角化,使用环形边界,边界框,有趣的是,在某些情况下,5角多边形提供了最好的性能。

无论如何,R * -tree家族可能是一个有趣的选择。

答案 1 :(得分:0)

嗯,你必须在十字路口上分割线条,否则你会遇到树叶重量的问题。

另一方面,如果您不使用SAH或任何其他算法来遍历树,您可以随心所欲地使用kd-tree的原始想法。但如果 绑定到某些传统算法,则 分割线。你必须这样做只是因为树的每个叶子都有一个重量(我想在你的情况下它取决于它的线条长度)。

如果你不分割线条,你也会得到错误的树叶重量。不,如果你不分割线,你应该在线所属的两个叶子中复制它们。

答案 2 :(得分:0)

你必须使用kd树吗?对于扩展原语,bv-tree可能更有效。