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>
impl<const N: usize> Clone for HyperbolicRotationMatrix<N>
Source§fn clone(&self) -> HyperbolicRotationMatrix<N>
fn clone(&self) -> HyperbolicRotationMatrix<N>
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl<const N: usize> Debug for HyperbolicRotationMatrix<N>
impl<const N: usize> Debug for HyperbolicRotationMatrix<N>
Source§impl<'de, const N: usize> Deserialize<'de> for HyperbolicRotationMatrix<N>
impl<'de, const N: usize> Deserialize<'de> for HyperbolicRotationMatrix<N>
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 From<HyperbolicAngle> for HyperbolicRotationMatrix<3>
impl From<HyperbolicAngle> for HyperbolicRotationMatrix<3>
Source§fn from(angle_list: HyperbolicAngle) -> HyperbolicRotationMatrix<3>
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>
impl From<UnitBiquaternion> for HyperbolicRotationMatrix<4>
Source§fn from(q: UnitBiquaternion) -> HyperbolicRotationMatrix<4>
fn from(q: UnitBiquaternion) -> HyperbolicRotationMatrix<4>
Source§impl<const N: usize> HyperbolicRotate<Minkowski<N>> for HyperbolicRotationMatrix<N>
impl<const N: usize> HyperbolicRotate<Minkowski<N>> for HyperbolicRotationMatrix<N>
Source§fn hyperbolic_rotate(&self, vector: &Minkowski<N>) -> Minkowski<N>
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
);