Skip to main content

conspire/geometry/bbox/unite/
mod.rs

1#[cfg(test)]
2pub mod test;
3
4use crate::{
5    geometry::bbox::{BoundingBox, Unite},
6    math::Tensor,
7};
8
9impl<const D: usize> Unite<Self> for BoundingBox<D> {
10    type Output = Self;
11    fn unite(self, other: Self) -> Self::Output {
12        let mut minimum = self.minimum;
13        let mut maximum = self.maximum;
14        minimum
15            .iter_mut()
16            .zip(other.minimum)
17            .zip(maximum.iter_mut().zip(other.maximum))
18            .for_each(|((min, other_min), (max, other_max))| {
19                *min = min.min(other_min);
20                *max = max.max(other_max);
21            });
22        Self { minimum, maximum }
23    }
24}
25
26impl<const D: usize> Unite<BoundingBox<D>> for &BoundingBox<D> {
27    type Output = BoundingBox<D>;
28    fn unite(self, other: BoundingBox<D>) -> Self::Output {
29        let mut minimum = self.minimum.clone();
30        let mut maximum = self.maximum.clone();
31        minimum
32            .iter_mut()
33            .zip(other.minimum)
34            .zip(maximum.iter_mut().zip(other.maximum))
35            .for_each(|((min, other_min), (max, other_max))| {
36                *min = min.min(other_min);
37                *max = max.max(other_max);
38            });
39        BoundingBox { minimum, maximum }
40    }
41}
42
43impl<const D: usize> Unite<&Self> for BoundingBox<D> {
44    type Output = Self;
45    fn unite(self, other: &Self) -> Self::Output {
46        let mut minimum = self.minimum;
47        let mut maximum = self.maximum;
48        minimum
49            .iter_mut()
50            .zip(other.minimum.iter())
51            .zip(maximum.iter_mut().zip(other.maximum.iter()))
52            .for_each(|((min, &other_min), (max, &other_max))| {
53                *min = min.min(other_min);
54                *max = max.max(other_max);
55            });
56        Self { minimum, maximum }
57    }
58}
59
60impl<const D: usize> Unite<Self> for &BoundingBox<D> {
61    type Output = BoundingBox<D>;
62    fn unite(self, other: Self) -> Self::Output {
63        let mut minimum = self.minimum.clone();
64        let mut maximum = self.maximum.clone();
65        minimum
66            .iter_mut()
67            .zip(other.minimum.iter())
68            .zip(maximum.iter_mut().zip(other.maximum.iter()))
69            .for_each(|((min, &other_min), (max, &other_max))| {
70                *min = min.min(other_min);
71                *max = max.max(other_max);
72            });
73        BoundingBox { minimum, maximum }
74    }
75}