% FOURMIS représente le comportement d'une fourmi placée au départ
% au centre de la grille. Elle part dans la direction de l'Est, puis
% en fonction de la couleur de la case d'arrivée, tourne de 90° et
% change la couleur de la case. Que se passe-t-il à court, moyen et
% long terme ?
% Argument d'entrée 1: taille du tableau carré
% Argument d'entrée 2: nombre d'itérations
% Argument d'entrée 3: tableau de départ vide ('norm') ou quadrillé
% aléatoirement ('quadri')
% Fonction réalisée par Stéphane Darbéda, élève en math spé Bio au
% lycée Marcelin Berthelot à Saint Maur des Fossés

function Fourmie(cote,arret,varargin)
if nargin==0
   cote=201;
   arret=12000;
   varargin{1}='norm';
   corl=1;
end
if nargin==2
   varargin{1}='norm';
   corl=1;
end
if eq(cote/2,round(cote/2))
   cote=cote+1;
end
switch varargin{1}
case 'norm'
   % Le tableau de dÈpart est vide
   Lig1=(cote+1)/2;
   Col1=(cote+1)/2;
   Deplacement=sparse(zeros(cote,cote));
   corl=1;
case 'quadri'
   % Le tableau de dÈpart est quadrillÈ aleatoirement
   Lig1=(cote+1)/2;
   Col1=(cote+1)/2;
   Deplacement=sparse(round(rand(cote,cote)));
   Deplacement(Lig1,Col1)=0;
   corl=3;
end
% Initialisation: premier déplacement vers l'est
vectLig=[Lig1+1 Lig1];
vectCol=[Col1 Col1];
im=imagesc(Deplacement);colormap cool;
axis equal
axis off
for i=1:arret
   if Deplacement(vectLig(2),vectCol(2))==0
      Deplacement(vectLig(2),vectCol(2))=corl;
      Lig=vectCol(2)-vectCol(1);
      Col=(-1)*(vectLig(2)-vectLig(1));
      vectLig=[vectLig(2) vectLig(2)+Lig];
      vectCol=[vectCol(2) vectCol(2)+Col];
   else
      Deplacement(vectLig(2),vectCol(2))=0;
      Lig=(-1)*(vectCol(2)-vectCol(1));
      Col=vectLig(2)-vectLig(1);
      vectLig=[vectLig(2) vectLig(2)+Lig];
      vectCol=[vectCol(2) vectCol(2)+Col];
   end
   % Affichage pas à pas
   %set(im,'cdata',Deplacement);   % Retirer les % pour l'affichage pas à pas
   %drawnow;
   %pause
end
if corl==3;
   Deplacement(vectLig(2),vectCol(2))=5;
end
imagesc(Deplacement);colormap cool;title('La fourmie de Langton');axis 
equal;axis off;
