您可以提供一种在任意位置和半径的网格中绘制圆形(ish)形状的高效算法吗?Python在网格上绘制填充的“圆”
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . o O o . . . . . . . . . . . . . . . . . . . .
. . . . O O O O O . . . . . . . . . . . . . . . . . . .
. . . o O O O O O o . . . . . . . . . . . . . . . . . .
. . . O O O O O O O . . . . . . . . . . o O o . . . . .
. . . o O O O O O o . . . . . . . . . o O O O o . . . .
. . . . O O O O O . . . . . . . . . . O O O O O . . . .
. . . . . o O o . . . . . . . . . . . o O O O o . . . .
. . . . . . . . . . . . . . . . . . . . o O o . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
我用这个进行寻路。它是更精细解析的图形领域的较低分辨率抽象。这些形状可以作为避免的块。
请记住,我希望能够使用它来快速索引块所在的二维数组。
score = self.map[x][y]
所以, “画出” 圈子将是类似的设定值可以阻止:
self.map[x][y] = PATH_COST_PROX1
绘制现场看起来是这样的:
def printme(self):
""" Print the map to stdout in ASCII."""
for y in reversed(range(self.ymax)):
for x in range(self.xmax):
if self.map[x][y] >= PATH_COST_PROX0:
print 'O',
elif self.map[x][y] >= PATH_COST_PROX1:
print 'o',
else:
print '.',
print ''
编辑:这是我原来的(可耻的)企图。我在网格上手工制作了圆圈,并且只记录了每次增加半径后添加的点数。这不是一个可怕的想法,但接受的答案更加优雅。
COVER_MAP = [
[(0,0)],
[(0,1),(1,0),(0,-1),(-1,0)],
[(1,1),(1,-1),(-1,-1),(-1,1)],
[(0,2),(2,0),(0,-2),(-2,0)],
[(1,2),(2,1),(2,-1),(1,-2),(-1,-2),(-2,-1),(-2,1),(-1,2)],
[(0,3),(2,2),(3,0),(2,-2),(0,-3),(-2,-2),(-3,0),(-2,2)],
[(1,3),(3,1),(3,-1),(1,-3),(-1,-3),(-3,-1),(-3,1),(-1,3)]
]
def set_blocked(self, p, radius):
"""
Set the blocked state of a coordinate. Takes an integer value that
represents the cost of the block
"""
#radius = radius * 2
if radius > len(COVER_MAP)-1:
radius=len(COVER_MAP)-1
#print "point:",p," radius:",radius
(cx,cy) = p
for i in range(len(COVER_MAP)):
for j in range(len(COVER_MAP[i])):
(rx,ry) = COVER_MAP[i][j]
x = cx + rx
y = cy + ry
if x >= 0 and x < self.xmax and y >= 0 and y < self.ymax:
if i < radius:
self.map[x][y] = PATH_COST_PROX0
elif i == radius:
self.map[x][y] = PATH_COST_PROX1
elif i == radius + 1:
self.map[x][y] = PATH_COST_PROX2
elif i == radius + 2:
self.map[x][y] = PATH_COST_PROX3
elif i == radius + 3:
self.map[x][y] = PATH_COST_PROX4
煤矿确实有能够使周围原来的圈子,这东西的记忆算法下面没有,但可以适用于提供减少成本的模糊环的优势。
你试过了什么?您可能想要提供一个最小代码示例http://www.sscce.org/ –
[尝试Bresenham的算法](http://en.wikipedia。org/wiki/Midpoint_circle_algorithm),[这个SO帖子讨论如何将它扩展到实心圆](http://stackoverflow.com/questions/1201200/fast-algorithm-for-drawing-filled-circles) – Kevin
你可以使用Numpy ? – YXD