基于KD树的目标点管理算法实现实验

该文详细介绍了基于KD树的K近邻搜索算法的实现,包括KD树的构建、K近邻查询以及两种过滤策略:椭圆视野范围过滤和通视性过滤。实验比较了KD树搜索与简单遍历方法的效率,并提供了完整的代码实现和实验结果展示。
摘要由CSDN通过智能技术生成

目录

一、实验概述

实验一:KD树构建

实验二:KD树K近邻查询

实验三:将所实现的最近邻算法和简单遍历的方法进行试验比较。

实验四:实现对KD树K近邻搜索结果的视野过滤。

实验五:实现对KD树K近邻搜索结果的通视性过滤。

二、实现思路

(一)KD树构建

 (二)K近邻查询

 (三)椭圆视野范围过滤

(四)通视过滤

 三、实验结果


一、实验概述

实验一:KD树构建

理解KD树构建的算法原理,设计源代码架构与执行流程,在此基础上实现构建KD树的函数接口

实验二:KD树K近邻查询

输入:已生成的KD树、观察者的二维坐标;

返回值:KD树中与观察者距离最近的K个(K≥1)目标。

实验三:将所实现的最近邻算法和简单遍历的方法进行试验比较。

实验四:实现对KD树K近邻搜索结果的视野过滤。

输入:已生成的KD树、观察者的二维坐标、观察者当前朝向角(弧度角)、观察者椭圆视野的长轴(视野长度)、短轴(视野宽度)

返回值:过滤后的视野范围内的感知目标

实验五:实现对KD树K近邻搜索结果的通视性过滤。

输入:已生成的KD树、观察者的二维坐标、观察者当前朝向角(弧度角)、观察者椭圆视野的长轴(视野长度)、短轴(视野宽度)

返回值:过滤后的视野范围内的感知目标

二、实现思路

(一)KD树构建

算法1:递归算法进行KD树的构建

  1. 定义 KDTreeNode 类,包括属性 point, split, left 和 right。
  2. 定义函数 build_kdtree(points, depth=0),其中 points 是数据集,depth 表示当前递归深度。
  3. 如果数据集为空,返回 None。
  4. 获取数据点的维度 dimension。
  5. 计算以 depth 为 基础,切分数据点 k 维度的坐标轴 axis。
  6. 对数据点按照所选维度排序。
  7. 选择中位数作为分割点 median。
  8. 将排序后中位数左侧点集赋值给 left_points,右侧点集赋值给 right_points。
  9. 递归建立 KD 树,分别以 left_points 和 right_points 为数据集,depth+1 为当前递归深度调用 build_kdtree 函数,分别返回左子树和右子树。

 (二)K近邻查询

算法2:基于KD树的最(K)近邻查询

    1. 定义距离函数 distance(p1, p2) 计算两个点之间的距离

    2. 初始化 result 为空列表,用来存储搜索到的 k 个最近邻的节点

    3. 初始化 stack 为空列表,用来存储搜索路径上的节点

    4. 初始化 result_point 为空列表,用来存储搜索到的 k 个最近邻点的坐标

    5. stack 不为空或 root 不为空时执行:

        a. 如果 root 不为空:

            (1) root 入栈

              (2) 如果 point[root.split] < root.point[root.split],则将 root 更新为 root 的左子节点,否则将其更新为右子节点

        b. 否则,弹出栈中最上面的节点 node

           (1) 如果 result 列表长度小于 k,将 node 加入 result 列表

             (2) 否则,如果 node 节点和 point 之间的距离小于 result 列表中最远的节点与 point 之间的距离,则将 node 加入 result 列表,并删除结果列表中的最远节点

             (3) 如果 point 和超平面的距离小于 result 列表中最远节点与  point 的距离,将根据 root 的切分维度向另一侧递归搜索,即如果 point[root.split] < root.point[root.split],则将 root 更新为其右子节点,否则更新为其左子节点

      6. 返回 result_point

 (三)椭圆视野范围过滤

整体思路:先定义视野过滤的辅助函数 tar_in_ellipse(angle,point,tar,a,b) ,用于判断给定的目标点是否在椭圆视野内;然后定义视野过滤的主函数 constrain_elli(position,points,angle_hudu),其中,position 表示观测者的位置,points 是待过滤的目标点集合,angle_hudu 表示观测者朝向的角度(单位为弧度)。主函数利用视野过滤辅助函数 tar_in_ellipse(angle,point,tar,a,b) 对每一个目标点进行视野过滤,将过滤后的可见点和不可见点分别存入 cons 和 uncons 两个列表中,最终将可见点和不可见点分别绘制在椭圆上,实现视觉化观察。

算法3:椭圆范围视野过滤算法

1.定义视野过滤的辅助函数 tar_in_ellipse(angle,point,tar,a,b):

a)计算两个焦点的坐标和其他参数。

b)计算目标点到两个焦点的距离。

c)判断目标点是否在椭圆内,即到两焦点距离是否小于a+b。

d)如果在,返回True;否则返回False。

2.在视野过滤的主函数 constrain_elli(position,points,angle_hudu)中遍历目标点point,对每一个目标点都调用视野过滤辅助函数 tar_in_ellipse(angle,point,tar,a,b) 进行视野过滤,将过滤后的可见点和不可见点分别存入 cons 和 uncons 两个列表中。

3.绘制椭圆,并将可见点和不可见点分别绘制在椭圆上,实现视觉化观察。

最终返回可见点和不可见点两个列表。

(四)通视过滤

参考军事地形学里判定通视的公式是什么?一文的通视判定方法的通视判断方法:观目高差÷观目距离≥遮低高差÷遮低距离,这个不等式成立,观察点和目标点之间即可互相通视。

整体思路:先定义通视判断的辅助函数 visbal(position,tar),用于判断观察点与目标点之间是否存在障碍物。然后定义通视判断的主函数 constrain_visibal(position,points),其中 position 表示观测者的位置,points 是待过滤的目标点集合。遍历目标点 points,对每一个目标点都调用通视判断辅助函数 visbal(position,tar) 进行通视判断。将过滤后的可通视点和不可通视点分别存入 cons 和 uncons 两个列表中,并根据路径上的障碍物,绘制通视网格图,以验证通视判断的正确性。

算法4:椭圆范围视野过滤算法

1.  visbal 辅助函数:

   1)获取观察点和目标点之间经过的网格 (barriers)

2)获取观察点和目标点的高度 (height_position 和 height_tar)

3)判断观察点和目标点谁的高度低,并分别设置最低高度 (height_min) 和最低高度对应的坐标 (min_index)

4)计算观察点和目标点的高度差 (d1) 和距离 (d2)

5)遍历障碍物网格 (barriers):

a)获取障碍点高度 (height_barrier)

b)计算遮低高差 (d3) 和遮低距离 (d4)

c)如果通视条件不满足 (d1/d2 < d3/d4):结束函数返回vis

6)返回 True

2.  constrain_visibal 主函数:

1)初始化不透视点列表 (uncons)、透视点列表 (cons) 和通视障碍列表 (barriers)

2)遍历待检测点,调用 visbal 函数判断当前点与观察点之间是否通视:

a)如果通视,将当前点添加至透视点列表 (cons)

b)否则,将当前点添加至不透视点列表 (uncons) 和通视障碍列表 (barriers)

3)调用可视化函数绘制通视网格图

4)返回透视点列表 (cons) 和不透视点列表 (uncons).

其中judge_grid.py使用下文中的方法进行直线过网格点的判断。解决直线过网格问题_numpy_matplotlib_直线占用的网格_CarnivoreRabbit的博客-CSDN博客https://blog.csdn.net/horsee/article/details/124834283?spm=1001.2101.3001.6650.9&utm_medium=distribute.pc_relevant.none-task-blog-2~default~BlogCommendFromBaidu~Rate-9-124834283-blog-6425410.235%5Ev38%5Epc_relevant_anti_t3_base&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~BlogCommendFromBaidu~Rate-9-124834283-blog-6425410.235%5Ev38%5Epc_relevant_anti_t3_base&utm_relevant_index=13

 三、实验结果

(一)K近邻搜索及KD树

 (二)视野范围过滤

 (三)通视过滤

完整代码下载链接:https://pan.baidu.com/s/1o5k0NDJFS9YtJpHVxpdqxw?pwd=qt20 
提取码:qt20 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值