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

% teste para poder ser candidato a pilar circular 
%----------------------------------------------------------

function [coord_circ]=TESTCANDIDATOPILARCIRC(RECT_feature_bit_control, feature_pontos, data, cart_data, coord_circ, r)

    % (1)start ---- define ---- 
    min_pts_featureC=2; % valor minimo de pontos que devera ter uma feature (PorExe: se min_pts_featureR = 2 implica que a feature tenha 2+1 pontos, ou seja 3 pontos) 
    angbwfeixes=0.5; % angulo de abertura do feixe laser (angulo entre dois feixes)
    raio_circ=200; % raio da feature circular (pilar circular) 
    L_Le_med=1.003; % parametro L/Le medio obtido de uma amostra em ambiente real (para tentar eliminar algum erro sistematico que possa existir)
    L_Le_tol=0.0273; % valor de tolerancia permitido para que possa ser um pilar circular 
    ps_coef_corr_max=8; % valor maximo para o chamado pseudocoeficiente de correlaçao para que possa ser considerado com pilar circular
    raio_med=209.5557; % valor do raio medio obtido da analise de uma amostra em ambiente real
    raio_dp=10.1447; % desvio padrao do raio medio obtido anteriormente 
    raio_mult_dp=2; % factor que define ao intervalo de aceitaçao dos pilares circulares em relaçao ao raio (2*desvio padrao ou 3*desvio padrao)
    % (1)end ------------------

    % (2)start-------------------Teste para candidato a pilar circular------------------------------
    if RECT_feature_bit_control ~= 1 % condiçao necessario para o caso de nao serem identificados nenhuma feature (se for =1 salta fora nao existem features a analisar)
               
        feature_pontos(:,3)=feature_pontos(:,2)-feature_pontos(:,1); % calculo da dimensao da feature (em termos de pontos)
        feature_pontos(find(feature_pontos(:,3) < min_pts_featureC),:)=[]; % todas as features que tiverem menos de min_pts_featureR+1 pontos sao eliminadas
        
        % (2.1)start ----------Teste de verificaçao de deteccao de pilares circulares----------
        if isempty(feature_pontos) 
            % caso onde nao é detectado nenhum pilar circular
        else % (2.1) quando se detecta um ou mais pilares circulares
            
            % (2.1.1)start ------ Local de analise efectiva de um dos candidatos a pilar circular para as diferentes features ------
            for i5=1:size(feature_pontos(:,1)) 
                
                [L_Le]=TEST_Le_L(data, cart_data, feature_pontos, i5, raio_circ, angbwfeixes); %funçao que compara a largura estimada (baseada na Dmin e ang de abertura) com a distancia real entre os extremos
                if and( L_Le >= (L_Le_med-L_Le_tol) , L_Le <= (L_Le_med+L_Le_tol) ) % condiçao de largura para poder ser candidato a pilar circular usando 3*sigma (desvio padrao)

                    pontos=cart_data(feature_pontos(i5,1):feature_pontos(i5,2),:)';
                    [coord_circ(i5,:)]=POINTS2CIRC_FIT_REIMANN(pontos); %-----Teste de Reimann-----
                    %[coefcorr]=COEFCORR_CIRCLINEAR(coord_circ(i5,:), pontos); %-----COEFICIENTE DE CORRELAÇAO usando a linearizaçao no plano complexo-----
	                [ps_coef_corr]=PSEUDOCOEFCORR(pontos,coord_circ(i5,:));%-----Pseudo coeficiente de correlaçao (erro medio dos pontos à circunferencia)-----  
                    if ps_coef_corr <= ps_coef_corr_max  % se TRUE ainda pode ser considerado pilar circular  se nao ja nao pode ser considerado como tal
                                           
                        %-----Quando a distancia ao centro for menor que a media das distancia que constituem o elemento-----  
                        dist_centro=sqrt(coord_circ(i5,1)^2+coord_circ(i5,2)^2);
                        dist_mean=mean(data(feature_pontos(i5,1):feature_pontos(i5,2)));
                        if dist_centro >= dist_mean 
                             %-----Raio compreendido entre um intervalo(usando o raio medio e 2*sigma (desvio padrao))-----
                            if or(coord_circ(i5,3) < raio_med-raio_mult_dp*raio_dp, coord_circ(i5,3) > raio_med+raio_mult_dp*raio_dp)
                                coord_circ(i5,:)=[0 0 0 0];
                            end
                        else
                            coord_circ(i5,:)=[0 0 0 0];
                        end
                    else
                        coord_circ(i5,:)=[0 0 0 0];
                    end %if ps_coef_corr <= ...
                end %if ( L_Le >= ... && L_Le <= ... )
            end
            % (2.1.1)end --------------------------------------------------------------------
        end
        % (2.1)start ----------Teste de verificaçao de deteccao de pilares circulares----------
    end
    % (2)end -----------------------------------------------------------------------------------------

    
    
        