無關青雲路,無關詩書,無你處,無江湖
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 |
---|---|
| |
題意:計算兩圓相交面積 思路:兩圓情況分析一下,分為相切,相交,内含,直接套模闆就行
#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;
}