Fichier:DragonCurve animation.gif
De testwiki
Aller à la navigation
Aller à la recherche
DragonCurve_animation.gif (641 × 480 pixels, taille du fichier : 143 kio, type MIME : image/gif, en boucle, 29 trames, 17 s)
Ce fichier provient de Wikimedia Commons et peut être utilisé par d'autres projets. Sa description sur sa page de description est affichée ci-dessous.
Description
| DescriptionDragonCurve animation.gif |
Français : Construction de la courbe du dragon English: Dragon curve construction |
| Date | |
| Source | Travail personnel |
| Auteur | Guillaume Jacquenot |
Source code (MATLAB)
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;
Conditions d’utilisation
Moi, en tant que détenteur des droits d’auteur sur cette œuvre, je la publie sous la licence suivante :
Ce fichier est disponible selon les termes de la licence Creative Commons Attribution – Partage dans les Mêmes Conditions 3.0 Non Transposé.
- Vous êtes libre :
- de partager – de copier, distribuer et transmettre cette œuvre
- d’adapter – de modifier cette œuvre
- Sous les conditions suivantes :
- paternité – Vous devez donner les informations appropriées concernant l'auteur, fournir un lien vers la licence et indiquer si des modifications ont été faites. Vous pouvez faire cela par tout moyen raisonnable, mais en aucune façon suggérant que l’auteur vous soutient ou approuve l’utilisation que vous en faites.
- partage à l’identique – Si vous modifiez, transformez ou vous basez sur cet élément, vous devez distribuer votre contribution sous une license identique ou compatible à celle de l’original.
Légendes
Ajoutez en une ligne la description de ce que représente ce fichier
Éléments décrits dans ce fichier
dépeint
Valeur sans élément de Wikidata
10 juillet 2011
image/gif
Historique du fichier
Cliquer sur une date et heure pour voir le fichier tel qu'il était à ce moment-là.
| Date et heure | Vignette | Dimensions | Utilisateur | Commentaire | |
|---|---|---|---|---|---|
| actuel | 10 juillet 2011 à 21:57 | 641 × 480 (143 kio) | wikimediacommons>Gjacquenot | Reduce resolution |
Utilisation du fichier
Les 2 pages suivantes utilisent ce fichier :
