HyperbolicRotationMatrix

Struct HyperbolicRotationMatrix 

Source
pub struct HyperbolicRotationMatrix<const N: usize> { /* private fields */ }
Expand description

Hyperbolic rotations in Minkowski Space

Construct a HyperbolicRotationMatrix to apply SO(N-1, 1) transformations to N-dimensional Minkowski vectors. For Minkowski 4-vectors, Biquaternion should be used instead for numerical stability. See documentation in HyperbolicAngle for details on SO(2,1) transformations (i.e., two-dimensional hyperbolic space), and in Biquaternion for details on SO(3,1) transformations (i.e., three-dimensional hyperbolic space).

In two dimensional hyperbolic space:

use hoomd_manifold::{
    HyperbolicAngle, HyperbolicRotate, HyperbolicRotationMatrix, Minkowski,
};
use std::f64::consts::PI;

fn rotate_about_z(minkowski_vector: &Minkowski<3>) -> Minkowski<3> {
    let generators = HyperbolicAngle::from((PI, 0.0_f64, 0.0_f64));
    let rotation_matrix = HyperbolicRotationMatrix::from(generators);
    rotation_matrix.hyperbolic_rotate(&minkowski_vector)
}

fn boost_in_x(minkowski_vector: &Minkowski<3>) -> Minkowski<3> {
    let generators = HyperbolicAngle::from((0.0_f64, 0.2_f64, 0.0_f64));
    let boost_matrix = HyperbolicRotationMatrix::from(generators);
    boost_matrix.hyperbolic_rotate(&minkowski_vector)
}

Trait Implementations§

Source§

impl<const N: usize> Clone for HyperbolicRotationMatrix<N>

Source§

fn clone(&self) -> HyperbolicRotationMatrix<N>

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<const N: usize> Debug for HyperbolicRotationMatrix<N>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de, const N: usize> Deserialize<'de> for HyperbolicRotationMatrix<N>

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl From<HyperbolicAngle> for HyperbolicRotationMatrix<3>

Source§

fn from(angle_list: HyperbolicAngle) -> HyperbolicRotationMatrix<3>

Create a matrix belonging to SO(2,1) from the generators of the algebra so(2,1).

Source§

impl From<UnitBiquaternion> for HyperbolicRotationMatrix<4>

Source§

fn from(q: UnitBiquaternion) -> HyperbolicRotationMatrix<4>

Converts to this type from the input type.
Source§

impl<const N: usize> HyperbolicRotate<Minkowski<N>> for HyperbolicRotationMatrix<N>

Source§

fn hyperbolic_rotate(&self, vector: &Minkowski<N>) -> Minkowski<N>

Rotate a Minkowski<N> by a HyperbolicRotationMatrix

§Examples

Rotate point in 2D hyperbolic space about z-axis:

use hoomd_manifold::{
    HyperbolicAngle, HyperbolicRotate, HyperbolicRotationMatrix, Minkowski,
};
use std::f64::consts::PI;

let v = Minkowski::from([1.0, 0.0, 1.0]);
let spatial_rotation = HyperbolicAngle::from((PI / 2.0, 0.0_f64, 0.0_f64));
let matrix = HyperbolicRotationMatrix::from(spatial_rotation);
let rotated = matrix.hyperbolic_rotate(&v);
let c = Minkowski::from([(PI / 2.0).cos(), (PI / 2.0).sin(), 1.0]);
assert_eq!(c, rotated);

Boost point in 2D hyperbolic space in x direction:

use hoomd_manifold::{
    HyperbolicAngle, HyperbolicRotate, HyperbolicRotationMatrix, Minkowski,
};
use num::complex::Complex;
use std::f64::consts::PI;

let v = Minkowski::from([1.0, 0.0, 1.0]);
let small_boost = HyperbolicAngle::from((0.0_f64, 0.1_f64, 0.0_f64));
let matrix = HyperbolicRotationMatrix::from(small_boost);
let rotated = matrix.hyperbolic_rotate(&v);
let c = Minkowski::from([
    (0.1_f64).sinh() + (0.1_f64).cosh(),
    0.0,
    (0.1_f64).sinh() + (0.1_f64).cosh(),
]);
assert_eq!(c, rotated);

Zero angles and rapidities does nothing:

use hoomd_manifold::{
    HyperbolicAngle, HyperbolicRotate, HyperbolicRotationMatrix, Minkowski,
};
use num::complex::Complex;
use std::f64::consts::PI;

let v = Minkowski::from([1.0, 2.0, 1.0]);
let identity = HyperbolicAngle::from((0.0_f64, 0.0_f64, 0.0_f64));
let matrix = HyperbolicRotationMatrix::from(identity);
let rotated = matrix.hyperbolic_rotate(&v);
let c = Minkowski::from([1.0, 2.0, 1.0]);
assert_eq!(c, rotated);

Rotate point in 3D hyperbolic space about y axis using matrix representation:

use approxim::assert_relative_eq;
use hoomd_manifold::{
    Biquaternion, HyperbolicRotate, HyperbolicRotationMatrix, Minkowski,
    UnitBiquaternion,
};
use num::complex::Complex;
use std::f64::consts::PI;

let q = Biquaternion::from([
    Complex::new(0.0, 0.0),
    Complex::new((PI / 4.0).sin(), 0.0),
    Complex::new(0.0, 0.0),
    Complex::new((PI / 4.0).cos(), 0.0),
]);
let v = q.to_unit()?;
let x = Minkowski::from([1.0, 0.0, 0.0, 1.0]);
let rotation = HyperbolicRotationMatrix::from(v);
let rotated = rotation.hyperbolic_rotate(&x);
assert_relative_eq!(rotated, [0.0, 0.0, -1.0, 1.0].into(), epsilon = 1e-12);

Boost point in 3D hyperbolic space in x direction using biquaternion algebra:

use approxim::assert_relative_eq;
use hoomd_manifold::{
    Biquaternion, HyperbolicRotate, Minkowski, UnitBiquaternion,
};
use num::complex::Complex;
use std::f64::consts::PI;

let x = Minkowski::from([0.0, 0.0, 0.0, 1.0]);
let q = Biquaternion::from([
    Complex::new(0.0, 0.25).sin(),
    Complex::new(0.0, 0.0),
    Complex::new(0.0, 0.0),
    Complex::new(0.0, 0.25).cos(),
]);
let v = q.to_unit()?;
let boosted = v.hyperbolic_rotate(&x);
assert_relative_eq!(
    boosted,
    [(0.5_f64).sinh(), 0.0, 0.0, (0.5_f64).cosh()].into(),
    epsilon = 1e-12
);
Source§

type Matrix = HyperbolicRotationMatrix<N>

Type of the related rotation matrix
Source§

impl<const N: usize> PartialEq for HyperbolicRotationMatrix<N>

Source§

fn eq(&self, other: &HyperbolicRotationMatrix<N>) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl<const N: usize> Serialize for HyperbolicRotationMatrix<N>

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl<const N: usize> Copy for HyperbolicRotationMatrix<N>

Source§

impl<const N: usize> StructuralPartialEq for HyperbolicRotationMatrix<N>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where T: for<'de> Deserialize<'de>,