Illusion d’optique : spirale de Fraser

Auteur ou autrice : Jean-Michel Sarlat.

Mise en ligne le 4 décembre 2023

Image du résultat de l’exemple

Une illusion qui tient à peu de chose. Bien que composée de cercles concentriques, l'image donne l'impression d'une spirale sans fin. Ceci est dû au fait que des motifs réguliers (les cercles) sont combinés avec un motif non aligné (les bandes de couleur).

Exemple publié initialement sur le site Syracuse.

Code


% JMS - 5 juillet 2003 - Spirale de Fraser 
% Voir : Les illusions des sens - Pour la Science avril/juin 2003
%        Page 38 (illusions géométriques)
% ===============================================================

% unité
u = 15;      

% rayon - la valeur 1.17 est une approximation de la solution
% de l'équation : x - 1 = Pi/20 * sqrt(x) qui permet d'obtenir des 
% dalles proches d'un carré.
def r(expr x) =
    mexp(x * mlog(1.17))
enddef;

% épaisseur des couronnes blanc/noir
def e(expr x) =
    1 + 0.4 * r(x)
enddef;

% point du dallage
def p(expr x,y) =
    u*r(y)*(cosd(x*9),sind(x*9))
enddef;

% point inférieur d'une couronne
def ti(expr x,y) =
    (u*r(y) - (e(y)/2))*(cosd(x*9),sind(x*9))
enddef;
% point inférieur intermédiaire d'une couronne
def tii(expr x,y) =
    (u*r(y) - (e(y)/4))*(cosd(x*9),sind(x*9))
enddef;
% point supérieur d'une couronne
def ts(expr x,y) =
    (u*r(y) + (e(y)/2))*(cosd(x*9),sind(x*9))
enddef;
% point supérieur intermédiaire d'une couronne
def tsi(expr x,y) =
    (u*r(y) + (e(y)/4))*(cosd(x*9),sind(x*9))
enddef;

% cadre de la figure
path cadre;
cadre = ((-1,-1)--(-1,1)--(1,1)--(1,-1)--cycle) scaled (u*r(18));


beginfig(1);

 fill cadre withcolor red+green;

 for i:=9 upto 21:
    for j:=0 upto 40:
     fill p(j,i+0.05) -- p(j+0.45,i+0.5) -- 
          p(j,i+0.95) -- p(j-0.45,i+0.5) -- cycle
          withcolor red;
    endfor;
 endfor;

 for i:=9 upto 21:
    for j:=0 step 2 until 40:
     jj := if i mod 2 = 0: j else: j-1 fi;
     fill p(jj+0.5,i-0.45) -- p(jj+0.95,i) -- 
          p(jj+0.5,i+0.45) -- p(jj+0.05,i) -- cycle
          withcolor .6 * blue;
    endfor;
    draw fullcircle scaled (2*u*r(i))
         withpen pencircle scaled (e(i))
         withcolor white;
    for j:=0 step 2 until 40:
     jj := if i mod 2 = 0: j+1 else: j fi;
     fill (ti(jj-0.7,i) .. ti(jj-0.35,i) .. ti(jj,i)) --
          (ti(jj,i) .. tii(jj+0.5,i) .. ts(jj+1.7,i)) --
          (ts(jj+1.7,i) .. ts(jj+1.35,i) .. ts(jj+1,i)) --
          (ts(jj+1,i) .. tsi(jj+0.5,i) .. ti(jj-0.7,i)) -- cycle
         withcolor black;
    endfor;
 endfor;

 clip currentpicture to cadre;

endfig;


end

Mots clés : Illusionspirale

Cet exemple fait partie de la collection d’exemples Illusions d’optique.

Fichiers

Télécharger l’archive complète