前言
上篇文章讲的是在栅格地图中实现A*算法的静态展示,本期文章实现动画的形式展示。
关于A*算法的基本原理和静态展示(附代码),想了解的朋友可以去看我的上篇文章。
A*算法的动态实现
1. 模块导入
from matplotlib.animation import FuncAnimation
在原来的基础上添加 from matplotlib.animation import FuncAnimation。
FuncAnimation
是一个非常有用的工具,用于创建动画,它通过在给定的图形对象上重复调用一个函数来实现动画效果。
2. A*算法函数和类
编写的函数和类与静态的时候一样,这里不做过多赘述。
3. 动画函数
# 初始化动画
def update(frame_number):
if frame_number < len(tmp):
# 将路径点设置为紫色
colored_map[tmp[frame_number].x][tmp[frame_number].y] = [255,0,255]
ax.clear()
ax.imshow(colored_map)
#设置网格和坐标轴
ax.set_xticks(np.arange(0.5, mapp.shape[0], 1))
ax.set_yticks(np.arange(0.5, mapp.shape[1], 1))
# 添加网格线,alpha 设置网格线的透明度
ax.grid(which='major', axis='both', linestyle='-', linewidth=1, color='k', alpha=0.5)
# 显示起点和终点
plt.scatter([start_x * 1], [start_y * 1], c='red', s=50) # 起点
plt.scatter([target_x * 1], [target_y * 1], c='blue', s=50) # 终点
else:
print("动画结束")
这里用if语句判断动画的显示,tmp代表算法寻路路径(由一串坐标点组成的列表,其中的每一个点表示一帧图像)。
tmp_tuples = [(position.x, position.y) for position in tmp]
print("tmp:",tmp_tuples)
将轨迹点的路径转换成坐标-列表的形式。
# 创建动画
ani = FuncAnimation(fig, update, frames=len(tmp), interval=100, repeat=False)
# 显示动画
plt.show()
4. 输出结果
tmp: [(0, 0), (1, 1), (2, 2), (3, 2), (4, 2), (5, 3), (6, 3), (7, 3), (8, 3), (9, 3), (10, 3), (11, 3), (12, 3), (13, 4), (14, 5), (15, 6), (15, 7), (15, 8), (15, 9), (15, 10), (15, 11), (16, 12), (17, 13), (18, 14), (19, 15), (19, 16), (19, 17), (19, 18), (19, 19)]
图像如下:
PS:后续我会更新基于A*算法的全覆盖路径规划,想了解的小伙伴欢迎前来!