转自:https://blog.csdn.net/aaakkk_1996/article/details/81746858
两圆相交分如下集中情况:相离+外切 ,相交,包含+内切
相交分两种,锐角和钝角相交,二者求解公式相同 【其实我自己都没理解钝角为啥同公式求解,欢迎帮我解答】
代码部分:
#include<iostream>
#include<vector>
#include<string>
#include<math.h>
#include <iomanip>
# define M_PI 3.1415926535897932384626433832795
using namespace std;
void r1r2swap(double& x1, double& y1, double& r1, double& x2, double& y2, double& r2) {
if (r1 > r2) {
swap(x1, x2);
swap(y1, y2);
swap(r1, r2);
}
}
double area(double x1, double y1, double r1, double x2, double y2, double r2) {
//求圆心距
double c= sqrt((pow(x1 - x2, 2) + pow(y1 - y2, 2)));
r1r2swap(x1, y1, r1, x2, y2, r2);//确保s1是小圆
if (c >= r1 + r2)return 0;//外离+外切
else if (c < r2 - r1) {//内含+内切
return M_PI * r1 * r1;
}
else {//相交 S1 小圆 S2 大圆
double ang1 = acos((r1 * r1 + c * c - r2 * r2) / (2.0 * r1 * c));
double ang2 = acos((r2 * r2 + c * c - r1 * r1) / (2.0 * r2 * c));
return ang1 * r1 * r1 + ang2 * r2 * r2 - r1 * c * sin(ang1); //两扇形和-四角形
}
}
int main(void) {
double x1; double y1; double r1; double x2; double y2; double r2;
cin >> x1 >> y1 >> r1 >> x2 >> y2 >> r2;
cout.setf(ios::fixed);
cout << fixed << setprecision(3) << area(x1, y1, r1, x2, y2, r2)<<endl;
return 0;
}