%-----------------------------------------------------------
% Carlos Cabral 2003 - Dep.UA

% funçao para o calculo da distancia dos pontos ao segmento de recta correspondente
%----------------------------------------------------------

function [indice,distancia_indice,line_segment,segmento]=DIST2SEGMENT(cart_data,first_last,segmento,line_segment);


    % (1)start ---- define ----
    dist_max_pts_recta=50; % valor limite para a distancia de forma a garantir que um ponto pertence ao segmento de recta (mm) 
    % (1)end ------------------


    % (2)start ----------------------------------------------------------------------------------------------------------------------------------
    % Ciclo para calcular a distancia euclediana entre os pontos e o segmento de recta definido pelos dois pontos extremos (first_last)
    for k1=1:first_last(1,3)-1
    
        z_vi=cart_data(first_last(1,1),:)'- cart_data(first_last(1,1)+k1,:)';
        Mod_z_vi=sqrt(z_vi(1)^2+z_vi(2)^2); %dist. euclediana entre o ponto inicial e outro ponto
        Ang_z_vi=atan2(z_vi(2),z_vi(1));
    
        % definir o vector ortogonal à recta
        Ang_segm=atan2(cart_data(first_last(1,2),2)-cart_data(first_last(1,1),2),cart_data(first_last(1,2),1)-cart_data(first_last(1,1),1));
        u_i=[cos(Ang_segm+pi/2); sin(Ang_segm+pi/2)];
        Mod_u_i=sqrt(u_i(1)^2+u_i(2)^2);
        Ang_u_i=atan2(u_i(2),u_i(1));
    
        %a distancia é então o produto interno entre estes dois vectores
        distancia(k1)=Mod_u_i*Mod_z_vi*cos(Ang_u_i-Ang_z_vi);
        
    end
    % (2)end -------------------------------------------------------------------------------------------------------------------------------------    
    
    
    % (3)start ------------------------------------------------------------
    % Ciclo onde se garante a segmentaçao de um conjunto de pontos (que representam ate entao uma recta) em dois segmentos de recta
    if max(abs(distancia)) > dist_max_pts_recta
        indice=first_last(1,1)+find(abs(distancia)==max(abs(distancia)));
        if length(indice) > 1 %Caso sejam encontrados varios pontos com a mesma distancia (escolhe o primeiro encontrado) 
            indice(2:length(indice))=[];
        end
        distancia_indice=distancia(find(abs(distancia)==max(abs(distancia))));
    else
        indice=[];
        distancia_indice=[];
        segmento(line_segment,:)=first_last;
        line_segment=line_segment+1;
    end
    % (3)end --------------------------------------------------------------
    

    