#[repr(C)]pub struct Rect {
pub min: Vec2,
pub max: Vec2,
}
Expand description
A rectangle defined by two opposite corners.
The rectangle is axis aligned, and defined by its minimum and maximum coordinates,
stored in Rect::min
and Rect::max
, respectively. The minimum/maximum invariant
must be upheld by the user when directly assigning the fields, otherwise some methods
produce invalid results. It is generally recommended to use one of the constructor
methods instead, which will ensure this invariant is met, unless you already have
the minimum and maximum corners.
Fields§
§min: Vec2
The minimum corner point of the rect.
max: Vec2
The maximum corner point of the rect.
Implementations§
source§impl Rect
impl Rect
sourcepub fn new(x0: f32, y0: f32, x1: f32, y1: f32) -> Self
pub fn new(x0: f32, y0: f32, x1: f32, y1: f32) -> Self
Create a new rectangle from two corner points.
The two points do not need to be the minimum and/or maximum corners. They only need to be two opposite corners.
Examples
let r = Rect::new(0., 4., 10., 6.); // w=10 h=2
let r = Rect::new(2., 3., 5., -1.); // w=3 h=4
sourcepub fn from_corners(p0: Vec2, p1: Vec2) -> Self
pub fn from_corners(p0: Vec2, p1: Vec2) -> Self
Create a new rectangle from two corner points.
The two points do not need to be the minimum and/or maximum corners. They only need to be two opposite corners.
Examples
// Unit rect from [0,0] to [1,1]
let r = Rect::from_corners(Vec2::ZERO, Vec2::ONE); // w=1 h=1
// Same; the points do not need to be ordered
let r = Rect::from_corners(Vec2::ONE, Vec2::ZERO); // w=1 h=1
sourcepub fn from_center_size(origin: Vec2, size: Vec2) -> Self
pub fn from_center_size(origin: Vec2, size: Vec2) -> Self
Create a new rectangle from its center and size.
Panics
This method panics if any of the components of the size is negative.
Examples
let r = Rect::from_center_size(Vec2::ZERO, Vec2::ONE); // w=1 h=1
assert!(r.min.abs_diff_eq(Vec2::splat(-0.5), 1e-5));
assert!(r.max.abs_diff_eq(Vec2::splat(0.5), 1e-5));
sourcepub fn from_center_half_size(origin: Vec2, half_size: Vec2) -> Self
pub fn from_center_half_size(origin: Vec2, half_size: Vec2) -> Self
Create a new rectangle from its center and half-size.
Panics
This method panics if any of the components of the half-size is negative.
Examples
let r = Rect::from_center_half_size(Vec2::ZERO, Vec2::ONE); // w=2 h=2
assert!(r.min.abs_diff_eq(Vec2::splat(-1.), 1e-5));
assert!(r.max.abs_diff_eq(Vec2::splat(1.), 1e-5));
sourcepub fn is_empty(&self) -> bool
pub fn is_empty(&self) -> bool
Check if the rectangle is empty.
Examples
let r = Rect::from_corners(Vec2::ZERO, Vec2::new(0., 1.)); // w=0 h=1
assert!(r.is_empty());
sourcepub fn width(&self) -> f32
pub fn width(&self) -> f32
Rectangle width (max.x - min.x).
Examples
let r = Rect::new(0., 0., 5., 1.); // w=5 h=1
assert!((r.width() - 5.).abs() <= 1e-5);
sourcepub fn height(&self) -> f32
pub fn height(&self) -> f32
Rectangle height (max.y - min.y).
Examples
let r = Rect::new(0., 0., 5., 1.); // w=5 h=1
assert!((r.height() - 1.).abs() <= 1e-5);
sourcepub fn size(&self) -> Vec2
pub fn size(&self) -> Vec2
Rectangle size.
Examples
let r = Rect::new(0., 0., 5., 1.); // w=5 h=1
assert!(r.size().abs_diff_eq(Vec2::new(5., 1.), 1e-5));
sourcepub fn half_size(&self) -> Vec2
pub fn half_size(&self) -> Vec2
Rectangle half-size.
Examples
let r = Rect::new(0., 0., 5., 1.); // w=5 h=1
assert!(r.half_size().abs_diff_eq(Vec2::new(2.5, 0.5), 1e-5));
sourcepub fn center(&self) -> Vec2
pub fn center(&self) -> Vec2
The center point of the rectangle.
Examples
let r = Rect::new(0., 0., 5., 1.); // w=5 h=1
assert!(r.center().abs_diff_eq(Vec2::new(2.5, 0.5), 1e-5));
sourcepub fn contains(&self, point: Vec2) -> bool
pub fn contains(&self, point: Vec2) -> bool
Check if a point lies within this rectangle, inclusive of its edges.
Examples
let r = Rect::new(0., 0., 5., 1.); // w=5 h=1
assert!(r.contains(r.center()));
assert!(r.contains(r.min));
assert!(r.contains(r.max));
sourcepub fn union(&self, other: Self) -> Self
pub fn union(&self, other: Self) -> Self
Build a new rectangle formed of the union of this rectangle and another rectangle.
The union is the smallest rectangle enclosing both rectangles.
Examples
let r1 = Rect::new(0., 0., 5., 1.); // w=5 h=1
let r2 = Rect::new(1., -1., 3., 3.); // w=2 h=4
let r = r1.union(r2);
assert!(r.min.abs_diff_eq(Vec2::new(0., -1.), 1e-5));
assert!(r.max.abs_diff_eq(Vec2::new(5., 3.), 1e-5));
sourcepub fn union_point(&self, other: Vec2) -> Self
pub fn union_point(&self, other: Vec2) -> Self
Build a new rectangle formed of the union of this rectangle and a point.
The union is the smallest rectangle enclosing both the rectangle and the point. If the point is already inside the rectangle, this method returns a copy of the rectangle.
Examples
let r = Rect::new(0., 0., 5., 1.); // w=5 h=1
let u = r.union_point(Vec2::new(3., 6.));
assert!(u.min.abs_diff_eq(Vec2::ZERO, 1e-5));
assert!(u.max.abs_diff_eq(Vec2::new(5., 6.), 1e-5));
sourcepub fn intersect(&self, other: Self) -> Self
pub fn intersect(&self, other: Self) -> Self
Build a new rectangle formed of the intersection of this rectangle and another rectangle.
The intersection is the largest rectangle enclosed in both rectangles. If the intersection
is empty, this method returns an empty rectangle (Rect::is_empty()
returns true
), but
the actual values of Rect::min
and Rect::max
are implementation-dependent.
Examples
let r1 = Rect::new(0., 0., 5., 1.); // w=5 h=1
let r2 = Rect::new(1., -1., 3., 3.); // w=2 h=4
let r = r1.intersect(r2);
assert!(r.min.abs_diff_eq(Vec2::new(1., 0.), 1e-5));
assert!(r.max.abs_diff_eq(Vec2::new(3., 1.), 1e-5));
sourcepub fn inset(&self, inset: f32) -> Self
pub fn inset(&self, inset: f32) -> Self
Create a new rectangle with a constant inset.
The inset is the extra border on all sides. A positive inset produces a larger rectangle, while a negative inset is allowed and produces a smaller rectangle. If the inset is negative and its absolute value is larger than the rectangle half-size, the created rectangle is empty.
Examples
let r = Rect::new(0., 0., 5., 1.); // w=5 h=1
let r2 = r.inset(3.); // w=11 h=7
assert!(r2.min.abs_diff_eq(Vec2::splat(-3.), 1e-5));
assert!(r2.max.abs_diff_eq(Vec2::new(8., 4.), 1e-5));
let r = Rect::new(0., -1., 6., 7.); // w=6 h=8
let r2 = r.inset(-2.); // w=11 h=7
assert!(r2.min.abs_diff_eq(Vec2::new(2., 1.), 1e-5));
assert!(r2.max.abs_diff_eq(Vec2::new(4., 5.), 1e-5));
sourcepub fn normalize(&self, other: Self) -> Self
pub fn normalize(&self, other: Self) -> Self
Build a new rectangle from this one with its coordinates expressed
relative to other
in a normalized ([0..1] x [0..1]) coordinate system.
Examples
let r = Rect::new(2., 3., 4., 6.);
let s = Rect::new(0., 0., 10., 10.);
let n = r.normalize(s);
assert_eq!(n.min.x, 0.2);
assert_eq!(n.min.y, 0.3);
assert_eq!(n.max.x, 0.4);
assert_eq!(n.max.y, 0.6);