考虑一个矩形网格。
我想要一种简短而优雅的方式来生成从[x0,y0]
到[x1,y1]
的直线路径,其中x0=x1
或y0 = y1
。
例如,在输入[1,3], [3,3]
上,应生成输出[[1,3],[2,3],[3,3]
。同样,如果输入是[3,3], [1,3]
。
我尝试了[[i,j] for i in range(self.origin[0],self.end[0]+1) for j in range(self.origin[1], self.end[1]+1)]
,但它仅适用于订购输入的情况。
答案 0 :(得分:3)
您的问题指出x -> y
的解决方案应与解决方案y -> x
相同,即我们只对定义路径上的点感兴趣,而不是对这些点的任何排序感兴趣。如果这是真的,那么只需找出哪个路径具有较小的x
(或y
)并将其指定为原点。
origin = (3,3)
dest = (1,3)
origin, dest = sorted([origin, dest])
path = {(i,j) for i in range(origin[0], dest[0]+1) for j in range(origin[1], dest[1]+1)}
# note that this is now a set comprehension, since it doesn't make any sense
# to use a list of unique hashable items whose order is irrelevant
当然,这解决了任何无阻碍的二维寻路。如果您知道只有一个方向在变化,那么只能朝那个方向看。
origin, dest = sorted((origin, dest))
if origin[0] == dest[0]: # y is changing
path = {(origin[0], j) for j in range(origin[1], dest[1]+1)}
else: # x is changing
path = {(i, origin[1]) for i in range(origin[0], dest[0]+1)}
答案 1 :(得分:1)
将步骤参数添加到您的范围,从而获得开始和放大的符号。结束差异:
x_dir = copysign(1, self.end[0] - self.origin[0])
... for i in range(self.origin[0], self.end[0]+1, x_dir) ...
同样为y方向做。