function MLogo(Lname,opts) % MLogo(Lname,opts) % Lname = 'dragon', 'Hilbert', 'Gosper', or 'plant' % https://blogs.mathworks.com/cleve/2025/05/03 % Copyright, 2025, MathWorks arguments Lname string opts.maxlevel double opts.color double opts.start string = 'A' opts.delta double = 90 opts.dirstart double = 0 opts.shave logical = false end [Arule,Brule] = rules(Lname); [maxlevel,color,delta,start,dirstart,shave] = set_opts(Lname,opts); expd = @(dir) cosd(dir) + 1i*sind(dir); paws = @(p) pause(p); % paws = @(p) gif_frame; s = start; for level = 1:maxlevel stack = zeros(0,2); z = 0; dir = dirstart; sloop = s; s = ''; zees = zeros(0,1); for kase = sloop switch kase case 'A' s = [s Arule]; case 'B' s = [s Brule]; case 'F' % step z = z + expd(dir); zees = [zees, z]; s = [s 'F']; case '+' % turn right dir = dir + delta; s = [s '+']; case '-' % turn left dir = dir - delta; s = [s '-']; case '[' % push stack stack = [z dir; stack]; s = [s '[']; case ']' % pop stack z = stack(1,1); dir = stack(1,2); zees = [zees, z]; stack(1,:) = []; s = [s ']']; end end if shave zees = shaver(zees); end plotzees(zees,level,Lname,color) paws(1) end function [Arule,Brule] = rules(Lname) switch lower(Lname) case 'gosper' Arule = 'A+BF++BF-FA--FAFA-BF+'; Brule = '-FA+BFBF++BF+FA--FA-B'; case 'dragon' Arule = 'A+BF+'; Brule = '-FA-B'; case 'hilbert' Arule = '+BF-AFA-FB+'; Brule = '-AF+BFB+FA-'; case 'plant' Arule = 'AF[+AF]AF[-AF][AF]'; Brule = ''; end end function [maxlevel,color,delta,start,dirstart,shave] = ... set_opts(Lname,opts) switch lower(Lname) case 'gosper' opts.delta = 60; maxlevel = 5; color = gcaco(2); case 'dragon' maxlevel = 12; color = gcaco(4); case 'hilbert' maxlevel = 6; color = gcaco(1); case 'plant' opts.delta = -45; opts.dirstart = 90; maxlevel = 7; color = gcaco(5); otherwise error([Lname ' not recognized.']) end if isfield(opts,'delta'), delta = opts.delta; end if isfield(opts,'dirstart'), dirstart = opts.dirstart; end if isfield(opts,'shave'), shave = opts.shave; end if isfield(opts,'start'), start = opts.start; end if isfield(opts,'maxlevel'), maxlevel = opts.maxlevel; end if isfield(opts,'color'), color = opts.color; end end function plotzees(zees,level,Lname,color) shg plot(zees,'linewidth',2,'color',color) axis padded axis equal noticks box on title(sprintf('%s %d',Lname,level),'fontsize',14) end function u = shaver(z) % shaver(z), flatten sharp corners if ~isempty(z) u = z(1); for j = 2:length(z) u = [u z(j-1)+[1 9]/10*(z(j)-z(j-1))]; end u(end+1) = z(end); else u = z; end end end