haar_lib/geom/
tangent_circle.rs

1//! 点を通る円の接線
2
3use crate::geom::*;
4
5/// 点`p`を通る円`c`の接線を求める
6pub fn tangent_circle(c: Circle, p: Vector, eps: Eps) -> Vec<Vector> {
7    let d = (p - c.center).abs();
8
9    if eps.lt(d, c.radius) {
10        return vec![];
11    }
12    if eps.eq(d, c.radius) {
13        return vec![p];
14    }
15
16    let a = (c.radius / d).acos();
17    let t = (p.1 - c.center.1).atan2(p.0 - c.center.0);
18
19    vec![
20        c.center + Vector::polar(c.radius, t + a),
21        c.center + Vector::polar(c.radius, t - a),
22    ]
23}