Skip to main content

Vec2

Struct Vec2 

pub struct Vec2 {
    pub x: f64,
    pub y: f64,
}
Expand description

A 2D vector.

This is intended primarily for a vector in the mathematical sense, but it can be interpreted as a translation, and converted to and from a Point (vector relative to the origin) and Size.

Fields§

§x: f64

The x-coordinate.

§y: f64

The y-coordinate.

Implementations§

§

impl Vec2

pub const ZERO: Vec2

The vector (0, 0).

pub const fn new(x: f64, y: f64) -> Vec2

Create a new vector.

pub const fn to_point(self) -> Point

Convert this vector into a Point.

pub const fn to_size(self) -> Size

Convert this vector into a Size.

pub const fn splat(v: f64) -> Vec2

Create a vector with the same value for x and y.

pub const fn dot(self, other: Vec2) -> f64

Dot product of two vectors.

pub const fn cross(self, other: Vec2) -> f64

Cross product of two vectors.

This is signed so that (1, 0) × (0, 1) = 1.

The following relations hold:

u.cross(v) = -v.cross(u)

v.cross(v) = 0.0

pub fn hypot(self) -> f64

Magnitude of vector.

See Point::distance for the same operation on Point.

§Examples
use kurbo::Vec2;
let v = Vec2::new(3.0, 4.0);
assert_eq!(v.hypot(), 5.0);

pub fn length(self) -> f64

Magnitude of vector.

This is an alias for Vec2::hypot.

pub const fn hypot2(self) -> f64

Magnitude squared of vector.

See Point::distance_squared for the same operation on Point.

§Examples
use kurbo::Vec2;
let v = Vec2::new(3.0, 4.0);
assert_eq!(v.hypot2(), 25.0);

pub const fn length_squared(self) -> f64

Magnitude squared of vector.

This is an alias for Vec2::hypot2.

pub fn atan2(self) -> f64

Find the angle in radians between this vector and the vector Vec2 { x: 1.0, y: 0.0 } in the positive y direction.

If the vector is interpreted as a complex number, this is the argument. The angle is expressed in radians.

pub fn angle(self) -> f64

Find the angle in radians between this vector and the vector Vec2 { x: 1.0, y: 0.0 } in the positive y direction.

This is an alias for Vec2::atan2.

pub fn from_angle(th: f64) -> Vec2

A unit vector of the given angle.

With th at zero, the result is the positive X unit vector, and at π/2, it is the positive Y unit vector. The angle is expressed in radians.

Thus, in a Y-down coordinate system (as is common for graphics), it is a clockwise rotation, and in Y-up (traditional for math), it is anti-clockwise. This convention is consistent with Affine::rotate.

pub fn lerp(self, other: Vec2, t: f64) -> Vec2

Linearly interpolate between two vectors.

pub fn normalize(self) -> Vec2

Returns a vector of magnitude 1.0 with the same angle as self; i.e. a unit/direction vector.

This produces NaN values when the magnitude is 0.

pub fn round(self) -> Vec2

Returns a new Vec2, with x and y rounded to the nearest integer.

§Examples
use kurbo::Vec2;
let a = Vec2::new(3.3, 3.6).round();
let b = Vec2::new(3.0, -3.1).round();
assert_eq!(a.x, 3.0);
assert_eq!(a.y, 4.0);
assert_eq!(b.x, 3.0);
assert_eq!(b.y, -3.0);

pub fn ceil(self) -> Vec2

Returns a new Vec2, with x and y rounded up to the nearest integer, unless they are already an integer.

§Examples
use kurbo::Vec2;
let a = Vec2::new(3.3, 3.6).ceil();
let b = Vec2::new(3.0, -3.1).ceil();
assert_eq!(a.x, 4.0);
assert_eq!(a.y, 4.0);
assert_eq!(b.x, 3.0);
assert_eq!(b.y, -3.0);

pub fn floor(self) -> Vec2

Returns a new Vec2, with x and y rounded down to the nearest integer, unless they are already an integer.

§Examples
use kurbo::Vec2;
let a = Vec2::new(3.3, 3.6).floor();
let b = Vec2::new(3.0, -3.1).floor();
assert_eq!(a.x, 3.0);
assert_eq!(a.y, 3.0);
assert_eq!(b.x, 3.0);
assert_eq!(b.y, -4.0);

pub fn expand(self) -> Vec2

Returns a new Vec2, with x and y rounded away from zero to the nearest integer, unless they are already an integer.

§Examples
use kurbo::Vec2;
let a = Vec2::new(3.3, 3.6).expand();
let b = Vec2::new(3.0, -3.1).expand();
assert_eq!(a.x, 4.0);
assert_eq!(a.y, 4.0);
assert_eq!(b.x, 3.0);
assert_eq!(b.y, -4.0);

pub fn trunc(self) -> Vec2

Returns a new Vec2, with x and y rounded towards zero to the nearest integer, unless they are already an integer.

§Examples
use kurbo::Vec2;
let a = Vec2::new(3.3, 3.6).trunc();
let b = Vec2::new(3.0, -3.1).trunc();
assert_eq!(a.x, 3.0);
assert_eq!(a.y, 3.0);
assert_eq!(b.x, 3.0);
assert_eq!(b.y, -3.0);

pub const fn is_finite(self) -> bool

Is this Vec2 finite?

pub const fn is_nan(self) -> bool

Is this Vec2 NaN?

pub const fn turn_90(self) -> Vec2

Turn by 90 degrees.

The rotation is clockwise in a Y-down coordinate system. The following relations hold:

u.dot(v) = u.cross(v.turn_90())

u.cross(v) = u.turn_90().dot(v)

pub const fn rotate_scale(self, rhs: Vec2) -> Vec2

Combine two vectors interpreted as rotation and scaling.

Interpret both vectors as a rotation and a scale, and combine their effects. by adding the angles and multiplying the magnitudes. This operation is equivalent to multiplication when the vectors are interpreted as complex numbers. It is commutative.

pub const fn get_coord(self, axis: Axis) -> f64

Get the member matching the given axis.

pub const fn get_coord_mut(&mut self, axis: Axis) -> &mut f64

Get a mutable reference to the member matching the given axis.

pub const fn set_coord(&mut self, axis: Axis, value: f64)

Set the member matching the given axis to the given value.

Trait Implementations§

§

impl Add<TranslateScale> for Vec2

§

type Output = TranslateScale

The resulting type after applying the + operator.
§

fn add(self, other: TranslateScale) -> TranslateScale

Performs the + operation. Read more
§

impl Add<Vec2> for Circle

§

type Output = Circle

The resulting type after applying the + operator.
§

fn add(self, v: Vec2) -> Circle

Performs the + operation. Read more
§

impl Add<Vec2> for CircleSegment

§

type Output = CircleSegment

The resulting type after applying the + operator.
§

fn add(self, v: Vec2) -> CircleSegment

Performs the + operation. Read more
§

impl Add<Vec2> for Ellipse

§

fn add(self, v: Vec2) -> Ellipse

In this context adding a Vec2 applies the corresponding translation to the ellipse.

§

type Output = Ellipse

The resulting type after applying the + operator.
§

impl Add<Vec2> for Line

§

type Output = Line

The resulting type after applying the + operator.
§

fn add(self, v: Vec2) -> Line

Performs the + operation. Read more
§

impl Add<Vec2> for Point

§

type Output = Point

The resulting type after applying the + operator.
§

fn add(self, other: Vec2) -> Point

Performs the + operation. Read more
§

impl Add<Vec2> for Rect

§

type Output = Rect

The resulting type after applying the + operator.
§

fn add(self, v: Vec2) -> Rect

Performs the + operation. Read more
§

impl Add<Vec2> for RoundedRect

§

type Output = RoundedRect

The resulting type after applying the + operator.
§

fn add(self, v: Vec2) -> RoundedRect

Performs the + operation. Read more
§

impl Add<Vec2> for TranslateScale

§

type Output = TranslateScale

The resulting type after applying the + operator.
§

fn add(self, other: Vec2) -> TranslateScale

Performs the + operation. Read more
§

impl Add<Vec2> for Triangle

§

type Output = Triangle

The resulting type after applying the + operator.
§

fn add(self, v: Vec2) -> Triangle

Performs the + operation. Read more
§

impl Add for Vec2

§

type Output = Vec2

The resulting type after applying the + operator.
§

fn add(self, other: Vec2) -> Vec2

Performs the + operation. Read more
§

impl AddAssign<Vec2> for Point

§

fn add_assign(&mut self, other: Vec2)

Performs the += operation. Read more
§

impl AddAssign<Vec2> for TranslateScale

§

fn add_assign(&mut self, other: Vec2)

Performs the += operation. Read more
§

impl AddAssign for Vec2

§

fn add_assign(&mut self, other: Vec2)

Performs the += operation. Read more
§

impl Clone for Vec2

§

fn clone(&self) -> Vec2

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

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

Performs copy-assignment from source. Read more
§

impl Debug for Vec2

§

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

Formats the value using the given formatter. Read more
§

impl Default for Vec2

§

fn default() -> Vec2

Returns the “default value” for a type. Read more
§

impl Display for Vec2

§

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

Formats the value using the given formatter. Read more
§

impl Div<f64> for Vec2

§

fn div(self, other: f64) -> Vec2

Note: division by a scalar is implemented by multiplying by the reciprocal.

This is more efficient but has different roundoff behavior than division.

§

type Output = Vec2

The resulting type after applying the / operator.
§

impl DivAssign<f64> for Vec2

§

fn div_assign(&mut self, other: f64)

Performs the /= operation. Read more
§

impl From<(f64, f64)> for Vec2

§

fn from(v: (f64, f64)) -> Vec2

Converts to this type from the input type.
§

impl Mul<Vec2> for Diagonal2

§

type Output = Vec2

The resulting type after applying the * operator.
§

fn mul(self, rhs: Vec2) -> Vec2

Performs the * operation. Read more
§

impl Mul<f64> for Vec2

§

type Output = Vec2

The resulting type after applying the * operator.
§

fn mul(self, other: f64) -> Vec2

Performs the * operation. Read more
§

impl MulAssign<f64> for Vec2

§

fn mul_assign(&mut self, other: f64)

Performs the *= operation. Read more
§

impl Neg for Vec2

§

type Output = Vec2

The resulting type after applying the - operator.
§

fn neg(self) -> Vec2

Performs the unary - operation. Read more
§

impl PartialEq for Vec2

§

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

Tests for self and other values to be equal, and is used by ==.
1.0.0 (const: unstable) · Source§

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

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

impl Sub<Vec2> for Circle

§

type Output = Circle

The resulting type after applying the - operator.
§

fn sub(self, v: Vec2) -> Circle

Performs the - operation. Read more
§

impl Sub<Vec2> for CircleSegment

§

type Output = CircleSegment

The resulting type after applying the - operator.
§

fn sub(self, v: Vec2) -> CircleSegment

Performs the - operation. Read more
§

impl Sub<Vec2> for Ellipse

§

fn sub(self, v: Vec2) -> Ellipse

In this context subtracting a Vec2 applies the corresponding translation to the ellipse.

§

type Output = Ellipse

The resulting type after applying the - operator.
§

impl Sub<Vec2> for Line

§

type Output = Line

The resulting type after applying the - operator.
§

fn sub(self, v: Vec2) -> Line

Performs the - operation. Read more
§

impl Sub<Vec2> for Point

§

type Output = Point

The resulting type after applying the - operator.
§

fn sub(self, other: Vec2) -> Point

Performs the - operation. Read more
§

impl Sub<Vec2> for Rect

§

type Output = Rect

The resulting type after applying the - operator.
§

fn sub(self, v: Vec2) -> Rect

Performs the - operation. Read more
§

impl Sub<Vec2> for RoundedRect

§

type Output = RoundedRect

The resulting type after applying the - operator.
§

fn sub(self, v: Vec2) -> RoundedRect

Performs the - operation. Read more
§

impl Sub<Vec2> for TranslateScale

§

type Output = TranslateScale

The resulting type after applying the - operator.
§

fn sub(self, other: Vec2) -> TranslateScale

Performs the - operation. Read more
§

impl Sub<Vec2> for Triangle

§

type Output = Triangle

The resulting type after applying the - operator.
§

fn sub(self, v: Vec2) -> Triangle

Performs the - operation. Read more
§

impl Sub for Vec2

§

type Output = Vec2

The resulting type after applying the - operator.
§

fn sub(self, other: Vec2) -> Vec2

Performs the - operation. Read more
§

impl SubAssign<Vec2> for Point

§

fn sub_assign(&mut self, other: Vec2)

Performs the -= operation. Read more
§

impl SubAssign<Vec2> for TranslateScale

§

fn sub_assign(&mut self, other: Vec2)

Performs the -= operation. Read more
§

impl SubAssign for Vec2

§

fn sub_assign(&mut self, other: Vec2)

Performs the -= operation. Read more
§

impl Sum for Vec2

§

fn sum<I>(iter: I) -> Vec2
where I: Iterator<Item = Vec2>,

Takes an iterator and generates Self from the elements by “summing up” the items.
§

impl Copy for Vec2

§

impl StructuralPartialEq for Vec2

Auto Trait Implementations§

§

impl Freeze for Vec2

§

impl RefUnwindSafe for Vec2

§

impl Send for Vec2

§

impl Sync for Vec2

§

impl Unpin for Vec2

§

impl UnsafeUnpin for Vec2

§

impl UnwindSafe for Vec2

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
§

impl<T> AnyEq for T
where T: Any + PartialEq,

§

fn equals(&self, other: &(dyn Any + 'static)) -> bool

§

fn as_any(&self) -> &(dyn Any + 'static)

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> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<T> Downcast<T> for T

§

fn downcast(&self) -> &T

§

impl<T> Downcast for T
where T: Any,

§

fn into_any(self: Box<T>) -> Box<dyn Any>

Convert Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.
§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Convert Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
§

impl<T> DowncastSync for T
where T: Any + Send + Sync,

§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync> ⓘ

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
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> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
§

impl<T> NoneValue for T
where T: Default,

§

type NoneType = T

§

fn null_value() -> T

The none-equivalent value.
§

impl<T> Pointable for T

§

const ALIGN: usize

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
§

impl<T, S> SimdFrom<T, S> for T
where S: Simd,

§

fn simd_from(_simd: S, value: T) -> T

§

impl<F, T, S> SimdInto<T, S> for F
where T: SimdFrom<F, S>, S: Simd,

§

fn simd_into(self, simd: S) -> T

Source§

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

Source§

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
§

impl<T> ToSmolStr for T
where T: Display + ?Sized,

§

fn to_smolstr(&self) -> SmolStr

Source§

impl<T> ToString for T
where T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

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

Source§

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>,

Source§

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.
§

impl<T> Upcast<T> for T

§

fn upcast(&self) -> Option<&T>

§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

impl<T> ErasedDestructor for T
where T: 'static,

§

impl<T> Fruit for T
where T: Send + Downcast,

§

impl<T, Rhs, Output> GroupOps<Rhs, Output> for T
where T: Add<Rhs, Output = Output> + Sub<Rhs, Output = Output> + AddAssign<Rhs> + SubAssign<Rhs>,

§

impl<T> MaybeSendSync for T
where T: Send + Sync + ?Sized,

§

impl<T, Rhs, Output> ScalarMul<Rhs, Output> for T
where T: Mul<Rhs, Output = Output> + MulAssign<Rhs>,

§

impl<T> WasmNotSend for T
where T: Send,

§

impl<T> WasmNotSendSync for T

§

impl<T> WasmNotSync for T
where T: Sync,