spatial_motion/
movement.rs1use 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}