function [c mark_comuni mark_rimasti] = costo(cams,cam1,cam2)
%%
%% INPUT  : le due telecamere che confronto cam1 e cam2
%%          cam1 e cam2 rappresentano le etichette delle telecamerea da
%%          confrontare
%%
%% OUTPUT : matrice costo c tra le due telecamere
%%          sarebbe utile creare tabella che mostri tutte le c


%non ha senso fare l'associazione con la medesima telecamera
if cam1 == cam2
    c=0;
    return
end
%% questa parte sarebbe necessaria per garantire l'esecuzione, ma decido 
%% di ometterla per velocizzare: per come ho strutturato gli algoritmi 
%% sono sicuro di restare all'interno della struttura dati
% if cam1 > size(cams,2) | cam2 > size(cams,2)
%     disp('errore:considero l''associazione con una telecamera inesistente');
%     return
% end
%%


%inoltre per velocizzare la funzione costo per quelle telecamere che non
%hanno punti in comune perchè non vedono la stessa zona (lo so a priori!!)
%a) essendo troppo lontane 
%b) se non sono orientate nella stessa zona


%inizializzo un vettore per i markers presenti in entrambe le telecamere
%ed uno con le telecamere non in comune
%in tal modo se dovessi associare effetivamente queste due telecamere
%sarebbe immediato: 
% creare una nuova entità che ha: 
% b) new_cams(k).label=[cam1 cam2] 
% a) new_cams(k).setmarkers = marker_rimasti

mark_comuni=[];
mark_rimasti=[];
i=1; j=1; c=0;
%si potrebbe migliorare l'efficienza (per il caso peggiore) partendo dalla 
%metà del vettore setmarkers di entrambi
while i<=size(cams(cam1).setmarkers,2) && j<=size(cams(cam2).setmarkers,2)
    %controlle i markers in comune 
    %in realtà per ogni marker visto dalla telecamera dovrei esprimere
        %ache la probabilità di vederlo
        % => suppongo che setmarkers(i) sia un vettore colonna con 2 
        % elementi: -il 1° è il numero di marker 
        %           -il 2° è la prob di vederlo  
    if cams(cam1).setmarkers(1,i)<cams(cam2).setmarkers(1,j)
        mark_rimasti =[mark_rimasti cams(cam1).setmarkers(1,i)];
        i=i+1;  
    elseif cams(cam1).setmarkers(1,i)==cams(cam2).setmarkers(1,j)    
        c= c+ cams(cam1).setmarkers(2,i)*cams(cam2).setmarkers(2,j);
        mark_comuni=[mark_comuni cams(cam1).setmarkers(1,i)];
        i=i+1;
        j=j+1;
    else        
        mark_rimasti =[mark_rimasti cams(cam2).setmarkers(1,j)];
        j=j+1;
    end
end
if i<=size(cams(cam1).setmarkers,2)
    mark_rimasti =[mark_rimasti cams(cam1).setmarkers(1,i:end)];
    i=i+1;
end
if j<=size(cams(cam2).setmarkers,2)
    mark_rimasti =[mark_rimasti cams(cam2).setmarkers(1,j:end)];
    j=j+1;
end

%divido la c per il numero di marker associati
if ~isempty(mark_comuni)
    c= c/size(mark_comuni,2);
end

%moltiplico c per il seno dell'angolo fra le due telecamere
%invece di moltiplicare si potrbbe dare un certo peso all'anglo fra 2
%telecamere, in relazione all'errore che si ha nel matching quando sono 
%perpendicolari o paralleli

%     c= c*norm(sin(cams(cam1).angles-cams(cam2).angles))
    
%posso usare i verosri lungo l'asse z, ovvero gli assi delle piramidi:
%se moltiplicando v1*v2' si ha 0 => sono perpendicolari

phi=acos(cams(cam1).versore'*cams(cam2).versore);
c=c*abs(sin(phi));

      