function [ X VY dimR ] = CoordBaseEnt ( M, Massa, entQt, diaQt, min_dim, show_ignora)
%
% Esta funcao calcula as coordenadas numa base das distancias das 
% entidades. Retorna as novas coordenadas das entidades (X), um vector
% com as entidade que constituem a base (VY) e a sua dimensao (dimR).
%
% Recebe como argumentos:
%   M        -> Matriz das distancias
%   Massa    -> Matriz linha com as massas das entidades
%   entQt    -> Numero de empresas
%   min_dim  -> Valor minimo para validar nova direccao
%               Caso seja menor do que 0.5, toma o valor '1.e-3'
%
% e retorna:
%   X      -> Coordenadas calculadas das empresas na nova base
%   B      -> Base auxiliar para escrever as entidades
%   dimR   -> Dimensao da base
%   VY     -> Elementos de 'X' que constituem a base
%
% Variaveis auxiliares e de teste:
%   Valores_Ignorados -> Vector os os elementos ignorados
%

if (min_dim < 0.5)
    min_dim = 1.e-3;     % Valor minimo para validar nova direccao
end

testeIgnoraQt = 0;
Valores_Ignorados = zeros (1,1);

X = zeros (entQt, entQt-1);     % Matriz das coordenadas das entidades:
                                %   1 -> entidades  ;  2 -> coordenadas
VY = zeros (1,entQt);

X(2,1) = M(1,2);
dimR = 2;
VY(1) = 1;
VY(2) = 2;

dim_LMax = entQt;
if (dim_LMax > (diaQt - 1)) 
    dim_LMax = diaQt - 1;
end;

x = 3;
while x <= entQt
    X(x,1) = (M(1,x)^2 + X(VY(2),1)^2 - M(2,x)^2) / (2 * X(VY(2),1));
    
    yMax = dimR-1;
    if (yMax > dim_LMax)
        yMax = dim_LMax;
    end;
    
    for y=2:yMax
        d0 = 2 * X(VY(y+1),y); 
        if d0 ~= 0
            a1 = M(VY(y),x)^2 + X(VY(y+1),y)^2 - M(VY(y+1),x)^2;
            a2 = 0;
            for i1=1:y-1
               a2 = a2 + (X(x, i1) - X(VY(y+1), i1))^2;
            end;
            a3 = 0;
            for i1=1:y-1
                a3 = a3 + (X(x, i1) - X(VY(y), i1))^2;
            end;
            X(x,y) = (a1 + a2 - a3) / d0;
        else 
            X(x,VY(y)) = 0;
            disp ('Deu zero no denominador...'); 
            disp(x); disp(y); disp(VY(y)); 
            pause;
        end;
    end;

    a1 = sum(X(x,:).^2);
    a2 = M(1,x)^2 - a1;
    a3 = abs(a2);
    a4 = sqrt(a3);
    if dimR <= dim_LMax
        if a4 < min_dim
            testeIgnoraQt = testeIgnoraQt + 1;
            Valores_Ignorados = [Valores_Ignorados, x];
        else
            if a2 < 0
                fprintf ('\nDeu negativos...  Coord: %3d ; M(1,x): ', x);
                fprintf ('%e ; a1: %e ; a2: %e\n', M(1,x)^2, a1, a2);
                fprintf ('                     ');
                %disp ('Deu negativos...');
                %disp (x); disp(M(1,x)); disp(M(1,x)^2); disp(a1); disp(a2);
                %pause;
            else
                X(x, dimR) = a4;
                VY(dimR + 1) = x;
                dimR = dimR + 1;
            end;
        end;
    else
        if a4 > min_dim
            disp ('====(x > dim_LMax+1)====');
            pause;
        end;
    end;
    
    x = x + 1;
end;

dimR = dimR - 1;

%
% Testes e mensagens de erro
%
if testeIgnoraQt > 0 && show_ignora == 1
    Valores_Ignorados
end;

if dimR > dim_LMax
    disp ('Atencao: dimR > dim_LMax');
    pause;
    %dimB = dim_LMax;
end

%
% Conferir distancias
%
teste = TestDistCoord (M, X, entQt, 5*min_dim, 0);
if teste > 0
    disp ('ERR-2-CalculaCoordenadas - Numero de erros detectados:');
    disp (teste);
    disp ('Prima uma tecla para continuar...');
    pause;
else
    %disp ('Concluiu teste das distancias');
end

end

