接着上一篇,我们继续讲解B*寻路算法,上一段的代码段,这节我们说一下方向向量,下一节我们对得到的路劲进行进一步优化,最终版的话,下面这段代码其实是没用的,根本不需要沿着障碍爬,但是基础的还是要一步步讲解的
# 返回爬墙路径 和 直线穿透障碍的第一个点,, 传入的是 当前点 {}字典信息 和 前进一步的障碍点坐标元祖 ()
# 点信息 为 {"point":(坐标),”direct“:(指向自己的向量(元祖)),其他自定义信息 }
def obstacle_path(self, cur, obstacle_point: tuple):
# 障碍前的点
temp_point = cur["point"]
# 获取指向终点的向量
direct=self.get_direct(temp_point)
while True:
# 传进来的点,沿着终点方向,穿透障碍,得到可以探索的第一个点 :地图内的任意两点连线都不可能穿过地图边界
end_point = temp_point[0] + direct[0], temp_point[1] + direct[1]
if map_be_search[end_point[0]][end_point[1]] == 0:
break
temp_point = end_point
end_info = {}
end_info["point"] = end_point
# end_info 的direct 需要攀爬过后才能知道
#--------穿透后的点已经好了
# 开始爬墙,先 把障碍周围所有可走的点拿到 为obstacle_path
obstacle_path=self.get_obstacle_path(obstacle_point)
# ----------------第一轮 攀爬-----------
# 这里是零时的 关闭表 ,实际上这里应该的全局关闭表
closeSet=[]
cur_grid = cur # 把传进来的那个点拿来用
while True:
closeSet.append(cur_grid)
# map_be_search[cur["point"][0]][cur["point"][1]] = 5
# print(map_be_search)
# time.sleep(0.5)
# 当前点已经是 穿透后的点了, !!!这里终点已经加入了closeSet 后面有用 !!
if cur_grid["point"] == end_point:
break
# 对当前格相邻的8格中的每一个
neighbors = self.get_neighbors(cur_grid["point"][0], cur_grid["point"][1])
next_point_info = {}
for neighbor in neighbors:
# 该邻居 在障碍周