Как он проверяет линию визирования между двумя точками? Любое пояснение к этой реализации ниже, пожалуйста? - PullRequest
0 голосов
/ 30 марта 2020

Я новичок в Python, развиваю себя с одной стороны и пытаюсь завершить sh мой проект с другой стороны. Я пытаюсь работать с алгоритмом нахождения пути, который проверяет линию прямой видимости между двумя точками, ниже приведена реализация этого алгоритма, но я не очень хорошо понял поведение этого кода.

Код для алгоритма прямой видимости для проверки между двумя точками, видны ли они друг другу или нет. Любое уточнение, пожалуйста, для его работы? Могу я получить разъяснения по коду, пожалуйста?

grid = [[0,0,0,0,0,0,0,0],
        [0,1,1,0,0,1,1,0],
        [0,0,0,0,0,0,0,0],
        [0,1,1,0,0,1,1,0],
        [0,0,0,0,0,0,0,0]]
#start, goal = (0,0),(4,3)
start, goal = (0,0),(4,3)

def los(start, goal):
    x0, y0 = start
    x1, y1 = goal

    dy = y1 - y0
    dx = x1 - x0

    if dy < 0:
        dy = -dy
        sy = -1
    else:
        sy = 1

    if dx < 0:
        dx = -dx
        sx = -1
    else:
        sx = 1

    f = 0
    result = []

    if dx >= dy:
        while x0 != x1:
            f = f + dy

            if f >= dx:
                result.append((x0+(sx-1)/2, y0+(sy-1)/2))
                y0 = y0 + sy
                f = f - dx
            if f != 0:
                result.append((x0+(sx-1)/2, y0+(sy-1)/2))
            if dy == 0:
                a = (x0+(sx-1)/2, y0)
                b = (x0+(sx-1)/2, y0-1)
                result.extend((a, b))
            x0 = x0 + sx
    else:
        while y0 != y1:
            f = f + dx

            if f >= dy:
                result.append((x0+(sx-1)/2, y0+(sy-1)/2))
                x0 = x0 + sx
                f = f - dy
            if f != 0:
                result.append((x0+(sx-1)/2, y0+(sy-1)/2))
            if dx == 0:
                a = (x0, y0+(sy-1)/2)
                b = (x0-1, y0+(sy-1)/2)
                result.extend((a, b))

            y0 = y0 + sy
    return result


check = los(start,goal)
print(check)
...