您可以提供一種在任意位置和半徑的網格中繪製圓形(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