Пусть окружности имеют центры с координатами:
и пусть соответствующие радиусы, которые вы вычислили, будут:
соответственно. Итак, похоже, вы ищете точку и коэффициент масштабирования со следующим свойством:
Аналогично, нам нужно найти точку в плоскости, которая является общей точкой пересечения трех окружностей, полученной путем масштабирования радиусов исходных окружностей с помощью общего коэффициента k, или в математической записи, нам нужно решить систему
Ясно, что приведенные выше системы и свойство, записанное перед системой, эквивалентны.
Чтобы упростить задачу, возведите в квадрат обе части каждого уравнения из системы:
По теореме Пифагора напишите
Вот почему в явных формулах система трех квадратных уравнений, приведенная выше, на самом деле является квадратичной системой уравнений:
который после переноса члена из правой части каждого уравнения в левую часть становится:
Разверните все квадраты разностей в каждом уравнении и измените порядок членов:
Чтобы упростить эту систему, вычтите второе уравнение из первого, затем вычтите третье уравнение из второго и сохраните одно из квадратных уравнений, скажем, сохраните первое квадратное уравнение:
Идея поиска решения этой системы заключается в следующем:
Чтобы упростить обозначения и выражения, мы можем использовать некоторые обозначения из линейной алгебры. Определите следующие два на два матрицы и два на один вектор-столбец:
и когда мы умножаем последнее матричное уравнение на обратную матрицу M:
Запишем также в матричных обозначениях
И, наконец, алгоритм нахождения точки пересечения трех окружностей после масштабирования с соответствующим масштабным коэффициентом можно сформулировать следующим образом:
Обратите внимание, что квадратное уравнение имеет два решения для z
. Тот, который я выбрал, с минусом, является первой точкой пересечения всякий раз, когда три круга являются внешними по отношению к каждому и с начальными непересекающимися радиусами. Существует также вторая точка пересечения, соответствующая положительному решению для z
. Если у вас есть информация с четвертой башни, вы сможете выбрать правильную точку и, возможно, даже полностью линеаризовать задачу. Но только с этими доступными данными у вас есть два решения.
Я протестировал алгоритм на следующем примере ручной работы:
x1 = 0; y1 = 0; r1 = sqrt(13)/3;
x2 = 5; y2 = 1; r2 = sqrt(13)/3;
x3 = 3; y3 = 7; r3 = sqrt(17)/3;
и он выводит правильное местоположение
x = 2; y = 3;
и коэффициент масштабирования k = 3
.
Я реализовал это в Matlab/Octave, потому что мне удобно работать с линейной алгеброй:
function [xy, k] = location_scaled(x1, y1, r1, x2, y2, r2, x3, y3, r3)
M = 2*[x2 - x1 y2 - y1;
x3 - x2 y3 - y2];
A = [r1^2 - r2^2;
r2^2 - r3^2];
B = [x2^2 + y2^2 - x1^2 - y1^2;
x3^2 + y3^2 - x2^2 - y2^2];
A = M\A;
B = M\B;
a = A'*A;
b = 2*B'*A - 2*[x1 y1]*A - r1^2;
c = [x1 y1]*[x1; y1] - 2*[x1 y1]*B + B'*B;
k = (- b - sqrt(b^2 - 4*a*c)) / (2*a);
xy = k*A + B;
k = sqrt(k);
end
person
Futurologist
schedule
24.05.2019