思路:先判断两个圆是否相交,半径分别为R,r
- 不相交(包括相切):两圆心距离d>=(R+r)
- 相交1:两圆心距离d<=|R-r|,一个圆在另一个圆内,所求面积为小圆面积
相交2:两圆心距离d>|R-r| && d<(R+r),所求面积为相交两扇形面积减去两三角形面积
扇形所对应角度用余弦定理求出,三角形面积用海伦公式求出
x,y,r分别对应圆的横纵坐标,半径
public double Area(int x1,int y1,int r1,int x2,int y2,int r2){
double s,p,l,ans;
int temp;
double pi = Math.PI;
l=Math.sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
if(l>=r1+r2) ans=0;
else if(l<=Math.abs(r1-r2)){
if(r1<=r2) ans=pi*r1*r1;
else ans=pi*r2*r2;
}
else{
p=(l+r1+r2)/2;
//海伦公式求三角形面积
s=2*Math.sqrt(p*(p-l)*(p-r1)*(p-r2));
if(r1>r2){
temp=x1;x1=x2;x2=temp;
temp=y1;y1=y2;y2=temp;
temp=r1;r1=r2;r2=temp;
}
ans=Math.acos((r1*r1+l*l-r2*r2)/(2*r1*l))*r1*r1+Math.acos((r2*r2+l*l-r1*r1)/(2*r2*l))*r2*r2-s;
}
return ans;
}
//控制输出格式
//DecimalFormat df = new DecimalFormat( "0.00000 ");
//df.format(ans);