function [Juntas Torques]=PC_Generate_MultiPolyTrajectories(Juntas,tJ,NumP)
%% Esta funcao constroi e concatena as trajectorias de 5,4 e 3 ordem para as posicao, velocidade e aceleracao de cada junta
% INPUT
% Juntas - estrutura com os dados das posições de juntas
% tJ - vector com temporização do movimento
% NumP - número de pontos de cada etapa
% OUTPUT
% Juntas - estrutura actualizada com os vectore de entrada do modelo
% Torques - estrutura inicializada para guardar os torques calculados pelo
%           modelo

% nomenclatura de juntas
joint_names_legs={'Ankle Flexion/Extension',...
    'Ankle Eversion/Inversion',...
    'Knee Flexion/Extension',...
    'Hip Flexion/Extension',...
    'Hip Rotation',...
    'Hip Abduction/Adduction'};

joint_names_upper_body={'Torso Rotation',...
    'Torso Lateral Flexion/Extension',...
    'Torso Flexion/Extension'};

joint_names_arm={'Shoulder Flexion/Extension',...
    'Shoulder Abduction/Adduction',...
    'Shoulder Rotation'...
    'Elbow Flexion/Extension'};

for i=1:size(Juntas.Perna_Apoio.ang_juntas,1)
    
    % Perna Apoio
    Juntas.Perna_Apoio.Input_Modelo(i).nome_junta=joint_names_legs{i};
    Torques.Perna_Apoio.Junta(i).nome_junta=joint_names_legs{i};
    Torques.Perna_Apoio.Junta(i).Torque=[];
    
    [Juntas.Perna_Apoio.Input_Modelo(i).pos...
        Juntas.Perna_Apoio.Input_Modelo(i).vel...
        Juntas.Perna_Apoio.Input_Modelo(i).ace...
        Juntas.Perna_Apoio.Input_Modelo(i).tempo]=...
        MultiPolyTraj5taOrd(Juntas.Perna_Apoio.ang_juntas(i,:),tJ,NumP);
    
    Juntas.Perna_Apoio.Input_Modelo(i).input_pos=...
        [Juntas.Perna_Apoio.Input_Modelo(i).tempo
        Juntas.Perna_Apoio.Input_Modelo(i).pos]';
    
    Juntas.Perna_Apoio.Input_Modelo(i).input_vel=...
        [Juntas.Perna_Apoio.Input_Modelo(i).tempo
        Juntas.Perna_Apoio.Input_Modelo(i).vel]';
    
    Juntas.Perna_Apoio.Input_Modelo(i).input_ace=...
        [Juntas.Perna_Apoio.Input_Modelo(i).tempo
        Juntas.Perna_Apoio.Input_Modelo(i).ace]';
    
    % Perna Livre
    Juntas.Perna_Livre.Input_Modelo(i).nome_junta=joint_names_legs{i};
    Torques.Perna_Livre.Junta(i).nome_junta=joint_names_legs{i};
    Torques.Perna_Livre.Junta(i).Torque=[];
    
    [Juntas.Perna_Livre.Input_Modelo(i).pos...
        Juntas.Perna_Livre.Input_Modelo(i).vel...
        Juntas.Perna_Livre.Input_Modelo(i).ace...
        Juntas.Perna_Livre.Input_Modelo(i).tempo]=...
        MultiPolyTraj5taOrd(Juntas.Perna_Livre.ang_juntas(i,:),tJ,NumP);
    
    Juntas.Perna_Livre.Input_Modelo(i).input_pos=...
        [Juntas.Perna_Livre.Input_Modelo(i).tempo
        Juntas.Perna_Livre.Input_Modelo(i).pos]';
    
    Juntas.Perna_Livre.Input_Modelo(i).input_vel=...
        [Juntas.Perna_Livre.Input_Modelo(i).tempo
        Juntas.Perna_Livre.Input_Modelo(i).vel]';
    
    Juntas.Perna_Livre.Input_Modelo(i).input_ace=...
        [Juntas.Perna_Livre.Input_Modelo(i).tempo
        Juntas.Perna_Livre.Input_Modelo(i).ace]';
end

for i=1:size(Juntas.Tronco.ang_juntas,1)
    
    % Tronco
    Juntas.Tronco.Input_Modelo(i).nome_junta=joint_names_upper_body{i};
    Torques.Tronco.Junta(i).nome_junta=joint_names_upper_body{i};
    Torques.Tronco.Junta(i).Torque=[];
    
    [Juntas.Tronco.Input_Modelo(i).pos...
        Juntas.Tronco.Input_Modelo(i).vel...
        Juntas.Tronco.Input_Modelo(i).ace...
        Juntas.Tronco.Input_Modelo(i).tempo]=...
        MultiPolyTraj5taOrd(Juntas.Tronco.ang_juntas(i,:),tJ,NumP);
    
    Juntas.Tronco.Input_Modelo(i).input_pos=...
        [Juntas.Tronco.Input_Modelo(i).tempo
        Juntas.Tronco.Input_Modelo(i).pos]';
    
    Juntas.Tronco.Input_Modelo(i).input_vel=...
        [Juntas.Tronco.Input_Modelo(i).tempo
        Juntas.Tronco.Input_Modelo(i).vel]';
    
    Juntas.Tronco.Input_Modelo(i).input_ace=...
        [Juntas.Tronco.Input_Modelo(i).tempo
        Juntas.Tronco.Input_Modelo(i).ace]';
end

% Cabeca
Juntas.Cabeca.Input_Modelo(1).nome_junta='Head Tilting';
Torques.Cabeca.Junta(1).nome_junta='Head Tilting';
Torques.Cabeca.Junta(1).Torque=[];

[Juntas.Cabeca.Input_Modelo(1).pos...
    Juntas.Cabeca.Input_Modelo(1).vel...
    Juntas.Cabeca.Input_Modelo(1).ace...
    Juntas.Cabeca.Input_Modelo(1).tempo]=...
    MultiPolyTraj5taOrd(Juntas.Cabeca.ang_juntas(1,:),tJ,NumP);

Juntas.Cabeca.Input_Modelo(1).input_pos=...
    [Juntas.Cabeca.Input_Modelo(1).tempo
    Juntas.Cabeca.Input_Modelo(1).pos]';

Juntas.Cabeca.Input_Modelo(1).input_vel=...
    [Juntas.Cabeca.Input_Modelo(1).tempo
    Juntas.Cabeca.Input_Modelo(1).vel]';

Juntas.Cabeca.Input_Modelo(1).input_ace=...
    [Juntas.Cabeca.Input_Modelo(1).tempo
    Juntas.Cabeca.Input_Modelo(1).ace]';

for i=1:size(Juntas.Braco_Direito.ang_juntas,1)
    
    % Bracos
    %     braco direito
    Juntas.Braco_Direito.Input_Modelo(i).nome_junta=joint_names_arm{i};
    Torques.Braco_Direito.Junta(i).nome_junta=joint_names_arm{i};
    Torques.Braco_Direito.Junta(i).Torque=[];
    
    [Juntas.Braco_Direito.Input_Modelo(i).pos...
        Juntas.Braco_Direito.Input_Modelo(i).vel...
        Juntas.Braco_Direito.Input_Modelo(i).ace...
        Juntas.Braco_Direito.Input_Modelo(i).tempo]=...
        MultiPolyTraj5taOrd(Juntas.Braco_Direito.ang_juntas(i,:),tJ,NumP);
    
    Juntas.Braco_Direito.Input_Modelo(i).input_pos=...
        [Juntas.Braco_Direito.Input_Modelo(i).tempo
        Juntas.Braco_Direito.Input_Modelo(i).pos]';
    
    Juntas.Braco_Direito.Input_Modelo(i).input_vel=...
        [Juntas.Braco_Direito.Input_Modelo(i).tempo
        Juntas.Braco_Direito.Input_Modelo(i).vel]';
    
    Juntas.Braco_Direito.Input_Modelo(i).input_ace=...
        [Juntas.Braco_Direito.Input_Modelo(i).tempo
        Juntas.Braco_Direito.Input_Modelo(i).ace]';
    
    %     braco esquerdo
    Juntas.Braco_Esquerdo.Input_Modelo(i).nome_junta=joint_names_arm{i};
    Torques.Braco_Esquerdo.Junta(i).nome_junta=joint_names_arm{i};
    Torques.Braco_Esquerdo.Junta(i).Torque=[];
    
    [Juntas.Braco_Esquerdo.Input_Modelo(i).pos...
        Juntas.Braco_Esquerdo.Input_Modelo(i).vel...
        Juntas.Braco_Esquerdo.Input_Modelo(i).ace...
        Juntas.Braco_Esquerdo.Input_Modelo(i).tempo]=...
        MultiPolyTraj5taOrd(Juntas.Braco_Esquerdo.ang_juntas(i,:),tJ,NumP);
    
    Juntas.Braco_Esquerdo.Input_Modelo(i).input_pos=...
        [Juntas.Braco_Esquerdo.Input_Modelo(i).tempo
        Juntas.Braco_Esquerdo.Input_Modelo(i).pos]';
    
    Juntas.Braco_Esquerdo.Input_Modelo(i).input_vel=...
        [Juntas.Braco_Esquerdo.Input_Modelo(i).tempo
        Juntas.Braco_Esquerdo.Input_Modelo(i).vel]';
    
    Juntas.Braco_Esquerdo.Input_Modelo(i).input_ace=...
        [Juntas.Braco_Esquerdo.Input_Modelo(i).tempo
        Juntas.Braco_Esquerdo.Input_Modelo(i).ace]';
end
Torques.Time_Vect=[];
end