天天看點

UESTC1713 無關青雲路,無關詩書,無你處,無江湖(計算幾何) 無關青雲路,無關詩書,無你處,無江湖

無關青雲路,無關詩書,無你處,無江湖

Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others)

Submit  Status

每個圓的屬性可以使用三個參數來描述, x x-圓心橫坐标, y y-圓心縱坐标, r r-半徑,現給出兩個圓分别的參數,求兩個圓相交的面積。

Input

第一行是一個正整數 T T( T≤12 T≤12),表示有 T T組測試資料 接下來有T行,每行有六個正整數描述兩個圓的屬性 x1,y1,r1,x2,y2,r2 x1,y1,r1,x2,y2,r2。  0≤x1,y1,r1,x2,y2,r2≤500 0≤x1,y1,r1,x2,y2,r2≤500

Output

對于每組測試資料輸出一行,表示兩個圓相交的面積大小,結果保留6位小數

Sample input and output

Sample Input Sample Output
3
0 0 10 15 0 10
-10 -10 5 0 -10 10
100 100 20 100 110 20      
45.331175
35.076661
860.843690
      

題意:計算兩圓相交面積 思路:兩圓情況分析一下,分為相切,相交,内含,直接套模闆就行

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define PI 3.1415926535898
struct circle
{
    double x,y;
    double r;
};
double dis(circle a,circle b)
{
    return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
double solve(circle a, circle b) {
    double d = dis(a, b);
    if (d >= a.r + b.r)
        return 0;
    if (d <= fabs(a.r - b.r)) {
        double r = a.r < b.r ? a.r : b.r;
        return PI * r * r;
    }
    double ang1 = acos((a.r * a.r + d * d - b.r * b.r) / 2. / a.r / d);
    double ang2 = acos((b.r * b.r + d * d - a.r * a.r) / 2. / b.r / d);
    double ret = ang1 * a.r * a.r + ang2 * b.r * b.r - d * a.r * sin(ang1);
    return ret;
}
int main()
{
    int t;
    while(scanf("%d",&t)!=EOF)
    {
        for(int i=0;i<t;i++)
        {
            circle a,b;
        scanf("%lf%lf%lf%lf%lf%lf",&a.x,&a.y,&a.r,&b.x,&b.y,&b.r);
        printf("%lf\n",solve(a,b));
        }
    }
    return 0;
}