Локализация точки с использованием расстояний до трех других точек в 3D
Предположим, что у нас есть 4 точки в 3D (P1, P2, P3, P4). Если координаты этих точек даны с их евклидовыми расстояниями до пятой точки P5 (r1, r2, r3, r4), как рассчитать координаты P5?
В этом посте ответ Don Reba идеально подходит для 2-D. Но как мне расширить его до 3-х?
Вот мой код для 2D:
static void localize(double[] P1, double[] P2, double[] P3, double r1, double r2, double r3)
{
double[] ex = normalize(difference(P2, P1));
double i = dotProduct(ex, difference(P3, P1));
double[] ey = normalize(difference(difference(P3, P1), scalarProduct(i, ex)));
double d = magnitude(difference(P2, P1));
double j = dotProduct(ey, difference(P3, P1));
double x = ((r1*r1) - (r2*r2) + (d*d)) / (2*d);
double y = (((r1*r1) - (r3*r3) + (i*i) + (j*j)) / (2*j)) - ((i*x) / j);
System.out.println(x + " " + y);
}
Я хочу перегрузить функцию с подписью
static void localize(double[] P1, double[] P2, double[] P3, double[] P4, double r1, double r2, double r3, double r4)
2 ответа
В статье трилатериации Википедии описан ответ. Этапы расчета:
- ex = (P2 - P1) / ‖P2 - P1‖
- i = ex(P3 - P1)
- ey = (P3 - P1 - i · ex) / ‖P3 - P1 - i · ex‖
- d = ‖P2 - P1‖
- j = ey(P3 - P1)
- x = (r12 - r22 + d2) / 2d
- y = (r12 - r32 + i2 + j2) / 2j - ix / j
- z = ± sqrt (r12 - x2 - y2)
Вам необходимо решить систему из четырех уравнений (i=1..4, Di - расстояние до i-й точки)
(X-Xi)^2+(Y-Yi)^2+(Z-Zi)^2=Di^2
Можно решить систему из трех уравнений и использовать четвертое, чтобы выбрать правильное решение (из двух).
Вот как работает GPS (где временные задержки для расстояний).
В приемниках GPS часто используются методы оптимизации, особенно когда доступно много спутников, и алгебраическое решение может быть нестабильным.