import numpy as np
a = np.zeros((10,10))
startx = 1
starty = 1
endx = 7
endy = 8
如何在数组(startx, starty) -> (endx, endy)
上遮盖宽度为3
的行a
?有什么有效的方法吗?
答案 0 :(得分:1)
如果我正确理解了您的问题,那么您想要一个二进制掩码,该掩码可以跟在数组中任何类型的行后面。
通常使用Bresenham's line algorithm或其变体来解决这类问题。 基本算法是众所周知的,在这里再次展示/重新实现它毫无意义。
无论如何,可以在pymrt.geometry.bresenham_line()
中找到该算法的n维有效版本,其用法类似于:
import numpy as np
import pymrt as mrt
import pymrt.geometry
point_a = (1, 1)
point_b = (7, 8)
line_points = tuple(x for x in mrt.geometry.bresenham_line(point_a, point_b))
arr = np.zeros((10, 10))
for line_point in line_points:
arr[line_point] = 1
print(arr)
# [[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
# [ 0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]
# [ 0. 0. 1. 0. 0. 0. 0. 0. 0. 0.]
# [ 0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]
# [ 0. 0. 0. 0. 1. 1. 0. 0. 0. 0.]
# [ 0. 0. 0. 0. 0. 0. 1. 0. 0. 0.]
# [ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
# [ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
# [ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
# [ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]]
免责声明:我是PyMRT的主要作者。
或者,您可以考虑使用bresenham
Python软件包,它是一种高效的2D实现。