Skip to main content

auburn/col2d/detection/
penetrates.rs

1use super::*;
2
3/// Trait for computing smallest penetration vector between `Self` and `T`.
4///
5/// # See also
6/// * [Collides2d]
7pub trait PenetratesRel2d<T> {
8    /// Computes the smallest penetration vector between `self` and `t`.
9    ///
10    /// # Arguments
11    /// * `t` - The object to compute penetration into
12    /// * `rel` - The *relative* transform from `self` to `t`
13    ///
14    /// # Example
15    /// ```
16    /// # use auburn::col2d::*;
17    /// let a = Box2d::with_halfdims(1.0, 1.0);
18    /// let b = Box2d::with_halfdims(1.0, 1.0);
19    /// let rel = Translate2d::from(Vec2::new(1.0, 0.0));
20    /// assert_eq!(a.penetrates_rel(&b, &rel), Some(Vec2::new(-1.0, 0.0)));
21    /// ```
22    ///
23    /// # See also
24    /// * [Collides2d::collides].
25    fn penetrates_rel(&self, t: &T, rel: &impl Transformation2d) -> Option<Vec2>;
26}
27
28/// Trait for computing smallest penetration vector between `Self` and `T`.
29///
30/// # See also
31/// * [Collides2d]
32pub trait Penetrates2d<B, T: Transformation2d> {
33    /// Computes the smallest penetration vector between `self` and `t`.
34    ///
35    /// # Arguments
36    /// * `t` - The object to compute penetration into
37    /// * `rel` - The *relative* transform from `self` to `t`
38    ///
39    /// # Example
40    /// ```
41    /// # use auburn::col2d::*;
42    /// let a = Box2d::with_halfdims(1.0, 1.0);
43    /// let a_t = Translate2d::from(Vec2::new(0.0, 0.0));
44    /// let b = Box2d::with_halfdims(1.0, 1.0);
45    /// let b_t = Translate2d::from(Vec2::new(1.0, 0.0));
46    /// assert_eq!(a.penetrates(&a_t, &b, &b_t), Some(Vec2::new(-1.0, 0.0)));
47    /// ```
48    ///
49    /// # See also
50    /// * [Collides2d::collides].
51    fn penetrates(&self, a_t: &T, b: &B, b_t: &T) -> Option<Vec2>;
52}
53
54impl<A, B, T> Penetrates2d<B, T> for A
55where
56    A: PenetratesRel2d<B>,
57    T: Transformation2d + DeltaTransform,
58{
59    fn penetrates(&self, a_transform: &T, b: &B, b_transform: &T) -> Option<Vec2> {
60        let rel = a_transform.delta_transform(b_transform);
61        self.penetrates_rel(b, &rel)
62    }
63}