Illusion d’optique
Auteur ou autrice : Maxime Chupin.
Mise en ligne le 11 avril 2023
Illusion initialement publiée sur le site Syracuse.
Code
% Déclaration de mes pictures qui permettront la composition de l'image
picture rond,rondn,rondb;
numeric diamax;
u:=0.05cm;
% Fabrication de l'image de base
rond = image(
for i:=15 downto 6:
% cercle permettant de faire la "bande circulaire"
path cercle, cercleb;
numeric r,rb,moy,diff;
% le rayon du plus petit cercle
r:=6*2.71**((i/10))*0.3*u;
% celui du plus grand
rb:=6*2.71**((i+1)/10)*0.3*u;
% On sauvegarde le diamètre maximal de la figure
if i=15:
diamax:=rb;
fi;
% rayon du cercle "médiant"
moy:=(r+rb)/4;
% laRgeur de la bande circulaire
diff:=rb-r;
cercle := fullcircle scaled (r);
cercleb := fullcircle scaled (rb);
% astuce permettant de palier au problèmes engendrés
% par "buildcycle" qui trace dans la suite un disque noir,
% ceci permet aussi de ne pas avoir de transparant
fill cercleb withcolor white;
for j:=0 step 2 until 36:
pair P,P',O;
path noir,dr,drb,p,c,d,e,f;
O:=(0,0);
% Le point où l'on fixe la première ellipse
P:=(moy)*(cosd(j*10+i*10),sind(j*10+10*i));
% Le point ou l'on fixe la deuxième ellipse
P':=(moy)*(cosd(10*i+(j+1)*10),sind(10*i+(j+1)*10));
dr:=O--(2*xpart P, 2*ypart P);
drb:=O--(2*xpart P', 2*ypart P');
% Partie noire de la bande
p = buildcycle(cercle,dr,cercleb,drb);
fill p;
% tracé des ellipses
fill fullcircle xscaled (diff/4) yscaled (diff/2)
rotated(90+10*j+10*i) shifted P withcolor green ;
fill fullcircle xscaled (diff/4) yscaled (diff/2)
rotated(90+10*(j+1)+10*i) shifted P' withcolor red ;
endfor;
endfor;
);
beginfig(1);
%Déclaration de la transformation de symétrie
transform T;
T = identity reflectedabout((diamax/2,-20),(diamax/2,20));
% la picture symétrique
rondn = rond transformed T;
% remise à l'origine
rondb=rondn shifted (-diamax,0);
for i:=0 upto 1:
for j:=0 upto 2:
if (j mod 2)=0:
draw rondb rotated(i*10)
shifted (j*diamax,i*diamax) ;
else:
draw rond rotated(i*10)
shifted (j*diamax,i*diamax) ;
fi;
endfor;
endfor;
for i:= 0 upto 0:
for j:=0 upto 1:
if j=1:
draw rondb rotated(i*10)
shifted (j*diamax+diamax/2,i*diamax+diamax/2) ;
else:
draw rond rotated(i*10)
shifted (j*diamax+diamax/2,i*diamax+diamax/2) ;
fi;
endfor;
endfor;
endfig;
end
Mots clés : Illusionpicturetransform
Cet exemple fait partie de la collection d’exemples Illusions d’optique.