Как я могу исправить ошибку, сгенерированную моей проверкой прямой видимости? - PullRequest
0 голосов
/ 14 января 2020

Я использую алгоритм прямой видимости алгоритм для планирования пути , и я здесь проверяю его работу , но, как показано на рисунке ниже, проверка линии визирования дает неправильные результаты. черные плитки - это пути, которые проверяются прямой видимости, функция также должна проверять плитки на (1,1) , но это не так. Как я мог исправить эти ошибки?

Line_of_sight_test

Код python

import numpy as np
import matplotlib.pyplot as plt

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), (3,2)

def lineOfSight(p, s):
    x0 = p[0]
    y0 = p[1]
    x1 = s[0]
    y1 = s[1]

    dy = y1 - y0
    dx = x1 - x0
    f = 0

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

    result = []
    if dx >= dy:
        while x0 != x1:
            f = f + dy
            i1 = x0 + int((sx-1)/2)
            i2 = y0 + int((sy-1)/2)
            if f >= dx:
                result.append((i1,i2))
                y0 = y0 + sy
                f = f - dx
            if f != 0:
                result.append((i1,i2))
            if dy == 0:
                result.append((i1, y0))
                result.append((i1, y0-1))
            x0 = x0 + sx
    else:
        while y0 != y1:
            f = f + dx
            i1 = x0 + int((sx-1)/2)
            i2 = y0 + int((sy-1)/2)
            if f >= dy:
                result.append((i1, i2))
                x0 = x0 + sx
                f = f - dy
            if f != 0:
                print((i1, i2))
            if dx == 0:
                result.append((x0, i2))
                result.append((x0-1, i2))
            y0 = y0 + sy
    return result

check = lineOfSight(start,goal)

def getSquare(point):
    x = [point[1], point[1]+1]
    y0 = [-point[0], -point[0]]
    y1 = [-(point[0]+1), -(point[0]+1)]
    return (x,y0,y1)

checked = []
for xy in check:
    checked.append(getSquare(xy))

plt.plot(start[1], -start[0], 'sb', label="Start Point")
plt.plot(goal[1], -goal[0], 'sg', label="Goal Point")

maxRow = len(grid)
maxCol = len(grid[0])
listRow = [-i for i in range(maxRow+1)]
listCol = [i for i in range(maxCol+1)]
xHorizontal, yHorizontal = np.meshgrid(listCol, [[0],[-maxRow]])
yVertical, xVertical = np.meshgrid(listRow, [[0],[maxCol]])
plt.plot(xHorizontal, yHorizontal, color='black')
plt.plot(xVertical, yVertical, color='black')

for square in checked:
    x, y0, y1 = square
    plt.fill_between(x,y0,y1, color='black')

plt.plot([start[1], goal[1]], [-start[0], -goal[0]], '-g')

plt.axis('equal')
plt.show()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...