Skip to main content

spatial_motion/
movement.rs

1use derive_more::{Add, AddAssign, Neg, Sub, SubAssign};
2use scalars::Zero;
3use vector_space::VectorSpace;
4
5use core::ops::{Div, DivAssign, Mul, MulAssign};
6
7#[derive(Copy, Clone, Debug, Add, AddAssign, Sub, SubAssign, Neg, PartialEq, Eq)]
8pub struct Movement<V, B> {
9    pub velocity: V,
10    pub spin: B,
11}
12
13impl<V: Zero, B: Zero> Zero for Movement<V, B> {
14    fn zero() -> Self {
15        Self {
16            velocity: V::zero(),
17            spin: B::zero(),
18        }
19    }
20
21    fn is_zero(&self) -> bool {
22        self.velocity.is_zero() && self.spin.is_zero()
23    }
24}
25
26impl<V, B> Mul<V::Scalar> for Movement<V, B>
27where
28    V: VectorSpace,
29    B: VectorSpace<Scalar = V::Scalar>,
30{
31    type Output = Self;
32
33    fn mul(self, scalar: V::Scalar) -> Self {
34        Self {
35            velocity: self.velocity * scalar,
36            spin: self.spin * scalar,
37        }
38    }
39}
40
41impl<V, B> Div<V::Scalar> for Movement<V, B>
42where
43    V: VectorSpace,
44    B: VectorSpace<Scalar = V::Scalar>,
45{
46    type Output = Self;
47
48    fn div(self, scalar: V::Scalar) -> Self {
49        Self {
50            velocity: self.velocity / scalar,
51            spin: self.spin / scalar,
52        }
53    }
54}
55
56impl<V, B> MulAssign<V::Scalar> for Movement<V, B>
57where
58    V: VectorSpace + MulAssign<V::Scalar>,
59    B: VectorSpace<Scalar = V::Scalar> + MulAssign<V::Scalar>,
60{
61    fn mul_assign(&mut self, scalar: V::Scalar) {
62        self.velocity *= scalar;
63        self.spin *= scalar;
64    }
65}
66
67impl<V, B> DivAssign<V::Scalar> for Movement<V, B>
68where
69    V: VectorSpace + DivAssign<V::Scalar>,
70    B: VectorSpace<Scalar = V::Scalar> + DivAssign<V::Scalar>,
71{
72    fn div_assign(&mut self, scalar: V::Scalar) {
73        self.velocity /= scalar;
74        self.spin /= scalar;
75    }
76}