function [parametros, residuos, sigma] = transforma2d(pts1,pts2,tipo)
% Esta funçâo calcula os 4 parametros de transformação (a,b,c,d) entre 
% 2 sistemas de coordenadas- Sistema 1 (partida): coord (x,y) e Sistema 2 
%(chegada): coord (u,v) . 
% Syntax: [parametros, residuos, sigma] = transforma_4(pts1,pts2,tipo)
% tipo= 4 ou 6
% No caso de ser uma transfromação a 4 parametros as equações  
% As equações para cada ponto serão do género
% | u1 | =  | x1 -y1 1 0|| a| 
% | v1 | =  | y1  x1 0 1|| b|  <==> b = A x 
%                        | c|    
%                        | d|

% No Caso de ser uma transformação a 6 parametros
% | u1 | =  | x1  y1 0  0  1 0|| a| 
% | v1 | =  | 0   0  x1 y1 0 1|| b|  <==> b = A x 
%                              | c|    
%                              | d|
%                              | e|
%                              | f|


%  A solução de minimos quadrados ~é:
% x=inv(A'*A)*A'*b
% onde A' e' a transposta e inv a inversa

% Tratamento do input
if nargin == 2 tipo =4;
end
% Recuperação dos pontos nos dois sistemas  
x = pts1(:,1); y = pts1(:,2);
u = pts2(:,1); v = pts2(:,2);
% 0. Calculo numero de pontos n = numero de linhas do vector x (ou y ou u 
% ou v)
n = length(x);

%1. Passo: escrita do vector b
% construimos os vectores linha u' e v' e colocamo-los numa matriz conduas
% linhas
aux = [u';v'];
b=aux(:);

% 2 Passo: escrita da matriz A
%Inicializacao da matriz A
if tipo == 4
    A=zeros(2*n,4);
% Enchimento da matriz
    A(1:2:2*n,1:4)= [x -y ones(n,1)  zeros(n,1)];
    A(2:2:2*n,1:4)= [y  x zeros(n,1) ones(n,1)];
else
    A=zeros(2*n,6);
    A(1:2:2*n,1:6)= [x y zeros(n,1) zeros(n,1) ones(n,1)  zeros(n,1)];
    A(2:2:2*n,1:6)= [zeros(n,1) zeros(n,1) x y zeros(n,1) ones(n,1)];
end
    
%3 Passo: solucao minmos quadrados
parametros = inv(A'*A)*A'*b;

%4. Passo: cálculo do desvio padrão
% Designado por v=Ax-b os resíduos, o desvio padrão à posteriori e'
% sigma = Raiz_quadrada((v'*v)/(m-l)) onde m,l são o numero de equações
% e incógnitas, respectivamente.
m=2*n;
l=tipo;
residuos = A*parametros-b;
sigma=0;
if (m-l ~= 0) 
    sigma = sqrt(residuos'*residuos)/(m-l);
end
