function voyageur(n,V)
%VOYAGEUR(N,V) représente le trajet du voyageur de commerce.
% 
% Représentation du trajet du voyageur de commece dur un parallélépipède 
% rectangle de dimension N (2<=N). V contient les vecteurs directions
% pour la représentation plane de l'hypercube. Par défaut V est défini
% avec 5 composantes (donc jusqu'à la dimension 5). Au delà, il suffit
% de rajouter un vecteur dans V. Au delà de 6 on ne voit plus rien.

% jbr, janvier 1998.

% vecteurs directions
if ~exist('V')
 V=[1    0
    1.45 2.2
    0    3
    -1.9 2.9
    2.65 8.4];
end

% validation de N
if (n<2)
	error('N doit être supérieur à 2')
end
if n>max(size(V))
	error('V doit contenir N vecteurs')
end

% définition des codes de Gros-Grey des nbres de 0 à 2^n-1
g=fliplr(grosgrey(n));

% Enregistrement des coordonnées de l'hypercube
v=zeros(n,2);
for i=1:2^n
	v(i,:)=[0 0];	% on part de l'origine
	for j=1:n
		v(i,:)=v(i,:)+g(i,j)*V(j,:);
	end
end

% représentation graphique du trajet du voyageur de commerce
clf
hold on
dx=.05*(n-1);
dy=.05*(n-1);

% représentation de l'hypercube
c=prism;
for j=1:n
	for i=0:2^j:2^n-1
		di=2^j-1:-1:2^(j-1);
		for k=1:length(di)
			plot([v(i+k,1) v(1+i+di(k),1)],[v(i+k,2) v(1+i+di(k),2)],...
			'-','color',c(j,:))
		end
	end
end

% représentation du trajet le plus court
couleur=[.5 0 .5];				% mauve
avant=[0 0];					% position précédente
df=(max(V(1,:))-min(V(1,:)))/8;	% longueur de la flèche
f=[0 df 0;-df 0 df];			% flèche
for i=1:2^n		
	x=[avant(1) v(i,1)];
	y=[avant(2) v(i,2)];
	plot(x,y,'-','linewidth',2,'color',couleur)
	mx=sum(x)/2; my=sum(y)/2;	% milieu du segment
	a=atan2(y(2)-y(1),x(2)-x(1));
	T=[cos(a) -sin(a);sin(a) cos(a)];
	ft=T*f;	% flèche transformée
	fill(ft(1,:)+mx(1),ft(2,:)+my(1),couleur)
	avant=v(i,:);
end

% représentation des sommets avec No et code
for i=1:2^n		
	plot(v(i,1),v(i,2),'.','markersize',48,'color',couleur)
	text(v(i,1)-dx/2,v(i,2),int2str(i-1),'fontsize',10,...
		'fontweight','bold','color',[1 1 1])
	text(v(i,1)-1.5*dx,v(i,2)-3*dy,sprintf('%1i%1i%1i%1i',g(i,:)),'fontsize',9)
	
end

% étiquette
set(gcf,'name','Trajet du voyageur de commerce (en mauve)','numbertitle','off')
px=min(v(:,1));
py=max(v(:,2));
text(px,py,['n = ',int2str(n)],'fontsize',14,'color',[1 0 0],'fontweight','bold')

axis off
figure(gcf)
hold off


