树上小屋

这是一个将艺术和工程融为一体的活计.

导航

碰撞检测技术:kd tree

接上文.
参考: http://bit.kuas.edu.tw/~cscheng/research/paper/kdtree.htm

根据我现在的理解. 比起blockmap, kd树很灵活,它可以公平地划分块. 保证每块的星星一样多. 但是要分配出一个二叉树(3D仍应是二叉)的结构,当深度比较大时,比如log(starn),就会费内存了. 还是用前面的例子实现...:

首先要计算层数,就是kd tree里面的k. 设星球总数为m,层数为k,用后面说的方法就得出大致的时间方程: T=(m/2^k)^2+k*m,(b<=log2(m)),求T最小值时的k. 这个指数方程不会解~ hehe,暂定为k=log2(m)好了. 接着开始划分并建立树, 首先第一刀竖着切,x=所有星的x平均数,这样就分别把两边的星星标记为2和3,表示当前属于2号和3号结点,这是第1层;再分别给2和3的区域横着切两刀,y仍取平均数,这是第2层.... 这样横竖交替地切,因此在建立每一层就要遍历starpool[]一次,一共是k*m次的位置检索. 而最后被归到同一个叶结点的星星组串成循环链表,以便对每组内部做n=(m/2^k)^2/2次碰撞检测. 现在就明白T的计算方法了.

午饭和晚饭都没吃,无法再思考下去了. 至于kd tree的效果是不是非常好,是否用在网游里更合适. 以后再想.

posted on 2006-12-19 20:00  euclid  阅读(1942)  评论(1编辑  收藏  举报