求兩圓相交的面積
阿新 • • 發佈:2018-12-17
一個無窮大的花園,花園中修建了兩個澆水噴頭,每個噴頭可以給以它中心的一定距離內的花澆水。請問兩個噴頭可以給多大面積的花園澆水?
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 *********/ } }