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 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 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 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
pub fn angle_between(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 FromReflect for Rot2
impl FromReflect for Rot2
source§fn from_reflect(reflect: &dyn Reflect) -> Option<Self>
fn from_reflect(reflect: &dyn Reflect) -> Option<Self>
Self
from a reflected value.source§fn take_from_reflect(
reflect: Box<dyn Reflect>
) -> Result<Self, Box<dyn Reflect>>
fn take_from_reflect( reflect: Box<dyn Reflect> ) -> Result<Self, Box<dyn Reflect>>
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 PartialEq for Rot2
impl PartialEq for Rot2
source§impl Reflect for Rot2
impl Reflect for Rot2
source§fn get_represented_type_info(&self) -> Option<&'static TypeInfo>
fn get_represented_type_info(&self) -> Option<&'static TypeInfo>
source§fn as_any_mut(&mut self) -> &mut dyn Any
fn as_any_mut(&mut self) -> &mut dyn Any
&mut dyn Any
.source§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§fn clone_value(&self) -> Box<dyn Reflect>
fn clone_value(&self) -> Box<dyn Reflect>
Reflect
trait object. Read moresource§fn set(&mut self, value: Box<dyn Reflect>) -> Result<(), Box<dyn Reflect>>
fn set(&mut self, value: Box<dyn Reflect>) -> Result<(), Box<dyn Reflect>>
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 reflect_partial_eq(&self, value: &dyn Reflect) -> Option<bool>
fn reflect_partial_eq(&self, value: &dyn Reflect) -> Option<bool>
source§fn apply(&mut self, value: &(dyn Reflect + 'static))
fn apply(&mut self, value: &(dyn Reflect + '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 Struct for Rot2
impl Struct for Rot2
source§fn field(&self, name: &str) -> Option<&dyn Reflect>
fn field(&self, name: &str) -> Option<&dyn Reflect>
name
as a &dyn Reflect
.source§fn field_mut(&mut self, name: &str) -> Option<&mut dyn Reflect>
fn field_mut(&mut self, name: &str) -> Option<&mut dyn Reflect>
name
as a
&mut dyn Reflect
.source§fn field_at(&self, index: usize) -> Option<&dyn Reflect>
fn field_at(&self, index: usize) -> Option<&dyn Reflect>
index
as a
&dyn Reflect
.source§fn field_at_mut(&mut self, index: usize) -> Option<&mut dyn Reflect>
fn field_at_mut(&mut self, index: usize) -> Option<&mut dyn Reflect>
index
as a &mut dyn Reflect
.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§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> 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<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 Reflect + 'static), ReflectPathError<'p>>
fn reflect_path<'p>( &self, path: impl ReflectPath<'p> ) -> Result<&(dyn Reflect + 'static), ReflectPathError<'p>>
path
. Read moresource§fn reflect_path_mut<'p>(
&mut self,
path: impl ReflectPath<'p>
) -> Result<&mut (dyn Reflect + 'static), ReflectPathError<'p>>
fn reflect_path_mut<'p>( &mut self, path: impl ReflectPath<'p> ) -> Result<&mut (dyn Reflect + '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 more