Расширенная версия ответа @YvesDaoust:
С учетом параметрической линии:
L(t) = A + t D
, где D - единичный вектор, т.е. D • D = 1
Расстояние от точки P до линии L равно:
t = D • (P - A)
Ближайшая точка P к набору линий в смысле наименьших квадратов сводит к минимуму сумму ошибок E:
E = (P - L(t))^2
E = (P - (A + tD))^2
E = (P - A - tD)^2
E = (P - A - (D • (P - A))D)^2
E = (P - A - (D•P - D•A)D)^2
E = (P - A - (D•P)D + (D•A)D)^2
E = (P - (D•P)D - A + (D•A)D)^2
E = (P - (D D^T)P - A + (D•A)D)^2
E = ((I - (D D^T)) P - A + (D•A)D)^2
E = (C x - b)^2
Где
C = I - (D D^T)
x = P
b = A - (D•A)D
Где «I» - единичная матрица 3x3. Решение наименьших квадратов:
C^T C x = C^T b
Другой способ получить ту же систему - взять производную уравнения:
E = (P - A - tD)^2
E = P•P - 2 P•A - 2t P•D + A•A + 2t A•D + t^2
Взяв производную по P и упрощая, мы получим (не забывайте применять правило цепочки, когда берете производную от «t», так как она является функцией от P):
dE/dP = 2(P - A - ((P - A) • D) D)
Приравнивая это к нулю:
dE/dP = 0
2(P - A - ((P - A)•D) D) = 0
P - ((P - A)•D) D = A
P - (P•D) D + (A•D) D = A
P - (P•D) D = A - (A•D) D
P - (D D^T) P = A - (A•D) D
(I - D D^T) P = A - (A•D) D
Где «I» - это единичная матрица 3x3. Это опять-таки линейная система вида C x = b.
Помните, что вам все равно нужно применить суммирование к обеим сторонам уравнения, поэтому оно действительно таково:
Sum(C^T C) x = Sum(C^T b)
Итак, наконец:
x = Sum(C^T C)^-1 Sum(C^T b)