64,631
社区成员
发帖
与我相关
我的任务
分享
struct kdres *kd_nearest_Asquare2(struct kdtree *kd, const double *pos, double D)
{
int ret;
struct kdres *rset;
if(!(rset = (kdres *)malloc(sizeof *rset)))
{
return 0;
}//判断rset是否初始化成功
if(!(rset->rlist = (res_node *)alloc_resnode()))
{
free(rset);
return 0;
}//判断rlist是否初始化成功
rset->rlist->next = 0;
rset->tree = kd;
if((ret = find_nearest_Asquare2(kd->root, pos, D, rset->rlist, 0, kd->dim)) == -1)
{
kd_res_free(rset);
return 0;
}
rset->size = ret;//赋值找到了多少临近点
kd_res_rewind(rset);
return rset;
}
static int find_nearest_Asquare2(struct kdnode *node, const double *pos, double D, struct res_node *list, int ordered, int dim)
{
double dist_sq, dist_x,dist_y,dist_z,dx;
int i, ret, added_res = 0;
if(!node) return 0;//注意这个地方,当节点为空的时候,表明已经查找到最终的叶子结点,返回值为零
dist_x = node->pos[0] - pos[0];
dist_y = node->pos[1] - pos[1];
dist_z = node->pos[2] - pos[2];
//如果距离在阈值范围内,就将其插入到返回结果链表中
if(abs(dist_x) < D && abs(dist_y) < D && abs(dist_z) < D)
{
if(rlist_insert(list, node, ordered ? dist_sq : -1.0) == -1) //这里是满足条件,就插入。
{
return -1;
}
added_res = 1;
}
//在这个节点的划分方向上,求两者之间的差值
//dx = pos[node->dir] - node->pos[node->dir];
//根据这个差值的符号, 选择进行递归查找的分支方向
ret = find_nearest_Asquare2(node->left, pos, D, list, ordered, dim);
//如果返回的值大于等于零,表明在这个分支中有满足条件的节点,则返回结果的个数进行累加,并在节点的另一个方向进行查找最近的节点
if(ret > 0 )
{
added_res += ret;
cout << "ret is :" << ret << endl;
}
ret = find_nearest_Asquare2( node->right, pos, D, list, ordered, dim);
if(ret == -1) {
return -1;
}
added_res += ret;
return added_res;
}