|
9 | 9 |
|
10 | 10 | template<class P>
|
11 | 11 | double circleCircleArea(P c, double cr, P d, double dr) {
|
12 |
| - if (cr < dr) swap(c, d), swap(cr, dr); |
13 |
| - auto A = [&](double r, double h) { |
14 |
| - return r*r*acos(h/r)-h*sqrt(r*r-h*h); |
15 |
| - }; |
16 |
| - auto l = (c - d).dist(), a = (l*l + cr*cr - dr*dr)/(2*l); |
17 |
| - if (sgn(l - cr - dr) >= 0) return 0; // far away |
18 |
| - if (sgn(l - cr + dr) <= 0) return M_PI*dr*dr; |
19 |
| - if (sgn(l - cr) >= 0) return A(cr, a) + A(dr, l-a); |
20 |
| - else return A(cr, a) + M_PI*dr*dr - A(dr, a-l); |
| 12 | + if (cr < dr) swap(c, d), swap(cr, dr); |
| 13 | + auto A = [&](double r, double h) { |
| 14 | + return r*r*acos(h/r)-h*sqrt(r*r-h*h); |
| 15 | + }; |
| 16 | + auto l = (c - d).dist(), a = (l*l + cr*cr - dr*dr)/(2*l); |
| 17 | + if (l - cr - dr >= 0) return 0; // far away |
| 18 | + if (l - cr + dr <= 0) return M_PI*dr*dr; |
| 19 | + if (l - cr >= 0) return A(cr, a) + A(dr, l-a); |
| 20 | + else return A(cr, a) + M_PI*dr*dr - A(dr, a-l); |
21 | 21 | }
|
0 commit comments