%Ejemplo de cómo generar figuras espaciales complejas

%Test para detección de sujetos con defectos protán
%El test consiste de una letra C, del color T0, sobre
%un fondo de color T. T0 y T corresponden a colores
%situados en una recta de confusión protán.

%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 al color T0
t0=[0.55 0.31 40];
T0=coor2tri(t0,Yw);
%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);
T=[T0;T];
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,:);
n=n(valen,:);
Tn=Tn(valen,:);

%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 de color verdadero, toda del color T0
for i=1:3;im(:,:,i)=n(1,i)*ones(256,256);end

%Decidimos qué color tendrá la letra y rellenamos los píxeles correspondientes
%a la misma de dicho color
test=2;
for i=1:3;for j=1:length(ind1);im(ind1(j),ind2(j),i)=n(test,i);end;end

figure;imshow(im)

%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
      for k=1:3;imag(:,:,k)=im(:,:,k)';end
   elseif posiciones(i)==3
      imag=im(:,256:-1:1,:);
   else
      for k=1:3;imag(:,:,k)=im(256:-1:1,:,k)';end
   end
   figure(fig);imshow(imag);pause;
end
