【问题标题】:algorithm to create a circle in a 2D array EDIT: diamond would be okay aswel在二维数组中创建圆的算法编辑:钻石也可以
【发布时间】:2018-01-28 21:55:52
【问题描述】:

我在 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

我该怎么做?

【问题讨论】:

  • 这里的主要问题是,除非您的半径非常大或您的坐标包含小数,否则您无法靠近圆。
  • 如果半径足够大,例如25,我该怎么做,我只需要算法
  • 半径为 5 或 10 的圆在网格上会是什么样子?

标签: python arrays algorithm list geometry


【解决方案1】:

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

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))

这个输出

00000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000
00000000000000000000000001000000000000000000000000
00000000000000000001111111111111000000000000000000
00000000000000001111111111111111111000000000000000
00000000000000111111111111111111111110000000000000
00000000000001111111111111111111111111000000000000
00000000000111111111111111111111111111110000000000
00000000001111111111111111111111111111111000000000
00000000011111111111111111111111111111111100000000
00000000111111111111111111111111111111111110000000
00000001111111111111111111111111111111111111000000
00000001111111111111111111111111111111111111000000
00000011111111111111111111111111111111111111100000
00000111111111111111111111111111111111111111110000
00000111111111111111111111111111111111111111110000
00001111111111111111111111111111111111111111111000
00001111111111111111111111111111111111111111111000
00001111111111111111111111111111111111111111111000
00011111111111111111111111111111111111111111111100
00011111111111111111111111111111111111111111111100
00011111111111111111111111111111111111111111111100
00011111111111111111111111111111111111111111111100
00011111111111111111111111111111111111111111111100
00011111111111111111111111111111111111111111111100
00111111111111111111111111111111111111111111111100
00011111111111111111111111111111111111111111111100
00011111111111111111111111111111111111111111111100
00011111111111111111111111111111111111111111111100
00011111111111111111111111111111111111111111111100
00011111111111111111111111111111111111111111111100
00011111111111111111111111111111111111111111111100
00001111111111111111111111111111111111111111111000
00001111111111111111111111111111111111111111111000
00001111111111111111111111111111111111111111111000
00000111111111111111111111111111111111111111110000
00000111111111111111111111111111111111111111110000
00000011111111111111111111111111111111111111100000
00000001111111111111111111111111111111111111000000
00000001111111111111111111111111111111111111000000
00000000111111111111111111111111111111111110000000
00000000011111111111111111111111111111111100000000
00000000001111111111111111111111111111111000000000
00000000000111111111111111111111111111110000000000
00000000000001111111111111111111111111000000000000
00000000000000111111111111111111111110000000000000
00000000000000001111111111111111111000000000000000
00000000000000000001111111111111000000000000000000
00000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000

请注意,我特意使用了一个相当大的数组和半径 - 这样可以更好地实际看到圆。对于 5 左右的某个半径,它可能会被像素化,令人难以置信。

【讨论】:

  • 那么当你运行创建圆的函数时,x和cx,y和cy是否完全一样?
  • 因为当我运行这个时,我得到的只是一个平行图
  • 对不起,这可能是我的一些不清楚的命名。 cx 意指中心 x 坐标,cy 相同,for 循环中的 x 和 y 遍历位置。
  • 平行四边形?这很有趣..您是在运行我的所有代码,还是将其合并到您的代码中?
  • 我不小心在for循环中为cx和cy aswel使用了迭代变量
【解决方案2】:

如果出现以下情况,您必须将坐标设置为 1 ((x – h)(x - h)) + ((y – k)(y - k)) = r * r 是真的。 h 是中心 x 坐标,k 是中心 y 坐标。

【讨论】:

  • 例如,我将如何在 for 循环中实现这一点?
【解决方案3】:

受 Izaak 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)

【讨论】:

    猜你喜欢
    • 2019-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-01
    • 2012-08-27
    • 2013-11-22
    • 1970-01-01
    相关资源
    最近更新 更多