从每个中心创建一个距离为2半径的2D圆阵列

时间:2018-02-27 13:20:48

标签: arrays matlab

我目前正致力于制作一个NxN圆圈阵列,其中N> 0,在1024 x 1024网格网格内具有不同的圆半径。 n_circles定义数组中的圆数,R是半径。我使用了一个repmat函数来复制数组,具体取决于我选择的圆圈数。这是我的代码:

n_circles = 4                    % Define the number of circles to be plotted                               
n0 = round(1024/n_circles); % Define the size of the basic mask
M0 = zeros(n0);             % Initialize the basic mask
I = 1:n0;             % Define the x and y coordinates of the basic mask
x = I - n0/2;
y = n0/2 - I;
[X,Y] = meshgrid(x,y);      % Create the mask
R = 4;                      % Define the radius of the basic circle

% Get the indices of the points inside the basic circle
A = (X.^2 + Y.^2 <= R^2);   
M0(A) = 1;                           % Set basic mask
% Replicate basic mask according to the number of circles to be plotted
M=repmat(M0,n_circles,n_circles); 
M(2^10,2^10) = 0;                    % zerofill the rest of the matrix

figure(1)
imagesc(M)
daspect([1 1 1])

imwrite(M,[num2str(n_circles),'array.bmp'])

问题是圆圈没有相互接触,即当我复制它们时,它们彼此相距很远。我需要生成一个彼此接触的圆形2D阵列,半径设置为低值。我在下面附上了一张图片来说明我的担忧。

enter image description here

因此在图片中,圆圈距离它们的中心距离为2半径,圆圈的半径非常小,使得整个2D圆阵列小于整个网格。有人可以帮忙吗?感谢。

1 个答案:

答案 0 :(得分:3)

  • 第1步:我们创建一个“掩码”并获取其中的索引。请注意,我们通过调用[xx,yy]将其另存为ind2sub,因此[x0+xx-R,y0+yy-R]将是具有中心[x0,y0]的圈子的索引。
  • 第2步:找出圆圈的中心,我们可以调用sub2ind(size(M),MidX+xx-R,MidY+yy-R)来获取它的真实索引。(看起来很奇怪,但我只是这样等待更好的答案。)
  • 第3步:使用for循环生成M中的所有圈子。

请注意,如果n_circle 奇数,我们应该做一些数学运算并稍微移动圆圈的中心,以便将所有圆圈保持在图片的中间。

clc; clear;
n_circles = 4;                    % Define the number of circles to be plotted
R = 4;                      % Define the radius of the basic circle
Len=400;
M=zeros(Len);               % Create the hole mask

% Get the indices of the points inside the basic circle
M0 = zeros(2*R+1);             % Initialize the basic mask
I = 1:(2*R+1);             % Define the x and y coordinates of the basic mask
x = (I - R)-1;
y = (R - I)+1;
[X,Y] = meshgrid(x,y);      % Create the mask
A = (X.^2 + Y.^2 <= R^2);   
[xx,yy]=ind2sub(size(M0),find(A == true)); 


%plot
for ii=1:n_circles
    for jj=1:n_circles
      MidX=Len/2+(ii-n_circles/2-0.5)*(2*R);
      MidY=Len/2+(jj-n_circles/2-0.5)*(2*R);
%       [MidX MidY]
      M(sub2ind(size(M),MidX+xx-R-1,MidY+yy-R-1))=1;
    end
end
figure(1)
imshow(M)

输出图像是:

enter image description here

希望它有所帮助!