% Exemplo da figura 4.43 do livro

fprintf('Exemplo da figura 4.43 do livro\n\n');

% Forma de entrada
S = [-1 1;
     1 1;
     0 0;
     -1 -1.5;
     -0.5 -1.5;
     0 -1.5;
     0.5 -1.5;
     1 -1.5];

% Forma de saída
Q = [-1 1;
     1 1;
     0 0;
     -1 -1.5;
     -0.5 -2.0;
     0 -2.25;
     0.5 -2.0;
     1 -1.5];

% Calcula o par de thin-plate splines que representam a
% transformação de S para Q.
[C1, E1] = thinplate(S, Q);

plot(S(:,1), S(:,2), '+');
axis([-3 3 -3 3]);
input('Entrada da fig. 4.43\n');

plot(Q(:,1), Q(:,2), '+');
axis([-3 3 -3 3]);
input('Saída da fig. 4.43\n');

result = evaltps(S, C1, S);

plot(result(:,1),result(:,2), '+');
axis([-3 3 -3 3]);
input('Thin-plate spline aplicada à própria imagem de entrada\n');

fprintf('Aplicando a thin-plate spline obtida a uma outra entrada\n');

teste = [-2.000000 -2.000000;
         -2.000000 -1.500000;
         -2.000000 -1.000000;
         -2.000000 -0.500000;
         -2.000000 0.000000;
         -2.000000 0.500000;
         -2.000000 1.000000;
         -2.000000 1.500000;
         -2.000000 2.000000;
         -1.500000 -2.000000;
         -1.500000 -1.500000;
         -1.500000 -1.000000;
         -1.500000 -0.500000;
         -1.500000 0.000000;
         -1.500000 0.500000;
         -1.500000 1.000000;
         -1.500000 1.500000;
         -1.500000 2.000000;
         -1.000000 -2.000000;
         -1.000000 -1.500000;
         -1.000000 -1.000000;
         -1.000000 -0.500000;
         -1.000000 0.000000;
         -1.000000 0.500000;
         -1.000000 1.000000;
         -1.000000 1.500000;
         -1.000000 2.000000;
         -0.500000 -2.000000;
         -0.500000 -1.500000;
         -0.500000 -1.000000;
         -0.500000 -0.500000;
         -0.500000 0.000000;
         -0.500000 0.500000;
         -0.500000 1.000000;
         -0.500000 1.500000;
         -0.500000 2.000000;
         0.000000 -2.000000;
         0.000000 -1.500000;
         0.000000 -1.000000;
         0.000000 -0.500000;
         0.000000 0.000000;
         0.000000 0.500000;
         0.000000 1.000000;
         0.000000 1.500000;
         0.000000 2.000000;
         0.500000 -2.000000;
         0.500000 -1.500000;
         0.500000 -1.000000;
         0.500000 -0.500000;
         0.500000 0.000000;
         0.500000 0.500000;
         0.500000 1.000000;
         0.500000 1.500000;
         0.500000 2.000000;
         1.000000 -2.000000;
         1.000000 -1.500000;
         1.000000 -1.000000;
         1.000000 -0.500000;
         1.000000 0.000000;
         1.000000 0.500000;
         1.000000 1.000000;
         1.000000 1.500000;
         1.000000 2.000000;
         1.500000 -2.000000;
         1.500000 -1.500000;
         1.500000 -1.000000;
         1.500000 -0.500000;
         1.500000 0.000000;
         1.500000 0.500000;
         1.500000 1.000000;
         1.500000 1.500000;
         1.500000 2.000000;
         2.000000 -2.000000;
         2.000000 -1.500000;
         2.000000 -1.000000;
         2.000000 -0.500000;
         2.000000 0.000000;
         2.000000 0.500000;
         2.000000 1.000000;
         2.000000 1.500000;
         2.000000 2.000000];

result2 = evaltps(teste, C1, S);

plot(teste(:,1),teste(:,2), '+');
axis([-3 3 -3 3]);
input('Marcos de entrada\n');

plot(result2(:,1),result2(:,2), '+');
axis([-3 3 -3 3]);
input('Marcos de saída\n');

% Exemplo 1D (página 322)

fprintf('Exemplo 1D da página 322 do livro\n\n');

S1 = [-1 0; 0 -1; 0 1; 1 0; 0 0];

Q1 = [4 4; 5 5; 3 3; 4 4; 2 2];

[C2, E2] = thinplate(S1, Q1);

fprintf('Energia de dobramento (dividida por 2): %g\n', E2/2);

fprintf('Parâmetros da thin-plate spline:\n');

C2(:,1)
