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

%calculo do metodo do gradiente e ciclo de identificaçao de features rectangulares
%----------------------------------------------------------

function [feature_pontos, RECT_feature_bit_control]=GRADMETHOD_IDEMFEATURESr(data)

    % (1)start ---- define ----
    grad_value=250; % valor apartir do qual se considera existir uma transiçao (ou seja, sao elementos diferentes, DECONTINUIDADE!)
    num_pontos=200; % definiçao da largura maxima dos objectos a identificar
    RECT_feature_bit_control=1; % variavel auxiliar para inumerar todas as features encontradas e NUMERO DE CONTROLO para saber se foram detectadas algumas features
    % (1)end ------------------
    
    
    % (2)start ----------------------calculo do gradiente entre duas medidas consecutivas----------------
    for i1=1:360
        grad(i1)=data(i1)-data(i1+1);
    end 
    grad(find(abs(grad) < grad_value))= 0;  % filtragem dos dados para descobrir os pontos de transiçao
    
    % Metodo para se conseguir extrair um pilar rectangular quando existem obras ou sejam os taipais que ficam encostados aos pilares
    grad(1)=grad_value+1; % para se garantir um gradiente positivo no inicio de cada scan
    grad(360)=-grad_value-1; % para se garantir um gradiente negativo no fim de cada scan
    % (2)end --------------------------------------------------------------------------------------------
        
   
    % (3)start -------ciclo para identificaçao de features (a seguir a um gradiente positivo tem de vir um negativo)-------
    index_pos=find(grad > 0); % para numerar todos os que forem ou tiverem gradiente positivo 
    
    for i3=1:length(index_pos) % para cada gradiente positivo verificar...
        temp=index_pos(i3)+num_pontos+1; % variavel para saber até onde se pode procurar o gradiente negativo
        if temp > 360 % se este valor for superior ao valor maximo da matriz este é limitado ao valor maximo da mesma que é 360
            temp=360;
        end
        
        % (3.1)start -----
        for i4=index_pos(i3)+1:temp % ciclo para procurar dentro do intervalo predefinido um gradiente negativo
            if grad(i4) < 0
                % matriz feature_pontos representa na 1ª coluna o inicio, na 2ª coluna o fim de uma feature
                feature_pontos(RECT_feature_bit_control,:)=[index_pos(i3)+1 i4 ]; %pq o objecto começa no ponto a seguir ao gradiente positivo e acaba no ponto antes do gradiente negativo  
                RECT_feature_bit_control=RECT_feature_bit_control+1;
                break % para quando for encontrado o primeiro gradiente negativo acabar logo o ciclo 
            else
                if grad(i4) > 0
                    break % para quando for encontrado o primeiro gradiente positivo acabar logo o ciclo e começar um novo apartir deste 
                end
            end
        end
        % (3.1)end -------
        
    end
    % (3)end ---------------------------------------------------------------------------------------------------------------
    
    
    % (4)start -------------------------------
    % para quando nao e detectado nenhum pilar
    if RECT_feature_bit_control==1;
        feature_pontos=NaN;
    end
    % (4)end ---------------------------------