Esto es algo así como el análisis de datos de seguimiento de animales que tengo que hacer en el laboratorio. Mi reflejo sería algo así:
Primero define una pista linearizada como sugirió @Iterator. Hago esto definiendo una spline con entre 3 y 20 puntos de control. Puedes ajustar la spline a través de todos tus datos o usar algo absoluto como la forma física de la pista de taxi, o la ruta óptima que produciría un taxiado perfecto según el libro de texto. Sea lo que sea que elijas, llamémoslo la ruta de referencia.
Luego muestrea densamente esa spline: encuentra unos 100,000 puntos más o menos a lo largo de la spline espaciados uniformemente de principio a fin.
Luego, para cada punto en el tiempo, y para cada trayectoria, determina dos cosas: (x) la identidad del punto a lo largo de la ruta de referencia que está más cerca de la posición XY del avión en ese punto en el tiempo, y (y) la distancia euclidiana entre el punto de datos instantáneo y ese punto de spline más cercano. Graficar y como una función de x te da un gráfico de la distancia entre el avión y la ruta de referencia, por la distancia a lo largo de esa ruta.
Si defines tu ruta de referencia como la spline a través de la trayectoria del Avión A, y haces el gráfico descrito anteriormente para el Avión B con respecto a esa ruta, tendrás la distancia entre los aviones como una función de su curso a lo largo de la pista, independientemente del tiempo.
Aquí tienes algo de código comentado que hace el truco. Funciona en mi ordenador con los datos de prueba aquí.
% Script para determinar la distancia entre 2 rutas en función
% de la distancia a lo largo de la primera ruta
%
% La Ruta 1 se utiliza para ajustar una spline. Esa spline se interpola densamente
% Para un punto dado a lo largo de la Ruta 2, se buscan los puntos de interpolación de la Ruta 1
% para encontrar el que tiene la distancia euclidiana más baja. La distancia al
% punto de interpolación de la Ruta 1 MÁS CERCANO a lo largo de la Ruta 1 es la 'distancia a la ruta de referencia' de esos puntos de la Ruta 2,
% y la distancia entre el punto de interpolación y el punto de la Ruta 2 es la 'desviación de la ruta de referencia'
%
% Debido a que los puntos a lo largo de la Ruta 1 no se están moviendo monótonamente desde el
% inicio de la ruta hasta el final, para ajustar una spline suave sobre
% la Ruta 1, hago que el usuario haga clic en puntos de control de spline sobre la Ruta 1. A
% se ajusta una spline temporal a los puntos clicados por el usuario, y se utiliza la spline temporal para dividir los datos de la Ruta 1 en pequeños grupos de datos. La
% centroid de cada grupo se toma como un punto de control para construir una Ruta 1
% spline.
%% Cargar datos. La ruta1 y la ruta2 son cada dos matrices n \[x\_data; y\_data\] %%
load pos\_data.mat ruta1 ruta2;
%% Graficar datos en bruto y obtener puntos de spline del usuario %%
figure; trazar(ruta1(1,:), ruta1(2,:), 'b'); % Primera ruta
hold on; trazar(ruta2(1,:), ruta2(2,:), 'r'); % Segunda ruta
\[spl\_x, spl\_y\] = getpts(); % Clics del ratón para definir la spline
user\_path = \[spl\_x'; spl\_y'\]; % Reorganizar al mismo formato que ruta1,2
%% Crear spline a partir de los puntos del usuario %%
n\_xx = 100; % n\_xx puntos de interpolación para la spline temporal
n\_x = size(user\_path,2); % n\_x muestras, 2 valores cada uno
xx\_t = linspace(0,1,n\_xx); % los interpolantes
x\_t = linspace(0,1,n\_x); % el parámetro para nuestra función paramétrica del tiempo
yy\_t = spline(x\_t,user\_path,xx\_t); % yy son los puntos a lo largo de la ruta en xx
plot( yy\_t(1,:), yy\_t(2,:), '.b', 'LineWidth', 4 );
%% Dividir los puntos de la Ruta 1 en grupos por el punto de interpolación temporal más cercano %%
% Para cada punto de la Ruta 1, encuentra el punto temporal de spline más cercano
TRI = delaunay( yy\_t(1,:), yy\_t(2,:) );
índice = dsearch( yy\_t(1,:), yy\_t(2,:), TRI, ruta1(1,:), ruta1(2,:) );
ruta1\_x = zeros(2,n\_xx); % hacer 1 punto de control de spline de la Ruta 1 para cada grupo de puntos de la Ruta 1
% hay n\_xx contenedores para puntos en Ruta 1. Determine los n\_xx centroides
% de los grupos de puntos que caen en cada uno de esos contenedores.
para n = 1:n\_xx
ruta1\_x(:,n) = \[ mean(ruta1(1, índice==n)); ...
mean(ruta1(2, índice==n))\];
end
%% Usa los centroides recién obtenidos como puntos de control de una 'spline de ruta 1'. %%
n\_xx = 1000; % muestrearemos densamente la spline de ruta 1
n\_x = size(ruta1\_x,2); % aunque solo tengamos 50 puntos de control para la spline de ruta 1
xx\_p1 = linspace(0, 1, n\_xx); % dónde interpolarse en la spline de ruta 1
x\_p1 = linspace(0, 1, n\_x); % el parámetro: distancia a lo largo de la spline temporal
yy\_p1 = spline(x\_p1, ruta1\_x, xx\_p1); % coordenadas x e y de la spline a lo largo de la ruta 1
figura; trazar( ruta1(1,:), ruta1(2,:), '.', 'TamañoDelMarcador', 10);
sostener; trazar( yy\_p1(1,:), yy\_p1(2,:), '-');
%% 'Linearizar' la Ruta 2 encontrando el punto más cercano a lo largo de la spline de la Ruta 1 para cada punto de la Ruta 2. %%
TRI = delaunay( yy\_p1(1,:), yy\_p1(2,:) );
índice = dsearch( yy\_p1(1,:), yy\_p1(2,:), TRI, ruta2(1,:), ruta2(2,:));
ruta2\_dist\_a lo largo = xx\_p1(1,índice); % distancia a lo largo de la spline de ruta 1 para cada punto de la Ruta 2
% es simplemente el valor de interpolación de la
% spline de ruta 1
% la desviación es la distancia euclidiana entre cada punto de la Ruta 2 y su
% homólogo de la spline de ruta 1 más cercano
desviación ruta2 = sqrt((ruta2(1,:) - yy\_p1(1,índice)).^2 + (ruta2(2,:) - yy\_p1(2,índice)).^2);
figura; trazar(ruta2\_dist\_a lo largo, desviación ruta2,'.');
Mis rutas no son bonitas y uniformes como las tuyas :/ Situación actual de seguimiento de animales. Así que hay una solución alternativa para ajustar una spline a esos datos en bruto algo desordenados.
Y aquí está el resultado del script.
PD: si eso se representara como un gráfico de líneas en lugar de un diagrama de dispersión, verías que los puntos no están en orden a lo largo del eje x, y el eje x no está muestreado uniformemente. Esto podría solucionarse con alguna combinación de interpolación y suavizado creo, pero la solución probablemente depende de cómo quieras que se formatée tu salida, así que no lo codifiqué.
Intenté hacer que el código fuera claro, pero por favor avísame si algo es confuso. Pregunta divertida en la que trabajar, gracias.