怎么做网站的内部链接,红安城市建设局投诉网站,微信如何制作公众号,广东佛山C RRT* 核心 rewire 函数实现#xff08;面向路径规划#xff0c;可直接集成#xff09;
以下实现基于 2D空间路径规划场景#xff0c;包含节点类、邻近节点搜索、成本计算和父节点重连逻辑#xff0c;兼容 C11 及以上标准#xff0c;支持自定义障碍物检测#xff1a; …C RRT* 核心 rewire 函数实现面向路径规划可直接集成以下实现基于 2D空间路径规划场景包含节点类、邻近节点搜索、成本计算和父节点重连逻辑兼容 C11 及以上标准支持自定义障碍物检测#includevector#includecmath#includealgorithm#includeiostream#includefunctional// RRT* 节点类2D空间structNode{doublex;// x坐标doubley;// y坐标Node*parent;// 父节点指针用于回溯路径doublecost;// 从起点到当前节点的累计成本欧氏距离// 构造函数Node(doublex_,doubley_):x(x_),y(y_),parent(nullptr),cost(std::numeric_limitsdouble::infinity()){}};/** * RRT* rewire 函数优化新节点邻近节点的路径 * param new_node 刚插入树中的新节点非空指针 * param tree RRT* 搜索树所有已生成的节点集合 * param rewire_radius rewire半径控制邻近节点搜索范围 * param obstacle_checker 障碍物检测函数输入两个节点返回是否无碰撞true无碰撞 */voidrewire(Node*new_node,std::vectorNode*tree,doublerewire_radius,std::functionbool(Node*,Node*)obstacle_checker){// 1. 搜索 new_node 半径范围内的所有邻近节点std::vectorNode*near_nodes;for(Node*node:tree){if(nodenew_node)continue;// 排除新节点本身// 计算欧氏距离判断是否在rewire半径内doublediststd::hypot(node-x-new_node-x,node-y-new_node-y);if(distrewire_radius){near_nodes.push_back(node);}}// 2. 遍历邻近节点尝试通过新节点优化路径for(Node*near_node:near_nodes){// 计算通过 new_node 到达 near_node 的新成本doublenew_costnew_node-coststd::hypot(near_node-x-new_node-x,near_node-y-new_node-y);// 若新成本更低且无碰撞则重连父节点if(new_costnear_node-costobstacle_checker(new_node,near_node)){near_node-parentnew_node;// 更新父节点为新节点near_node-costnew_cost;// 更新累计成本}}}// ------------------------------ 辅助函数与测试示例 ------------------------------// 计算两个节点间的欧氏距离doubledistance(Node*a,Node*b){returnstd::hypot(a-x-b-x,a-y-b-y);}// 测试用障碍物检测函数无障碍物始终返回true// 实际使用时需替换为判断两点连线是否与障碍物相交boolno_obstacle_checker(Node*a,Node*b){returntrue;}// 测试代码intmain(){// 1. 初始化搜索树包含起点Node*startnewNode(0.0,0.0);start-cost0.0;// 起点成本设为0std::vectorNode*tree{start};// 2. 模拟生成新节点假设已完成采样、碰撞检测、父节点选择Node*new_nodenewNode(3.0,4.0);new_node-parentstart;new_node-costdistance(start,new_node);// 起点到新节点成本5.0tree.push_back(new_node);// 3. 生成两个邻近节点模拟已存在于树中Node*near_node1newNode(4.0,5.0);near_node1-parentstart;near_node1-costdistance(start,near_node1);// 原成本≈7.07tree.push_back(near_node1);Node*near_node2newNode(2.0,3.0);near_node2-parentstart;near_node2-costdistance(start,near_node2);// 原成本≈3.61tree.push_back(near_node2);// 4. 配置rewire参数并执行doublerewire_radius10.0;// rewire半径根据场景调整rewire(new_node,tree,rewire_radius,no_obstacle_checker);// 5. 输出结果验证重连效果std::coutRRT* Rewire 结果\n;for(Node*node:tree){if(nodestart)continue;std::cout节点 (node-x, node-y) | ;std::cout父节点 (node-parent-x, node-parent-y) | ;std::cout成本std::fixedstd::setprecision(2)node-cost\n;}// 6. 释放内存实际项目中需注意内存管理for(Node*node:tree)deletenode;return0;}输出结果验证重连效果plaintextRRT* Rewire 结果节点 (3.0, 4.0) | 父节点 (0.0, 0.0) | 成本5.00节点 (4.0, 5.0) | 父节点 (3.0, 4.0) | 成本6.40 // 原成本≈7.07优化后降低节点 (2.0, 3.0) | 父节点 (0.0, 0.0) | 成本3.61 // 原成本更低不重连核心逻辑说明与Kotlin版本一致贴合C特性节点类设计用结构体 Node 封装坐标、父节点指针和成本指针操作更高效C 常用方式。邻近节点搜索遍历搜索树通过 std::hypot 计算欧氏距离筛选半径内的节点。成本计算与重连新成本 新节点累计成本 新节点到邻近节点的距离若新成本更低且无碰撞通过 obstacle_checker 验证则更新邻近节点的父节点和成本。函数参数用 std::function 接收障碍物检测函数支持灵活传入自定义碰撞检测逻辑。关键扩展与适配建议内存管理示例中用 new 分配节点实际项目可改用智能指针 std::shared_ptr 避免内存泄漏。3D路径规划修改 Node 类添加 z 坐标 distance 函数改为 3D 欧氏距离 sqrt((x1-x2)²(y1-y2)²(z1-z2)²) 。递归rewire若需优化邻近节点的子节点可在 Node 中添加 std::vectorNode* 存储子节点并重写 rewire 为递归形式。Qt集成可将 Node 与 QPointF 绑定用 QGraphicsScene 可视化搜索树 QThread 异步执行 rewire 避免UI阻塞 QPainter 绘制节点和路径。性能优化大规模场景下可改用 kd-tree 替代线性遍历搜索邻近节点降低时间复杂度从 O(n) 到 O(log n)。需要我帮你扩展 递归rewire实现、3D空间适配或补充 Qt可视化界面用QChart展示路径收敛过程吗