%
%<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
%<><> Codigo complementar do livro "Equacoes Diferenciais Ordinarias"  <><>
%<><> dos professores Marcelo Viana e Jose Espinar                     <><>
%<><>                                                                  <><>
%<><> Codigo escrito por Guilherme Tegoni Goedert                      <><>
%<><> https://git.impa.br/ggoedert/EDO/tree/master                     <><>
%<><> v 1.0 - 25/09/2016                                               <><>
%<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>

%<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
%<><> Capitulo 9                                                       <><>
%<><> Experimento: Problema de N-Corpos                                <><>
%<><> Objetivo 2 - um exemplo                                          <><>
%<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>

% Numero de Corpos
N = 3;
% Legendas de cores para os corpos; para mais de 9 corpos, favor completar este mapa de cores
Cor = [0 0 0;...    % Corpo 1 = preto
       1 0 0;...    % Corpo 2 = vermelho
       0 0 1;...    % Corpo 3 = azul
       0 1 0;...    % Corpo 4 = verde limao
       1 0.62 0;... % Corpo 5 = dourado
       0 1 1;...    % Corpo 6 = cyan
       1 0 1;...    % Corpo 7 = magenta
     0.5 0 0;...    % Corpo 8 = marrom
     0.5 0 0.5];    % Corpo 9 = roxo
        
% Intervalo de Integração
ti = 0;
tf = 200;

h = 0.05;
hmin = 1e-6;
hmax = 0.25;

% Massas dos Corpos
Massas = zeros(N,1);
Massas(1) = 2000;
Massas(2) = 2000;
Massas(3) = 2000;

% Condições iniciais na forma [x y z,  x' y' z']
Inicial = zeros(6,N);
Inicial(:,1) = [25 0 0,     0 -10 0];
Inicial(:,2) = [-25 0 0,    0  10 0];
Inicial(:,3) = [0 0 0,      0  0  2];

%Centro de Massa
CentroMassa = (Inicial*Massas)./sum(Massas);
Inicial = Inicial - [CentroMassa,CentroMassa,CentroMassa];

% Lei da Gravitação
G = 1;                              % Constante universal da gravitacao no sistema de unidades usado
F = @(t,x) Gravitacao(t,x,Massas,N,G);  % Parametrizacao da lei da gravitacao

Tol = 1e-6;
[t,Orbitas] = RKF45(ti,tf,Inicial,F,Tol,h,hmin,hmax);

% Resolucao e apresentacao de Resultados
figure;
grid on
Angulo_por_Passo = 10;

for i = 2:length(t)
    % Apresentacao animada das Orbitas
    hold off
    for j = 1:N
        plot3(Orbitas(i,1,j),Orbitas(i,2,j),Orbitas(i,3,j),'o','Color',Cor(j,:))
        hold on
        plot3(Orbitas(1:i,1,j),Orbitas(1:i,2,j),Orbitas(1:i,3,j),'--','Color',Cor(j,:))
    end
    xlabel('x'); ylabel('y'); zlabel('z');
    %title(sprintf('t = %g',t(i)));
    %xlim([-30 30]); ylim([-30 30]); zlim([-5 5]);
    axis 'square'
    view([mod(t(i)*Angulo_por_Passo,360), 15])
    grid on
    pause(0.0001)
end
