网格上节点的相互可见性

时间:2019-07-06 14:58:44

标签: python-3.x graph grid

我有一个简单的网格,我需要检查两个节点是否相互可见。所有墙和节点的配合都是已知的。我需要检查两个节点的相互可见性。

我尝试使用向量,但没有得到可接受的结果。该算法可以工作,但是不适合我的程序,因此我必须对数据进行转换以获得可接受的结果。

我将此代码用于检查节点以实现相互可见性

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)])
  1. in_map-检查点是否不在国外地图边界;
  2. 开始,目标-元组宽度x和y坐标;
  3. cell_width,cell_height-带有节点宽度和高度(以像素为单位)的int变量(我将pygame用于可视化图)。

这种方法我没有任何问题,但是它不适用于图形,它可以“独立”工作,完全不是我需要的。我的英语不好,请原谅我:)

1 个答案:

答案 0 :(得分:1)

您发布的代码看起来非常不错, 而您的问题并不能说明需要改进的地方。

与其对向量进行FP算术, 您可能希望增加整数X或Y指针 一次一个像素。 考虑使用Bresenham's line algorithm, 枚举视线中的像素 在startgoal之间。 关键观察是对于给定的斜率 它会注意到X或Y的增加速度会更快, 并在该索引上循环。