diff --git a/crates/emath/src/rect.rs b/crates/emath/src/rect.rs index 28ca2ec4..c3e6ad93 100644 --- a/crates/emath/src/rect.rs +++ b/crates/emath/src/rect.rs @@ -200,6 +200,18 @@ impl Rect { Self::from_min_max(self.min - amnt, self.max + amnt) } + /// Scale up by this factor in each direction, keeping the center + #[must_use] + pub fn scale_from_center(self, scale_factor: f32) -> Self { + self.scale_from_center2(Vec2::splat(scale_factor)) + } + + /// Scale up by this factor in each direction, keeping the center + #[must_use] + pub fn scale_from_center2(self, scale_factor: Vec2) -> Self { + Self::from_center_size(self.center(), self.size() * scale_factor) + } + /// Shrink by this much in each direction, keeping the center #[must_use] pub fn shrink(self, amnt: f32) -> Self { @@ -740,6 +752,25 @@ mod tests { assert_eq!(r.distance_sq_to_pos(pos2(25.0, 5.0)), 50.0); // right and above } + #[test] + fn scale_rect() { + let c = pos2(100.0, 50.0); + let r = Rect::from_center_size(c, vec2(30.0, 60.0)); + + assert_eq!( + r.scale_from_center(2.0), + Rect::from_center_size(c, vec2(60.0, 120.0)) + ); + assert_eq!( + r.scale_from_center(0.5), + Rect::from_center_size(c, vec2(15.0, 30.0)) + ); + assert_eq!( + r.scale_from_center2(vec2(2.0, 3.0)), + Rect::from_center_size(c, vec2(60.0, 180.0)) + ); + } + #[test] fn test_ray_intersection() { let rect = Rect::from_min_max(pos2(1.0, 1.0), pos2(3.0, 3.0));