一个无穷大的花园,花园中修建了两个浇水喷头,每个喷头可以给以它中心的一定距离内的花浇水。请问两个喷头可以给多大面积的花园浇水?
package step1;
public class Task {
public double solve(double x1, double y1, double r1,
double x2, double y2, double r2) {
/********* Begin *********/
double area = Math.PI * (r1 * r1 + r2 * r2);
double d = Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
if (d >= r1 + r2)
return area;
else if (Math.abs(r1 - r2) >= d) {
if (r1 > r2)
return Math.PI * r1 * r1;
else
return Math.PI * r2 * r2;
} else {
// 正弦定理求扇形圆心角
double a1 = 2 * Math.acos((r1 * r1 + d * d - r2 * r2) / 2 / r1 / d);
double a2 = 2 * Math.acos((r2 * r2 + d * d - r1 * r1) / 2 / r2 / d);
// 两个扇形面积和减去四边形的面积即为相交区域面积
// 四边形面积再转化为两个三角形的面积之和来计算
double ans = r1 * r1 * a1 / 2 + r2 * r2 * a2 / 2 - r1 * r1 * Math.sin(a1) / 2 - r2 * r2 * Math.sin(a2) / 2;
return area - ans;
}
/********* End *********/
}
}