debug64

Мой блог обо всем.

Нахождение точек пересечения двух окружностей

Даны координаты центров окружностей и их радиусы. Необходимо найти точки пересечения этих окружностей.

Кликните на картинке, что бы посмотреть как это работает.

Точка P1 является центром первой окружности радиусом R1 и точка P2 центром второй окружности радиусом R2.

Обозначим:

  • h - высота треугольника P1P3P2 (расстояние между точками P3 и P0)
  • *a - расстояние между точками P1 и P0
  • *b - расстояние между точками P2 и P0
  • d = a + b; - расстояние между точками P1 и P2

Проверяем, если R1 + R2 < d, тогда окружности не пересекаются, т.к. лежат отдельно, если |R1 - R2| > d, тогда окружности так же не пересекаются, т.к. одна окружность находится внутри другой.

Рассмотрим 2 прямоугольных треугольника, P1P3P0 и P2P3P0. Получаем:
Photo

Photo

Так как эти треугольники имеют общий катет (h), тогда:
Photo

Выразим a через b:
Photo

тогда,
Photo

Photo

Photo

Photo

Photo

Зная b, находим а:
Photo

Найдем точку P0 с помощью векторного параметрического уравнения прямой:
Photo

Зная координаты точки P0 находим координаты точек P3 и P4. Для этого возмем единичный вектор от P1 до P2, повернем его на +90 градусов для P3 (-90 градусов для P4) и умножим на h.

Таким образом находим координаты точки P3:
Photo

Photo

Аналогично находим координаты точки P4:
Photo

Photo

Реализацию этого способа вы найдете в исходном коде этой страницы, метод Circle.moGetCrossPoints

2й способ решения задачи.

Так как точки пересечения окружностей общие, тогда запишем уравнения окружностей в виде системы уранений:
Photo

Для упрощения преобразований, переместим центр окружности 1 в начало координат и пересчитаем координаты центра второй окружности:
Photo

Перепишем систему уранений для новых координат:
Photo

Раскроем скобки во втором уравнении:
Photo

Вычтем из второго уравнения первое и перенесем известные в правую часть:
Photo

Выразим:
Photo

Если XP2 не равен 0, тогда подставляем X в уравнение первой окружности:
Photo

Раскрываем скобки и избавляемся от знаменателя:
Photo

Как видим у нас получается квадратное уравнение, обозначим:
Photo

Тогда:
Photo

  • Если D < 0, значит окружности не пересекаются
  • Если D = 0, значит окружности соприкасаются и имееют одну точку пересечения
    Photo
  • Если D > 0, значит окружности пересекаются и имеют две точки пересечения
    Photo

Если XP2 = 0, тогда решаем через Y и получаем:
Photo

Помним, если под корнем число отрицательное, значит окружности не пересекаются, если равно 0, тогда окружности соприкасаются и имееют одну точку пересечения, если число больше 0, тогда X может быть как отрицательным, так и положительным.

Реализацию этого способа вы найдете в исходном коде этой страницы, метод Circle.moGetCrossPoints2


Поделиться