geometry: Don't compute intersection for non-overlapping rects

This commit is contained in:
Victor Brekenfeld 2021-12-20 19:09:58 +01:00
parent c0b9ecbcdf
commit 5d8ac82688
1 changed files with 8 additions and 3 deletions

View File

@ -886,16 +886,21 @@ impl<N: Coordinate, Kind> Rectangle<N, Kind> {
} }
/// Clamp rectangle to min and max corners resulting in the overlapping area of two rectangles /// Clamp rectangle to min and max corners resulting in the overlapping area of two rectangles
///
/// Returns `None` if the two rectangles don't overlap
#[inline] #[inline]
pub fn intersection(self, other: impl Into<Rectangle<N, Kind>>) -> Self { pub fn intersection(self, other: impl Into<Rectangle<N, Kind>>) -> Option<Self> {
let other = other.into(); let other = other.into();
Rectangle::from_extemities( if !self.overlaps(other) {
return None;
}
Some(Rectangle::from_extemities(
(self.loc.x.max(other.loc.x), self.loc.y.max(other.loc.y)), (self.loc.x.max(other.loc.x), self.loc.y.max(other.loc.y)),
( (
(self.loc.x.saturating_add(self.size.w)).min(other.loc.x.saturating_add(other.size.w)), (self.loc.x.saturating_add(self.size.w)).min(other.loc.x.saturating_add(other.size.w)),
(self.loc.y.saturating_add(self.size.h)).min(other.loc.y.saturating_add(other.size.h)), (self.loc.y.saturating_add(self.size.h)).min(other.loc.y.saturating_add(other.size.h)),
), ),
) ))
} }
/// Compute the bounding box of a given set of points /// Compute the bounding box of a given set of points