Как создать этот конкретный фрактальный паттерн в MATLAB? - PullRequest
1 голос
/ 16 мая 2019

Мне нужно сделать массив нулей и единиц в этом конкретном фрактальном паттерне:

0 0 0 0 0 1 0 0 0 0 0 0
0 0 1 1 1 1 1 1 1 0 0 0
0 1 0 0 0 1 0 0 0 1 0 0
0 1 0 0 1 1 1 0 0 1 0 0
0 1 0 1 0 1 0 1 0 1 0 0
1 1 1 1 1 1 1 1 1 1 1 1
0 1 0 1 0 1 0 1 0 1 0 0
0 1 0 0 1 1 1 0 0 1 0 0
0 1 0 0 0 1 0 0 0 1 0 0
0 0 1 1 1 1 1 1 1 0 0 0
0 0 0 0 0 1 0 0 0 0 0 0
0 0 0 0 0 1 0 0 0 0 0 0

Фактический массив должен быть 100 x 100. Узор должен начинаться со средней (x, y) координатыи разверните, чтобы он выглядел как шаблон (с использованием циклов).

До сих пор мне удалось создать шаблон, который выглядит как знак «+».Я не уверен, как его продолжить.

Это мой код:

n = zeros(16); % using 16x16 array for practice
x = length(n)/2;
y = length(n)/2;
z = length(n) - 1;

xso = length(n)/2; % x axis south movement
xno = length(n)/2; % x axis north movement
yea = length(n)/2; % y axis east movement
ywe = length(n)/2; % y axis west movement

for i = 1:1:z
        newyea = move('east', x, yea);
        n(x, newyea) = 1;
        yea = newyea;

        newywe = move('west', x, ywe);
        n(x, newywe) = 1;
        ywe = newywe;

        newxso = move('south', xso, y);
        n(newxso, y) = 1;
        xso = newxso;

        newxno = move('north', xno, y);
        n(newxno, y) = 1;
        xno = newxno;
end

У меня также есть определенная пользователем функция:

function newval = move(dir, x, y)

switch dir
    case 'east'
        newval = y + 1;
    case 'west'
        newval = y - 1;
    case 'south'
        newval = x + 1;
    case 'north'
        newval = x - 1;
end

1 Ответ

1 голос
/ 17 мая 2019

Поскольку не было никаких ограничений на внешний вид цикла, я бы предложил следующее решение.Но, прежде, давайте посмотрим на ваш данный пример:

Given example

Либо вы должны ограничить желаемое измерение d нечетным, то есть d = 11, 13, 15, ... или вы должны указать, как шаблон должен быть продолжен в случае четного измерения d, как здесь d = 12.Для моего решения я решил, что размер d будет нечетным.

Вот код:

d = 15;                 % Dimension

A = zeros(d);           % Initialize output array A

c = (d + 1) / 2;        % Calculate center index (row, column)

A(:, c) = 1;            % Add: Cross 
A(c, :) = 1;

J = 0;                  % Auxiliary index
for I = (c+2):2:d       % For every second row (or column) from center to border
  J = J + 1;             
  l = 4 * J - 1;        % Calculate length of line to draw
  s = c - (l-1)/2;      % Calculate start point of line
  e = c + (l-1)/2;      % Calculate end point of line
  A(I, s:e) = 1;        % Add: "South" line
  A(s:e, I) = 1;        % Add: "East" line
  A(c - 2*J, s:e) = 1;  % Add: "North" line
  A(s:e, c - 2*J) = 1;  % Add: "West" line
end

figure(1);              % Show image
imagesc(A);

Выход для d = 15 (для сравнения с данным примером):

Output for d = 15

Выход для d = 99:

Output for d = 99

Надеюсь, чтопомогает!

Если у вас есть более строгие ограничения на цикл for, сообщите мне / нам.Затем я попытаюсь изменить свой код соответствующим образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...