1. 程式人生 > >求兩圓相交的面積

求兩圓相交的面積

一個無窮大的花園,花園中修建了兩個澆水噴頭,每個噴頭可以給以它中心的一定距離內的花澆水。請問兩個噴頭可以給多大面積的花園澆水?

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 *********/
	  }
}