function epicycle(R,V,O,options)
% Représente une epicycloïde dessinée de la façon suivante:
% des cercles sont placés avec leurs centres respectifs sur le
% bord du cercle suivant; il sont définis par leurs rayons R.
% Les cercles tournent à la vitesse V et O donne l'angle permettant
% de repérer le centre du cercle sur le bord du suivant.
% OPTIONS vaut 'cercles' pour superposer les cercles ou
% 'anim' pour faire une animation.

% Exemples: epicycle([1 1/2 1/3],[1 7 -17],[0 0 pi/2])
%           epicycle([1 1/2 1/4],[-2 5 19],[0 0 0])
%           epicycle([1 0.8 0.4 0.2 0.4 0.2],[1 10 -17 -26 28 37],...
%                    [0 -pi/2 -pi/2 0 0 pi/2])
%           epicycle([1 1/2 1/4],[1 3 80],[0 0 0])
%           epicycle([1 1/2 1/4],[1 4 31],[0 0 0])

% JBR, novembre 1999, CSA

% Vérification des données
n=length(R);
if (length(V)~=n)|(length(O)~=n)
	error('Vecteurs mal dimensionnés')
end
if nargin==3
	options='';
end


% Définition de X et Y
t=0:pi/800:2*pi;
x=0;
y=0;
for i=1:n
	x=x+R(i)*cos(V(i)*t+O(i));
	y=y+R(i)*sin(V(i)*t+O(i));
end

% Représentation graphique
if strcmp(options,'cercles')
	gr=flipud(gray(256));
	gr=gr(1:fix(256/(n+1)):256,:);
	X=cos(t);
	Y=sin(t);
	centrex=cumsum([0 R].*[0 cos(O)]);
	centrey=cumsum([0 R].*[0 sin(O)]);
	cla
	hold on
	for i=1:n
		cer(i)=fill(R(i)*X+centrex(i),R(i)*Y+centrey(i),gr(i,:));
		pt(i)=plot(centrex(i),centrey(i),'or');
	end
	pt(n+1)=plot(centrex(n+1),centrey(n+1),'or');
end
	
plot(x,y)
axis equal
axis off
hold off
