e-olymp 4. Two circles

Задача взята с сайта e-olymp.com.

Условие

Определить количество точек пересечения двух окружностей.

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

Шесть чисел: x1, y1, r1, x2, y2, r2, где x1, y1, x2, y2 — координаты центров окружностей, а r1, r2 — их радиусы. Все числа — действительные, не превышают 109, заданы не более чем с тремя знаками после запятой.

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

Количество точек пересечения. Если точек пересечения бесконечно много, то вывести -1.

Тесты:

X1 Y1 R1 X2 Y2 R2 N
0 0 5 5 0 1 2
0 0 5 0 0 6 1
0 1 6 0 3 6 2

Код на Java:

Ход решения:

Высчитываем расстояние между центрами окружностей по формуле:Range = \sqrt{(X_2-X_1)^2+(Y_2-Y_1)^2}. Вычисление в одну строку:

Далее рассчитываем суму радиусов окружностей.
Если центры совпадают (Range = 0) и длины радиусов равны, значит, совпадают и окружности:

Если расстояние между окружностями равно сумме радиусов, окружности имеют одну общую точку, касаясь друг друга снаружи. Также одна из окружностей может лежать внутри другой и касаться ее изнутри:

Если расстояние между окружностями превышает сумму радиусов, это значит, что они не пересекаются. Также одна окружность может лежать внутри другой, но не касаться ее:

В остальных случаях окружности пересекаются и имеют две общие точки:

Ссылки:

Рабочий код для тестирования на Ideone.com: Ideone.com