pub struct Angle<T>where
T: Float,{ /* private fields */ }Expand description
An angle represented by it’s sine and cosine as UnitNegRanges.
Implementations§
Source§impl<T> Angle<T>where
T: Float,
impl<T> Angle<T>where
T: Float,
Sourcepub const fn new(sin: UnitNegRange<T>, cos: UnitNegRange<T>) -> Angle<T>
pub const fn new(sin: UnitNegRange<T>, cos: UnitNegRange<T>) -> Angle<T>
Construct an Angle from sin and cos values.
Sourcepub fn from_y_x(y: T, x: T) -> Angle<T>
pub fn from_y_x(y: T, x: T) -> Angle<T>
Construct an Angle from y and x values. Normalizes the values.
Sourcepub const fn sin(self) -> UnitNegRange<T>
pub const fn sin(self) -> UnitNegRange<T>
The sine of the Angle.
Sourcepub const fn cos(self) -> UnitNegRange<T>
pub const fn cos(self) -> UnitNegRange<T>
The cosine of the Angle.
Sourcepub fn tan(self) -> Option<T>
pub fn tan(self) -> Option<T>
The tangent of the Angle.
returns the tangent or None if self.cos < SQ_EPSILON
Sourcepub fn csc(self) -> Option<T>
pub fn csc(self) -> Option<T>
The cosecant of the Angle.
returns the cosecant or None if self.sin < SQ_EPSILON
Sourcepub fn sec(self) -> Option<T>
pub fn sec(self) -> Option<T>
The secant of the Angle.
returns the secant or None if self.cos < SQ_EPSILON
Sourcepub fn cot(self) -> Option<T>
pub fn cot(self) -> Option<T>
The cotangent of the Angle.
returns the cotangent or None if self.sin < SQ_EPSILON
Sourcepub fn abs(self) -> Angle<T>
pub fn abs(self) -> Angle<T>
The absolute value of the angle, i.e. the angle with a positive sine.
§Examples
use angle_sc::{Angle, Degrees};
let angle_m45 = Angle::from(Degrees(-45.0));
let result_45 = angle_m45.abs();
assert_eq!(Degrees(45.0), Degrees::from(result_45));Sourcepub fn opposite(self) -> Angle<T>
pub fn opposite(self) -> Angle<T>
The opposite angle on the circle, i.e. +/- 180 degrees.
§Examples
use angle_sc::{Angle, Degrees};
let angle_m30 = Angle::from(Degrees(-30.0));
let result = angle_m30.opposite();
assert_eq!(Degrees(150.0), Degrees::from(result));Sourcepub fn quarter_turn_cw(self) -> Angle<T>
pub fn quarter_turn_cw(self) -> Angle<T>
A quarter turn clockwise around the circle, i.e. + 90°.
§Examples
use angle_sc::{Angle, Degrees};
let angle_m30 = Angle::from(Degrees(-30.0));
let result = angle_m30.quarter_turn_cw();
assert_eq!(Angle::from(Degrees(60.0)), result);Sourcepub fn quarter_turn_ccw(self) -> Angle<T>
pub fn quarter_turn_ccw(self) -> Angle<T>
A quarter turn counter-clockwise around the circle, i.e. - 90°.
§Examples
use angle_sc::{Angle, Degrees};
let angle_120 = Angle::from(Degrees(120.0));
let result = angle_120.quarter_turn_ccw();
assert_eq!(Angle::from(Degrees(30.0)), result);Sourcepub fn negate_cos(self) -> Angle<T>
pub fn negate_cos(self) -> Angle<T>
Negate the cosine of the Angle.
I.e. PI - angle.radians() for positive angles,
angle.radians() + PI for negative angles
§Examples
use angle_sc::{Angle, Degrees};
let angle_45 = Angle::from(Degrees(45.0));
let result_45 = angle_45.negate_cos();
assert_eq!(Degrees(135.0), Degrees::from(result_45));Sourcepub fn double(self) -> Angle<T>
pub fn double(self) -> Angle<T>
Double the Angle. See: Double-angle formulae
§Examples
use angle_sc::{Angle, Degrees};
let angle_30 = Angle::from(Degrees(30.0));
let result_60 = angle_30.double();
// Note: multiplication is not precise...
// assert_eq!(Degrees(60.0), Degrees::<f64>::from(result_60));
let delta_angle = (60.0 - Degrees::<f64>::from(result_60).0).abs();
assert!(delta_angle <= 32.0 * f64::EPSILON);Sourcepub fn half(self) -> Angle<T>
pub fn half(self) -> Angle<T>
Half of the Angle. See: Half-angle formulae
§Examples
use angle_sc::{Angle, Degrees};
let angle_30 = Angle::from(Degrees(30.0));
let angle_60 = Angle::from(Degrees(60.0));
assert_eq!(angle_30, angle_60.half());Trait Implementations§
Source§impl<T> Add for Angle<T>where
T: Float,
impl<T> Add for Angle<T>where
T: Float,
Source§fn add(self, other: Angle<T>) -> <Angle<T> as Add>::Output
fn add(self, other: Angle<T>) -> <Angle<T> as Add>::Output
Add two Angles, i.e. a + b Uses trigonometric identity functions, see: angle sum and difference identities.
§Examples
use angle_sc::{Angle, Degrees};
let angle_30 = Angle::from(Degrees(30.0));
let angle_60 = Angle::from(Degrees(60.0));
let result_90 = angle_30 + angle_60;
assert_eq!(Degrees(90.0), Degrees::from(result_90));Source§impl<T> AddAssign for Angle<T>where
T: Float,
impl<T> AddAssign for Angle<T>where
T: Float,
Source§fn add_assign(&mut self, other: Angle<T>)
fn add_assign(&mut self, other: Angle<T>)
+= operation. Read moreimpl<T> Copy for Angle<T>
Source§impl<'de, T> Deserialize<'de> for Angle<T>
impl<'de, T> Deserialize<'de> for Angle<T>
Source§fn deserialize<D>(
deserializer: D,
) -> Result<Angle<T>, <D as Deserializer<'de>>::Error>where
D: Deserializer<'de>,
fn deserialize<D>(
deserializer: D,
) -> Result<Angle<T>, <D as Deserializer<'de>>::Error>where
D: Deserializer<'de>,
Deserialize an value in Degrees to an Angle.
impl<T> Eq for Angle<T>
Source§impl<T> From<(Degrees<T>, Degrees<T>)> for Angle<T>
impl<T> From<(Degrees<T>, Degrees<T>)> for Angle<T>
Source§fn from(params: (Degrees<T>, Degrees<T>)) -> Angle<T>
fn from(params: (Degrees<T>, Degrees<T>)) -> Angle<T>
Construct an Angle from the difference of a pair angles in Degrees:
a - b
Examples:
use angle_sc::{Angle, Degrees, trig};
// Difference of Degrees(-155.0) - Degrees(175.0)
let angle = Angle::from((Degrees(-155.0), Degrees(175.0)));
assert_eq!(0.5, angle.sin().0);
assert_eq!(trig::COS_30_DEGREES, angle.cos().0);
assert_eq!(30.0, Degrees::from(angle).0);Source§impl<T> From<(Radians<T>, Radians<T>)> for Angle<T>
impl<T> From<(Radians<T>, Radians<T>)> for Angle<T>
Source§fn from(params: (Radians<T>, Radians<T>)) -> Angle<T>
fn from(params: (Radians<T>, Radians<T>)) -> Angle<T>
Construct an Angle from the difference of a pair angles in Radians: a - b
Examples:
use angle_sc::{Angle, Radians, trig};
// 6*π - π/3 radians round trip
let angle = Angle::from((
Radians(3.0 * core::f64::consts::TAU),
Radians(core::f64::consts::FRAC_PI_3),
));
assert_eq!(-core::f64::consts::FRAC_PI_3, Radians::from(angle).0);Source§impl<T> From<Degrees<T>> for Angle<T>
impl<T> From<Degrees<T>> for Angle<T>
Source§fn from(a: Degrees<T>) -> Angle<T>
fn from(a: Degrees<T>) -> Angle<T>
Construct an Angle from an angle in Degrees.
Examples:
use angle_sc::{Angle, Degrees, is_within_tolerance, trig};
let angle = Angle::from(Degrees(60.0));
assert_eq!(trig::COS_30_DEGREES, angle.sin().0);
assert_eq!(0.5, angle.cos().0);
assert_eq!(60.0, Degrees::from(angle).0);Source§impl<T> From<Radians<T>> for Angle<T>
impl<T> From<Radians<T>> for Angle<T>
Source§fn from(a: Radians<T>) -> Angle<T>
fn from(a: Radians<T>) -> Angle<T>
Construct an Angle from an angle in Radians.
Examples:
use angle_sc::{Angle, Radians, trig};
let angle = Angle::from(Radians(-core::f64::consts::FRAC_PI_6));
assert_eq!(-0.5, angle.sin().0);
assert_eq!(trig::COS_30_DEGREES, angle.cos().0);
assert_eq!(-core::f64::consts::FRAC_PI_6, Radians::from(angle).0);Source§impl<T> Neg for Angle<T>where
T: Float,
impl<T> Neg for Angle<T>where
T: Float,
Source§fn neg(self) -> Angle<T>
fn neg(self) -> Angle<T>
An implementation of Neg for Angle, i.e. -angle. Negates the sine of the Angle, does not affect the cosine.
§Examples
use angle_sc::{Angle, Degrees};
let angle_45 = Angle::from(Degrees(45.0));
let result_m45 = -angle_45;
assert_eq!(Degrees(-45.0), Degrees::from(result_m45));Source§impl<T> PartialOrd for Angle<T>where
T: Float,
impl<T> PartialOrd for Angle<T>where
T: Float,
Source§fn partial_cmp(&self, other: &Angle<T>) -> Option<Ordering>
fn partial_cmp(&self, other: &Angle<T>) -> Option<Ordering>
Compare two Angles, i.e. a < b.
It compares whether an Angle is clockwise of the other Angle on the
unit circle.
§Examples
use angle_sc::{Angle, Degrees};
let degrees_120 = Angle::from(Degrees(120.0));
let degrees_m120 = -degrees_120;
assert!(degrees_120 < degrees_m120);Source§impl<T> Serialize for Angle<T>
impl<T> Serialize for Angle<T>
Source§fn serialize<S>(
&self,
serializer: S,
) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>where
S: Serializer,
fn serialize<S>(
&self,
serializer: S,
) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>where
S: Serializer,
Serialize an Angle to an value in Degrees.
impl<T> StructuralPartialEq for Angle<T>
Source§impl<T> Sub for Angle<T>where
T: Float,
impl<T> Sub for Angle<T>where
T: Float,
Source§fn sub(self, other: Angle<T>) -> <Angle<T> as Sub>::Output
fn sub(self, other: Angle<T>) -> <Angle<T> as Sub>::Output
Subtract two Angles, i.e. a - b Uses trigonometric identity functions, see: angle sum and difference identities.
§Examples
use angle_sc::{Angle, Degrees, is_within_tolerance};
let angle_30 = Angle::from(Degrees(30.0));
let angle_60 = Angle::from(Degrees(60.0));
let result_30 = angle_60 - angle_30;
assert!(is_within_tolerance(Degrees(30.0).0, Degrees::from(result_30).0, 32.0 * f64::EPSILON));Auto Trait Implementations§
impl<T> Freeze for Angle<T>where
T: Freeze,
impl<T> RefUnwindSafe for Angle<T>where
T: RefUnwindSafe,
impl<T> Send for Angle<T>where
T: Send,
impl<T> Sync for Angle<T>where
T: Sync,
impl<T> Unpin for Angle<T>where
T: Unpin,
impl<T> UnsafeUnpin for Angle<T>where
T: UnsafeUnpin,
impl<T> UnwindSafe for Angle<T>where
T: UnwindSafe,
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,
impl<T, Right> ClosedAdd<Right> for T
impl<T, Right> ClosedAddAssign<Right> for T
impl<T> ClosedNeg for Twhere
T: Neg<Output = T>,
impl<T, Right> ClosedSub<Right> for T
impl<T, Right> ClosedSubAssign<Right> for T
impl<T> DeserializeOwned for Twhere
T: for<'de> Deserialize<'de>,
impl<T> Scalar for T
Source§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
Source§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self from the equivalent element of its
superset. Read moreSource§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
self is actually part of its subset T (and can be converted to it).Source§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset but without any property checks. Always succeeds.Source§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self to the equivalent element of its superset.