function [Q, t, rmsd] = alinhar(X,Y, opt)
%
% [Q, t, rmsd] = alinhar(X,Y, opt)
%
% INPUT:
% X: conjunto de pontos A
% Y: conjunto de pontos B (referencia)
% opt: 0 permite reflexoes totais, 1 evita reflexoes
% 
% OUTPUT:
% Q: matriz de rotacao otima
% t: vetor de translacao
% rmsd: valor do RMSD
%

if nargin<3
   opt=0; 
end

% K: dimensao
% N: numero de pontos
[K N] = size(X);

% centralizando os dois conjuntos de pontos
e = ones(N,1);
X0 = (1/N)*X*e;
Y0 = (1/N)*Y*e;

X = X - X0*e';
Y = Y - Y0*e';

% Problema de Procrustes Ortogonal
M = Y*X';
[U,S,V] = svd(M);

% evitar reflexoes?
if (opt)
    if (det(U*V')<0)
        V(:,end) = -V(:,end);
    end
end

% rotacao otima
Q = U*V';

% translacao
t = Y0 - Q*X0;

% valor do RMSD
rmsd = norm(Q*X - Y, 'fro')/sqrt(N);