Пусть круги имеют центры с координатами:
и пусть соответствующие радиусы, которые вы вычислили, будут:
соответственно. Похоже, вы ищете точку и коэффициент масштабирования со следующим свойством:
Эквивалентно, нам нужно найти точку в плоскости, которая является общей точкой пересечения трех окружностей, полученную путем пересчета радиусов исходных окружностей на общий множитель к, или в математической записи нам нужно решить систему
Понятно, что системы выше и свойство, написанное перед системой, эквивалентны.
Чтобы упростить вещи, возведите в квадрат обе стороны каждого уравнения из системы:
По теореме Пифагора напишите
Вот почему в явных формулах система трех квадратов уравнений, приведенная выше, фактически является квадратичной системой уравнений:
которое после перемещения члена с правой стороны каждого уравнения в левую становится:
Разверните все квадратные различия в каждом уравнении и измените порядок слов:
Чтобы упростить эту систему, вычтите второе уравнение из первого, затем вычтите третье уравнение из второго и оставьте одно из квадратичных уравнений, скажем, оставьте первое квадратное уравнение:
Идея найти решение этой системы заключается в следующем:
Чтобы упростить обозначения и выражения, мы можем использовать немного обозначений из линейной алгебры. Определите следующие два по две матрицы и два по одному столбцу-вектора:
и когда мы умножаем последнее матричное уравнение на обратную матрицу 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