Два кола#4

Два кола (Розбір)

Слід розглянути варіанти зовнішнього та внутрішнього дотику, а також можливість розташування одного кола всередині іншого. Кола мають нескінченну кількість точок перетину лише у випадку їх збігу.

Нехай dist^2 = (x_2 - x_1)^2 + (y_2 - y_1)^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);