diff --git a/homework-01-two-circles/main.c b/homework-01-two-circles/main.c new file mode 100644 index 0000000..f9df9ac --- /dev/null +++ b/homework-01-two-circles/main.c @@ -0,0 +1,86 @@ +#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; +}