Пересечение двух окружностей

Входные данные

Пусть нам заданы две окружности \(O_1 и O_2\) с центрами \(A и B\), для которых известны координаты их центров \(x_A, \, y_A, и x_B, \, y_B\) соответственно и радиусы \(r_1 и r_2\)

Ищем точки пересечения

Пусть \(P\) - точка пересечения окружностей \(O_1 и O_2\), \(P_1\) - точка пересечения отрезка \(AB\) с окружностью \(O_1\)

\(length\) - длина отрезка \(AB\), \(r_1 и r_2\) - длины отрезков \(AP и BP\), соответственно

Так как длина отрезка \(AP_1\) равна \(r_1\), а длина отрезка \(AB\) - \(length\), то длина отезка \(P_1B\) - \(length - r_1\)

Теперь мы знаем отношение отрезков \(AP_1 к P_1B\). Назовем его k.


\(k = \frac{AP_1}{P_1B}\ = \frac{r_1}{length - r_1}\)

Пользуясь фомулой деления отезка в заданном отношении, найдем координаты точки \(P_1\), которая делит отрезок \(AB\) в отношении \(k = \frac{r_1}{length - r_1}\) Тогда координаты точки \(P_1\) (\(x_{p_1}; \,y_{p_1}\)) соответственно равны \(\frac{x_A\ + \, k \,\,·\, x_B}{1 \,\, + \,k}\ \) и \(\,\frac{y_A\ + \, k \,\,·\, y_B}{1 \,\, + \,k}\)

Теперь найдем косинус угла \(α\)

Из теоремы косинусов для треугольника \(PAB\) следует, что

\({r_2} ^ {2} \, = \, {r_1} ^ {2} \, + \, {length} ^ {2}\ - 2\, r_1 · length · cos(α)\)

Отсюда находим \(cos(α)\)

\(cos(α)\,=\, \frac{{r_1} ^ {2} \, + \, {length} ^ {2}\, - \,{r_2} ^ {2}}{2\, r_1 · length}\)

Из основного тригонометрического тождества находим \(sin(α)\)

\(sin(α)\,=\, \sqrt{1 - cos ^ {2} (α)}\)


Это равенство справедливо, так как \(0 < α < 180\) и \(sin(α) > 0\)

Теперь, мы можем повернуть вектор \(AP_1\) на угол \(α\), так как мы знаем \(cos(α) и sin(α)\) и узнать координаты одной из точек пересечения. Также, мы можем найти координаты второй точки пересечения, повернув вектор \(AP_1\) на угол \(-α\), так как \(cos(-α)\,=\,cos(α) и sin(-α)\,= -sin(α)\)



Другие возможные случаи

Заметим, что также возможны случаи взаимного расположения двух окружностей. Окрущности могут не иметь общих точек, совпадать или касаются друг друга. Но данные случаи очевидно проверить, написав только функцию расстояния между двумя точками.

Подробное описание работы с этими случаями представлено в видео. Также в видео описан и случай, когда окружности имеют две точки пересечения

Код

Для того, чтобы получить код программы Вам надо пройти тест из трех вопросов.

В условии каждого вопроса будут даны восемь чисел.

Первое и второе - координаты центра первой окружности

Третье и четвертое - координаты точки, лежащей на первой окружности

Пятое и шестое - координаты центра второй окружности

Седьмое и восьмое - координаты точки, лежащей на второй окружности

В ответе Вам нужно вывести количество точек пересечения - \(n\), а затем \(n\) пар точек пересеченя, разделенных между собой пробелом (сначала \(x\)-координата точки, а затем её \(y\)-координату.

Гарантируется, что все числа в ответе - целые и не превосходят \(10000\)


Выполните задания:

\(O_A = (-5; 0), \, A = (-1; 3), \, O_B = (4; 4), \, B = (8; 4)\) Ответ

\(O_A = (-4; 0), \, A = (-7; 4), \, O_B = (4; 6), \, B = (1; 10)\) Ответ

\(O_A = (-4; 5), \, A = (-1; 8), \, O_B = (2; -1), \, B = (5; -10)\) Ответ