Python:如何创建一个离散圆圈的子矩阵?

时间:2016-02-20 11:23:13

标签: python numpy multidimensional-array grid shapes

在一个充满zeros的二维方格(矩阵)中,我需要创建一个充满ones的子矩阵,该子矩阵的形状尽可能接近圆。我知道当你使用单元格或像素时,无法精确地表示圆圈,因此我的目标是离散圆圈。

我能想出的最好的东西是这个代码,它产生方形子矩阵(下图中的蓝色方块):

from __future__ import division 
import numpy
import matplotlib.pyplot as plt
import matplotlib.colors as mc
import random
import os
import math

n=101 #Grid size
empty_lattice=numpy.zeros((n,n)) #The empty 2D grid
x=int(numpy.random.uniform(0,n-1)) #X coord. top left corner
y=int(numpy.random.uniform(0,n-1)) #Y coord. top left corner
side=int(numpy.random.uniform(15,n)) #Side of the square approximating the circle
max_y=n-y #Checks the distance between the y of the submatrix origin and the matrix vertical boundary
max_x=n-x #Checks the distance between the x of the submatrix origin and the matrix horizontal boundary
max_width=0 #Initializes a maximum width for the loading submatrix
if max_y<max_x: #This assigns the minimum value between max_y and max_x to max_width, so that the submatrix is always a square
    max_width=max_y
else:
    max_width=max_x     
if side>max_width:
    for i in range(0,max_width):
        for j in range(0, max_width):
            empty_lattice[x+i][y+j]=1
else:
    for i in range(0, side):
        for j in range(0, side):
            empty_lattice[x+i][y+j]=1

现在,从视觉上看,这会转化为下面的图像,但是如您所知,蓝色方块和内切圆在面积方面存在明显差异: enter image description here

我的问题:我如何修改我的代码,以便能够“平滑”我的方块的角落,以便出现类似圆圈的东西?

修改

即使圆圈不完全位于网格边界内,也应该绘制圆圈(查看图像)。

1 个答案:

答案 0 :(得分:2)

这个函数填充了一个看起来很不错的1s圈。

def fill_cell(cell, corner, rad):
    m, n = cell.shape
    ctr = corner[0]+m/2, corner[1]+n/2
    x = np.arange(m) - ctr[0]
    y = np.arange(n) - ctr[1]
    X,Y = np.meshgrid(x, y, order='ij')  # could try order='xy'
    Z = ((X**2 + Y**2)<= rad**2).astype(cell.dtype)
    return Z
empty_lattice[:] = fill_cell(empty_lattice, (x,y),side/2)

empty_lattice中的位置不对 - 因为您定义x,y坐标和我的假设的方式不同,但我认为您可以对此进行排序。

半径看起来不错,但它可能会偏离整数。

要填写多个圈子,您可以迭代x,y值,然后 为切片(视图)指定晶格值

xyslice = slice(x,15), slice(y,15)
empty_lattice[xyslice] = fill_cell(empty_lattice[xyslice],...)

对于重叠的圈子,我会查看某种逻辑分配

empty_lattice[xyslice] |= fill_cell(...)