Delete
void fiesta::ESDFMap::DeleteFromList(int link, int idx) {
if (prev_[idx] != undefined_) //把idx前后连上,就无法通过link障碍物索引到idx,等价于把idx从link障碍物中删除!!!
next_[prev_[idx]] = next_[idx]; //index->prev->next = index->next (因为数组形式,和指针顺序相反,理解一下)
else
head_[link] = next_[idx]; //如果idx是第一个,那么把head和idx下一个体素连上,idx索引被删除,不影响link障碍物的DLL
if (next_[idx] != undefined_) //如果next[idx]不存在,next_[prev_[idx]]= next[idx] = undefined,不用else讨论
prev_[next_[idx]] = prev_[idx]; //index->next->prev = index->prev (prev[next] = next->prev)
//所有if结束后,释放idx的前后指向,等待通过insertintolist重新复制
prev_[idx] = next_[idx] = undefined_; //free(index)
}
Insert
//将idx连接到link障碍物上
void fiesta::ESDFMap::InsertIntoList(int link, int idx) { //输入link是总网格大小 idx是当前update中弹出的体素id
if (head_[link] == undefined_) //link障碍物没有连接体素
head_[link] = idx; //第一个head连接idx
else {
prev_[head_[link]] = idx; //link->prev = index
next_[idx] = head_[link]; //index->next = link idx放到head[link]前面
head_[link] = idx; //将head[link]指向idx,说明插入是在link头部·插入,之前的体素都往内部挤
}
}
FIESTA个人理解 三 (insert delete)
最新推荐文章于 2024-09-29 18:03:50 发布
这段代码展示了在ESDFMap数据结构中如何删除和插入障碍物体素。DeleteFromList函数通过调整前后连接,将idx从link障碍物的双向链表中移除。InsertIntoList函数则将idx插入到link障碍物的链表头部。这两个函数对于动态维护障碍物列表至关重要。
摘要由CSDN通过智能技术生成