Xarici və daxili toxunma variantlarını, həmçinin bir dairənin digərinin içində olma ehtimalını nəzərə almaq lazımdır. Dairələr yalnız öz üst-üstə düşdükləri halda sonsuz sayda kəsişmə nöqtələrinə malikdirlər.
dist^2 = (x_2 - x_1)^2 + (y_2 - y_1)^2 – dairələrin mərkəzləri arasındakı məsafənin kvadratıdır. Onda:
Dairələr xarici toxunurlarsa, (r_1 + r_2)^2 = dist^2.
Dairələrin daxili toxunma nöqtəsi varsa, (r_1 - r_2)^2 = dist^2.
Dairələr ümumi nöqtələrə malik deyillər və biri digərinin içində deyilsə, (r_1 + r_2)^2 < dist^2.
Dairələr kəsişmirlər, lakin biri digərinin içindədirsə, (r_1 - r_2)^2 > dist^2.
Alqoritmin Tətbiqi
Əvvəlcə, iki kəsişmə nöqtəmiz olduğunu farz edək.
int res = 2;Giriş məlumatlarını oxuyun.
scanf("%lf %lf %lf %lf %lf %lf", &xx1, &yy1, &r1, &xx2, &yy2, &r2);Dairələrin mərkəzləri arasındakı məsafənin kvadratını hesablayın.
dist2 = (xx2-xx1)*(xx2-xx1) + (yy2-yy1)*(yy2-yy1);Dairələrin üst-üstə düşmədiyini yoxlayın.
if ((xx1 == xx2) && (yy1 == yy2) && (r1 == r2)) res = -1; elseİki dairənin xarici toxunma şərtini yoxlayın.
if (fabs((r1 + r2) * (r1 + r2) - dist2) < EPS) res = 1; elseİki dairənin daxili toxunma şərtini yoxlayın.
if (fabs((r1 - r2) * (r1 - r2) - dist2) < EPS) res = 1; elseDairələrin ümumi nöqtələrə malik olmadığı halları nəzərdən keçirin.
if ((r1 + r2)*(r1 + r2) < dist2 - EPS) res = 0; else
if ((r1 - r2)*(r1 - r2) > dist2 + EPS) res = 0;Cavabı çap edin. Əgər yuxarıdakı şərtlərdən heç biri ödənmirsə, deməli, iki kəsişmə nöqtəmiz var.
printf("%d\n", res);