相离,相切,相交,内含这几种情况都考虑了。
1 struct Circle{ 2 double x, y, r; 3 }; 4 //圆的圆心坐标,半径 5 6 double dis(Circle a, Circle b){ 7 return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y)); 8 } 9 //两圆圆心的距离 10 11 double solve(Circle a, Circle b){ 12 double d = dis(a, b); 13 if (d >= a.r + b.r) return 0; 14 if (d <= fabs(a.r - b.r)){ 15 double r = a.r < b.r ? a.r : b.r; 16 return pi * r * r; 17 } 18 19 double ang1 = acos((a.r * a.r + d * d - b.r * b.r) / 2.00 / a.r / d); 20 double ang2 = acos((b.r * b.r + d * d - a.r * a.r) / 2.00 / b.r / d); 21 double ret = ang1 * a.r * a.r + ang2 * b.r * b.r - d * a.r * sin(ang1); 22 return ret; 23 } 24 //返回值即为两圆公共部分的面积
原文:http://www.cnblogs.com/cxhscst2/p/6399571.html