#[repr(C)]pub struct Transform {
pub angle: f32,
pub scale: f32,
pub tx: f32,
pub ty: f32,
}Expand description
A similarity transform — a turn and a uniform scale about the origin,
then a move: p' = R(angle) · scale · p + t, y down, so a positive
angle turns clockwise on screen. What a node’s rotate, scale and
pivot compose to (ADR 0043), carried by the clip entry its quads
name (display::Clip::transform) in the same units as the entry’s
rect.
#[repr(C)]: four floats, which is how KuiClip and the Node
clips() buffer read it.
use kui_core::{Rect, Transform, Vec2};
// A quarter turn about the centre of a 100 × 50 box at (10, 10).
let t = Transform::about(Vec2::new(60.0, 35.0), 0.25, 1.0);
let p = t.apply(Vec2::new(10.0, 10.0));
assert!((p.x - 85.0).abs() < 1e-4 && (p.y - (-15.0)).abs() < 1e-4);
let back = t.unapply(p);
assert!((back.x - 10.0).abs() < 1e-4 && (back.y - 10.0).abs() < 1e-4);
// Its bounding box is the box turned: 50 wide, 100 tall, same centre.
let b = t.bounds(Rect::new(10.0, 10.0, 100.0, 50.0));
assert!((b.w - 50.0).abs() < 1e-3 && (b.h - 100.0).abs() < 1e-3);Fields§
§angle: f32Radians, clockwise with y down.
scale: f32The uniform factor; 1 for none.
tx: f32The move after the turn and the scale.
ty: f32Implementations§
Source§impl Transform
impl Transform
Sourcepub fn about(pivot: Vec2, turns: f32, scale: f32) -> Transform
pub fn about(pivot: Vec2, turns: f32, scale: f32) -> Transform
A turn of turns (clockwise, y down) and a scale of scale about
pivot, which stays where it is.
pub fn is_identity(&self) -> bool
Sourcepub fn unapply(&self, p: Vec2) -> Vec2
pub fn unapply(&self, p: Vec2) -> Vec2
The point that maps to p: the inverse. A scale of zero has no
inverse; the answer is then NaN, which no rect contains, so nothing
is hit, as nothing is drawn.
Sourcepub fn then(&self, outer: &Transform) -> Transform
pub fn then(&self, outer: &Transform) -> Transform
This transform, then outer: the composition a nested turn is
(inner.then(outer) maps a point as outer.apply(inner.apply(p))).
Sourcepub fn scaled(&self, s: f32) -> Transform
pub fn scaled(&self, s: f32) -> Transform
Logical to physical pixels: the move scales, the turn and the factor do not.
Trait Implementations§
impl Copy for Transform
impl StructuralPartialEq for Transform
Auto Trait Implementations§
impl Freeze for Transform
impl RefUnwindSafe for Transform
impl Send for Transform
impl Sync for Transform
impl Unpin for Transform
impl UnsafeUnpin for Transform
impl UnwindSafe for Transform
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<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.