Решение задачи "Круговая площадь" с Меньшиков

Без пояснения   Просмотров: 10


Два круга заданы координатами центров в прямоугольной декартовой системе координат и радиусами. Найти площадь их пересечения.


Ограничения: во входных данных числа вещественные и по модулю не превосходят 1000.

Код

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
 
int n;
const double pi = 2*acos(0.0);
struct point
{
    double x,y;
};
struct circle
{
    point c;
    double r;
    void input()
    {
        cin>>c.x>>c.y>>r;
    }
}c1,c2;
 
double dist (const point &p1, const point &p2)
{
    return sqrt((p1.x - p2.x)*(p1.x - p2.x) + (p1.y - p2.y)*(p1.y - p2.y));
}
double area_cross_circle(const circle &c1, const circle &c2)
{
    // первый всегда больше
    if (c1.r < c2.r)
        return area_cross_circle(c2,c1);
 
    double d = dist(c1.c, c2.c);
    // частные случаи
    if ( d > c1.r + c2.r) return 0;
    if ( d + c2.r <= c1.r) return pi*c2.r*c2.r;
 
    // имеет место пересечение
    double alpha = 2 * acos(( d * d + c1.r * c1.r - c2.r * c2.r)/(2 * d * c1.r));
    double beta  = 2 * acos(( d * d + c2.r * c2.r - c1.r * c1.r)/(2 * d * c2.r));
    double S1 = c1.r * c1.r * (alpha - sin(alpha)) / 2;
    double S2 = c2.r * c2.r * (beta  - sin(beta))  / 2;
    return S1 + S2;
}
int main()
{
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
 
    c1.input();
    c2.input();
    double S = area_cross_circle(c1,c2);
    printf("%0.2f", S);
    return 0;
}

         

 Администратор Photo Автор: Администратор


Отправить решение задачи
Чтобы отправить решение вам нужно войти в систему или зарегистрироваться

Комментарии

Чтобы написать комментарии вам нужно войти в систему или зарегистрироваться