Struct emath::Rect

source ·
#[repr(C)]
pub struct Rect { pub min: Pos2, pub max: Pos2, }
Expand description

A rectangular region of space.

Usually a Rect has a positive (or zero) size, and then Self::min <= Self::max. In these cases Self::min is the left-top corner and Self::max is the right-bottom corner.

A rectangle is allowed to have a negative size, which happens when the order of min and max are swapped. These are usually a sign of an error.

Normally the unit is points (logical pixels) in screen space coordinates.

Rect does NOT implement Default, because there is no obvious default value. Rect::ZERO may seem reasonable, but when used as a bounding box, Rect::NOTHING is a better default - so be explicit instead!

Fields§

§min: Pos2

One of the corners of the rectangle, usually the left top one.

§max: Pos2

The other corner, opposing Self::min. Usually the right bottom one.

Implementations§

source§

impl Rect

source

pub const EVERYTHING: Self = _

Infinite rectangle that contains every point.

source

pub const NOTHING: Self = _

The inverse of Self::EVERYTHING: stretches from positive infinity to negative infinity. Contains no points.

This is useful as the seed for bounding boxes.

§Example:
let mut rect = Rect::NOTHING;
assert!(rect.size() == Vec2::splat(-f32::INFINITY));
assert!(rect.contains(pos2(0.0, 0.0)) == false);
rect.extend_with(pos2(2.0, 1.0));
rect.extend_with(pos2(0.0, 3.0));
assert_eq!(rect, Rect::from_min_max(pos2(0.0, 1.0), pos2(2.0, 3.0)))
source

pub const NAN: Self = _

An invalid Rect filled with f32::NAN.

source

pub const ZERO: Self = _

A Rect filled with zeroes.

source

pub const fn from_min_max(min: Pos2, max: Pos2) -> Self

source

pub fn from_min_size(min: Pos2, size: Vec2) -> Self

left-top corner plus a size (stretching right-down).

source

pub fn from_center_size(center: Pos2, size: Vec2) -> Self

source

pub fn from_x_y_ranges( x_range: impl Into<Rangef>, y_range: impl Into<Rangef> ) -> Self

source

pub fn from_two_pos(a: Pos2, b: Pos2) -> Self

Returns the bounding rectangle of the two points.

source

pub fn from_points(points: &[Pos2]) -> Self

Bounding-box around the points.

source

pub fn everything_right_of(left_x: f32) -> Self

A Rect that contains every point to the right of the given X coordinate.

source

pub fn everything_left_of(right_x: f32) -> Self

A Rect that contains every point to the left of the given X coordinate.

source

pub fn everything_below(top_y: f32) -> Self

A Rect that contains every point below a certain y coordinate

source

pub fn everything_above(bottom_y: f32) -> Self

A Rect that contains every point above a certain y coordinate

source

pub fn with_min_x(self, min_x: f32) -> Self

source

pub fn with_min_y(self, min_y: f32) -> Self

source

pub fn with_max_x(self, max_x: f32) -> Self

source

pub fn with_max_y(self, max_y: f32) -> Self

source

pub fn expand(self, amnt: f32) -> Self

Expand by this much in each direction, keeping the center

source

pub fn expand2(self, amnt: Vec2) -> Self

Expand by this much in each direction, keeping the center

source

pub fn shrink(self, amnt: f32) -> Self

Shrink by this much in each direction, keeping the center

source

pub fn shrink2(self, amnt: Vec2) -> Self

Shrink by this much in each direction, keeping the center

source

pub fn translate(self, amnt: Vec2) -> Self

source

pub fn rotate_bb(self, rot: Rot2) -> Self

Rotate the bounds (will expand the Rect)

source

pub fn intersects(self, other: Self) -> bool

source

pub fn set_width(&mut self, w: f32)

keep min

source

pub fn set_height(&mut self, h: f32)

keep min

source

pub fn set_center(&mut self, center: Pos2)

Keep size

source

pub fn contains(&self, p: Pos2) -> bool

source

pub fn contains_rect(&self, other: Self) -> bool

source

pub fn clamp(&self, p: Pos2) -> Pos2

Return the given points clamped to be inside the rectangle Panics if Self::is_negative.

source

pub fn extend_with(&mut self, p: Pos2)

source

pub fn extend_with_x(&mut self, x: f32)

Expand to include the given x coordinate

source

pub fn extend_with_y(&mut self, y: f32)

Expand to include the given y coordinate

source

pub fn union(self, other: Self) -> Self

The union of two bounding rectangle, i.e. the minimum Rect that contains both input rectangles.

source

pub fn intersect(self, other: Self) -> Self

The intersection of two Rect, i.e. the area covered by both.

source

pub fn center(&self) -> Pos2

source

pub fn size(&self) -> Vec2

rect.size() == Vec2 { x: rect.width(), y: rect.height() }

source

pub fn width(&self) -> f32

source

pub fn height(&self) -> f32

source

pub fn aspect_ratio(&self) -> f32

Width / height

  • aspect_ratio < 1: portrait / high
  • aspect_ratio = 1: square
  • aspect_ratio > 1: landscape / wide
source

pub fn square_proportions(&self) -> Vec2

[2, 1] for wide screen, and [1, 2] for portrait, etc. At least one dimension = 1, the other >= 1 Returns the proportions required to letter-box a square view area.

source

pub fn area(&self) -> f32

source

pub fn distance_to_pos(&self, pos: Pos2) -> f32

The distance from the rect to the position.

The distance is zero when the position is in the interior of the rectangle.

source

pub fn distance_sq_to_pos(&self, pos: Pos2) -> f32

The distance from the rect to the position, squared.

The distance is zero when the position is in the interior of the rectangle.

source

pub fn signed_distance_to_pos(&self, pos: Pos2) -> f32

Signed distance to the edge of the box.

Negative inside the box.

let rect = Rect::from_min_max(pos2(0.0, 0.0), pos2(1.0, 1.0));
assert_eq!(rect.signed_distance_to_pos(pos2(0.50, 0.50)), -0.50);
assert_eq!(rect.signed_distance_to_pos(pos2(0.75, 0.50)), -0.25);
assert_eq!(rect.signed_distance_to_pos(pos2(1.50, 0.50)), 0.50);
source

pub fn lerp_inside(&self, t: Vec2) -> Pos2

Linearly interpolate so that [0, 0] is Self::min and [1, 1] is Self::max.

source

pub fn lerp_towards(&self, other: &Self, t: f32) -> Self

Linearly self towards other rect.

source

pub fn x_range(&self) -> Rangef

source

pub fn y_range(&self) -> Rangef

source

pub fn bottom_up_range(&self) -> Rangef

source

pub fn is_negative(&self) -> bool

width < 0 || height < 0

source

pub fn is_positive(&self) -> bool

width > 0 && height > 0

source

pub fn is_finite(&self) -> bool

True if all members are also finite.

source

pub fn any_nan(self) -> bool

True if any member is NaN.

source§

impl Rect

§Convenience functions (assumes origin is towards left top):
source

pub fn left(&self) -> f32

min.x

source

pub fn left_mut(&mut self) -> &mut f32

min.x

source

pub fn set_left(&mut self, x: f32)

min.x

source

pub fn right(&self) -> f32

max.x

source

pub fn right_mut(&mut self) -> &mut f32

max.x

source

pub fn set_right(&mut self, x: f32)

max.x

source

pub fn top(&self) -> f32

min.y

source

pub fn top_mut(&mut self) -> &mut f32

min.y

source

pub fn set_top(&mut self, y: f32)

min.y

source

pub fn bottom(&self) -> f32

max.y

source

pub fn bottom_mut(&mut self) -> &mut f32

max.y

source

pub fn set_bottom(&mut self, y: f32)

max.y

source

pub fn left_top(&self) -> Pos2

source

pub fn center_top(&self) -> Pos2

source

pub fn right_top(&self) -> Pos2

source

pub fn left_center(&self) -> Pos2

source

pub fn right_center(&self) -> Pos2

source

pub fn left_bottom(&self) -> Pos2

source

pub fn center_bottom(&self) -> Pos2

source

pub fn right_bottom(&self) -> Pos2

source

pub fn split_left_right_at_fraction(&self, t: f32) -> (Self, Self)

Split rectangle in left and right halves. t is expected to be in the (0,1) range.

source

pub fn split_left_right_at_x(&self, split_x: f32) -> (Self, Self)

Split rectangle in left and right halves at the given x coordinate.

source

pub fn split_top_bottom_at_fraction(&self, t: f32) -> (Self, Self)

Split rectangle in top and bottom halves. t is expected to be in the (0,1) range.

source

pub fn split_top_bottom_at_y(&self, split_y: f32) -> (Self, Self)

Split rectangle in top and bottom halves at the given y coordinate.

source§

impl Rect

source

pub fn intersects_ray(&self, o: Pos2, d: Vec2) -> bool

Does this Rect intersect the given ray (where d is normalized)?

Trait Implementations§

source§

impl Clone for Rect

source§

fn clone(&self) -> Rect

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for Rect

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Div<f32> for Rect

§

type Output = Rect

The resulting type after applying the / operator.
source§

fn div(self, factor: f32) -> Self

Performs the / operation. Read more
source§

impl From<[Pos2; 2]> for Rect

from (min, max) or (left top, right bottom)

source§

fn from([min, max]: [Pos2; 2]) -> Self

Converts to this type from the input type.
source§

impl Mul<Rect> for TSTransform

Transforms the rectangle.

§

type Output = Rect

The resulting type after applying the * operator.
source§

fn mul(self, rect: Rect) -> Rect

Performs the * operation. Read more
source§

impl Mul<Rect> for f32

§

type Output = Rect

The resulting type after applying the * operator.
source§

fn mul(self, vec: Rect) -> Rect

Performs the * operation. Read more
source§

impl Mul<f32> for Rect

§

type Output = Rect

The resulting type after applying the * operator.
source§

fn mul(self, factor: f32) -> Self

Performs the * operation. Read more
source§

impl PartialEq for Rect

source§

fn eq(&self, other: &Rect) -> bool

This method tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
source§

impl Copy for Rect

source§

impl Eq for Rect

source§

impl StructuralPartialEq for Rect

Auto Trait Implementations§

§

impl Freeze for Rect

§

impl RefUnwindSafe for Rect

§

impl Send for Rect

§

impl Sync for Rect

§

impl Unpin for Rect

§

impl UnwindSafe for Rect

Blanket Implementations§

source§

impl<T> Any for T
where T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T, U> Into<U> for T
where U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T> ToOwned for T
where T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.