У вас есть следующие данные, представляющие ваши 3 окружности:
For each circle i=1,2,3:
Center: Ci = (ai, bi)
Radius: ri > 0
Чтобы три круга имели общую точку пересечения (x, y)
эта точка должна быть решением для системы квадратов c уравнения:
(x - a1)^2 + (y - b1)^2 = r1^2
(x - a2)^2 + (y - b2)^2 = r2^2
(x - a3)^2 + (y - b3)^2 = r3^2
Разверните каждое уравнение и переставьте термины:
x^2 + y^2 - 2*a1*x - 2*b1*y = r1^2 - a1^2 - b1^2
x^2 + y^2 - 2*a2*x - 2*b2*y = r2^2 - a2^2 - b2^2
x^2 + y^2 - 2*a3*x - 2*b3*y = r1^2 - a3^2 - b3^2
Одна хитрость заключается в переписывании системы следующим образом:
z - 2*a1*x - 2*b1*y = r1^2 - a1^2 - b1^2
z - 2*a2*x - 2*b2*y = r2^2 - a2^2 - b2^2
z - 2*a3*x - 2*b3*y = r1^2 - a3^2 - b3^2
x^2 + y^2 = z
Это переопределенная система из трех линейных уравнений и трех неизвестных переменных (x, y, z)
, плюс одно дополнительное квадратичное c уравнение между этими тремя переменными x^2 + y^2 = z
.
Итак, решение линейных систем легко, поэтому выполните следующее алгоритм:
Шаг 1: Сокращение линейной системы
z - 2*a1*x - 2*b1*y = r1^2 - a1^2 - b1^2
z - 2*a2*x - 2*b2*y = r2^2 - a2^2 - b2^2
z - 2*a3*x - 2*b3*y = r1^2 - a3^2 - b3^2
путем вычитания первого уравнения из второго и третьего:
z = 2*a1*x + 2*b1*y + r1^2 - a1^2 - b1^2
2*(a1-a2)*x + 2*(b1-b2)*y = r2^2 - a2^2 - b2^2 - r1^2 + a1^2 + b1^2
2*(a1-a3)*x + 2*(b1-b3)*y = r1^2 - a3^2 - b3^2 - r1^2 + a1^2 + b1^2
Шаг 2: Решите двойную линейную систему для (x, y):
2*(a1-a2)*x + 2*(b1-b2)*y = r2^2 - a2^2 - b2^2 - r1^2 + a1^2 + b1^2
2*(a1-a3)*x + 2*(b1-b3)*y = r1^2 - a3^2 - b3^2 - r1^2 + a1^2 + b1^2
и найдите решение (или решения в некоторых вырожденных случаях, но обычно быть точно одним решением) (x, y)
. * 103 4 *
Шаг 3: Рассчитайте z
, подставив каждое решение (x, y)
из шага 2 в формулу:
z = 2*a1*x + 2*b1*y + r1^2 - a1^2 - b1^2
Шаг 4: Проверьте, если
x^2 + y^2 = z
Если это так, то три круга пересекаются в точке (x, y)
. Если ни одно из решений (x, y, z)
из шага 3 не удовлетворяет квадратному уравнению c, то эти три круга не пересекаются.