标签:
2 2 3 0 0 0 0 2 3 0 0 5 0
Case #1: 15.70796 Case #2: 2.25078
经分析可得:
两个圆环的相交面积 = 圆环1外圆和圆环2外圆的相交面积 - 圆环1外圆和圆环2内圆的相交面积 - 圆环1内圆和圆环2外圆的相交面积 + 圆环1内圆和圆环2内圆的相交面积。
#include <cstdio>
#include <cmath>
using namespace std;
#define PI acos(-1.0) //定义PI
struct Circle { // 定义圆
double x, y;
double r;
};
struct Ring { // 定义圆环
double x, y;
double R, r;
};
struct Get_Intersection_RingAndRing {
//求圆心距,即两个圆心之间的距离
double get_dis(double x1, double y1, double x2, double y2) {
return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
}
// 求两圆的相交面积
double get_CircleIntersectionArea(Circle c1, Circle c2) {
double dis = get_dis(c1.x, c1.y, c2.x, c2.y);
// 圆心距大于半径和,两圆相交面积为0
if(dis >= c1.r + c2.r) return 0;
double min_r = c1.r < c2.r ? c1.r : c2.r;
double max_r = c1.r > c2.r ? c1.r : c2.r;
if(min_r + dis <= max_r) //圆心距小于半径之差,两圆包含关系
return PI * min_r * min_r;
double a = acos((c1.r * c1.r + dis * dis - c2.r * c2.r) / 2 / c1.r / dis);
double b = acos((c2.r * c2.r + dis * dis - c1.r * c1.r) / 2 / c2.r / dis);
double area1 = a * c1.r * c1.r; //第一个圆中扇形的面积, 弧长L=a*c1.r,面积等于0.5*L*c1.r
double area2 = b * c2.r * c2.r; //第二个圆中扇形的面积
double ans = area1 + area2; //两个扇形的面积和等于四边形的面积加上两圆相交的面积
double area_qua = sin(a) * c1.r * dis; //四边形的面积
ans -= area_qua;
return ans;
}
//求圆环和圆环的相交面积
double Get_IntersectionArea(Ring r1, Ring r2) {
Circle a1, a2, b1, b2;
a1.x = r1.x, a1.y = r1.y, a1.r = r1.r;
a2.x = r1.x, a2.y = r1.y, a2.r = r1.R;
b1.x = r2.x, b1.y = r2.y, b1.r = r2.r;
b2.x = r2.x, b2.y = r2.y, b2.r = r2.R;
return get_CircleIntersectionArea(a2, b2) - get_CircleIntersectionArea(a1, b2) - get_CircleIntersectionArea(a2, b1) + get_CircleIntersectionArea(a1, b1);
}
};
int main()
{
int T;
Ring r1, r2;
Get_Intersection_RingAndRing x;
scanf("%d", &T);
for(int cas = 1; cas <= T; cas++) {
scanf("%lf%lf", &r1.r, &r1.R);
r2.r = r1.r, r2.R = r1.R;
scanf("%lf%lf%lf%lf", &r1.x, &r1.y, &r2.x, &r2.y);
printf("Case #%d: %.5lf\n", cas, x.Get_IntersectionArea(r1, r2));
}
return 0;
}
标签:
原文地址:http://blog.csdn.net/lyhvoyage/article/details/44872561