Картирование распространения паттерна (фрактал) - PullRequest
0 голосов
/ 07 июня 2019

По сути, я пытаюсь создать фрактальный паттерн, который расширяется от определенной точки в массиве, как показано на рисунке Фрактальный паттерн .Теперь, чтобы сделать это, я создал два файла: функциональный файл, который определяет, какие индексы мне следует изменить, и основной файл, который имеет дело с изменением этих значений индексов на единицу (другие функции, возможно, должны быть добавлены, поэтому причина, по которой я имеюдва файла).

Условия для фрактала:

- фрактал распространяется прямо на север, юг, восток и запад от исходного элемента.

- Элементы могут иметь только одинсосед.

Теперь давайте предположим, что я хочу создать фрактальный паттерн размером 60x60 и начальные значения которого равны (30,30). Для моего функционального файла в настоящее время у меня есть:

    function Fout = fractalfunc(inputmatrix)
for row = 1:60
    for col = 1:60 %go through matrix element by element
        if inputmatrix(row,col) == 1
            if inputmatrix(row-1,col)==0 && inputmatrix(row-1,col-1)==0 && inputmatrix(row-1,col+1)==0 %Checks North, NorthWest and NorthEast elements
              %Not sure what code should go here, trying to store my Fout
              %values in a nx2 matrix which essentially contains the indices
              %elements from the input matrix that need to be changed to 1.                
            end   
            if inputmatrix(row,col+1)==0 && inputmatrix(row-1,col+1)==0 && inputmatrix(row+1,col+1)==0 %Checks East, NorthEast and SouthEast elements
              %Not sure what code should go here, trying to store my Fout
              %values in a nx2 matrix which essentially contains the indices
              %elements from the input matrix that need to be changed to 1.    

            end
            if inputmatrix(row+1,col)==0 && inputmatrix(row+1,col-1)==0 && inputmatrix(row+1,col+1)==0 %Checks South, SouthWest and SouthEast elements 
              %Not sure what code should go here, trying to store my Fout
              %values in a nx2 matrix which essentially contains the indices
              %elements from the input matrix that need to be changed to 1.    

            end
            if inputmatrix(row,col-1)==0 && inputmatrix(row-1,col-1)==0 && inputmatrix(row+1,col-1)==0 %Checks West, NorthWest and SouthWest elements 
              %Not sure what code should go here, trying to store my Fout
              %values in a nx2 matrix which essentially contains the indices
              %elements from the input matrix that need to be changed to 1.    
            end
        end
    end
end
end

MyОсновной файл имеет:

dims = 60;
mat1 = zeros(dims,dims);
mat1(round(dims/2), round(dims/2)) = 1;
for m = 1:63 % Number of iterations through fractal
    changeindices = fractalfunc(mat1);



    for k = 1:length(changeindices)
        mat1(changeindices(k,1), changeindices(k,2)) = 1; % Change pixel to one

    end
    figure(2),colormap(jet(8)),image(mat1)
    pause(0.01) 
    %Show result (in the loop will look like animation)
end

Вещи, с которыми я борюсь:

- Выходные значения из определяемой пользователем функции должны быть электронной таблицей nx2, где они заполняются значениямиот определенных элементов индекса, которые удовлетворяют заявлениям IF.На самом деле не уверен, как это сделать, как, например, когда все пять моих операторов IF верны в строке = 30 и col = 30, тогда Fout = [29 30;30 31; 31 30; 30 29], и это фактически повторяет создание списка.

-Как перезапустить цикл, например, после того, как он достигнет первого 1 в (30,30), он обновитновые компоненты: север, восток, юг, запад, а затем я хочу, чтобы операторы if были выполнены для этих новых элементов, использующих шаблон для распространения.

Заранее спасибо :) (Я уже много писал, я знаю, что действительно новичок в MATLAB, любой совет приветствуется)

1 Ответ

0 голосов
/ 07 июня 2019

Вот одно из возможных решений, используя conv2 для обновления фрактальной матрицы и цикл while для обновления анимации.

% seed fractal
dims = 60;
mat1 = zeros(dims);
mat1(round(dims/2), round(dims/2)) = 1;

% initialize animation
h = imagesc(mat1); axis off tight
hax = h.Parent;
h_title = title(sprintf('Iteration %0.0f',0),'Parent',hax);

% step_idx : fractal iteration 
% k : convolution kernel
% y : change matrix
step_idx = 0;
k = [0,1,0; 1,1,1; 0,1,0];
is_changing = true;
while (is_changing)
    % increment counter
    step_idx = step_idx + 1;
    % compute change 
    y = ( conv2(h.CData, k, 'same') == 1 );
    % update fractal
    h.CData(y) = 1;
    % set framerate max ~30 fps
    h_title.String = sprintf('Iteration %0.0f', step_idx);
    drawnow(); pause(1/30);
    % determine if this frame is any different from the last frame
    is_changing = any(y(:));
end
...