получить список точек по диагонали между 2 точками в списке Python 2D - PullRequest
0 голосов
/ 09 мая 2019

Для данного квадратного двумерного списка, скажите:

foo2d = [
[1, 1, 1, 1, 3],
[1, 3, 0, 3, 4],
[1, 1, 1, 1, 3],
[1, 3, 0, 2, 4],
[1, 3, 1, 3, 4]
]

Я бы хотел список диагоналей от (0, 1) (foo2d[1][0]) до диагональной точки от него, (2,3) (foo2d[3][2]).Таким образом, в приведенном выше списке игрушек возвращаемый список должен быть: [1, 0, 1]

Я попытался воспользоваться тем фактом, что наклон этой линии равен 1 (или -1), поэтому элемент в спискедолжно удовлетворять:

     pointY - startY
abs(-----------------) == 1
     pointX - startX

и находиться между минимумом x и максимумом x.У меня нет реализации кода, потому что а) он все сломал и б) мой компьютер сломался, когда я сохранял файл, что вынудило меня вернуться к резервной копии git, которая не содержала этот код.

Есливам это нужно, я могу попробовать написать псевдокод для этого поведения.Спасибо за любые мысли, которые вы можете дать мне с этим вопросом!

1 Ответ

1 голос
/ 09 мая 2019

Если наклон линии может быть только 1 или -1, вы можете попробовать это:

def get_diagonal_points(matrix, start_x, start_y, end_x, end_y):
    # make start_x <= end_x, if you don't need to check, remove this line
    if start_x > end_x:
        start_x, start_y, end_x, end_y = end_x, end_y, start_x, start_y

    result = []
    slope = (end_y - start_y) // (end_x - start_x)
    for i, j in zip(range(start_x, end_x), range(start_y, end_y, slope)):
        result.append(matrix[i][j])
    result.append(matrix[end_x][end_y])  # add end point
    return result

тест и вывод:

foo2d = [
[1, 1, 1, 1, 3],
[1, 3, 0, 3, 4],
[1, 1, 1, 1, 3],
[1, 3, 0, 2, 4],
[1, 3, 1, 3, 4]
]
print(get_diagonal_points(foo2d, 0, 1, 2, 3))
# [1, 0, 1]
print(get_diagonal_points(foo2d, 0, 4, 3, 1))
# [3, 3, 1, 3]
print(get_diagonal_points(foo2d, 3, 1, 0, 4))
# [3, 3, 1, 3]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...