haar_lib/geom/
intersect_circle_line.rs1use crate::geom::{dist_line_point::*, *};
4
5#[derive(Clone, Copy, Debug, PartialEq)]
7#[allow(non_camel_case_types)]
8pub enum IntersectCircleLine {
9 OUTSIDE,
11 TANGENT,
13 CROSSED,
15}
16
17impl IntersectCircleLine {
18 pub fn outside(self) -> bool {
20 self == Self::OUTSIDE
21 }
22 pub fn tangent(self) -> bool {
24 self == Self::TANGENT
25 }
26 pub fn crossed(self) -> bool {
28 self == Self::CROSSED
29 }
30}
31
32pub fn intersect_circle_line(c: Circle, l: Line, eps: Eps) -> (IntersectCircleLine, Vec<Vector>) {
34 use self::IntersectCircleLine::*;
35
36 let d = dist_line_point(l, c.center);
37
38 if eps.gt(d, c.radius) {
39 return (OUTSIDE, vec![]);
40 }
41
42 let n = l.normal();
43 let b = l.from + l.diff() * n.cross(c.center + n - l.from) / n.cross(l.diff());
44
45 if eps.eq(d, c.radius) {
46 (TANGENT, vec![b])
47 } else {
48 let a = (c.radius * c.radius - d * d).sqrt();
49 (CROSSED, vec![b + l.unit() * a, b - l.unit() * a])
50 }
51}