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}