Posición aparente de un objeto debajo del agua

Primero, vamos a resolver una situación más simple. Dado el ángulo de incidencia, determinaremos la posición aparente de un objeto vista por un nadador que se encuentra en la dirección del rayo refractado
El objeto está situado en el origen a una profundidad h. Del objeto parte un rayo (color rojo) que forma un ángulo de incidencia θi. El rayo refractado forma un ángulo θr con la normal. De acuerdo con la ley de la refracción
nsinθi=sinθr
siendo n=1.33 el índice de refracción del agua y 1 el índice de refracción del aire. El ángulo de refracción θr es mayor que el incidente θi.
La dirección del rayo refractado y su prolongación pasa por el punto (xs,h) y su pendiente es 1/tanθr. Sabiendo que xs=htanθi. La ecuación de esta recta es
Del objeto parte un rayo (color azul) que forma un ángulo de incidencia θ'i. El rayo refractado forma un ángulo θ'r con la normal.
La dirección del rayo refractado y su prolongación pasa por el punto (x's,h) y su pendiente es 1/tanθ'r. Sabiendo que x's=htanθ'i. La ecuación de esta recta es
Las prolongaciones de los rayos refractados se cortan el en punto señalado en color azul de coordenadas
Esta es la posición (xa, ya) aparente del objeto visto por un observador que se encuentra en la dirección del rayo refractado. Donde θ'i=θi+δ, siendo δ un incremento de ángulo pequeño.
Representamos la posición aparente (xa, ya) de un objeto situado en el origen, para varios ángulos de incidencia
La profundidad del objeto es h=1 m, el incremento de ángulo δ=0.01 grados. Las flechas indican la dirección del rayo refractado, la dirección de observación del objeto
n=1.33; %índice de refracción del agua
delta=0.01*pi/180; %0.01 grado
h=1; %profundidad
hold on
%piscina
x=[0,0,1.1,1.1];
y=[0,1,1,0];
fill(x,y,'c')
plot(0,0,'ro','markersize',4,'markeredgecolor','r','markerfacecolor','r')
for aIn=(0:5:45)*pi/180
aRe=asin(n*sin(aIn)); %ángulo de refracción
aRe_p=asin(n*sin(aIn+delta)); %ángulo de refracción
xa=sin(aIn)^3*(n^2-1)*h/cos(aIn)^3;
ya=(1-(1-n^2*sin(aIn)^2)^(3/2)*h/(n*cos(aIn)^3));
plot(xa,ya,'ro','markersize',4,'markeredgecolor','r','markerfacecolor','r')
xs=h*tan(aIn);
line([0,xs],[0,h],'color','k')
line([xs,xa],[h,ya],'lineStyle','--','color','k')
quiver(xs,h,0.25*sin(aRe),0.25*cos(aRe));
end
hold off
xlim([0,1.1])
xlabel('x')
ylabel('y')
title('Refracción')

Se fija la posición del observador
En esta sección vamos a describir la posición aparente de los objetos sumergidos en una piscina respecto de un nadador situado en el borde

El eje Y coincide con la posición del nadador y el eje X con la superficie del agua. La posición de los ojos del nadador es (0,y0) y la posición del objeto sumergido (punto de color rojo) en el agua es (xb, yb), la posición aparente del objeto (punto de color azul) es (xa, ya)
Un rayo incidente procedente del objeto, se refracta en un punto de la superficie de separación de los dos medios situado a xs, formando un ángulo θi con la normal. El rayo refractado llega a los ojos del observador formando un ángulo θr con la normal.
Conocida la posición del objeto (xb, yb) y la de los ojos del nadador (0,y0), a partir de la ley de la refracción, nsinθi=sinθr, vamos a calcular la posición xs donde se refracta el rayo de luz procedente del objeto y los ángulo de incidencia θi y el refractado θr. En la figura vemos que
Eliminado xs y utilizando la ley de la refracción
Resolvemos esta ecuación transcendente, para calcular θr, después xs y θi
La ecuación de la dirección del rayo refractado y su prolongación es
Para determinar la posición aparente del objeto, precisamos trazar un rayo más de ángulo de refracción θ'r= θr+δ, (siendo δ un ángulo muy pequeño, infinitesimal) y hallar la intersección de la prolongación de los dos rayos refractados, tal como se muestra exageradamente en la figura. Las ecuaciones de las rectas de color rojo y azul son, respectivamente

Despejamos la posición aparente xa e ya que es el punto de intersección de las dos rectas
Calculamos la ordenada ya
Hacemos la aproximación
El resultado final es
Calculamos la abscisa xa
El resultado final es
Cálculo de la posición aparente de un objeto sumergido
Sea y0=1.5 la altura de los ojos de nadador, la posición del objeto (xb, yb) es (5,-2)m
Resolvemos la ecuación transcendente para calcular el ángulo del rayo refractado θr y la posición xs en la superficie del agua donde se refracta el rayo incidente
y posteriormente, las posición aparente (xa, ya) de un objeto situado en la posición (xb, yb)
Trazamos el rayo incidente, el refractado y su prolongación hasta la posición aparente del objeto
n=1.33; %índice de refracción del agua
xb=5; %distancia al objeto
yb=-2; %profundidad
y0=1.5; %observador
f=@(x) xb-y0*x/sqrt(1-x^2)+yb*x/sqrt(n^2-x^2); % x es sin(th)
th_r=asin(fzero(f,[0,0.99]));
hold on
%piscina
x=[0,5,5,0];
y=[0,0,-2,-2];
hold on
fill(x,y,'c')
plot(xb,yb,'ro','markersize',6,'markeredgecolor','r','markerfacecolor','r')
plot(0,y0,'ko','markersize',4,'markeredgecolor','k','markerfacecolor','k')
xa=xb+yb*(n^2-1)*sin(th_r)^3/(n^2-sin(th_r)^2)^(3/2);
ya=yb*n^2*cos(th_r)^3/(n^2-sin(th_r)^2)^(3/2);
plot(xa,ya,'bo','markersize',4,'markeredgecolor','b','markerfacecolor','b')
xs=y0*tan(th_r);
line([xb,xs],[yb,0],'color','k')
line([0,xs],[y0,0],'color','k')
line([xs,xa],[0,ya],'lineStyle','--','color','k')
hold off
xlabel('x')
ylabel('y')
title('Refracción')

Elaboramos un script para dibujar la apariencia de un objeto de forma circular de radio 0.5 situado en el fondo de una piscina. La posición del centro del objeto es (5,-2) m y el observador está en el borde de la piscina a y0=1.5
n=1.33; %índice de refracción del agua
y0=1.5; %observador
%objeto
t=(1:360)*pi/180;
Xb=[0.5*cos(t),0]+5;
Yb=[0.5*sin(t),0]-2;
%piscina
x=[0,5.6,5.6,0];
y=[0,0,-2.6,-2.6];
hold on
fill(x,y,'c')
%observador
plot(0,y0,'ko','markersize',4,'markeredgecolor','k','markerfacecolor','k')
for i=1:length(Xb)
xb=Xb(i);
yb=Yb(i);
f=@(x) xb-y0*x/sqrt(1-x^2)+yb*x/sqrt(n^2-x^2);
th_r=asin(fzero(f,[0,0.99]));
plot(xb,yb,'ro','markersize',2,'markeredgecolor','r','markerfacecolor','r')
xa=xb+yb*(n^2-1)*sin(th_r)^3/(n^2-sin(th_r)^2)^(3/2);
ya=yb*n^2*cos(th_r)^3/(n^2-sin(th_r)^2)^(3/2);
plot(xa,ya,'bo','markersize',2,'markeredgecolor','b','markerfacecolor','b')
end
xs=y0*tan(th_r);
line([xb,xs],[yb,0],'color','k')
line([0,xs],[y0,0],'color','k')
line([xs,xa],[0,ya],'lineStyle','--','color','k')
hold off
xlabel('x')
ylabel('y')
title('Refracción')

Finalmente, dibujamos la forma aparente del fondo de una piscina vista por el nadador situado en el borde. La forma real está descrita por la función
n=1.33; %índice de refracción del agua
y0=1.5; %observador
g=@(x) (-0.9-0.5*x/15.5).*(x<15.5)+(-1.6*x+21.02).*(x>=15.5 && x<18.2)/2.7
-3*(x>=18.2 && x<=25);
xb=0:0.1:25;
yb=zeros(1,length(xb));
xa=zeros(1,length(xb));
ya=zeros(1,length(xb));
for i=1:length(xb)
yb(i)=g(xb(i));
end
%yb=fliplr(yb);
for i=1:length(xb)
f=@(x) xb(i)-y0*x/sqrt(1-x^2)+yb(i)*x/sqrt(n^2-x^2);
if sign(f(0))==sign(f(0.99))
break;
else
th_r=asin(fzero(f,[0,0.99]));
end
xa(i)=xb(i)+yb(i)*(n^2-1)*sin(th_r)^3/(n^2-sin(th_r)^2)^(3/2);
ya(i)=yb(i)*n^2*cos(th_r)^3/(n^2-sin(th_r)^2)^(3/2);
end
hold on
%observador
plot(0,y0,'ko','markersize',4,'markeredgecolor','k','markerfacecolor','k')
fill([25,0,xb],[0,0,yb],'c')
plot(xa(1:i-1),ya(1:i-1),'r')
hold off
xlabel('x')
ylabel('y')
title('Refracción')

Invertimos el perfil de la piscina, de modo que la parte más profunda esté más cerca del observador
Utilizamos la función
...
for i=1:length(xb)
yb(i)=g(xb(i));
end
yb=fliplr(yb);
for i=1:length(xb)
...

El nadador no aprecia el fondo de la piscina a partir de cierta distancia xb de alrededor 6 m, para la cual ya se hace casi cero
Referencias
Kenneth S. Mendelson. Apparent shape of a swimming pool. Am. J. Phys. 78 (12). December 2010, pp.1254-1257
R Arizaga, N Cap, H Rabal, M Trivi. Image distortion due to refraction by planar surfaces. Eur. J. Phys. 31 (2010) pp. 115-127