Аналіз алгоритму
Слід розглянути варіанти зовнішнього та внутрішнього дотику, а також можливість розташування одного кола всередині іншого. Кола мають нескінченну кількість точок перетину лише у випадку їх збігу.
Нехай – квадрат відстані між центрами кіл. Тоді:
Кола торкаються ззовні, якщо .
Кола мають точку внутрішнього дотику, якщо .
Кола не мають спільних точок і не містяться одне в одному, якщо .
Кола не перетинаються, але при цьому містяться одне в одному, якщо .
Реалізація алгоритму
Спочатку припустимо, що у нас є дві точки перетину.
int res = 2;
Читаємо вхідні дані.
scanf("%lf %lf %lf %lf %lf %lf", &xx1, &yy1, &r1, &xx2, &yy2, &r2);
Обчислюємо квадрат відстані між центрами кіл.
dist2 = (xx2-xx1)*(xx2-xx1) + (yy2-yy1)*(yy2-yy1);
Перевіряємо, чи не збігаються кола.
if ((xx1 == xx2) && (yy1 == yy2) && (r1 == r2)) res = -1; else
Перевіряємо умову зовнішнього дотику двох кіл.
if (fabs((r1 + r2) * (r1 + r2) - dist2) < EPS) res = 1; else
Перевіряємо умову внутрішнього дотику двох кіл.
if (fabs((r1 - r2) * (r1 - r2) - dist2) < EPS) res = 1; else
Розглядаємо випадки, коли кола не мають спільних точок.
if ((r1 + r2)*(r1 + r2) < dist2 - EPS) res = 0; else if ((r1 - r2)*(r1 - r2) > dist2 + EPS) res = 0;
Виводимо відповідь. Якщо жодна з вище перелічених умов не виконується, то маємо дві точки перетину.
printf("%d\n", res);