Page1
八叉树为三维数据设计
八叉树不需要回到root节点才停止,可以提前停止搜索。
构建一个以搜索节点为中心,搜索半径的球,球完全落在某立方体里,则搜索范围就在立方体中。外面的东西不用管。
Page2
Page3
octant组成:
子节点children有8个;
center,立方体中心点位置;
extent:半个边长,中心点到其中一个面的距离;
立方体中的点的index;
判断是不是leaf
Page4
构建8叉树:
db:database,所有的点,根据点构建8茶树
如果root节点不存在就建一个,把点都放进去。
判断点的数量够不够leaf_size,或者边长够不够min_extent,如果是的话就可以返回了,不是就进一步切割;
第一步是考虑里面的点进入哪个子节点中,第一个绿框决定每个子节点都有什么点,记下来。第二个框,每个子节点中心点在哪,边长多少,把点放进去,再调用递归函数建下一层octent。
Page5 KNN查找
query ball在S2内部,所以可以搜索完S12后停止搜索,不必返回S1根节点再搜索S3 S4。
Page6
首先如果进来根节点是none则什么都不用做了,回去;
如果是leaf节点,把octent中所有节点拿过来计算距离,对比,放到容器中;
如果不是leaf,就再继续寻找最近的子节点,递归调用;
找完之后再找其他子节点,因为找完第一个子节点之后还没能提前终止,if()return true,如果提前终止就不用再去找其他子节点了,也可能找完第一个子节点没找到,还要找其他7个子节点,就到了for循环;
最后,如果query球被一个octent包围了,就可以提前终止了。inside函数是说一个query被一个octent包围了。
考虑顺序:
球和某个面有接触;
球和顶点有接触;
球和某个棱有接触。