algorithms_edu/algo/geometry/
angle_between_vectors.rs1use super::{SafeArcSinCos, Vec2D, Vec3D};
2
3impl Vec2D {
4 pub fn angle(&self, other: &Self) -> f64 {
6 (self.dot(other) / (self.magnitude() * other.magnitude())).acos_safe()
7 }
8}
9
10impl Vec3D {
11 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}