Skip to main content

Vec2

Struct Vec2 

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

Source§

impl Vec2

Source

pub const ZERO: Vec2

The vector (0, 0).

Source

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

Create a new vector.

Examples found in repository?
examples/shapes_demo.rs (line 72)
63fn draw_shape_attached(
64    scene: &mut impl SceneBuilder,
65    shape: &Shape,
66    placement: Point,
67    direction: Vec2,
68    size: f64,
69    brush: &Brush,
70    stroke_world_width: f64,
71) {
72    let perp = Vec2::new(-direction.y, direction.x);
73    let a = shape.anchor();
74    let anchor_world = direction * (a.x * size) + perp * (a.y * size);
75    let origin = placement - anchor_world;
76    let xform = Affine::translate(origin.to_vec2())
77        * Affine::rotate(direction.atan2())
78        * Affine::scale(size);
79    let (paths, style) = match shape.kind() {
80        ShapeKind::Paths { paths, style } => (paths, style),
81        ShapeKind::Glyph { .. } => return,
82    };
83    match style {
84        ShapeStyle::Fill => {
85            for sub in paths {
86                scene.fill(FillRule::NonZero, xform, brush, None, sub, PickId::Skip);
87            }
88        }
89        ShapeStyle::Stroke => {
90            let stroke = Stroke::new(stroke_world_width / size)
91                .with_caps(Cap::Round)
92                .with_join(Join::Round);
93            for sub in paths {
94                scene.stroke(&stroke, xform, brush, None, sub, PickId::Skip);
95            }
96        }
97    }
98}
Source

pub const fn to_point(self) -> Point

Convert this vector into a Point.

Source

pub const fn to_size(self) -> Size

Convert this vector into a Size.

Source

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

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

Source

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

Dot product of two vectors.

Source

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

Source

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);
Source

pub fn length(self) -> f64

Magnitude of vector.

This is an alias for Vec2::hypot.

Source

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);
Source

pub const fn length_squared(self) -> f64

Magnitude squared of vector.

This is an alias for Vec2::hypot2.

Source

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.

Examples found in repository?
examples/shapes_demo.rs (line 77)
63fn draw_shape_attached(
64    scene: &mut impl SceneBuilder,
65    shape: &Shape,
66    placement: Point,
67    direction: Vec2,
68    size: f64,
69    brush: &Brush,
70    stroke_world_width: f64,
71) {
72    let perp = Vec2::new(-direction.y, direction.x);
73    let a = shape.anchor();
74    let anchor_world = direction * (a.x * size) + perp * (a.y * size);
75    let origin = placement - anchor_world;
76    let xform = Affine::translate(origin.to_vec2())
77        * Affine::rotate(direction.atan2())
78        * Affine::scale(size);
79    let (paths, style) = match shape.kind() {
80        ShapeKind::Paths { paths, style } => (paths, style),
81        ShapeKind::Glyph { .. } => return,
82    };
83    match style {
84        ShapeStyle::Fill => {
85            for sub in paths {
86                scene.fill(FillRule::NonZero, xform, brush, None, sub, PickId::Skip);
87            }
88        }
89        ShapeStyle::Stroke => {
90            let stroke = Stroke::new(stroke_world_width / size)
91                .with_caps(Cap::Round)
92                .with_join(Join::Round);
93            for sub in paths {
94                scene.stroke(&stroke, xform, brush, None, sub, PickId::Skip);
95            }
96        }
97    }
98}
Source

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.

Source

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.

Source

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

Linearly interpolate between two vectors.

Source

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.

Examples found in repository?
examples/shapes_demo.rs (line 154)
100fn main() {
101    let mut renderer = VelloRenderer::new().expect("vello renderer init");
102    let registry = ShapeRegistry::with_builtins();
103
104    let glyph_brush: Brush = rgb8(60, 130, 220).into();
105    let chrome_brush: Brush = rgb8(80, 84, 96).into();
106    let line_brush: Brush = rgb8(190, 195, 205).into();
107
108    let glyph_world_stroke = 2.0;
109    let line_stroke = Stroke::new(2.5).with_caps(Cap::Butt);
110    let cell_stroke = Stroke::new(1.0);
111
112    {
113        let scene = renderer.scene();
114
115        for (i, name) in builtin::NAMES.iter().enumerate() {
116            let center = cell_center(i);
117            let cell = Rect::new(
118                center.x - CELL_W * 0.5 + 2.0,
119                center.y - CELL_H * 0.5 + 2.0,
120                center.x + CELL_W * 0.5 - 2.0,
121                center.y + CELL_H * 0.5 - 2.0,
122            )
123            .to_path(0.1);
124            scene.stroke(
125                &cell_stroke,
126                Affine::IDENTITY,
127                &chrome_brush,
128                None,
129                &cell,
130                PickId::Skip,
131            );
132
133            let shape = registry.get(name).expect("registered");
134            draw_shape_centered(scene, shape, center, 28.0, &glyph_brush, glyph_world_stroke);
135        }
136
137        let demos: &[(&str, f64)] = &[
138            ("arrow-closed", 18.0),
139            ("arrow-stealth", 22.0),
140            ("arrow-open", 18.0),
141            ("arrow-feather", 28.0),
142            ("arrow-dot", 14.0),
143        ];
144        let demo_top = GRID_TOP + (GRID_ROWS as f64) * CELL_H + 25.0;
145        let demo_spacing = 28.0;
146        let x_start = 60.0;
147        let x_end = (W as f64) - 60.0;
148
149        for (i, &(name, size)) in demos.iter().enumerate() {
150            let y = demo_top + (i as f64) * demo_spacing;
151            let start = Point::new(x_start, y);
152            let end = Point::new(x_end, y);
153
154            let direction = (end - start).normalize();
155            let shape = registry.get(name).expect("registered");
156
157            let mut line = hephaestus::Path::new();
158            line.move_to(start);
159            line.line_to(end);
160            scene.stroke(
161                &line_stroke,
162                Affine::IDENTITY,
163                &line_brush,
164                None,
165                &line,
166                PickId::Skip,
167            );
168
169            draw_shape_attached(
170                scene,
171                shape,
172                end,
173                direction,
174                size,
175                &glyph_brush,
176                glyph_world_stroke,
177            );
178        }
179    }
180
181    let mut pixels = vec![0u8; (W * H * 4) as usize];
182    let bg: Color = rgb8(20, 22, 28);
183    renderer
184        .render_to_buffer(W, H, bg, &mut pixels)
185        .expect("render");
186
187    let path = std::env::current_dir()
188        .unwrap()
189        .join("examples/shapes_demo.png");
190    hephaestus::image::write_png(&path, W, H, &pixels).expect("write png");
191    println!("wrote {}", path.display());
192}
Source

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);
Source

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);
Source

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);
Source

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);
Source

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);
Source

pub const fn is_finite(self) -> bool

Is this Vec2 finite?

Source

pub const fn is_nan(self) -> bool

Is this Vec2 NaN?

Source

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)

Source

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.

Source

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

Get the member matching the given axis.

Source

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

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

Source

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

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

Trait Implementations§

Source§

impl Add for Vec2

Source§

type Output = Vec2

The resulting type after applying the + operator.
Source§

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

Performs the + operation. Read more
Source§

impl Add<TranslateScale> for Vec2

Source§

type Output = TranslateScale

The resulting type after applying the + operator.
Source§

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

Performs the + operation. Read more
Source§

impl Add<Vec2> for Circle

Source§

type Output = Circle

The resulting type after applying the + operator.
Source§

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

Performs the + operation. Read more
Source§

impl Add<Vec2> for Ellipse

Source§

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

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

Source§

type Output = Ellipse

The resulting type after applying the + operator.
Source§

impl Add<Vec2> for Line

Source§

type Output = Line

The resulting type after applying the + operator.
Source§

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

Performs the + operation. Read more
Source§

impl Add<Vec2> for Point

Source§

type Output = Point

The resulting type after applying the + operator.
Source§

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

Performs the + operation. Read more
Source§

impl Add<Vec2> for Rect

Source§

type Output = Rect

The resulting type after applying the + operator.
Source§

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

Performs the + operation. Read more
Source§

impl Add<Vec2> for RoundedRect

Source§

type Output = RoundedRect

The resulting type after applying the + operator.
Source§

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

Performs the + operation. Read more
Source§

impl AddAssign for Vec2

Source§

fn add_assign(&mut self, other: Vec2)

Performs the += operation. Read more
Source§

impl AddAssign<Vec2> for Point

Source§

fn add_assign(&mut self, other: Vec2)

Performs the += operation. Read more
Source§

impl Clone for Vec2

Source§

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

impl Copy for Vec2

Source§

impl Debug for Vec2

Source§

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

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

impl Default for Vec2

Source§

fn default() -> Vec2

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

impl Display for Vec2

Source§

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

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

impl Div<f64> for Vec2

Source§

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.

Source§

type Output = Vec2

The resulting type after applying the / operator.
Source§

impl DivAssign<f64> for Vec2

Source§

fn div_assign(&mut self, other: f64)

Performs the /= operation. Read more
Source§

impl From<(f64, f64)> for Vec2

Source§

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

Converts to this type from the input type.
Source§

impl Mul<f64> for Vec2

Source§

type Output = Vec2

The resulting type after applying the * operator.
Source§

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

Performs the * operation. Read more
Source§

impl MulAssign<f64> for Vec2

Source§

fn mul_assign(&mut self, other: f64)

Performs the *= operation. Read more
Source§

impl Neg for Vec2

Source§

type Output = Vec2

The resulting type after applying the - operator.
Source§

fn neg(self) -> Vec2

Performs the unary - operation. Read more
Source§

impl PartialEq for Vec2

Source§

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

Equality operator ==. Read more
1.0.0 (const: unstable) · Source§

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

Inequality operator !=. Read more
Source§

impl StructuralPartialEq for Vec2

Source§

impl Sub for Vec2

Source§

type Output = Vec2

The resulting type after applying the - operator.
Source§

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

Performs the - operation. Read more
Source§

impl Sub<Vec2> for Circle

Source§

type Output = Circle

The resulting type after applying the - operator.
Source§

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

Performs the - operation. Read more
Source§

impl Sub<Vec2> for Ellipse

Source§

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

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

Source§

type Output = Ellipse

The resulting type after applying the - operator.
Source§

impl Sub<Vec2> for Line

Source§

type Output = Line

The resulting type after applying the - operator.
Source§

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

Performs the - operation. Read more
Source§

impl Sub<Vec2> for Point

Source§

type Output = Point

The resulting type after applying the - operator.
Source§

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

Performs the - operation. Read more
Source§

impl Sub<Vec2> for Rect

Source§

type Output = Rect

The resulting type after applying the - operator.
Source§

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

Performs the - operation. Read more
Source§

impl Sub<Vec2> for RoundedRect

Source§

type Output = RoundedRect

The resulting type after applying the - operator.
Source§

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

Performs the - operation. Read more
Source§

impl SubAssign for Vec2

Source§

fn sub_assign(&mut self, other: Vec2)

Performs the -= operation. Read more
Source§

impl SubAssign<Vec2> for Point

Source§

fn sub_assign(&mut self, other: Vec2)

Performs the -= operation. Read more
Source§

impl Sum for Vec2

Source§

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.

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
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> Brush for T
where T: Clone + PartialEq + Default + Debug,

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

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

Source§

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

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

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

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

impl<T> Downcast<T> for T

Source§

fn downcast(&self) -> &T

Source§

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

Source§

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> ErasedDestructor for T
where T: 'static,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

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

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

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, S> SimdFrom<T, S> for T
where S: Simd,

Source§

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

Source§

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

Source§

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

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

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

impl<T> Upcast<T> for T

Source§

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

Source§

impl<S, T> Upcast<T> for S
where T: UpcastFrom<S> + ?Sized, S: ?Sized,

Source§

fn upcast(&self) -> &T
where Self: ErasableGeneric, T: Sized + ErasableGeneric<Repr = Self::Repr>,

Perform a zero-cost type-safe upcast to a wider ref type within the Wasm bindgen generics type system. Read more
Source§

fn upcast_into(self) -> T
where Self: Sized + ErasableGeneric, T: Sized + ErasableGeneric<Repr = Self::Repr>,

Perform a zero-cost type-safe upcast to a wider type within the Wasm bindgen generics type system. Read more
Source§

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

Source§

impl<T> WasmNotSendSync for T

Source§

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

Source§

impl<T> WithSubscriber for T

Source§

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

fn with_current_subscriber(self) -> WithDispatch<Self>

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