Вы можете попытаться решить эту проблему с помощью простой линейной интерполяции между двумя наборами. Это работает, если переход между наборами действительно почти линейный. Если вы знаете, что это что-то еще, вы можете адаптировать функцию интерполяции.
Давайте сосредоточимся на одной точке p
. Мы знаем его координаты во всех наборах p_A
, p_B
и p_C
. Затем мы указываем, что p_C
является более или менее линейной интерполяцией между p_A
и p_B
с параметром t
(где t=0
представляет набор A, а t=1
представляет набор B):
p_C = (1 - t) * p_A + t * p_B
= p_A - t * p_A + t * p_B
= p_A + t * (p_B - p_A)
p_C - p_A = t * (p_B - p_A)
Теперь вопрос заключается в том, чтобы найти t
, который приблизительно соответствует всем вашим точкам.
Мы можем решить эту проблему, сформулировав задачу как линейную задачу наименьших квадратов. То есть мы хотим минимизировать суммированные невязки (разницу между левыми и правыми сторонами приведенного выше уравнения) для всех точек:
arg min_t Σ_i (pi_C.x - pi_A.x - t * (pi_B.x - pi_A.x))^2
+ (pi_C.y - pi_A.y - t * (pi_B.y - pi_A.y))^2
Оптимальный t
равен:
numX = Σ_i (pi_A.x^2 - pi_A.x * pi_B.x - pi_A.x * pi_C.x + pi_B.x * pi_C.x)
numY = Σ_i (pi_A.y^2 - pi_A.y * pi_B.y - pi_A.y * pi_C.y + pi_B.y * pi_C.y)
denX = Σ_i (pi_A.x^2 - 2 * pi_A.x * pi_B.x + pi_B.x^2)
denY = Σ_i (pi_A.y^2 - 2 * pi_A.y * pi_B.y + pi_B.y^2)
t = (numX + numY) / (denX + denY)
Если ваши точки имеют более высокое измерение, просто добавьте новое измерение с тем же шаблоном.