pub struct Rot2 {
pub cos: f32,
pub sin: f32,
}
Expand description
A counterclockwise 2D rotation.
§Example
use std::f32::consts::PI;
// Create rotations from radians or degrees
let rotation1 = Rot2::radians(PI / 2.0);
let rotation2 = Rot2::degrees(45.0);
// Get the angle back as radians or degrees
assert_eq!(rotation1.as_degrees(), 90.0);
assert_eq!(rotation2.as_radians(), PI / 4.0);
// "Add" rotations together using `*`
assert_relative_eq!(rotation1 * rotation2, Rot2::degrees(135.0));
// Rotate vectors
assert_relative_eq!(rotation1 * Vec2::X, Vec2::Y);
Fields§
§cos: f32
The cosine of the rotation angle in radians.
This is the real part of the unit complex number representing the rotation.
sin: f32
The sine of the rotation angle in radians.
This is the imaginary part of the unit complex number representing the rotation.
Implementations§
source§impl Rot2
impl Rot2
sourcepub fn radians(radians: f32) -> Self
pub fn radians(radians: f32) -> Self
Creates a Rot2
from a counterclockwise angle in radians.
§Note
The input rotation will always be clamped to the range (-π, π]
by design.
§Example
let rot1 = Rot2::radians(3.0 * FRAC_PI_2);
let rot2 = Rot2::radians(-FRAC_PI_2);
assert_relative_eq!(rot1, rot2);
let rot3 = Rot2::radians(PI);
assert_relative_eq!(rot1 * rot1, rot3);
sourcepub fn degrees(degrees: f32) -> Self
pub fn degrees(degrees: f32) -> Self
Creates a Rot2
from a counterclockwise angle in degrees.
§Note
The input rotation will always be clamped to the range (-180°, 180°]
by design.
§Example
let rot1 = Rot2::degrees(270.0);
let rot2 = Rot2::degrees(-90.0);
assert_relative_eq!(rot1, rot2);
let rot3 = Rot2::degrees(180.0);
assert_relative_eq!(rot1 * rot1, rot3);
sourcepub fn turn_fraction(fraction: f32) -> Self
pub fn turn_fraction(fraction: f32) -> Self
Creates a Rot2
from a counterclockwise fraction of a full turn of 360 degrees.
§Note
The input rotation will always be clamped to the range (-50%, 50%]
by design.
§Example
let rot1 = Rot2::turn_fraction(0.75);
let rot2 = Rot2::turn_fraction(-0.25);
assert_relative_eq!(rot1, rot2);
let rot3 = Rot2::turn_fraction(0.5);
assert_relative_eq!(rot1 * rot1, rot3);
sourcepub fn from_sin_cos(sin: f32, cos: f32) -> Self
pub fn from_sin_cos(sin: f32, cos: f32) -> Self
sourcepub fn as_radians(self) -> f32
pub fn as_radians(self) -> f32
Returns the rotation in radians in the (-pi, pi]
range.
sourcepub fn as_degrees(self) -> f32
pub fn as_degrees(self) -> f32
Returns the rotation in degrees in the (-180, 180]
range.
sourcepub fn as_turn_fraction(self) -> f32
pub fn as_turn_fraction(self) -> f32
Returns the rotation as a fraction of a full 360 degree turn.
sourcepub const fn sin_cos(self) -> (f32, f32)
pub const fn sin_cos(self) -> (f32, f32)
Returns the sine and cosine of the rotation angle in radians.
sourcepub fn length(self) -> f32
pub fn length(self) -> f32
Computes the length or norm of the complex number used to represent the rotation.
The length is typically expected to be 1.0
. Unexpectedly denormalized rotations
can be a result of incorrect construction or floating point error caused by
successive operations.
sourcepub fn length_squared(self) -> f32
pub fn length_squared(self) -> f32
Computes the squared length or norm of the complex number used to represent the rotation.
This is generally faster than Rot2::length()
, as it avoids a square
root operation.
The length is typically expected to be 1.0
. Unexpectedly denormalized rotations
can be a result of incorrect construction or floating point error caused by
successive operations.
sourcepub fn length_recip(self) -> f32
pub fn length_recip(self) -> f32
Computes 1.0 / self.length()
.
For valid results, self
must not have a length of zero.
sourcepub fn try_normalize(self) -> Option<Self>
pub fn try_normalize(self) -> Option<Self>
Returns self
with a length of 1.0
if possible, and None
otherwise.
None
will be returned if the sine and cosine of self
are both zero (or very close to zero),
or if either of them is NaN or infinite.
Note that Rot2
should typically already be normalized by design.
Manual normalization is only needed when successive operations result in
accumulated floating point error, or if the rotation was constructed
with invalid values.
sourcepub fn normalize(self) -> Self
pub fn normalize(self) -> Self
Returns self
with a length of 1.0
.
Note that Rot2
should typically already be normalized by design.
Manual normalization is only needed when successive operations result in
accumulated floating point error, or if the rotation was constructed
with invalid values.
§Panics
Panics if self
has a length of zero, NaN, or infinity when debug assertions are enabled.
sourcepub fn fast_renormalize(self) -> Self
pub fn fast_renormalize(self) -> Self
Returns self
after an approximate normalization, assuming the value is already nearly normalized.
Useful for preventing numerical error accumulation.
See Dir3::fast_renormalize
for an example of when such error accumulation might occur.
sourcepub fn is_normalized(self) -> bool
pub fn is_normalized(self) -> bool
Returns whether self
has a length of 1.0
or not.
Uses a precision threshold of approximately 1e-4
.
sourcepub fn is_near_identity(self) -> bool
pub fn is_near_identity(self) -> bool
Returns true
if the rotation is near Rot2::IDENTITY
.
sourcepub fn angle_between(self, other: Self) -> f32
👎Deprecated since 0.15.0: Use angle_to
instead, the semantics of angle_between
will change in the future.
pub fn angle_between(self, other: Self) -> f32
angle_to
instead, the semantics of angle_between
will change in the future.Returns the angle in radians needed to make self
and other
coincide.
sourcepub fn angle_to(self, other: Self) -> f32
pub fn angle_to(self, other: Self) -> f32
Returns the angle in radians needed to make self
and other
coincide.
sourcepub fn inverse(self) -> Self
pub fn inverse(self) -> Self
Returns the inverse of the rotation. This is also the conjugate of the unit complex number representing the rotation.
sourcepub fn nlerp(self, end: Self, s: f32) -> Self
pub fn nlerp(self, end: Self, s: f32) -> Self
Performs a linear interpolation between self
and rhs
based on
the value s
, and normalizes the rotation afterwards.
When s == 0.0
, the result will be equal to self
.
When s == 1.0
, the result will be equal to rhs
.
This is slightly more efficient than slerp
, and produces a similar result
when the difference between the two rotations is small. At larger differences,
the result resembles a kind of ease-in-out effect.
If you would like the angular velocity to remain constant, consider using slerp
instead.
§Details
nlerp
corresponds to computing an angle for a point at position s
on a line drawn
between the endpoints of the arc formed by self
and rhs
on a unit circle,
and normalizing the result afterwards.
Note that if the angles are opposite like 0 and π, the line will pass through the origin,
and the resulting angle will always be either self
or rhs
depending on s
.
If s
happens to be 0.5
in this case, a valid rotation cannot be computed, and self
will be returned as a fallback.
§Example
let rot1 = Rot2::IDENTITY;
let rot2 = Rot2::degrees(135.0);
let result1 = rot1.nlerp(rot2, 1.0 / 3.0);
assert_eq!(result1.as_degrees(), 28.675055);
let result2 = rot1.nlerp(rot2, 0.5);
assert_eq!(result2.as_degrees(), 67.5);
sourcepub fn slerp(self, end: Self, s: f32) -> Self
pub fn slerp(self, end: Self, s: f32) -> Self
Performs a spherical linear interpolation between self
and end
based on the value s
.
This corresponds to interpolating between the two angles at a constant angular velocity.
When s == 0.0
, the result will be equal to self
.
When s == 1.0
, the result will be equal to rhs
.
If you would like the rotation to have a kind of ease-in-out effect, consider
using the slightly more efficient nlerp
instead.
§Example
let rot1 = Rot2::IDENTITY;
let rot2 = Rot2::degrees(135.0);
let result1 = rot1.slerp(rot2, 1.0 / 3.0);
assert_eq!(result1.as_degrees(), 45.0);
let result2 = rot1.slerp(rot2, 0.5);
assert_eq!(result2.as_degrees(), 67.5);
Trait Implementations§
source§impl<'de> Deserialize<'de> for Rot2
impl<'de> Deserialize<'de> for Rot2
source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
source§impl Distribution<Rot2> for Standard
impl Distribution<Rot2> for Standard
source§impl Ease for Rot2
impl Ease for Rot2
source§fn interpolating_curve_unbounded(start: Self, end: Self) -> impl Curve<Self>
fn interpolating_curve_unbounded(start: Self, end: Self) -> impl Curve<Self>
source§impl From<Rot2> for Isometry2d
impl From<Rot2> for Isometry2d
source§impl FromReflect for Rot2
impl FromReflect for Rot2
source§fn from_reflect(reflect: &dyn PartialReflect) -> Option<Self>
fn from_reflect(reflect: &dyn PartialReflect) -> Option<Self>
Self
from a reflected value.source§fn take_from_reflect(
reflect: Box<dyn PartialReflect>,
) -> Result<Self, Box<dyn PartialReflect>>
fn take_from_reflect( reflect: Box<dyn PartialReflect>, ) -> Result<Self, Box<dyn PartialReflect>>
Self
using,
constructing the value using from_reflect
if that fails. Read moresource§impl GetTypeRegistration for Rot2
impl GetTypeRegistration for Rot2
source§fn get_type_registration() -> TypeRegistration
fn get_type_registration() -> TypeRegistration
TypeRegistration
for this type.source§fn register_type_dependencies(registry: &mut TypeRegistry)
fn register_type_dependencies(registry: &mut TypeRegistry)
source§impl MulAssign for Rot2
impl MulAssign for Rot2
source§fn mul_assign(&mut self, rhs: Self)
fn mul_assign(&mut self, rhs: Self)
*=
operation. Read moresource§impl PartialReflect for Rot2
impl PartialReflect for Rot2
source§fn get_represented_type_info(&self) -> Option<&'static TypeInfo>
fn get_represented_type_info(&self) -> Option<&'static TypeInfo>
source§fn clone_value(&self) -> Box<dyn PartialReflect>
fn clone_value(&self) -> Box<dyn PartialReflect>
Reflect
trait object. Read moresource§fn try_apply(&mut self, value: &dyn PartialReflect) -> Result<(), ApplyError>
fn try_apply(&mut self, value: &dyn PartialReflect) -> Result<(), ApplyError>
source§fn reflect_kind(&self) -> ReflectKind
fn reflect_kind(&self) -> ReflectKind
source§fn reflect_ref(&self) -> ReflectRef<'_>
fn reflect_ref(&self) -> ReflectRef<'_>
source§fn reflect_mut(&mut self) -> ReflectMut<'_>
fn reflect_mut(&mut self) -> ReflectMut<'_>
source§fn reflect_owned(self: Box<Self>) -> ReflectOwned
fn reflect_owned(self: Box<Self>) -> ReflectOwned
source§fn try_into_reflect(
self: Box<Self>,
) -> Result<Box<dyn Reflect>, Box<dyn PartialReflect>>
fn try_into_reflect( self: Box<Self>, ) -> Result<Box<dyn Reflect>, Box<dyn PartialReflect>>
source§fn try_as_reflect(&self) -> Option<&dyn Reflect>
fn try_as_reflect(&self) -> Option<&dyn Reflect>
source§fn try_as_reflect_mut(&mut self) -> Option<&mut dyn Reflect>
fn try_as_reflect_mut(&mut self) -> Option<&mut dyn Reflect>
source§fn into_partial_reflect(self: Box<Self>) -> Box<dyn PartialReflect>
fn into_partial_reflect(self: Box<Self>) -> Box<dyn PartialReflect>
source§fn as_partial_reflect(&self) -> &dyn PartialReflect
fn as_partial_reflect(&self) -> &dyn PartialReflect
source§fn as_partial_reflect_mut(&mut self) -> &mut dyn PartialReflect
fn as_partial_reflect_mut(&mut self) -> &mut dyn PartialReflect
source§fn reflect_partial_eq(&self, value: &dyn PartialReflect) -> Option<bool>
fn reflect_partial_eq(&self, value: &dyn PartialReflect) -> Option<bool>
source§fn apply(&mut self, value: &(dyn PartialReflect + 'static))
fn apply(&mut self, value: &(dyn PartialReflect + 'static))
source§fn reflect_hash(&self) -> Option<u64>
fn reflect_hash(&self) -> Option<u64>
source§fn serializable(&self) -> Option<Serializable<'_>>
fn serializable(&self) -> Option<Serializable<'_>>
source§fn is_dynamic(&self) -> bool
fn is_dynamic(&self) -> bool
source§impl Reflect for Rot2
impl Reflect for Rot2
source§fn as_any_mut(&mut self) -> &mut dyn Any
fn as_any_mut(&mut self) -> &mut dyn Any
&mut dyn Any
. Read moresource§fn into_reflect(self: Box<Self>) -> Box<dyn Reflect>
fn into_reflect(self: Box<Self>) -> Box<dyn Reflect>
source§fn as_reflect(&self) -> &dyn Reflect
fn as_reflect(&self) -> &dyn Reflect
source§fn as_reflect_mut(&mut self) -> &mut dyn Reflect
fn as_reflect_mut(&mut self) -> &mut dyn Reflect
source§impl StableInterpolate for Rot2
impl StableInterpolate for Rot2
source§fn interpolate_stable(&self, other: &Self, t: f32) -> Self
fn interpolate_stable(&self, other: &Self, t: f32) -> Self
other
given value using the parameter t
. At
t = 0.0
, a value equivalent to self
is recovered, while t = 1.0
recovers a value
equivalent to other
, with intermediate values interpolating between the two.
See the trait-level documentation for details.source§fn interpolate_stable_assign(&mut self, other: &Self, t: f32)
fn interpolate_stable_assign(&mut self, other: &Self, t: f32)
interpolate_stable
that assigns the result to self
for convenience.source§fn smooth_nudge(&mut self, target: &Self, decay_rate: f32, delta: f32)
fn smooth_nudge(&mut self, target: &Self, decay_rate: f32, delta: f32)
target
at a given decay rate. The decay_rate
parameter controls how fast the distance between self
and target
decays relative to
the units of delta
; the intended usage is for decay_rate
to generally remain fixed,
while delta
is something like delta_time
from an updating system. This produces a
smooth following of the target that is independent of framerate. Read moresource§impl Struct for Rot2
impl Struct for Rot2
source§fn field(&self, name: &str) -> Option<&dyn PartialReflect>
fn field(&self, name: &str) -> Option<&dyn PartialReflect>
name
as a &dyn PartialReflect
.source§fn field_mut(&mut self, name: &str) -> Option<&mut dyn PartialReflect>
fn field_mut(&mut self, name: &str) -> Option<&mut dyn PartialReflect>
name
as a
&mut dyn PartialReflect
.source§fn field_at(&self, index: usize) -> Option<&dyn PartialReflect>
fn field_at(&self, index: usize) -> Option<&dyn PartialReflect>
index
as a
&dyn PartialReflect
.source§fn field_at_mut(&mut self, index: usize) -> Option<&mut dyn PartialReflect>
fn field_at_mut(&mut self, index: usize) -> Option<&mut dyn PartialReflect>
index
as a &mut dyn PartialReflect
.source§fn name_at(&self, index: usize) -> Option<&str>
fn name_at(&self, index: usize) -> Option<&str>
index
.source§fn iter_fields(&self) -> FieldIter<'_>
fn iter_fields(&self) -> FieldIter<'_>
source§fn clone_dynamic(&self) -> DynamicStruct
fn clone_dynamic(&self) -> DynamicStruct
DynamicStruct
.source§fn get_represented_struct_info(&self) -> Option<&'static StructInfo>
fn get_represented_struct_info(&self) -> Option<&'static StructInfo>
None
if TypeInfo
is not available.source§impl TypePath for Rot2
impl TypePath for Rot2
source§fn type_path() -> &'static str
fn type_path() -> &'static str
source§fn short_type_path() -> &'static str
fn short_type_path() -> &'static str
source§fn type_ident() -> Option<&'static str>
fn type_ident() -> Option<&'static str>
source§fn crate_name() -> Option<&'static str>
fn crate_name() -> Option<&'static str>
impl Copy for Rot2
impl StructuralPartialEq for Rot2
Auto Trait Implementations§
impl Freeze for Rot2
impl RefUnwindSafe for Rot2
impl Send for Rot2
impl Sync for Rot2
impl Unpin for Rot2
impl UnwindSafe for Rot2
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
source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
source§unsafe fn clone_to_uninit(&self, dst: *mut T)
unsafe fn clone_to_uninit(&self, dst: *mut T)
clone_to_uninit
)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.source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
source§impl<T> DynamicTypePath for Twhere
T: TypePath,
impl<T> DynamicTypePath for Twhere
T: TypePath,
source§fn reflect_type_path(&self) -> &str
fn reflect_type_path(&self) -> &str
TypePath::type_path
.source§fn reflect_short_type_path(&self) -> &str
fn reflect_short_type_path(&self) -> &str
source§fn reflect_type_ident(&self) -> Option<&str>
fn reflect_type_ident(&self) -> Option<&str>
TypePath::type_ident
.source§fn reflect_crate_name(&self) -> Option<&str>
fn reflect_crate_name(&self) -> Option<&str>
TypePath::crate_name
.source§fn reflect_module_path(&self) -> Option<&str>
fn reflect_module_path(&self) -> Option<&str>
source§impl<T> DynamicTyped for Twhere
T: Typed,
impl<T> DynamicTyped for Twhere
T: Typed,
source§fn reflect_type_info(&self) -> &'static TypeInfo
fn reflect_type_info(&self) -> &'static TypeInfo
Typed::type_info
.source§impl<S> GetField for Swhere
S: Struct,
impl<S> GetField for Swhere
S: Struct,
source§impl<T> GetPath for T
impl<T> GetPath for T
source§fn reflect_path<'p>(
&self,
path: impl ReflectPath<'p>,
) -> Result<&(dyn PartialReflect + 'static), ReflectPathError<'p>>
fn reflect_path<'p>( &self, path: impl ReflectPath<'p>, ) -> Result<&(dyn PartialReflect + 'static), ReflectPathError<'p>>
path
. Read moresource§fn reflect_path_mut<'p>(
&mut self,
path: impl ReflectPath<'p>,
) -> Result<&mut (dyn PartialReflect + 'static), ReflectPathError<'p>>
fn reflect_path_mut<'p>( &mut self, path: impl ReflectPath<'p>, ) -> Result<&mut (dyn PartialReflect + 'static), ReflectPathError<'p>>
path
. Read moresource§fn path<'p, T>(
&self,
path: impl ReflectPath<'p>,
) -> Result<&T, ReflectPathError<'p>>where
T: Reflect,
fn path<'p, T>(
&self,
path: impl ReflectPath<'p>,
) -> Result<&T, ReflectPathError<'p>>where
T: Reflect,
path
. Read moresource§fn path_mut<'p, T>(
&mut self,
path: impl ReflectPath<'p>,
) -> Result<&mut T, ReflectPathError<'p>>where
T: Reflect,
fn path_mut<'p, T>(
&mut self,
path: impl ReflectPath<'p>,
) -> Result<&mut T, ReflectPathError<'p>>where
T: Reflect,
path
. Read moresource§impl<T> Instrument for T
impl<T> Instrument for T
source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
source§impl<T> IntoEither for T
impl<T> IntoEither for T
source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
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 moresource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
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