algorithms_edu/algo/geometry/
angle_between_vectors.rs

1use super::{SafeArcSinCos, Vec2D, Vec3D};
2
3impl Vec2D {
4    /// Return the smaller of the two angles between two 2D vectors in radians
5    pub fn angle(&self, other: &Self) -> f64 {
6        (self.dot(other) / (self.magnitude() * other.magnitude())).acos_safe()
7    }
8}
9
10impl Vec3D {
11    /// Return the smaller of the two angles between two 3D vectors in radians
12    pub fn angle(&self, other: &Self) -> f64 {
13        (self.dot(other) / (self.magnitude() * other.magnitude())).acos_safe()
14    }
15}
16
17#[cfg(test)]
18mod tests {
19    use super::*;
20    use std::f64::consts::FRAC_PI_2;
21    #[test]
22    fn test_angle_between_vectors() {
23        let v = Vec2D::new(3., 4.);
24        let w = Vec2D::new(4., -3.);
25        assert_eq!(v.angle(&w), FRAC_PI_2);
26        assert_eq!(v.angle(&v), 0.);
27
28        let v = Vec3D::new(1., 2., 3.);
29        let w = Vec3D::new(2., 3., 4.);
30        assert_eq!(v.angle(&w), 0.12186756768575456);
31        assert_eq!(v.angle(&v), 0.);
32    }
33}