pub struct Affine(/* private fields */);Expand description
A 2D affine transform.
Implementations§
Source§impl Affine
impl Affine
Sourcepub const FLIP_Y: Affine
pub const FLIP_Y: Affine
A transform that is flipped on the y-axis. Useful for converting between y-up and y-down spaces.
Sourcepub const fn new(c: [f64; 6]) -> Affine
pub const fn new(c: [f64; 6]) -> Affine
Construct an affine transform from coefficients.
If the coefficients are (a, b, c, d, e, f), then the resulting
transformation represents this augmented matrix:
| a c e |
| b d f |
| 0 0 1 |Note that this convention is transposed from PostScript and
Direct2D, but is consistent with the
Wikipedia
formulation of affine transformation as augmented matrix. The
idea is that (A * B) * v == A * (B * v), where * is the
Mul trait.
Sourcepub const fn scale_non_uniform(s_x: f64, s_y: f64) -> Affine
pub const fn scale_non_uniform(s_x: f64, s_y: f64) -> Affine
An affine transform representing non-uniform scaling with different scale values for x and y
Sourcepub fn scale_about(s: f64, center: impl Into<Point>) -> Affine
pub fn scale_about(s: f64, center: impl Into<Point>) -> Affine
An affine transform representing a scale of scale about center.
Useful for a view transform that zooms at a specific point, while keeping that point fixed in the result space.
See Affine::scale() for more info.
Sourcepub fn rotate(th: f64) -> Affine
pub fn rotate(th: f64) -> Affine
An affine transform representing rotation.
The convention for rotation is that a positive angle rotates a positive X direction into positive Y. 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.
The angle, th, is expressed in radians.
Sourcepub fn rotate_about(th: f64, center: impl Into<Point>) -> Affine
pub fn rotate_about(th: f64, center: impl Into<Point>) -> Affine
An affine transform representing a rotation of th radians about center.
See Affine::rotate() for more info.
Sourcepub const fn skew(skew_x: f64, skew_y: f64) -> Affine
pub const fn skew(skew_x: f64, skew_y: f64) -> Affine
An affine transformation representing a skew.
The skew_x and skew_y parameters represent skew factors for the
horizontal and vertical directions, respectively.
This is commonly used to generate a faux oblique transform for font rendering. In this case, you can slant the glyph 20 degrees clockwise in the horizontal direction (assuming a Y-up coordinate system):
let oblique_transform = kurbo::Affine::skew(20f64.to_radians().tan(), 0.0);Sourcepub fn reflect(point: impl Into<Point>, direction: impl Into<Vec2>) -> Affine
pub fn reflect(point: impl Into<Point>, direction: impl Into<Vec2>) -> Affine
Create an affine transform that represents reflection about the line point + direction * t, t in (-infty, infty)
§Examples
let point = Point::new(1., 0.);
let vec = Vec2::new(1., 1.);
let map = Affine::reflect(point, vec);
assert_near(map * Point::new(1., 0.), Point::new(1., 0.));
assert_near(map * Point::new(2., 1.), Point::new(2., 1.));
assert_near(map * Point::new(2., 2.), Point::new(3., 1.));Sourcepub fn pre_rotate(self, th: f64) -> Affine
pub fn pre_rotate(self, th: f64) -> Affine
A rotation by th followed by self.
Equivalent to self * Affine::rotate(th)
Sourcepub fn pre_rotate_about(self, th: f64, center: impl Into<Point>) -> Affine
pub fn pre_rotate_about(self, th: f64, center: impl Into<Point>) -> Affine
A rotation by th about center followed by self.
Equivalent to self * Affine::rotate_about(th, center)
Sourcepub fn pre_scale(self, scale: f64) -> Affine
pub fn pre_scale(self, scale: f64) -> Affine
A scale by scale followed by self.
Equivalent to self * Affine::scale(scale)
Sourcepub fn pre_scale_non_uniform(self, scale_x: f64, scale_y: f64) -> Affine
pub fn pre_scale_non_uniform(self, scale_x: f64, scale_y: f64) -> Affine
A scale by (scale_x, scale_y) followed by self.
Equivalent to self * Affine::scale_non_uniform(scale_x, scale_y)
Sourcepub fn pre_translate(self, trans: Vec2) -> Affine
pub fn pre_translate(self, trans: Vec2) -> Affine
A translation of trans followed by self.
Equivalent to self * Affine::translate(trans)
Sourcepub fn pre_skew(self, skew_x: f64, skew_y: f64) -> Affine
pub fn pre_skew(self, skew_x: f64, skew_y: f64) -> Affine
A skew of (skew_x, skew_y) followed by self.
Equivalent to self * Affine::skew(skew_x, skew_y)
Sourcepub fn pre_reflect(
self,
point: impl Into<Point>,
direction: impl Into<Vec2>,
) -> Affine
pub fn pre_reflect( self, point: impl Into<Point>, direction: impl Into<Vec2>, ) -> Affine
A reflection about the line through point in direction followed by self.
Equivalent to self * Affine::reflect(point, direction)
Sourcepub fn then_rotate(self, th: f64) -> Affine
pub fn then_rotate(self, th: f64) -> Affine
self followed by a rotation of th.
Equivalent to Affine::rotate(th) * self
Sourcepub fn then_rotate_about(self, th: f64, center: impl Into<Point>) -> Affine
pub fn then_rotate_about(self, th: f64, center: impl Into<Point>) -> Affine
self followed by a rotation of th about center.
Equivalent to Affine::rotate_about(th, center) * self
Sourcepub fn then_scale(self, scale: f64) -> Affine
pub fn then_scale(self, scale: f64) -> Affine
self followed by a scale of scale.
Equivalent to Affine::scale(scale) * self
Sourcepub fn then_scale_non_uniform(self, scale_x: f64, scale_y: f64) -> Affine
pub fn then_scale_non_uniform(self, scale_x: f64, scale_y: f64) -> Affine
self followed by a scale of (scale_x, scale_y).
Equivalent to Affine::scale_non_uniform(scale_x, scale_y) * self
Sourcepub fn then_scale_about(self, scale: f64, center: impl Into<Point>) -> Affine
pub fn then_scale_about(self, scale: f64, center: impl Into<Point>) -> Affine
self followed by a scale of scale about center.
Equivalent to Affine::scale_about(scale) * self
Sourcepub fn then_skew(self, skew_x: f64, skew_y: f64) -> Affine
pub fn then_skew(self, skew_x: f64, skew_y: f64) -> Affine
self followed by a skew of (skew_x, skew_y).
Equivalent to Affine::skew(skew_x, skew_y) * self
Sourcepub fn then_reflect(
self,
point: impl Into<Point>,
direction: impl Into<Vec2>,
) -> Affine
pub fn then_reflect( self, point: impl Into<Point>, direction: impl Into<Vec2>, ) -> Affine
self followed by a reflection about the line through point in direction.
Equivalent to Affine::reflect(point, direction) * self
Sourcepub const fn then_translate(self, trans: Vec2) -> Affine
pub const fn then_translate(self, trans: Vec2) -> Affine
self followed by a translation of trans.
Equivalent to Affine::translate(trans) * self
Sourcepub const fn map_unit_square(rect: Rect) -> Affine
pub const fn map_unit_square(rect: Rect) -> Affine
Creates an affine transformation that takes the unit square to the given rectangle.
Useful when you want to draw into the unit square but have your output fill any rectangle.
In this case push the Affine onto the transform stack.
Sourcepub const fn determinant(self) -> f64
pub const fn determinant(self) -> f64
Compute the determinant of this transform.
§Geometric interpretation
Consider a region transformed by this affine. The transformed region’s area is the area of the original region scaled by the absolute value of the determinant. A negative determinant indicates orientation reversal.
Sourcepub const fn nuclear_norm_squared(self) -> f64
pub const fn nuclear_norm_squared(self) -> f64
Compute the square of the nuclear norm of this transform.
This is the square of the Schatten p-norm with p=1, also known as the “trace norm.”
Returns the squared norm for efficiency; take the square root as necessary.
§Geometric interpretation
Consider a unit circle transformed by this affine. The nuclear norm is the sum of the resulting ellipse’s radii (semi axes). That sum multiplied by π is a first-order approximation of the ellipse’s perimeter.
Sourcepub const fn frobenius_norm_squared(self) -> f64
pub const fn frobenius_norm_squared(self) -> f64
Compute the square of the Frobenius norm of this transform.
This is the square of the Schatten p-norm with p=2.
Returns the squared norm for efficiency; take the square root as necessary.
§Geometric interpretation
Consider a unit circle transformed by this affine. The squared Frobenius norm is twice the mean squared radius of the resulting ellipse. Alternatively, it is equal to the squared distance from the ellipse’s center to a corner of the rectangle spanned by the ellipse’s axes.
Sourcepub fn spectral_norm(self) -> f64
pub fn spectral_norm(self) -> f64
Compute the spectral norm of this transform.
This is the Schatten p-norm with p=∞.
§Geometric interpretation
Consider a unit circle transformed by this affine. The spectral norm is the major radius (semi-major axis) of the Ellipse.
Sourcepub const fn inverse(self) -> Affine
pub const fn inverse(self) -> Affine
Compute the inverse transform.
Produces NaN values when the determinant is zero.
Sourcepub fn transform_rect_bbox(self, rect: Rect) -> Rect
pub fn transform_rect_bbox(self, rect: Rect) -> Rect
Compute the bounding box of a transformed rectangle.
Returns the minimal Rect that encloses the given Rect after affine transformation.
If the transform is axis-aligned, then this bounding box is “tight”, in other words the
returned Rect is the transformed rectangle.
The returned rectangle always has non-negative width and height.
Sourcepub const fn translation(self) -> Vec2
pub const fn translation(self) -> Vec2
Returns the translation part of this affine map ((self.0[4], self.0[5])).
Sourcepub const fn with_translation(self, trans: Vec2) -> Affine
pub const fn with_translation(self, trans: Vec2) -> Affine
Replaces the translation portion of this affine map
The translation can be seen as being applied after the linear part of the map.
Trait Implementations§
impl Copy for Affine
Source§impl From<TranslateScale> for Affine
impl From<TranslateScale> for Affine
Source§fn from(ts: TranslateScale) -> Affine
fn from(ts: TranslateScale) -> Affine
Source§impl MulAssign for Affine
impl MulAssign for Affine
Source§fn mul_assign(&mut self, other: Affine)
fn mul_assign(&mut self, other: Affine)
*= operation. Read moreimpl StructuralPartialEq for Affine
Auto Trait Implementations§
impl Freeze for Affine
impl RefUnwindSafe for Affine
impl Send for Affine
impl Sync for Affine
impl Unpin for Affine
impl UnsafeUnpin for Affine
impl UnwindSafe for Affine
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
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
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.