File:DragonCurve animation.gif

From Wikimedia Commons, the free media repository
Jump to navigation Jump to search

DragonCurve_animation.gif(641 × 480 pixels, file size: 143 KB, MIME type: image/gif, looped, 29 frames, 17 s)

Captions

Captions

Add a one-line explanation of what this file represents

Summary[edit]

Description
Français : Construction de la courbe du dragon
English: Dragon curve construction
Date
Source Own work
Author Guillaume Jacquenot

Source code (MATLAB)[edit]

function S = DragonCurve(pattern,MaxRecursionLevel)
% DRAGONCURVE
% This function generates a fractal curve called the dragon curve.
%
% A dragon curve is any member of a family of self-similar fractal curves,
%   which can be approximated by recursive methods such as Lindenmayer
%   systems.
%
% Inputs :
%  - pattern           : [Optional] Vector of complex that contain linear
%                        transformation to apply to each line segment
%  - MaxRecursionLevel : [Optional] Maximum recusrion level
%                        Remember each time a new level is added, the
%                        number of line segments is doubled
%  - options           : [Optional] Structure with display option
%
% Outputs :
%   - S : Structure that contains the line segment for each recursion level
%         Just enter "plot(S(end).LineSeg,'k');" to plot the finest level
%         generated
%
% See http://en.wikipedia.org/wiki/Dragon_curve
%
% 2011/07/10
% Guillaume Jacquenot
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if nargin < 3
    options.plot                = true;
    options.generateGIFAnimate  = true;
    options.plotConvergence     = false;
    if nargin < 2
        MaxRecursionLevel = 15;
        if nargin < 1
            pattern(1)     = 0.5 * (1+1i);
            pattern(2)     = 0.5 * (1-1i);
        end
    end
end

S(MaxRecursionLevel) = struct('LineSeg',[]);
npat = numel(pattern);
S(1).LineSeg = [0;pattern(1:(npat-1));1];
for level = 2:MaxRecursionLevel;
    delta = diff(S(level-1).LineSeg);
    S(level).LineSeg = zeros(npat^level+1,1);
    S(level).LineSeg(1:npat:end) = S(level-1).LineSeg;
    S(level).LineSeg(2:4:end-3)  = ...
            S(level-1).LineSeg(1:2:end-2) + delta(1:2:end-1) * pattern(1);
    S(level).LineSeg(4:4:end-1)  = ...
            S(level-1).LineSeg(2:2:end-1) + delta(2:2:end  ) * pattern(2);
end

if options.plot || options.generateGIFAnimate
    BBox = determineBoundingBox(S);
    plotDragonCurve(S,BBox);
end

if options.generateGIFAnimate
    cmd = generateGIFAnimationCommand(MaxRecursionLevel);
    eval(cmd);
end

if options.plotConvergence
    plot_Convergence_Evolution(S);
end
return;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function plotDragonCurve(S,BBox)
figure('Color','w');
hold on
box on
axis off
MaxRecursionLevel = numel(S);
for level=1:MaxRecursionLevel
    hp=plot(S(level).LineSeg,'k');
    axis equal
    axis(BBox);
    saveas(gcf,[mfilename '_' sprintf('%03d',level)],'png');
    saveas(gcf,[mfilename '_' sprintf('%03d',level)],'jpg');
    plot2svg([mfilename '_' sprintf('%03d',level) '.svg']);
    pause(0.5);
    delete(hp);
end
plot(S(end).LineSeg,'k');
return;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function BBox = determineBoundingBox(S,proportionalOffset)
if nargin==1
    proportionalOffset = 0.1;
end
BBox    = zeros(1,4);
BBox(1) = min(real(S(end).LineSeg));
BBox(2) = max(real(S(end).LineSeg));
BBox(3) = min(imag(S(end).LineSeg));
BBox(4) = max(imag(S(end).LineSeg));
dBBoxX = BBox(2)-BBox(1);
dBBoxY = BBox(4)-BBox(3);
BBox = BBox + proportionalOffset * [-dBBoxX dBBoxX -dBBoxY dBBoxY];
return;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function plot_Convergence_Evolution(S)
figure
hold on
box on
title('Evolution of the length of the curve with the number of levels');
xlabel('Level');
ylabel('Log of the length');
MaxRecursionLevel = numel(S);
lengthCurve = zeros(1,MaxRecursionLevel);
for level=1:MaxRecursionLevel
    lengthCurve(level) = sum(abs(diff(S(level).LineSeg)));
end
plot(log2(lengthCurve));
grid on
return;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function cmd = generateGIFAnimationCommand(MaxRecursionLevel)
cmd = '!convert -antialias -density 100 -delay 60 ';
for level =[1:1:MaxRecursionLevel MaxRecursionLevel-1:-1:1]
    cmd = [cmd mfilename '_' sprintf('%03d',level) '.png '];
end
cmd = [cmd mfilename '.gif'];
return;
 
This diagram was created with MATLAB.

Licensing[edit]

I, the copyright holder of this work, hereby publish it under the following license:
w:en:Creative Commons
attribution share alike
This file is licensed under the Creative Commons Attribution-Share Alike 3.0 Unported license.
You are free:
  • to share – to copy, distribute and transmit the work
  • to remix – to adapt the work
Under the following conditions:
  • attribution – You must give appropriate credit, provide a link to the license, and indicate if changes were made. You may do so in any reasonable manner, but not in any way that suggests the licensor endorses you or your use.
  • share alike – If you remix, transform, or build upon the material, you must distribute your contributions under the same or compatible license as the original.

File history

Click on a date/time to view the file as it appeared at that time.

Date/TimeThumbnailDimensionsUserComment
current20:57, 10 July 2011Thumbnail for version as of 20:57, 10 July 2011641 × 480 (143 KB)Gjacquenot (talk | contribs)Reduce resolution
20:25, 10 July 2011Thumbnail for version as of 20:25, 10 July 20111,201 × 901 (401 KB)Gjacquenot (talk | contribs)Reduce bounding box
16:12, 10 July 2011Thumbnail for version as of 16:12, 10 July 20111,201 × 901 (259 KB)Gjacquenot (talk | contribs)

The following page uses this file:

File usage on other wikis

The following other wikis use this file: