pub struct Vec2 {
pub x: f64,
pub y: f64,
}Expand description
Fields§
§x: f64The x-coordinate.
y: f64The y-coordinate.
Implementations§
Source§impl Vec2
impl Vec2
Sourcepub const fn new(x: f64, y: f64) -> Vec2
pub const fn new(x: f64, y: f64) -> Vec2
Create a new vector.
Examples found in repository?
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}Sourcepub const fn cross(self, other: Vec2) -> f64
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
Sourcepub fn hypot(self) -> f64
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);Sourcepub fn length(self) -> f64
pub fn length(self) -> f64
Magnitude of vector.
This is an alias for Vec2::hypot.
Sourcepub const fn hypot2(self) -> f64
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);Sourcepub const fn length_squared(self) -> f64
pub const fn length_squared(self) -> f64
Magnitude squared of vector.
This is an alias for Vec2::hypot2.
Sourcepub fn atan2(self) -> f64
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?
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}Sourcepub fn angle(self) -> f64
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.
Sourcepub fn from_angle(th: f64) -> Vec2
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.
Sourcepub fn normalize(self) -> Vec2
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?
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}Sourcepub fn ceil(self) -> Vec2
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);Sourcepub fn floor(self) -> Vec2
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);Sourcepub fn expand(self) -> Vec2
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);Sourcepub fn trunc(self) -> Vec2
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);Sourcepub const fn turn_90(self) -> Vec2
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)
Sourcepub const fn rotate_scale(self, rhs: Vec2) -> Vec2
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.
Sourcepub const fn get_coord_mut(&mut self, axis: Axis) -> &mut f64
pub const fn get_coord_mut(&mut self, axis: Axis) -> &mut f64
Get a mutable reference to the member matching the given axis.
Trait Implementations§
Source§impl Add<TranslateScale> for Vec2
impl Add<TranslateScale> for Vec2
Source§type Output = TranslateScale
type Output = TranslateScale
+ operator.Source§fn add(self, other: TranslateScale) -> TranslateScale
fn add(self, other: TranslateScale) -> TranslateScale
+ operation. Read moreSource§impl Add<Vec2> for RoundedRect
impl Add<Vec2> for RoundedRect
Source§type Output = RoundedRect
type Output = RoundedRect
+ operator.Source§impl AddAssign for Vec2
impl AddAssign for Vec2
Source§fn add_assign(&mut self, other: Vec2)
fn add_assign(&mut self, other: Vec2)
+= operation. Read moreSource§impl AddAssign<Vec2> for Point
impl AddAssign<Vec2> for Point
Source§fn add_assign(&mut self, other: Vec2)
fn add_assign(&mut self, other: Vec2)
+= operation. Read moreimpl Copy for Vec2
Source§impl DivAssign<f64> for Vec2
impl DivAssign<f64> for Vec2
Source§fn div_assign(&mut self, other: f64)
fn div_assign(&mut self, other: f64)
/= operation. Read moreSource§impl MulAssign<f64> for Vec2
impl MulAssign<f64> for Vec2
Source§fn mul_assign(&mut self, other: f64)
fn mul_assign(&mut self, other: f64)
*= operation. Read moreimpl StructuralPartialEq for Vec2
Source§impl Sub<Vec2> for RoundedRect
impl Sub<Vec2> for RoundedRect
Source§type Output = RoundedRect
type Output = RoundedRect
- operator.Source§impl SubAssign for Vec2
impl SubAssign for Vec2
Source§fn sub_assign(&mut self, other: Vec2)
fn sub_assign(&mut self, other: Vec2)
-= operation. Read moreAuto 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> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<T> Brush for T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
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>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
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)
fn as_any(&self) -> &(dyn Any + 'static)
&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)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.