function [F] = ResectionCorrection(a)

%Prostorova resekce - optimalizovane parametry jsou veskere parametry
%kamery ve vsech snimcich, nelinearni parametry kamery (K, P, C) jsou
%uvazovany shodne pro kazdy snimek, zbyle parametry se pro kazdy snimek
%lisi, rovnice viz T. Luhmann Close Range Photogrammetry - str. 205

%VYTVORENI PROMENNYCH, VYPOCET NEKTERYCH PARAMETRU

global name;
K1 = a(1);                                                                  %nelinearni parametry kamery                                                                  
K2 = a(2);
K3 = a(3);
P1 = a(4);
P2 = a(5);
C1 = a(6);
C2 = a(7);

for i = 1:size(name,1);                                                     %linearni parametry kamery
    eval(['global DET' num2str(i)]);
    eval(['global DET' num2str(i)]);
    
    eval(['global x' num2str(i)]);
    eval(['global y' num2str(i)]);
    
    eval(['global xcor' num2str(i)]);
    eval(['global ycor' num2str(i)]);
    
    eval(['global X' num2str(i)]);
    eval(['global Y' num2str(i)]);
    eval(['global Z' num2str(i)]);
    
    eval(['Px' num2str(i) '= a(' num2str((i-1)*2+8) ');']);
    eval(['Py' num2str(i) '= a(' num2str((i-1)*2+9) ');']);
   
    eval(['Cx' num2str(i) '= a(' num2str((i-1)+8+2*size(name,1)) ');']);
    
    eval(['Vx' num2str(i) '= a(' num2str((i-1)*3+8+3*size(name,1)) ');']);
    eval(['Vy' num2str(i) '= a(' num2str((i-1)*3+9+3*size(name,1)) ');']);
    eval(['Vz' num2str(i) '= a(' num2str((i-1)*3+10+3*size(name,1)) ');']);
    
    eval(['Omega' num2str(i) '= a(' num2str((i-1)*3+8+6*size(name,1)) ');']);
    eval(['Fi' num2str(i) '= a(' num2str((i-1)*3+9+6*size(name,1)) ');']);
    eval(['Kappa' num2str(i) '= a(' num2str((i-1)*3+10+6*size(name,1)) ');']);
                                                                            
    eval(['r11' num2str(i) '= DET' num2str(i) '*(-cos(Fi' num2str(i) ').*cos(Kappa' num2str(i) '));']);
    eval(['r12' num2str(i) '= DET' num2str(i) '*(cos(Fi' num2str(i) ').*sin(Kappa' num2str(i) '));']);
    eval(['r13' num2str(i) '= DET' num2str(i) '*(-sin(Fi' num2str(i) '));']);
    eval(['r21' num2str(i) '= DET' num2str(i) '*(-cos(Omega' num2str(i) ').*sin(Kappa' num2str(i) ')-sin(Omega' num2str(i) ').*sin(Fi' num2str(i) ').*cos(Kappa' num2str(i) '));']);
    eval(['r22' num2str(i) '= DET' num2str(i) '*(-cos(Omega' num2str(i) ').*cos(Kappa' num2str(i) ')+sin(Omega' num2str(i) ').*sin(Fi' num2str(i) ').*sin(Kappa' num2str(i) '));']);
    eval(['r23' num2str(i) '= DET' num2str(i) '*sin(Omega' num2str(i) ').*cos(Fi' num2str(i) ');']);
    eval(['r31' num2str(i) '= DET' num2str(i) '*(-sin(Omega' num2str(i) ').*sin(Kappa' num2str(i) ')+cos(Omega' num2str(i) ').*sin(Fi' num2str(i) ').*cos(Kappa' num2str(i) '));']);
    eval(['r32' num2str(i) '= DET' num2str(i) '*(-sin(Omega' num2str(i) ').*cos(Kappa' num2str(i) ')-cos(Omega' num2str(i) ').*sin(Fi' num2str(i) ').*sin(Kappa' num2str(i) '));']);
    eval(['r33' num2str(i) '= DET' num2str(i) '*(-cos(Omega' num2str(i) ').*cos(Fi' num2str(i) '));']);
                                                                            %vypocet clenu matice rotace
    eval(['r' num2str(i) '= sqrt((xcor' num2str(i) ').^2+(ycor' num2str(i) ').^2);']);
                                                                            %korigovana vzdalenost daneho bodu od daneho stredu snimku
    eval(['kx' num2str(i) '= r11' num2str(i) '.*(X' num2str(i) '-Vx' num2str(i) ')+r21' num2str(i) '.*(Y' num2str(i) '-Vy' num2str(i) ')+r31' num2str(i) '.*(Z' num2str(i) '-Vz' num2str(i) ');']);
    eval(['ky' num2str(i) '= r12' num2str(i) '.*(X' num2str(i) '-Vx' num2str(i) ')+r22' num2str(i) '.*(Y' num2str(i) '-Vy' num2str(i) ')+r32' num2str(i) '.*(Z' num2str(i) '-Vz' num2str(i) ');']);
    eval(['N' num2str(i)  '= r13' num2str(i) '.*(X' num2str(i) '-Vx' num2str(i) ')+r23' num2str(i) '.*(Y' num2str(i) '-Vy' num2str(i) ')+r33' num2str(i) '.*(Z' num2str(i) '-Vz' num2str(i) ');']);
                                                                            %vytvoreni parametru funkce
end
 
%MINIMALIZOVANA FUNKCE - VSE PREVEDENO NA PRAVOU STRANU ROVNICE, JEDNOTLIVE
%ROVNICE PRO JEDNOTLIVE SNIMKY NASKALADNY POD SEBE

for i = 1:size(name);
    if i == 1
        F1 = ['-x' num2str(i) '+Px' num2str(i) '-Cx' num2str(i) '.*kx' num2str(i) './N' num2str(i) '+xcor' num2str(i) '.*K1.*r' num2str(i) '.^2+xcor' num2str(i) '.*K2/10^6.*r' num2str(i) '.^4+xcor' num2str(i) '.*K3/10^12.*r' num2str(i) '.^6+P1.*(r' num2str(i) '.^2+2.*xcor' num2str(i) '.^2)+2.*P2.*xcor' num2str(i) '.*ycor' num2str(i) '+C1.*xcor' num2str(i) '+C2.*ycor' num2str(i) ';'...
              '-y' num2str(i) '+Py' num2str(i) '-Cx' num2str(i) '.*ky' num2str(i) './N' num2str(i) '+ycor' num2str(i) '.*K1.*r' num2str(i) '.^2+ycor' num2str(i) '.*K2/10^6.*r' num2str(i) '.^4+ycor' num2str(i) '.*K3/10^12.*r' num2str(i) '.^6+2.*P1.*xcor' num2str(i) '.*ycor' num2str(i) '+P2.*(r' num2str(i) '.^2+2.*ycor' num2str(i) '.^2)'];
    else
        F1 = [F1 ';-x' num2str(i) '+Px' num2str(i) '-Cx' num2str(i) '.*kx' num2str(i) './N' num2str(i) '+xcor' num2str(i) '.*K1.*r' num2str(i) '.^2+xcor' num2str(i) '.*K2/10^6.*r' num2str(i) '.^4+xcor' num2str(i) '.*K3/10^12.*r' num2str(i) '.^6+P1.*(r' num2str(i) '.^2+2.*xcor' num2str(i) '.^2)+2.*P2.*xcor' num2str(i) '.*ycor' num2str(i) '+C1.*xcor' num2str(i) '+C2.*ycor' num2str(i)...
                 ';-y' num2str(i) '+Py' num2str(i) '-Cx' num2str(i) '.*ky' num2str(i) './N' num2str(i) '+ycor' num2str(i) '.*K1.*r' num2str(i) '.^2+ycor' num2str(i) '.*K2/10^6.*r' num2str(i) '.^4+ycor' num2str(i) '.*K3/10^12.*r' num2str(i) '.^6+2.*P1.*xcor' num2str(i) '.*ycor' num2str(i) '+P2.*(r' num2str(i) '.^2+2.*ycor' num2str(i) '.^2)'];
    end
end

%FUNKCE PRO PRIPAD VYPOCTU POUZE PRVNICH DVOU CLENU RADIALNIHO ZKRESLENI

% for i = 1:size(name);
%     if i == 1
%         F1 = ['-x' num2str(i) '+dPx' num2str(i) '-Cx' num2str(i) '.*kx' num2str(i) './N' num2str(i) '+xcor' num2str(i) '.*K1.*r' num2str(i) '.^2+xcor' num2str(i) '.*K2.*r' num2str(i) '.^4' ';'...
%               '-y' num2str(i) '+dPy' num2str(i) '-Cy' num2str(i) '.*ky' num2str(i) './N' num2str(i) '+ycor' num2str(i) '.*K1.*r' num2str(i) '.^2+ycor' num2str(i) '.*K2.*r' num2str(i) '.^4' ];
%     else
%         F1 = [F1 ';-x' num2str(i) '+dPx' num2str(i) '-Cx' num2str(i) '.*kx' num2str(i) './N' num2str(i) '+xcor' num2str(i) '.*K1.*r' num2str(i) '.^2+xcor' num2str(i) '.*K2.*r' num2str(i) '.^4'...
%                  ';-y' num2str(i) '+dPy' num2str(i) '-Cy' num2str(i) '.*ky' num2str(i) './N' num2str(i) '+ycor' num2str(i) '.*K1.*r' num2str(i) '.^2+ycor' num2str(i) '.*K2.*r' num2str(i) '.^4'];
%     end
% end

%SESTAVENI MINIMALIZOVANE FUNKCE

eval(['F =[' F1 '];']);

end

