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}