# num-quaternion
[](https://github.com/ralphtandetzky/num-quaternion/actions)
[](https://docs.rs/num-quaternion)
[](https://crates.io/crates/num-quaternion)
[](https://crates.io/crates/num-quaternion)
[](LICENSE-MIT.md)
[](LICENSE-APACHE.md)
Quaternions for Rust.
`num-quaternion` is a Rust library designed for robust, efficient and easy to
use quaternion arithmetic and operations.
[Quaternions](https://en.wikipedia.org/wiki/Quaternion) are used extensively
in computer graphics, robotics, and physics for representing rotations and
orientations.
## Features
- **Basic Quaternion Operations**: Addition, subtraction, multiplication,
division, and conjugation.
- **Unit Quaternions**: Special support for unit quaternions with optimized
operations.
- **Conversion Functions**: Convert to/from Euler angles, rotation vectors,
and more.
- **Interpolation**: Spherical linear interpolation (SLERP) for smooth
rotations.
- **Interoperability**: Works with the `serde` and the `rand` crates.
- **Comprehensive Documentation**: Detailed documentation with examples to
help you get started quickly.
## Installation
Add `num-quaternion` to your `Cargo.toml`:
```toml
[dependencies]
num-quaternion = "1.0.6"
```
For `#![no_std]` environments, disable the default `std` feature and enable
`libm` to benefit from the advanced mathematical functions of `num-quaternion`:
```toml
[dependencies]
num-quaternion = { version = "1.0.6", default-features = false, features = ["libm"] }
```
Then, include it in your crate:
```rust
use num_quaternion::{Quaternion, UnitQuaternion, Q32, Q64, UQ32, UQ64};
```
To serialize or deserialize `Quaternion`s with `serde`, or to randomly sample
`UnitQuaternion`s using the `rand` crate, enable the respective `serde` or
`rand` feature.
## Usage
### Creating Quaternions
```rust
// Create a quaternion with explicit components
let q1 = Q32::new(1.0, 2.0, 3.0, 4.0); // = 1 + 2i + 3j + 4k
// Create a quaternion using shorthand notation
let q2 = 1.0 + Q32::I; // = 1 + i
```
### Basic Operations
```rust
let q3 = q1 + q2; // Quaternion addition
let q4 = q1 * q2; // Quaternion multiplication
let q_conj = q1.conj(); // Quaternion conjugation
```
### Unit Quaternions
```rust
let uq1 = q1.normalize().expect("Normalization failed"); // Normalize quaternion
let uq2 = UQ32::I; // Unit quaternion representing the imaginary unit
```
### Conversion Functions
```rust
// From Euler angles
let (roll, pitch, yaw) = (1.5, 1.0, 3.0);
let uq = UnitQuaternion::from_euler_angles(roll, pitch, yaw);
// To Euler angles
let euler_angles = uq.to_euler_angles();
// From rotation vector
let rotation_vector = [1.0, 0.0, 0.0]; // x axis rotation, 1 radian
let uq = UnitQuaternion::from_rotation_vector(&rotation_vector);
// To rotation vector
let rotation_vector = uq.to_rotation_vector();
```
### Spherical Linear Interpolation (SLERP)
```rust
let uq1 = UQ32::ONE; // Create a unit quaternion
let uq2 = UQ32::I; // Create another unit quaternion
let interpolated = uq1.slerp(&uq2, 0.3); // Perform SLERP with t=0.3
```
## Documentation
Comprehensive documentation with examples can be found on
[docs.rs](https://docs.rs/num-quaternion/latest/num-quaternion/).
For detailed design principles and the error handling strategy see the
[Design Rationale](DESIGN_RATIONALE.md).
Detailed release notes are provided in [RELEASES.md](RELEASES.md).
## Contributing
Contributions are welcome! Please fork
[the repository](https://github.com/ralphtandetzky/num-quaternion) and submit
pull requests. By contributing, you agree that your contributions will be
dual-licensed under the Apache-2.0 and MIT licenses.
If you have any questions or need help, feel free to open an
[issue on GitHub](https://github.com/ralphtandetzky/num-quaternion/issues).
Further instructions can be found in the [CONTRIBUTING.md](CONTRIBUTING.md)
guidelines.
## License
Licensed under either of
- [Apache License, Version 2.0](LICENSE-APACHE.md)
- [MIT license](LICENSE-MIT.md)
at your option.
## Acknowledgements
Special thanks to [@cuviper](https://github.com/cuviper) for the
[`num-complex` crate](https://crates.io/crates/num-complex) which served
as a model for this crate. `num-quaternion` is designed to integrate seamlessly
with the [`rust-num` family](https://github.com/rust-num) of crates.