haar_lib/geom/
area_intersection_circles.rs

1//! 2つの円の共通部分の面積
2
3use crate::geom::{intersect_circles::*, *};
4use std::f64::consts::PI;
5
6/// 2つの円の共通部分の面積を求める
7pub fn area_intersection_circles(a: Circle, b: Circle, eps: Eps) -> f64 {
8    use self::IntersectCircles::*;
9    let (s, _) = intersect_circles(a, b, eps);
10
11    match s {
12        SAME => a.radius * a.radius * PI,
13        INSIDE | INSCRIBED => {
14            let a_s = a.radius * a.radius * PI;
15            let b_s = b.radius * b.radius * PI;
16            a_s.min(b_s)
17        }
18        INTERSECTED => {
19            let d = (a.center - b.center).abs();
20
21            let ang =
22                ((a.radius * a.radius + d * d - b.radius * b.radius) / (a.radius * d * 2.0)).acos();
23            let t1 = (ang - (ang * 2.0).sin() / 2.0) * a.radius * a.radius;
24
25            let ang =
26                ((b.radius * b.radius + d * d - a.radius * a.radius) / (b.radius * d * 2.0)).acos();
27            let t2 = (ang - (ang * 2.0).sin() / 2.0) * b.radius * b.radius;
28
29            t1 + t2
30        }
31        _ => 0.0,
32    }
33}