%Medida de agudeza visual mediante un método de ajuste
%
%Fases del problema:
%
%1. Estímulos:
%   Es de Snellen, de distinta orientación y contraste unidad, sobre un fondo
%   blanco de la luminancia máxima permitida por el dispositivo.
%2. Tarea que debe realizar el observador:
%   Determinar el tamaño angular mínimo del objeto que le permite reconocerlo.
%   El sujeto leerá la orientación de las letras en voz alta.
%3. Método de variación de los parámetros libres del experimento.
%   El parámetro libre es el ángulo subtendido por la letra. Si fijamos la distancia
%   de observación, variar el ángulo es sólo variar el tamaño de la letra.
%   Usaremos el método de ajuste.
%
%Abordamos cada fase del problema:
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%1. Obtención de los estímulos  %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%Construimos un test de agudeza formado por Es de Snellen de distinta orientación;
%Para facilitar el control del tamaño de la E, hacemos que el fondo de la figura sea del
%color que necesitemos y creamos una matriz que contiene sólo la E, no el fondo.

set(gcf,'Color',[1 1 1]);axis('off');hold on;
im=ones(5,5);im([1 3 5],:)=2*ones(3,5);im([2 4],1)=2*ones(2,1);

%Construimos Es girando y reflejando la E inicial.
im_e(:,:,1)=im;
im_e(:,:,2)=im';
im_e(:,:,3)=im(:,end:-1:1);
im_e(:,:,4)=im(:,end:-1:1)';

%Representamos las Es obtenidas en una figura y obtenemos el tamaño por defecto.
for i=1:4
   subplot(1,4,i);
   colormap([1 1 1;0 0 0]);image(im_e(:,:,i));axis('square');
   axis('off')
   ejes(i)=gca;
   set(gca,'Units','centimeters');
   pos(i,:)=get(gca,'Position');
   %El tamaño de la letra es, en este caso pos(i,3);
end

%Obtenemos los centros de las figuras:
 cen=pos(:,[1 2])+pos(:,3:4)/2;;
 

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%2 y 3. Implementación del método de medida  %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Introducimos la distancia de observación, en centímetros:
d=100;

%Paso de variación del tamaño
k=0.99;
 
%Creamos dos botones para modificar el tamaño de las letras
bot(1)=uicontrol(gcf,'units','normalized','String','+AV')
set(bot(1),'Callback',...
'posn=[cen-k*pos(:,3:4)/2 k*pos(:,3:4)];AV=pi/(180*60*2*atan(posn(1,3)/d/2/5));for i=1:4;set(ejes(i),''Position'',posn(i,:));end;title([''AV='' num2str(AV)]);pos=posn;');
posb=get(bot(1),'Position');
bot(2)=uicontrol(gcf,'units','normalized','String','-AV','Position',[posb(1)+posb(3) posb(2:4)])
set(bot(2),'Callback',...
'posn=[cen-pos(:,3:4)/2/k pos(:,3:4)/k];AV=pi/(180*60*2*atan(posn(1,3)/d/2/5));for i=1:4;set(ejes(i),''Position'',posn(i,:));end;title([''AV='' num2str(AV)]);pos=posn;');
%Podríamos crear más botones, con acciones adicionales.
bot(3)=uicontrol(gcf,'units','normalized','String','OK','Position',[posb(1)+2*posb(3) posb(2:4)])
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%¿Qué problemas tiene el test así generado y cómo los resolverías?%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


