- /
-
Barnsley Fern
on 23 Oct 2024
- 13
- 105
- 0
- 0
- 1343
Cite your audio source here (if applicable):
drawframe(1);
Write your drawframe function below
function drawframe(f)
nIter = 150000;
A = zeros(2, 2, 4);
A(:, :, 1) = [0.00, 0.00; 0.00, 0.16]; % Stem
A(:, :, 2) = [0.85, 0.04; -0.04, 0.85]; % Successively smaller leaflets
A(:, :, 3) = [0.20, -0.26; 0.23, 0.22]; % Largest left-hand leaflet
A(:, :, 4) = [-0.15, 0.28; 0.26, 0.24]; % Largest right-hand leaflet
b = [[0; 0], [0; 1.60], [0; 1.60], [0; 0.44]];
p = [0.01, 0.85, 0.07, 0.07];
fernArr = zeros(2, nIter+1);
rng(123);
for i = 1:nIter
eqIdx = randsample(1:4, 1, true, p);
prevPoint = fernArr(:, i);
newPoint = A(:, :, eqIdx) * prevPoint + b(:, eqIdx);
fernArr(:, i+1) = newPoint;
end
fernArr = fernArr';
% Fern Plotting
xlimStart = [-3, 3];
ylimStart = [0, 10];
xlimEnd = [0, 0.63];
ylimEnd = [0.46, 1.91];
% stepArr is 48 frames long.
stepArr = [1:9, 10:10:99, 100:100:999, 1000:1000,9999, linspace(10000, nIter, 19)];;
% Zooming takes 30 frames
numFrames = 30;
xlimArr = [linspace(xlimStart(1), xlimEnd(1), numFrames)',...
linspace(xlimStart(2), xlimEnd(2), numFrames)'];
ylimArr = [linspace(ylimStart(1), ylimEnd(1), numFrames)',...
linspace(ylimStart(2), ylimEnd(2), numFrames)'];
p = scatter(nan,nan, [], [0, 1, 0], 'filled');
set(gca,'Color','k');
set(gca,'YTickLabel',[]);
set(gca,'XTickLabel',[]);
hold on
xlim(xlimStart);
ylim(ylimStart);
hold off
if f <= length(stepArr)
pointNum = stepArr(f);
else
pointNum = stepArr(end);
end
p.XData = fernArr(1:pointNum, 1);
p.YData = fernArr(1:pointNum, 2);
if f <= length(stepArr)
limIdx = 1;
elseif f >= (length(stepArr) + height(xlimArr))
limIdx = height(xlimArr);
else
limIdx = f - length(stepArr);
end
xlim([xlimArr(limIdx, :)])
ylim([ylimArr(limIdx, :)])
end
Movie
Audio
This submission does not have audio.