C-求两圆相交的面积
题解
计算几何,真心没经验/(ㄒoㄒ)/~~。
网上很多博客说这是一题模板题,也确实是,不过憋了十多分钟还是没憋出来,我是参照另一篇题解,在此就不做过多赘述,以免复制。
https://blog.csdn.net/hactrox/article/details/38397555
#include <iostream> #include <algorithm> #include <cmath> using namespace std; const double pi = acos(-1); int x2, y2, r2, x3, y3, r3; double area(int x2, int y2, int r2, int x3, int y3, int r3) { r2 = (double) r2; r3 = (double) r3; // 两个半径之和 double p = r2 + r3; // 圆心之间的距离 double d = sqrt((x2 - x3) * (x2 - x3) + (y2 - y3) * (y2 - y3)); // 分离 + 相切 if (d >= p) { return 0; } // 内含 if (d <= abs(r2 - r3)) { int r = min(r2, r3); return pi * r * r; } // 相交 double angle1 = acos((r2 * r2 + d * d - r3 * r3) / (2 * r2 * d)); double angle2 = acos((r3 * r3 + d * d - r2 * r2) / (2 * r3 * d)); double angle3 = sin(angle1); return r2 * r2 * angle1 + r3 * r3 * angle2 - r2 * d * angle3; } int main() { scanf("%d%d%d%d%d%d", &x2, &y2, &r2, &x3, &y3, &r3); double ar = area(x2, y2, r2, x3, y3, r3); printf("%.2f\n", ar); return 0; }