Задача взята с сайта 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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
import java.util.*; import java.lang.*; import java.io.*; class Main { public static void main (String[] args) throws java.lang.Exception { Scanner scan = new Scanner(System.in); double x1 = scan.nextDouble(), y1 = scan.nextDouble(), r1 = scan.nextDouble(); double x2 = scan.nextDouble(), y2 = scan.nextDouble(), r2 = scan.nextDouble(); double range = Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)); double rads = r1 + r2; if (range == 0 && r1 == r2) { System.out.print(-1); } else if (range == rads || range + r1 == r2 || range + r2 == r1) { System.out.print(1); } else if ((range > rads) || ((range < rads) && ((range * 2 < r1 && range + r2 < r1) || (range * 2 < r2 && range + r1 < r2)))){ System.out.print(0); } else { System.out.print(2); } } } |
Ход решения:
Высчитываем расстояние между центрами окружностей по формуле: = . Вычисление в одну строку:
1 |
double range = Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)); |
Далее рассчитываем суму радиусов окружностей.
Если центры совпадают (Range = 0) и длины радиусов равны, значит, совпадают и окружности:
1 2 3 |
if (range == 0 && r1 == r2) { System.out.print(-1); } |
Если расстояние между окружностями равно сумме радиусов, окружности имеют одну общую точку, касаясь друг друга снаружи. Также одна из окружностей может лежать внутри другой и касаться ее изнутри:
1 2 3 |
else if (range == rads || range + r1 == r2 || range + r2 == r1) { System.out.print(1); } |
Если расстояние между окружностями превышает сумму радиусов, это значит, что они не пересекаются. Также одна окружность может лежать внутри другой, но не касаться ее:
1 2 3 |
else if ((range > rads) || ((range < rads) && ((range * 2 < r1 && range + r2 < r1) || (range * 2 < r2 && range + r1 < r2)))){ System.out.print(0); } |
В остальных случаях окружности пересекаются и имеют две общие точки:
1 2 3 |
else { System.out.print(2); } |
Ссылки:
Рабочий код для тестирования на Ideone.com: Ideone.com