%% INTERFACCIA GRAFICA NEL CASO BIDIMENSIONALE


function [] = START()
global h1
global dest
global tempi

%% DICHIARAZIONE OGGETTI
S.ln = []; 
load base.mat
assignin('base','pt',pt)

%% BASE
S.fh = figure('units','pixels',...
              'position',[10 320 1054 730],...
              'menubar','none',...
              'name','SIMULAZIONI 2D',...
              'numbertitle','off',...
              'resize','off');  

          
S.tempi=uipanel('parent',S.fh,'units','pixel','position',[5 5 1040 720]);
          
          
S.axd = axes('parent',S.fh,...
             'units','pixels',...
             'position',[700 380 300 300],'visible','off');
axis([-2000 12000 -2000 12000])
dest=gca;

          
%% NUMERO TELECAMERE
          
S.NumTeler = uicontrol('parent',S.fh,'style','tex',...
                         'units','pix',...
                         'position',[30 650 180 25],...
                         'fontsize',13,...
                         'backg',get(S.fh,'color'),...
                         'string','NUMERO TELECAMERE','Visible', 'on');


S.NumTel = uicontrol('parent',S.fh,'style','pop',...
                        'units','pixels',...
                        'position',[30 620 180 25],...
                        'foregroundColor',[0.3 0.3 0.7],...
                        'backg',[1 1 1],...
                        'string',{'empty','OTTO','SEDICI'});                               

%% VARIABILI AUX    & ETICHETTE VARIE                
                    
S.Puntirealilabel = uicontrol('parent',S.fh,'style','tex',...
                         'units','pix',...
                         'position',[470 680 180 25],...
                         'fontsize',13,...
                         'backg',get(S.fh,'color'),...
                         'string','PUNTI REALI','Visible', 'on');

S.Puntirealilabel = uicontrol('parent',S.fh,'style','tex',...
                         'units','pix',...
                         'position',[470 340 180 25],...
                         'fontsize',13,...
                         'backg',get(S.fh,'color'),...
                         'string','PUNTI RICOSTRUITI','Visible', 'on');                     

S.DimStanzaXet= uicontrol('parent',S.fh,'style','tex',...
                         'units','pix',...
                         'position',[30 590 180 25],...
                         'fontsize',13,...
                         'backg',get(S.fh,'color'),...
                         'string','VISUALE MINIMA','Visible', 'on');
                     
                     
S.DimStanzaYet= uicontrol('parent',S.fh,'style','tex',...
                         'units','pix',...
                         'position',[220 590 180 25],...
                         'fontsize',13,...
                         'backg',get(S.fh,'color'),...
                         'string','VISUALE MASSIMA','Visible', 'on');

S.Epsilonet= uicontrol('parent',S.fh,'style','tex',...
                         'units','pix',...
                         'position',[220 530 180 25],...
                         'fontsize',13,...
                         'backg',get(S.fh,'color'),...
                         'string','EPSILON','Visible', 'on');

S.unicpuntolabel= uicontrol('parent',S.fh,'style','tex',...
                         'units','pix',...
                         'position',[30 470 180 25],...
                         'fontsize',13,...
                         'backg',get(S.fh,'color'),...
                         'string','DIST. UNICO P.TO','Visible', 'on');
                     
S.Vis_min = uicontrol('parent',S.fh,'style','edit','position',[30  560 180 25],'backg',[1 1 1],'string','1000');                       
S.Vis_max = uicontrol('parent',S.fh,'style','edit','position',[220  560 180 25],'backg',[1 1 1],'string','7000');  
S.Epsilon = uicontrol('parent',S.fh,'style','edit','position',[220  500 180 25],'backg',[1 1 1],'string','2');  
S.DistUnic = uicontrol('parent',S.fh,'style','edit','position',[30  440 180 25],'backg',[1 1 1],'string','5');  

%% TEMPI

S.EpsilonTempi= uicontrol('parent',S.fh,'style','tex',...
                         'units','pix',...
                         'position',[30 150 180 25],...
                         'fontsize',13,...
                         'backg',get(S.fh,'color'),...
                         'string','TEMPO ESECUZIONE','Visible', 'on');

S.Ttot = uicontrol('parent',S.fh,'style','edit','position',[220  150 100 25],'backg',[1 1 1],'visible','on'); 
                     
S.tP1R4 = uicontrol('parent',S.fh,'style','edit','position',[30  120 100 25],'backg',[1 1 1],'visible','off'); 
S.tP1R3 = uicontrol('parent',S.fh,'style','edit','position',[30  90 100 25],'backg',[1 1 1],'visible','off'); 
S.tP1R2 = uicontrol('parent',S.fh,'style','edit','position',[30  60 100 25],'backg',[1 1 1],'visible','off'); 
S.tP1R1 = uicontrol('parent',S.fh,'style','edit','position',[30  30 100 25],'backg',[1 1 1],'visible','off'); 

S.tP2R2 = uicontrol('parent',S.fh,'style','edit','position',[140  90 100 25],'backg',[1 1 1],'visible','off'); 
S.tP2R1 = uicontrol('parent',S.fh,'style','edit','position',[140  60 100 25],'backg',[1 1 1],'visible','off'); 

S.tP3R1 = uicontrol('parent',S.fh,'style','edit','position',[250  75 100 25],'backg',[1 1 1],'visible','off'); 



%% NUMERO MARKER
                     
S.ed.tot2 = uicontrol('parent',S.fh,'style','tex',...
                         'units','pix',...
                         'position',[220 650 180 25],...
                         'fontsize',13,...
                         'backg',get(S.fh,'color'),...
                         'string','NUMERO MARKER','Visible', 'on');

S.NumMarker = uicontrol('parent',S.fh,'style','edit','position',[220  620 180 25],'backg',[1 1 1]);                           

set(S.NumTel,'callback',{@NumTel_call,S});  


S.PRx = uicontrol('parent',S.fh,'style','list',...
                 'unit','pix',...
                 'position',[470 30 100 300],...
                 'min',0,'max',2,...
                 'fontsize',14,...
                 'string',{},'visible','on');
             
S.PRy = uicontrol('parent',S.fh,'style','list',...
                 'unit','pix',...
                 'position',[570 30 100 300],...
                 'min',0,'max',2,...
                 'fontsize',14,...
                 'string',{},'visible','on');

             
%% OUNTI RICOSTRUITI

S.PVx = uicontrol('parent',S.fh,'style','list',...
                 'unit','pix',...
                 'position',[470 380 100 300],...
                 'min',0,'max',2,...
                 'fontsize',14,...
                 'string',{},'visible','on');         


S.PVy = uicontrol('parent',S.fh,'style','list',...
                 'unit','pix',...
                 'position',[570 380 100 300],...
                 'min',0,'max',2,...
                 'fontsize',14,...
                 'string',{},'visible','on');         


%% SCELTA TIPO RICOSTRUZIONE
S.ed.tot = uicontrol('parent',S.fh,'style','tex',...
                         'units','pix',...
                         'position',[30 530 180 25],...
                         'fontsize',13,...
                         'backg',get(S.fh,'color'),...
                         'string','TIPO RICOSTRUZIONE','Visible', 'on');
                     
S.TipRic = uicontrol('parent',S.fh,'style','pop',...
                        'units','pixels',...
                        'position',[30 500 180 25],...
                        'foregroundColor',[0.3 0.3 0.7],...
                        'backg',[1 1 1],...
                        'string',{'empty','CENTRALIZZATO','ELIMINA RAGGI','MANTIENI RAGGI','ELIMINA RAGGI PESATI','MANTIENI RAGGI PESATI'}); 

%% PULSANTI

S.pb(1) = uicontrol('parent',S.fh,'style','push',...
                    'units','pixels',...
                    'position',[30 320 180 50],...
                    'fontsize',14,...
                    'string','INIZIALIZZAZIONE');
                
S.pb(2) = uicontrol('parent',S.fh,'style','push',...
                    'units','pixels',...
                    'position',[30 240 180 50],...
                    'fontsize',14,...
                    'string','RESTART','Visible','on');

S.pb(3) = uicontrol('parent',S.fh,'style','push',...
                    'units','pixels',...
                    'position',[220 240 180 50],...
                    'fontsize',14,...
                    'string','MEDIA','Visible','on');

S.pb(4) = uicontrol('parent',S.fh,'style','push',...
                    'units','pixels',...
                    'position',[220 320 180 50],...
                    'fontsize',14,...
                    'string','RICOSTRUZIONE');

        
                

%% GRAFICO INSERIMENTO PUNTI 

S.FigPun = axes('parent',S.fh,'units','pixels',...
               'position',[700 380 300 300],...
               'fontsize',8,...
               'visible','on');

title('Click to add points','fontw','bold')
set(S.FigPun,'buttondownfcn',{@ax_bdfcn,S})
axis([0 10000 0 10000])

set(S.TipRic,'callback',{@TipRic_call,S});

%% GRAFICO RICOSTRUZIONE

S.FigRic = axes('parent',S.fh,'units','pixels',...
               'position',[700 30 300 300],...
               'fontsize',8,...
               'visible','on');
h1=gca;
axis([0 10000 0 10000])

%% FUNZIONE INSERIMENTO MANUALE DEI MARKER           
function [] = ax_bdfcn(varargin)

S = varargin{1,3};  % Associo ad S la struttura della GUI
L = length(S.ln);
p = get(S.FigPun, 'currentpoint'); % Ritorna la posizione del mouse
S.ln(L+1) = line(p(1),p(3),'Marker','+');  % Plotto il marker

punti=evalin('base','pt');
if punti(1,1)==-1
punti=[p(1,1) p(1,2)];
else
punti=[punti ; p(1,1) p(1,2)] ;
end
set(S.PVx,'string',{punti(:,1)}) %aggiungo alla lista dei punti reali
set(S.PVy,'string',{punti(:,2)}) 
assignin('base','pt',punti); %Salvo nel workspace la lista aggiornata dei marker reali posizionati
set(S.NumMarker,'string',length(punti(:,1))) %Aggiorno l'informazione sul numero di marker
assignin('base','n',length(punti(:,1))) %Salvo nel workspace il numero di marker


%% FUNZIONE SCELTA NUMERO TELECAMERE

function [] = NumTel_call(varargin)
S = varargin{3};  % Associo ad S la struttura della GUI
P = get(S.NumTel,{'string','val'});  % Leggo la scelta dell'utente
if P{2}==2                    % Salvo il numero di telecamere nel WS
assignin('base','m',8)
else
    assignin('base','m',16)
end


    
%% FUNZIONE SCELTA TIPO DI RICOSTRUZIONE

function [] = TipRic_call(varargin)
S = varargin{3};
P = get(S.TipRic,{'val'});
assignin('base','TipoRicostruzione',P{1})

%% ASSOCIO AD OGNI BOTTONE UNA FUNZIONE
hold off;
set(S.pb(:),{'callback'},{{@pb1_call,S};{@pb2_call,S};{@pb3_call,S};{@pb4_call,S}})  


%% PULSANTE INIZIALIZZAZIONE

function [] = pb1_call(varargin)
S=varargin{1,3}; % Associa aD S la struttura della GUI
WB = waitbar(0,'loading...','position',[30,100,290,60]) ; %Apre la barra di attesa
global dest
tmp = str2double(get(S.Epsilon,'string')); %Legge dall'interfaccia il valore di epsilon, lo converte da stringa a numero
assignin('base','epsilon',tmp)
tmp = str2double(get(S.Vis_min,'string')); %Assume la visuale minima della videocamera e la salva nel workspace
assignin('base','d_min',tmp)
tmp = str2double(get(S.Vis_max,'string')); %Assume la visuzle massima della videocamera
assignin('base','d_max',tmp)
waitbar(0.3, WB) ;
assignin('base','dim_stanza_x',10000); %Salva nel workspace le  dimensioni dell'ambiente di ripresa assunte 10000x10000 [mm]x[mm]
assignin('base','dim_stanza_y',10000);

dim_stanza_x=10000;
dim_stanza_y=10000;

d_min=evalin('base','d_min'); %Carica i dati della videocamera dal workspace
d_max=evalin('base','d_max');

m=evalin('base','m'); %Carica dal workspace il numero di telecamere
n=evalin('base','n'); %Carica dal workspace il numero di marker
pt=evalin('base','pt'); %Carica dal workspace i marker reali

Main2 %richiama la funzione main2

set(S.FigPun,'visible','off')
set(S.axd,'visible','on')
waitbar(0.7,WB); %aggiornamento waitbar

assignin('base','a',a); %Salva nel workspace i parametri delle rette passanti per centri e fuoco
assignin('base','b',b);
assignin('base','c',c);
assignin('base','piano_gen',piano_gen); %Salvo piani immagine delle videocamere
assignin('base','num_pixel_centri',num_pixel_centri); %Salva numero pixel di ogni proiezione di marker su piano immagine
assignin('base','x_f_as',x_f_as); %Salvo dati fuochi telecamere
assignin('base','y_f_as',y_f_as);
waitbar(1,WB) ; %Completa waitbar
close(WB) %Chiudi wb

%% BOTTONE RICOSTRUZIONE

function [] = pb4_call(varargin)
global h1;
S=varargin{3}; % assegna ad S la struttua dell'intefaccia

tmp = str2double(get(S.Epsilon,'string')); %Legge epsilon dall'interfaccia, lo converte in numero e lo salava nel workspace
assignin('base','epsilon',tmp)
pt=evalin('base','pt'); %Carica le coordinate dei marker veri
pt=pt';
x_f_as=evalin('base','x_f_as'); %Carica posizione fuoco delle telecamere
y_f_as=evalin('base','y_f_as');
a=evalin('base','a');   %Carica, sempre da workspace, i dati relativi ai raggi
b=evalin('base','b');
c=evalin('base','c');
d_min=evalin('base','d_min'); %Carica il campo visivo delle videocamere
d_max=evalin('base','d_max');
Scelta=evalin('base','TipoRicostruzione'); %Carica il tipo di ricostruzione scelto
num_pixel_centri=evalin('base','num_pixel_centri'); %Carica il numero di pixel associato a ciascun raggio
epsilon=evalin('base','epsilon');
dim_stanza_x=evalin('base','dim_stanza_x'); %Carica le dimensioni dell'ambiente di ripresa
dim_stanza_y=evalin('base','dim_stanza_y');
numero_tele=evalin('base','m'); %Carica il numero di videocamere

if numero_tele==16 %Ricostruzione nel caso di 16 videocamere
if Scelta==2
    Test_Stato_dell_Arte % Richiama la ricostruzione centralizzata
    Punti=pulisci2(punti_stato_arte);
    Punti_med=Punti; 
end
if Scelta==3
    Test_Associa2; % Richiama la ricostruzione decentralizzata con minimi quadrati elimina raggi
    Punti=pulisci2(P14a2);
    Punti_med=Punti;
end
if Scelta==4
   Test_Associa3 % Richiama la ricostruzione decentralizzata con minimi quadrati mantieni raggi
   Punti=pulisci3(P14a3); 
   Punti_med=Punti;
   %Estrapolo i punti dalle celle
    P=[Punti{1}{1}];
    for i=2:length(Punti)
      P=[P ; Punti{i}{1}];        
    end
    Punti=P;
end

if Scelta==5
    Test_Associa2_pes %Richiama ricostruzione decentralizzata con minimi quadrati pesati elimina raggi
    Punti=pulisci2(P14Pa2);
    Punti_med=Punti;
end

if Scelta==6
    Test_Associa3_pes %Richiama ricostruzione decentralizzata con minimi quadrati pesati mantieni raggi
    Punti=pulisci3(P14Pa3);
    Punti_med=Punti;
    %Estrapolo i punti dalle celle
    P=[Punti{1}{1}];
    for i=2:length(Punti)
      P=[P ; Punti{i}{1}];        
    end
    Punti=P;
end
else %Ricostruzione con 8 videocamere
if Scelta==2
    Test_Stato_dell_Arte %Richiama ricostruzione centralizzata
    Punti=pulisci2(punti_stato_arte);
    Punti_med=Punti;
end
if Scelta==3
    Test_Associa28; %Richiama ricostruzione decentralizzata mediante minimi quadrati con eliminazione dei raggi
    Punti=pulisci2(P14a2);
    Punti_med=Punti;
end
if Scelta==4
   Test_Associa38 %Richiama ricostruzione decentralizzata con minimi quadrati che mantengono raggi
   Punti=pulisci3(P14a3);
   Punti_med=Punti;
   %Estrapolo i punti dalle celle
    P=[Punti{1}{1}];
    for i=2:length(Punti)
      P=[P ; Punti{i}{1}];        
    end
    Punti=P;
end

if Scelta==5
    Test_Associa2_pes8 %Richiama ricostruzione decentralizzata con minimi quadrati pesati con eliminazione dei raggi
    Punti=pulisci2(P14Pa2);
    Punti_med=Punti;
end

if Scelta==6
    Test_Associa3_pes8 %Richiama ricostruzione decentralizzata con minimi quadrati pesati che mantengono raggi
    Punti=pulisci3(P14Pa3);
    %Estrapolo i punti dalle celle
    P=[Punti{1}{1}];
    Punti_med=Punti;
    for i=2:length(Punti)
      P=[P ; Punti{i}{1}];        
    end
    Punti=P;
 
end    
    
end
set(S.PRx,'string',{Punti(:,1)}) %aggiungo alla lista dei punti ricostruiti i punti ottenuti
set(S.PRy,'string',{Punti(:,2)}) 
axes(h1) %Attivo l'axes per la ricostruzione e visualizzo i punti originari e quelli ricostruiti
plot(Punti(:,1),Punti(:,2),'.','Marker','+','MarkerSize',10)
hold on
plot(pt(1,:),pt(2,:),'.','Marker','o','MarkerSize',10)
axis([0 10000 0 10000])
grid on
hold off
assignin('base','Punti',Punti); %salvo i punti ricostruiti nel ws
assignin('base','Punti_med',Punti_med);

%% FUNZIONE MEDIA

function [] = pb3_call(varargin)

global h1;
S=varargin{3};

tmp = str2double(get(S.DistUnic,'string')); %ottengo valore distanza che identifica un unico marker e la salvoanche nel workspace
assignin('base','d_unic',tmp);
d_unic=evalin('base','d_unic');
Punti_med=evalin('base','Punti_med');
Tip_Ric=evalin('base','TipoRicostruzione');
pt=evalin('base','pt');
pt=pt';
if (Tip_Ric==4 || Tip_Ric==6) %Se la ricostruzione avvenuta mantenendo i raggi medio mediante media_punti3
   P_med=media_punti3(Punti_med,d_unic)
   assignin('base','temporaneo',P_med)
   P=[P_med{1}{1}(1:2)];
   for i=2:length(P_med)
     P=[P ; P_med{i}{1}(1:2)];        
   end
   P_med=P;
else
   P_med=media_punti2(Punti_med,d_unic); %Altrimenti media con media_punti2
end


set(S.PRx,'string',{P_med(:,1)}) %aggiorno la lista dei punti ricostruiti
set(S.PRy,'string',{P_med(:,2)})
axes(h1) %Aggiorno il grafico della ricostruzione
plot(P_med(:,1),P_med(:,2),'.','Marker','+','MarkerSize',10)
hold on
plot(pt(1,:),pt(2,:),'.','Marker','o','MarkerSize',10)
axis([0 10000 0 10000])
grid on
hold off

%% FUNZIONE RESTART: Riavvia una nuova interfaccia e chiede quella in
%% esecuzione
function [] = pb2_call(varargin)
% S=varargin{3};
 clear all
 clc
 close all
 START
