function X=Tortue3D(S,delta)
%TORTUE3D(S,DELTA) déplacement à 3D
%
% La fonction TORTUE3D(S) représente le déplacement d'une tortue
% dans l'espace suivant le modèle décrit par la chaîne S. 
% L'orientation actuelle de la tortue est donnée par trois 
% vecteurs H, L et U indiquant la direction (Heading), la
% direction à gauche (Left) et la direction haute (Up). Ces
% trois vecteurs sont perpendiculaires et de norme 1. Le
% déplacement est donc réalisé uniquement sur la base de
% rotations autour de ces trois axes. La tortue avance toujours
% dans la direction de H. Il y a donc 6 rotations possibles.
% On ajoute également la rotation de 180° autour de U pour des
% raisons pratiques. 
%
% La chaîne S comporte uniquement les symboles suivants: 
% F avance dans la direction donnée par H (heading);
% + tourne à gauche de DELTA autour de U;
% - tourne à droite de DELTA autour de U;
% & tourne vers le bas de DELTA autour de L;
% ^ tourne vers le haut de DELTA autour de L;
% \ tourne à gauche de DELTA autour de H;
% / tourne à droite de DELTA autour de H;
% | tourne de 180° autour de U.

% J.-B. Roux, Collège de Saussure, 1996.
%%%%%% A ajouter le traitement de f (sans trait) et de la couleur.

% Initialisation
H=[1 0 0
   0 1 0
   0 0 1];	% matrice de directions :col1=H, col2=L, col3=U
P=[0;0;0];	% position initiale de la tortue
d=1;		% longueur du parcours
X=P;		% X contient les coordonnées des sommets

% Définition des matrices de rotations.
[Rup,Rum,Rlp,Rlm,Rhp,Rhm,Rud]=MatRotDef(delta);

% traitement de la chaîne
n=length(S);
for i=1:n
	if S(i)=='F'
		P=P+d*H(:,1);
		X=[X P];
	elseif S(i)=='+'
		H=H*Rup;
	elseif S(i)=='-'
		H=H*Rum;
	elseif S(i)=='&'
		H=H*Rlp;
	elseif S(i)=='^'
		H=H*Rlm;
	elseif S(i)=='\'
		H=H*Rhp;
	elseif S(i)=='/'
		H=H*Rhm;
	elseif S(i)=='|'
		H=H*Rud;
	end
end
