clear all
close all
clc

NP=361;

%-----------------------------------------------------------------------
%% CODIGO DAS ENTRADAS
% seguidor
% 11-translação de face plana
% 12-translação com rolete
% 13-oscilante de face plana
% 14-oscilante com rolete
% intervalos da função deslocamento
% 21-A1=90; A2=180; A3=270
% 22-A1=90; A2=90; A3=180
% 23-A1=180; A2=180; A3=360
% intervalo de avanço
% 31-parabolico
% 32-cubico
% 33-senoid/al
% 34-cicloidal
% intervalo de retorno
% 41-parabolico
% 42-cubico
% 43-senoidal
% 44-cicloidal
%-----------------------------------------------------------------------
%% DADOS POR EQUIPE
entra = [ 11 21 31 41;      % 1
          12 21 31 41;      % 2
          13 21 32 41;      % 3
          14 21 34 43;      % 4
          11 22 34 41;      % 5
          12 22 33 42;      % 6
          13 22 31 43;      % 7
          14 22 32 44;      % 8
          11 23 32 43;      % 9
          12 23 34 42];     % 10
%-----------------------------------------------------------------------
%% SELECAO DE EQUIPE
equipe = input('NUMERO DA EQUIPE: ')
seguidor = entra(equipe,1);
intervalos = entra(equipe,2);
avanco = entra(equipe,3);
retorno = entra(equipe,4);
clc
%-----------------------------------------------------------------------
%% DADOS DO SEGUIDOR
switch seguidor
    case 11      % seguidor de translação de face plana
        nome_seguidor = {'Translação de face plana'};
        L=20;
        R0=40;
    case 12      % seguidor de translação com rolete
        nome_seguidor = {'Translação com rolete'};
        L=10;
        R0=40;
        Rf =20;
        E=20;
    case 13      % seguidor oscilante de face plana
        nome_seguidor = {'Oscilante de face plana'};
        L=10*pi/180;    % rad
        R0=40;          % mm
        C1=110;         % mm
        C2=85;          % mm
        C3=45;          % mm
        B0=0*pi/180;    % rad
    case 14      % seguidor oscilante com rolete
        nome_seguidor = {'Oscilante com rolete'};
        L=10*pi/180;    % rad
        R0=40;          % mm
        Rf=13;          % mm
        C1=115;         % mm
        C2=40;          % mm
        C3=110;         % mm
        B0=15*pi/180;   % rad
end
%-----------------------------------------------------------------------
%% DADOS DOS INTERVALOS
switch intervalos
    case 21
        A1 = 90*pi/180;
        A2 = 90*pi/180;
        A3 = 180*pi/180;
    case 22
        A1 = 90*pi/180;
        A2 = 90*pi/180;
        A3 = 180*pi/180;
    case 23
        A1 = 180*pi/180;
        A2 = 180*pi/180;
        A3 = 360*pi/180;
end
%-----------------------------------------------------------------------
%% FUNCAO DESLOCAMENTO
for i=1:NP
    A(i)=360*pi/180*(i-1)/(NP-1);
    if A(i) <= A1
        switch avanco
            case 31
                % avanço parabólico
                nome_avanco = {'Parabólico'};
                if A(i) < A1/2
                    f(i)=2*L*(A(i)/A1)^2;
                    fL(i)=4*L*A(i)/A1^2;
                    fLL(i)=4*L/A1^2;
                else
                    f(i)=L*(1-2*((A1-A(i))/A1)^2);
                    fL(i)=-4*L*(A(i)-A1)/A1^2;
                    fLL(i)=-4*L/A1^2;
                end
            case 32
                % avanço cúbico
                nome_avanco = {'Cúbico'};
                if A(i) < A1/2
                    f(i)=4*L*(A(i)/A1)^3;
                    fL(i)=12*L*(A(i)^2)/A1^3;
                    fLL(i)=24*L*A(i)/A1^3;
                else
                    f(i)=L*(1-4*((A1-A(i))/A1)^3);
                    fL(i)=12*L*((A(i)-A1)^2)/A1^3;
                    fLL(i)=24*L*(A(i)-A1)/A1^3;
                end
            case 33
                % avanço senoidal
                nome_avanco = {'Senoidal'};
                f(i)=L/2*(1-cos(pi*A(i)/A1));
                fL(i)=pi*L/(2*A1)*sin(pi*A(i)/A1);
                fLL(i)=pi^2*L/(2*A1^2)*cos(pi*A(i)/A1);
            case 34
                % avanço cicloidal
                nome_avanco = {'Cicloidal'};
                f(i)=L/pi*(pi*A(i)/A1-1/2*sin(2*pi*A(i)/A1));
                fL(i)=L/A1*(1-cos(2*pi*A(i)/A1));
                fLL(i)=2*pi*L/A1^2*L*sin(2*pi*A(i)/A1);
        end
    elseif A(i) <= A2
        % plano avançado
        f(i)=L;
        fL(i)=0;
        fLL(i)=0;
    elseif A(i) <= A3
        switch retorno
            case 41
                % retorno parabólico
                nome_retorno = {'Parabólico'};
                if A(i) < (A2+A3)/2
                    f(i)=L*(1-2*((A2-A(i))/(A2-A3))^2);
                    fL(i)=-4*L*(A(i)-A2)/(A2-A3)^2;
                    fLL(i)=-4*L/(A2-A3)^2;
                else
                    f(i)=2*L*((A(i)-A3)/(A2-A3))^2;
                    fL(i)=4*L*(A(i)-A3)/(A2-A3)^2;
                    fLL(i)=4*L/(A2-A3)^2;
                end
            case 42
                % retorno cúbico
                nome_retorno = {'Cúbico'};
                if A(i) < (A2+A3)/2
                    f(i)=L*(1-4*((A2-A(i))/(A2-A3))^3);
                    fL(i)=12*L*((A(i)-A2)^2)/(A2-A3)^3;
                    fLL(i)=12*L*(2*A(i)-2*A2)/(A2-A3)^3;
                else
                    f(i)=4*L*((A(i)-A3)/(A2-A3))^3;
                    fL(i)=12*L*((A(i)-A3)^2)/(A2-A3)^3;
                    fLL(i)=12*L*(2*A(i)-2*A3)/(A2-A3)^3;
                end
            case 43
                % retorno senoidal
                nome_retorno = {'Senoidal'};
                f(i)=L/2*(1-cos(pi*(A(i)-A3)/(A2-A3)));
                fL(i)=pi*L/(2*(A2-A3))*sin(pi*(A(i)-A3)/(A2-A3));
                fLL(i)=pi^2*L/(2*(A2-A3)^2)*cos(pi*(A(i)-A3)/(A2-A3));
            case 44
                % retorno cicloidal
                nome_retorno = {'Cicloidal'};
                f(i)=L/pi*(pi*(A(i)-A3)/(A2-A3)-1/2*sin(2*pi*(A(i)-A3)/(A2-A3)));
                fL(i)=L/(A2-A3)*(1-cos(2*pi*(A(i)-A3)/(A2-A3)));
                fLL(i)=2*pi*L/(A2-A3)^2*sin(2*pi*(A(i)-A3)/(A2-A3));
        end
    else
        f(i)=0;
        fL(i)=0;
        fLL(i)=0;
    end
end
%-----------------------------------------------------------------------
%% COORDENADAS DO PERFIL
for i=1:NP
    switch seguidor
        case 11      % translação de face plana
            ATAN(i)=ATAN2(fL(i),-(R0+f(i)));
            G(i) = -A(i)+ATAN2(fL(i),-(R0+f(i)));
            R(i) = sqrt(fL(i)^2+(R0+f(i))^2);
        case 12      % translação com rolete
            Rp0=R0+Rf;
            H(i)=sqrt(Rp0^2-E^2)+f(i);
            Ap(i) = atan((fL(i)-E)/(sqrt(Rp0^2-E^2)+f(i)));
            G(i) = pi-A(i)-atan((E+Rf*sin(Ap(i)))/(H(i)-Rf*cos(Ap(i))));
            R(i) = sqrt((H(i)-Rf*cos(Ap(i)))^2+(E+Rf*sin(Ap(i)))^2);
        case 13      % oscilante de face plana
            B(i) = B0+f(i);
            D(i) = (C1*cos(B(i))-C2*sin(B(i)))/(1+fL(i));
            X(i) = C1-C3*sin(B(i))-D(i)*cos(B(i));
            Y(i) = C2-C3*cos(B(i))+D(i)*sin(B(i));
            G(i) = pi/2-A(i)+ATAN2(Y(i),X(i));
            R(i) = sqrt(X(i)^2+Y(i)^2);
        case 14      % oscilante com rolete
            B(i) = B0+f(i);
            D(i) = atan((C3*(1+fL(i))*cos(B(i))-C1)/(C3*(1+fL(i))*sin(B(i))+C2));
            X(i) = C1-C3*cos(B(i))+Rf*sin(D(i));
            Y(i) = C2+C3*sin(B(i))-Rf*cos(D(i));
            G(i) = pi/2-A(i)+ATAN2(Y(i),X(i));
            R(i) = sqrt(X(i)^2+Y(i)^2);
    end
end
%-----------------------------------------------------------------------
%-----------------------------------------------------------------------
%% GRÁFICO DA FUNÇÃO DESLOCAMENTO
figure('Name','RESULTADOS')
if seguidor == 13 | seguidor == 14
    fpr=f*180/pi;
    Lpr=L*180/pi;
else
    fpr=f;
    Lpr=L;
end
subplot(3,4,1)
plot(A*180/pi,fpr,'LineWidth',2)
xlabel('A (^o)');
ylabel('f(A)')
xlim([0 360])
set(gca,'XTick',0:45:360)
grid on
hold on
plot(0,0,'ro',A1*180/pi,Lpr,'ro',A2*180/pi,Lpr,'ro',A3*180/pi,0,'ro',360,0,'ro','LineWidth',2)
title('Função deslocamento - f(A)')

subplot(3,4,5)
plot(A*180/pi,fL,'LineWidth',2)
xlabel('A (^o)');
ylabel('f''(A)')
xlim([0 360])
set(gca,'XTick',0:45:360)
grid on
title('Derivada da função deslocamento - f''(A)')

subplot(3,4,9)
plot(A*180/pi,fLL,'LineWidth',2)
xlabel('A (^o)');
ylabel('f''''(A)')
xlim([0 360])
set(gca,'XTick',0:45:360)
grid on
title('2^a Derivada da função deslocamento - f''''(A)')

subplot(3,4,[2 3 4 6 7 8 10 11 12])
polar(G,R,'b')
title('Perfil da came')
%% ÂNGULO DE PRESSÃO

if seguidor == 12
    figure('name','ÂNGULO DE PRESSÃO')
    plot(A*180/pi,Ap*180/pi,'LineWidth',2)
    xlabel('A (^o)');
    ylabel('Ap(A)')
    xlim([0 360])
    set(gca,'XTick',0:45:360)
    grid on
    title('Ângulo de pressão')
end






