在2D数组编辑中创建圆的算法:diamond可以作为

2024-10-01 19:24:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我在python中有一个2D表示一个平铺贴图,数组中的每个元素都是1或0,0表示陆地,1表示水。我需要一个算法,取2个随机坐标作为圆心,一个半径(最大5)的变量,并替换数组中必要的元素来形成一个完整的圆。在

x = random.randint(0,MAPWIDTH)
y = random.randint(0,MAPHEIGHT)
rad = random.randint(0,5)

tileMap[x][y] = 1 #this creates the center of the circle

我该怎么做?在


Tags: the算法元素半径random数组this平铺
3条回答

如前所述,可以使用圆的定义,如下所示:

import math

def dist(x1, y1, x2, y2):
    return math.sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2)

def make_circle(tiles, cx, cy, r):
    for x in range(cx - r, cx + r):
        for y in range(cy - r, cy + r):
            if dist(cx, cy, x, y) <= r:
                tiles[x][y] = 1

width = 50
height = 50

cx = width // 2
cy = height // 2
r = 23

tiles = [[0 for _ in range(height)] for _ in range(width)]

make_circle(tiles, cx, cy, r)

print("\n".join("".join(map(str, i)) for i in tiles))

这个输出

^{pr2}$

请注意,我故意使用了一个相当大的数组和半径-这使得实际上能够更好地看到圆。对于半径为5的区域,它可能会被像素化。在

你必须将坐标设置为1如果 ((x – h)(x - h)) + ((y – k)(y - k)) = r * r为真。 h是中心x坐标,k是中心y坐标。在

灵感来自Izak van Dongen,只是重新设计了一点:

from pylab import imshow, show, get_cmap
from numpy import random
import math

def dist(x1, y1, x2, y2):
    return math.sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2)

def make_circle(tiles, cx, cy, r):
    for x in range(cx - r, cx + r):
        for y in range(cy - r, cy + r):
            if dist(cx, cy, x, y) < r:
                tiles[x][y] = 1
    return tiles

def generate_image_mask(iw,ih,cx,cy,cr):

    mask = [[0 for _ in range(ih)] for _ in range(iw)]
    mask = make_circle(mask, cx, cy, cr)
    #print("\n".join("".join(map(str, i)) for i in mask))
    imshow(mask, cmap=get_cmap("Spectral"), interpolation='nearest')
    show()

if __name__ == '__main__':

    image_w = 60
    image_h = 60
    circle_x = image_w/2
    circle_y = image_h/2
    circle_r = 15

    generate_image_mask(image_w,image_h,circle_x,circle_y,circle_r)

相关问题 更多 >

    热门问题