%% Spielerei: Affine Transformation
% 4.02.2019 Nicolas

%% Datenpunkte
% Bei drei Datenpunkten wird exakt transformiert, ab vier Datenpunkten
% eine Naeherung. Achtung: Es darf niemals der gleiche Datenpunkt zweimal
% auftauchen!

close all
clear all

if 1
    % exakte Kontrollpunkte
    % Quelle
    srcx = [0 0 1];
    srcy = [0 1 0]; 

    % Ziel
    dstx = [1.5 0 3];
    dsty = [0.5 2 1]; 
else
    % Naeherung
    % Quelle
    srcx = [0 0 1 0.2];
    srcy = [0 1 0 0.2]; 

    % Ziel
    dstx = [1.5 0 3 1.5];
    dsty = [0.5 2 1 0.4]; 
end


%% Bestimmung der Transformationsmatrix
A = [srcx(:) srcy(:) 0*srcx(:)+1];
bx = dstx(:);
by = dsty(:);

ax = A\bx;
ay = A\by;

T = [ax(1) ax(2) ax(3); ay(1) ay(2) ay(3); 0 0 1];


%% Test der Transformationsmatrix
% Testbild: Haus vom Nikolas
tstxy = [0 0; 0 1; 0.5 2; 1 1; 0 1; 1 0; 0 0; 1 1; 1 0;];

% Koordinaten erweitern um 1-Zeile
tstxy1 = [tstxy'; 0*tstxy(:,1)'+1];

% Transformation
dstxy1 = T*tstxy1;

%% Darstellung
% Kontrollpunkte
plot(srcx, srcy, 'bo', dstx, dsty, 'ro');
hold on
% Punktwolke
plot(tstxy1(1,:), tstxy1(2,:), 'b.:', dstxy1(1,:), dstxy1(2,:), 'r.:');
axis equal