#include #include #include #include #include #ifdef __PROGTEST__ #define debug(...) ((void)0) #else #define debug(fmt, ...) fprintf(stdout, "[%s:%d %s()] " fmt "\n", __FILE__, __LINE__, __func__, ##__VA_ARGS__) #endif // https://www.geeksforgeeks.org/dsa/area-of-intersection-of-two-circles/ double intersection_area(double a_r, double b_r, double distance) { double a_square = a_r * a_r; double b_square = b_r * b_r; double distane_square = distance * distance; double alpha = acos((distane_square + a_square - b_square) / (2 * a_r * distance)) * 2; double beta = acos((distane_square + b_square - a_square) / (2 * b_r * distance)) * 2; double a1 = 0.5 * beta * b_square - 0.5 * b_square * sin(beta); double a2 = 0.5 * alpha * a_square - 0.5 * a_square * sin(alpha); double area = a1 + a2; debug("Area = %lf", area); return area; } double circle_area(double radius) { return M_PI * radius * radius; } int main() { double a_center_x = 0, a_center_y = 0, a_radius = 0, b_center_x = 0, b_center_y = 0, b_radius = 0; printf("Zadejte parametry kruznice #1:\n"); int inputs_read = scanf("%lf %lf %lf", &a_center_x, &a_center_y, &a_radius); if(inputs_read != 3 || a_radius <= 0) { printf("Nespravny vstup.\n"); return EXIT_FAILURE; } printf("Zadejte parametry kruznice #2:\n"); inputs_read = scanf("%lf %lf %lf", &b_center_x, &b_center_y, &b_radius); if(inputs_read != 3 || b_radius <= 0) { printf("Nespravny vstup.\n"); return EXIT_FAILURE; } double center_distance = sqrt((b_center_x - a_center_x) * (b_center_x - a_center_x) + (b_center_y - a_center_y) * (b_center_y - a_center_y)); double radii_sum = a_radius + b_radius; if(a_center_x == b_center_x && a_center_y == b_center_y && a_radius == b_radius) { printf("Kruznice splyvaji, prekryv: %lf\n", circle_area(a_radius)); } else if(center_distance <= a_radius - b_radius) { debug("B radius = %lf", b_radius); debug("Double A radius = %lf", a_radius * 2); if(a_radius == 2 * b_radius) { printf("Vnitrni dotyk, kruznice #2 lezi uvnitr kruznice #1, prekryv: %lf\n", circle_area(b_radius)); } else { printf("Kruznice #2 lezi uvnitr kruznice #1, prekryv: %lf\n", circle_area(b_radius)); } } else if(center_distance <= b_radius - a_radius) { debug("A radius = %lf", a_radius); debug("Double B radius = %lf", b_radius * 2); if(b_radius == 2 * a_radius) { printf("Vnitrni dotyk, kruznice #1 lezi uvnitr kruznice #2, prekryv: %lf\n", circle_area(a_radius)); } else { printf("Kruznice #1 lezi uvnitr kruznice #2, prekryv: %lf\n", circle_area(a_radius)); } } else if(center_distance < radii_sum) { printf("Kruznice se protinaji, prekryv: %lf\n", intersection_area(a_radius, b_radius, center_distance)); } else if(center_distance == radii_sum) { printf("Vnejsi dotyk, zadny prekryv.\n"); } else { printf("Kruznice lezi vne sebe, zadny prekryv.\n"); } return EXIT_SUCCESS; }