Слід розглянути варіанти зовнішнього та внутрішнього дотику, а також можливість розташування одного кола всередині іншого. Кола мають нескінченну кількість точок перетину лише у випадку їх збігу.
Нехай dist^2 = (x_2 - x_1)^2 + (y_2 - y_1)^2 – квадрат відстані між центрами кіл. Тоді:
Кола торкаються ззовні, якщо (r_1 + r_2)^2 = dist^2.
Кола мають точку внутрішнього дотику, якщо (r_1 - r_2)^2 = dist^2.
Кола не мають спільних точок і не містяться одне в одному, якщо (r_1 + r_2)^2 < dist^2.
Кола не перетинаються, але при цьому містяться одне в одному, якщо (r_1 - r_2)^2 > dist^2.
Реалізація алгоритму
Спочатку припустимо, що у нас є дві точки перетину.
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);