我有一个简单的网格,我需要检查两个节点是否相互可见。所有墙和节点的配合都是已知的。我需要检查两个节点的相互可见性。
我尝试使用向量,但没有得到可接受的结果。该算法可以工作,但是不适合我的程序,因此我必须对数据进行转换以获得可接受的结果。
我将此代码用于检查节点以实现相互可见性
def finding_vector_grid(start, goal):
distance = [start[0]-goal[0], start[1]-goal[1]]
norm = math.sqrt(distance[0] ** 2 + distance[1] ** 2)
if norm == 0: return [1, 1]
direction = [(distance[0]/norm), (distance[1]/norm)]
return direction
def finding_vector_path(start, goal):
path = [start]
direction = finding_vector_grid((start[0]*cell_width, start[1]*cell_height),
(goal[0]*cell_width, goal[1]*cell_height))
x, y = start[0]*cell_width, start[1]*cell_height
point = start
while True:
if point not in path and in_map(point):
path.append(point)
elif not in_map(point):
break
x -= direction[0]
y -= direction[1]
point = (x//cell_width, y//cell_height)
return path
def vector_obstacles_clean(path, obstacles):
result = []
for node in path:
if node in obstacles:
result.append(node)
break
result.append(node)
return result
例如:
path = finding_vector_path((0, 0), (0, 5))
path = vector_obstacles_clean(path, [(0, 3)])
这种方法我没有任何问题,但是它不适用于图形,它可以“独立”工作,完全不是我需要的。我的英语不好,请原谅我:)
答案 0 :(得分:1)
您发布的代码看起来非常不错, 而您的问题并不能说明需要改进的地方。
与其对向量进行FP算术,
您可能希望增加整数X或Y指针
一次一个像素。
考虑使用Bresenham's line algorithm,
枚举视线中的像素
在start
和goal
之间。
关键观察是对于给定的斜率
它会注意到X或Y的增加速度会更快,
并在该索引上循环。