autd3_core/acoustics/directivity/
sphere.rs

1use super::*;
2
3/// Sphere directivity model.
4#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
5pub struct Sphere {}
6
7impl Directivity for Sphere {
8    #[inline]
9    fn directivity(_: Angle) -> f32 {
10        1.
11    }
12
13    #[inline]
14    fn directivity_from_dir(_: &UnitVector3, _: &Vector3) -> f32 {
15        1.
16    }
17}
18
19#[cfg(test)]
20mod tests {
21    use super::*;
22
23    use rand::prelude::*;
24
25    #[test]
26    fn test_directivity() {
27        let mut rng = rand::rng();
28        assert_eq!(1.0, Sphere::directivity(rng.random::<f32>() * rad));
29    }
30
31    #[rstest::rstest]
32    #[test]
33    #[case::dir_x(1., Vector3::x())]
34    #[case::dir_y(1., Vector3::y())]
35    #[case::dir_z(1., Vector3::z())]
36    fn test_directivity_sphere_from_dir(#[case] expected: f32, #[case] target: Vector3) {
37        let mut rng = rand::rng();
38        let dir =
39            UnitVector3::new_unchecked(Vector3::new(rng.random(), rng.random(), rng.random()));
40        assert_eq!(expected, Sphere::directivity_from_dir(&dir, &target));
41    }
42}