%Script que define los datos del simulador de cobertura
global MATERIALES FACETAS DIFRACTORES;

MATERIALES(1,1:2)=[5-0.04*i 0.2]; %Hormigón
MATERIALES(2,1:2)=[2.5-0.03*i 0.05]; %Madera
MATERIALES(3,1:2)=[6-0.05*i 0.01]; %Vidrio
rayos_los=0;
rayos_ref=0;
num_refl=0;
rayos_dif=0;
num_dif=0;
bandera=0;
Dg=1; %directividad de la antena transmisora
k0=(2*pi*(2.4*10^9))/(3*10^8); %k0=(2*pi)/lambda = (2*pi*f)/c
c=3*10^8;
f=2.4*10^9; % 2.4 Ghz
Aef=((c^2)*Dg)/(4*pi*(f^2));
beta=pi/2;
area=input('¿Desea especificar el área eficaz de la antena? (1-Si 0-No):');
if(area==1)
    Aef=input('Área eficaz en metros cuadrados:');
end


fprintf('Introduzca datos del recinto:\n');
xmax=input('X max (en metros):');
ymax=input('Y max (en metros):');
res=input('Introduzca resolución (en metros):');
FACETAS(1,1:7)=[[0 0] [xmax 0] 0 1 1];
FACETAS(2,1:7)=[[xmax 0] [xmax ymax] 0 1 1];
FACETAS(3,1:7)=[[xmax ymax] [0 ymax] 0 1 1];
FACETAS(4,1:7)=[[0 ymax] [0 0] 0 1 1];
while(bandera==0)
    if(size(DIFRACTORES)~=0)
        DIFRACTORES(1:end,:)=[];
    end
    FACETAS(5:end,:)=[]; %Borramos facetas antiguas
    num_fac_int=input('Numero de facetas internas:');
    if(num_fac_int~=0)
        ult_dif=0; %Si el mapa es incorrecto, sobreescribimos los difractores también
        for fac=5:4+num_fac_int
            fprintf('Faceta interna numero %d\n',fac);
            FACETAS(fac,1)=input('x inicial:');
            FACETAS(fac,2)=input('y inicial:');
            FACETAS(fac,3)=input('x final:');
            FACETAS(fac,4)=input('y final:');
            FACETAS(fac,5)=0; %Tipo reflexión
            FACETAS(fac,6)=0; %Pared interna
            FACETAS(fac,7)=input('material(1-Hormigon, 2-Madera, 3-Vidrio):');
            %Considero los puntos esquina como posibles difractores
            if(FACETAS(fac,1)~=0 && FACETAS(fac,1)~=xmax && FACETAS(fac,2)~=0 && FACETAS(fac,2)~=ymax)
                DIFRACTORES(ult_dif+1,1:6)=[FACETAS(fac,1) FACETAS(fac,2) fac fac 2 FACETAS(fac,7)]; %El factor n inicializado a 2 (borde de faceta)
                ult_dif=ult_dif+1;
            end
            if(FACETAS(fac,3)~=0 && FACETAS(fac,3)~=xmax && FACETAS(fac,4)~=0 && FACETAS(fac,4)~=ymax)
                DIFRACTORES(ult_dif+1,1:6)=[FACETAS(fac,3) FACETAS(fac,4) fac fac 2 FACETAS(fac,7)]; %El factor n inicializado a 2 (borde de faceta)
                ult_dif=ult_dif+1;
            end
        end %Fin comprobacion de difractores para una faceta
    end %Fin de solicitud de datos de una faceta
    [num_facetas ~]=size(FACETAS);
    close all;
    pinta_facetas(res,0,xmax,ymax);
    bandera=input('¿Es correcto el mapa? (1-Si,0-No):');
end

fprintf('Introduzca datos del transmisor:\n')
x_tx=input('x (en metros):');
y_tx=input('y (en metros):');
p_tx=[x_tx y_tx];
pol=input('Polarizacion (1-Horizontal, 2-Vertical):');
P0=input('Potencia en mw:');
rayos_los=input('¿Considerar LOS? (1-Si, 0-No):');
rayos_ref=input('¿Considerar reflexiones? (1-Si, 0-No):');
if(rayos_ref==1)
    num_refl=input('Número de reflexiones:');
end
rayos_dif=input('¿Considerar difracciones? (1-Si, 0-No):');
if(rayos_dif==1)
    rayos_dif2=input('¿Considerar difracciones dobles? (1-Si, 0-No):');
    rayos_mix=input('¿Considerar rayos mixtos? (1-Si, 0-No):');
    if(rayos_mix==1 && num_refl==0)
        num_refl=input('Número de reflexiones:');
    end        
end
if(rayos_dif==1)
    ind1=1;
    ind2=ind1+1;
    [dif ~]=size(DIFRACTORES);
    borra=[];
    bandera=0;
    while(ind1<dif)
        while(ind2<dif+1) %Mientras no este repetido o llegue al final
            if((DIFRACTORES(ind1,1:2)-DIFRACTORES(ind2,1:2))==0) %Punto repetido
                %repetido=1;
                %display('HAY UNO REPETIDO');
                if(DIFRACTORES(ind1,3)==DIFRACTORES(ind1,4)) %Hay que añadir la faceta para formar una cuña
                    DIFRACTORES(ind1,4)=DIFRACTORES(ind2,3);
                    ang=angulo_incidencia([FACETAS(DIFRACTORES(ind1,3),1:2);FACETAS(DIFRACTORES(ind1,3),3:4)],[FACETAS(DIFRACTORES(ind1,4),1:2);FACETAS(DIFRACTORES(ind1,4),3:4)]);
                    if(ang==0) %Ambos son paralelos, no da 180 por usar arcoseno
                        %borralo a el y todos los que se crucen
                        if(bandera==0) %Cogemos la faceta de ind1 solo la primera vez
                            borra=[borra ind1 ind2];
                            bandera=1;
                        else
                            borra=[borra ind2];
                        end
                    else %Caso de que formen una cuña (<180º)
                        if(bandera==0) 
                            DIFRACTORES(ind1,5)=2-(1/pi)*ang*(pi/180);
                        end %Si ya habia dos facetas que formaran 180º para ese punto, elimino todos los difractores en ese punto
                        borra=[borra ind2];
                    end
                else %Si ya habia otra faceta, cojo la que forme angulo mayor, sin pasarse de 180º
                    seg1=[FACETAS(DIFRACTORES(ind1,3),1:2);FACETAS(DIFRACTORES(ind1,3),3:4)];
                    seg2=[FACETAS(DIFRACTORES(ind1,4),1:2);FACETAS(DIFRACTORES(ind1,4),3:4)];
                    segn=[FACETAS(DIFRACTORES(ind2,3),1:2);FACETAS(DIFRACTORES(ind2,3),3:4)];
                    ang1=angulo_incidencia(seg1,seg2);
                    ang2=angulo_incidencia(seg1,segn);
                    ang3=angulo_incidencia(seg2,segn);
                    ang=max([ang1 ang2 ang3]);
                    if(ang2==0 || ang3==0) %Si alguno de ellos es 180º desecho todos
                        borra=[borra ind1 ind2];
                    else
                        if(ang==ang1) %Las facetas antiguas ya eran la cuña mayor, la nueva cae en medio
                            borra=[borra ind2];
                        end
                        if(ang==ang2) %Seleccionamos la faceta que forme cuña mayor
                            DIFRACTORES(ind1,4)=DIFRACTORES(ind2,3);
                            DIFRACTORES(ind1,5)=2-(1/pi)*ang2*(pi/180);
                            borra=[borra ind2];
                        end
                        if(ang==ang3)
                            DIFRACTORES(ind1,3)=DIFRACTORES(ind2,3);
                            DIFRACTORES(ind1,5)=2-(1/pi)*ang3*(pi/180);
                            borra=[borra ind2];
                        end
                    end
                end
                %En cualquier caso,se ha borrado un difractor,
                ind2=ind2+1; %BORRAR
            else
                ind2=ind2+1;
            end
        end %He terminado de recorrer la lista, actualizo los índices
        bandera=0;
        ind1=ind1+1; %Comprobamos el siguiente elemento de la lista
        ind2=ind1+1; %Apuntamos al siguiente
    end %En este punto ya tenemos la lista de difractores sin repeticiones
    %Ahora eliminamos las cuñas que coinciden con otras paredes y no sean
    %en los extremos
    borra=unique(borra); 
    borra=sort(borra,'descend'); %De este modo, borramos correctamente
    for k=1:length(borra)
        DIFRACTORES(borra(k),:)=[];
    end
    [dif ~]=size(DIFRACTORES);
    borra=[];
    for n_fac=5:4+num_fac_int
        segmento2=[FACETAS(n_fac,1:2);FACETAS(n_fac,3:4)];
        for k=1:dif 
            if(n_fac~=DIFRACTORES(k,3)) %No comparar consigo misma
                segmento1=[FACETAS(DIFRACTORES(k,3),1:2);FACETAS(DIFRACTORES(k,3),3:4)]; %Solo necesito una de las facetas que forman la cuña
                p_int=calcula_intersecciones(segmento1,segmento2);
                if(((isempty(p_int)==0) && distancias(p_int,DIFRACTORES(k,1:2))==0) && ((distancias(p_int,segmento2(1,:))~=0) && (distancias(p_int,segmento2(2,:))~=0)))
                    borra=[borra k];
                end
            end
        end
    end
    borra=sort(borra,'descend'); %De este modo, borramos correctamente
    for k=1:length(borra)
        DIFRACTORES(borra(k),:)=[];
    end
    [dif ~]=size(DIFRACTORES);
end

rx(1,2)=0;%PRUEBAS
fprintf('Introduzca datos del receptor:\n')
rx(1)=input('x (en metros):');
rx(2)=input('y (en metros):');
