% PARACHUTE

% Ce script nécessite la fonction: cylindre

%parachute=demi-sphère
a=0;
b=2*pi;
c=0;
d=pi/2;

[t,u]=meshgrid(a:(b-a)/50:b,c:(d-c)/50:d);

xp=cos(t).*cos(u);
yp=sin(t).*cos(u);
zp=sin(u);


p(1)=surfl(xp,yp,zp);

shading interp
hold on
%tete parachutiste=sphère
a=0;
b=2*pi;
c=-pi/2;
d=pi/2;

[t,u]=meshgrid(a:(b-a)/50:b,c:(d-c)/50:d);

xt=cos(t).*cos(u)/5;
yt=sin(t).*cos(u)/5;
zt=sin(u)/5-1.5;

p(2) = surfl(xt,yt,zt);

%corps=cylindre
a=-0.09;
b=0.09;
c=-2.5;
d=-1.5;
[xc,zc] = meshgrid(a:(b-a)/50:b,c:(d-c)/50:d);

yc = sqrt(0.09.^2 - xc.^2);
xc = [xc -xc];
yc = [yc -yc];
zc = [zc zc];

p(3) = surfl(xc,yc,zc);


%corde du parachute
Rfil = 0.03;
p(4) = cylindre(Rfil,[0 0 -2],[1 0 0]);
p(5) = cylindre(Rfil,[0 0 -2],[-1 0 0]);
p(6) = cylindre(Rfil,[0 0 -2],[0 1 0]);
p(7) = cylindre(Rfil,[0 0 -2],[0 -1 0]);

cible = surfl(xp*2,yp*2,zp*0-22.5);

shading flat
axis image
axis off

% couleurs
c1=get(p(1),'CData');
c2=get(p(2),'CData');
c3=get(p(3),'CData');

% palette personnelle
% un bloc rouge, puis un bloc vert puis un bleu
c=(0:63)./63;
nul=zeros(1,64);
colormap gray
cg = colormap;
perso=[c nul nul;nul c nul;nul nul c]';
perso = [cg;perso];

% on associe aux sphères les couleurs personnelles
set(p(1),'CData',c1+1);
set(p(2),'CData',c2+2);
set(p(3),'CData',c3+3);

% il faut dire à Matlab qu'on a changé les graduations de couleur
% les couleurs ne sont plus graduées de 0 à 1
% mais de 0 à 3
caxis([0 4])
colormap(perso)
% descente du parachute
n = 50;
dz = 20/n;
for etape = 1:n
    for i = 1:length(p)
        z = get(p(i),'ZData');
        set(p(i),'ZData',z-dz);
    end
    angle = rand*25*(-1)^etape;
    rotate(p,[0 1 0],angle,[0 0 -etape*dz])
    drawnow
end
hold off