%Ejemplo de cómo generar figuras espaciales complejas, introduciendo 
%cambios aleatorios en la paleta.

%Test para detección de sujetos con defectos protán
%El test consiste de una letra C, de un color, sobre
%un fondo de color distinto situado en la misma recta
%de confusión protán.

%A diferencia del caso anterior, ni el fondo ni la letra tendrán un color
%uniforme, sino que mantendremos la cromaticidad constante y haremos que la
%luminancia varíe aleatoriamente

%Cargamos el sistema de referencia y la información sobre el monitor
[T_l,Yw,Msx]=loadsys;
[tm,a,g]=loadmon(Msx);

%Definimos la paleta de colores del test
%Definimos un conjunto de colores para el fondo, con igual cromaticidad
%y distinta luminancia
t0=[0.55 0.31];
Y0=linspace(20,40,5);
T0=coor2tri([t0(ones(5,1),:) Y0'],Yw);
[n0,sat0,Tn0]=tri2val(T0,Yw,tm,a,g,8)
figure;colordgm(T0,1,T_l,Yw,'show_numb',1,'showtriang',{3,tm})
figure;colormap(n0);image(1:5)

%Pasamos al espacio de conos de Smith y Pokorny
LMS0=xyz2con(T0,6);
%Si el sujeto es protán, el valor de L que tenga el color es irrelevante
%Damos distintos valores de L
L=linspace(0,2*LMS0(1),20);
%Estos colores serán colores de confusión con T0
LMS=[L' LMS0(ones(1,20),2:3) ];
%Volvemos al espacio triestímulo y eliminamos los colores que no sean reales
T=con2xyz(LMS,6);
figure;colordgm(T,1,T_l,Yw,'show_numb',1,'showtriang',{3,tm})
valen=find((all(T'>0)));
T=T(valen,:);
%Y eliminamos también los que están fuera del triángulo de primarios
tY=tri2coor(T,Yw);
valen=find(inpolygon(tY(:,1),tY(:,2),tm([2:2:7],end),tm([3:2:7],end)));
T=T(valen,:);
figure;colordgm(T,1,T_l,Yw,'show_numb',1,'showtriang',{3,tm})
%Calculamos los niveles digitales de la paleta de colores
[n,sat,Tn]=tri2val(T,Yw,tm,a,g,8)
%Eliminamos los colores cuya luminancia es excesiva para nuestro monitor
valen=find(sat==0);
T=T(valen,:);

%Elegimos uno de los colores creados y, conservando su cromaticidad, cambiamos su
%luminancia
test=1;
tY=tri2coor(T(test,:),Yw);
Y=linspace(tY(3)/2,5*tY(3),10);
tY=[tY(ones(10,1),1:2) Y'];
Ttest=coor2tri(tY,Yw);
[n,sat,Tn]=tri2val(Ttest,Yw,tm,a,g,8)
%Eliminamos los colores cuya luminancia es excesiva para nuestro monitor
valen=find(sat==0);
Ttest=Ttest(valen,:);
figure;colormap(n);image(1:size(n,1))

%La paleta final será
paleta=[n0;n]
%el número de colores disponibles para el fondo es
ncf=size(n0,1)
%y para el test
nct=size(n,1);

%La imagen será una letra C de 256x256 píxels
%Definimos el dominio espacial del test, en grados subtendidos desde el observador
x=linspace(-1,1,256);
[x,y]=meshgrid(x);
%Definimos los radios y la apertura de la C
r1=0.4;r2=0.5;ang0=5;
%Elegimos el mejor sistema de referencia espacial para manejar el estímulo. Polares,
%en nuestro caso.
%Transformamos el domino [x,y] en cartesianas a un dominio [r,ang] en polares
r=sqrt(x.^2+y.^2);
ang=180*atan2(y,x)/pi;
%Determinamos en qué posiciones de la matriz hay que dibujar la letra C
[ind1,ind2]=find((r>=r1) & (r<=r2) & (abs(ang)>ang0));


%Creamos una imagen indexada de 256x256, combinando los índices de la paleta
%correspondientes a los posibles colores de fondo
im=round((ncf-1)*rand(256,256)+1);

%Rellenamos los píxeles correspondientes a la letra combinando aleatoriamente
%los índices de la paleta correspondientes al test y al fondo

for j=1:length(ind1);im(ind1(j),ind2(j))=round((size(paleta,1)-1)*rand(1,1)+1);end;

figure;imshow(im,paleta)

%Para comprobar si el observador ve la letra o no, podemos pedirle que nos
%diga la orientación de la abertura. Haremos que esta cambie de manera aleatoria
%de una presentación a otra.
posiciones=round(3*rand(30,1)+1);

fig=gcf+1;
for i=1:length(posiciones)
   if posiciones(i)==1
      imag=im;
   elseif posiciones(i)==2
      imag=im';
   elseif posiciones(i)==3
      imag=im(:,256:-1:1);
   else
      imag=im(256:-1:1,:)';
   end
   figure(fig);imshow(imag,paleta);pause;
end
