Skip to main content

Numerical quaternion implementation for 3D rotations using NumPy

Project description

num-quaternions

A Python library for numerical quaternion operations using NumPy, designed for 3D rotations and transformations.

Description

num-quaternions provides a simple and efficient implementation of quaternions for representing and manipulating 3D rotations. The library is built on top of NumPy using modern ndarray types and follows PEP8 naming conventions. It offers methods for:

  • Creating rotation quaternions from axis-angle representation
  • Rotating vectors and coordinate bases
  • Converting quaternions to rotation matrices
  • Quaternion arithmetic (multiplication, conjugation, inversion)
  • Vector operations (cross product, norm calculations)

Installation

Install from PyPI:

pip install num-quaternions

Or install from source:

git clone https://github.com/avabr/num-quaternions.git
cd num-quaternions
pip install -e .

Usage

Basic Example

import numpy as np
from num_quaternions import NumQuaternion

# Create a quaternion representing 90-degree rotation around x-axis
q = NumQuaternion(hi=np.pi/2, vector=[1.0, 0.0, 0.0])

# Define a vector
v = np.array([0.0, 1.0, 0.0])

# Rotate the vector
rotated = q.rotate_vector(v)
print(rotated)  # Output: [0. 0. 1.]

Creating Quaternions

# Default quaternion (180-degree rotation)
q = NumQuaternion()

# Custom rotation: angle 'hi' around axis 'vector'
q = NumQuaternion(hi=np.pi/4, vector=[0.0, 0.0, 1.0])

# Parameters:
# - hi: rotation angle in radians
# - vector: rotation axis as [x, y, z] (will be normalized)

Rotating Vectors

# Rotate a vector in space
v = np.array([1.0, 0.0, 0.0])
v_rotated = q.rotate_vector(v)

# Rotate the coordinate basis (inverse rotation)
v_basis = q.rotate_basis(v)

Getting Rotation Matrix

# Get the 3x3 rotation matrix
M = q.get_matrix()
print(M)

# The matrix can be used for standard matrix operations
v_matrix = np.array([[1.0], [0.0], [0.0]])
v_rotated = M @ v_matrix

Quaternion Operations

# Quaternion conjugate
q_conj = q._conjugate()

# Quaternion norm (should be 1 for unit quaternions)
norm = q._norma()

# Quaternion inverse
q_inv = q._inv()

# Quaternion multiplication
q1 = NumQuaternion(hi=np.pi/4, vector=[0.0, 0.0, 1.0])
q2 = NumQuaternion(hi=np.pi/4, vector=[0.0, 0.0, 1.0])
q_result = q1._prod_quaternions(q1, q2)  # 90-degree rotation

Complete Example

import numpy as np
from num_quaternions import NumQuaternion

# Create a 90-degree rotation around the z-axis
q = NumQuaternion(hi=np.pi/2, vector=[0.0, 0.0, 1.0])

# Rotate a point
point = np.array([1.0, 0.0, 0.0])
rotated_point = q.rotate_vector(point)
print(f"Original: {point}")
print(f"Rotated:  {rotated_point}")
# Output:
# Original: [1. 0. 0.]
# Rotated:  [ 0.  1.  0.]

# Get the rotation matrix
matrix = q.get_matrix()
print(f"Rotation matrix:\n{matrix}")

# Verify it's a valid rotation matrix
det = np.linalg.det(matrix)
print(f"Determinant: {det}")  # Should be 1.0

API Reference

Public Methods

  • rotate_vector(vector) - Rotate a vector in space
  • rotate_basis(vector) - Rotate the coordinate basis (inverse rotation)
  • get_matrix() - Get the 3x3 rotation matrix representation

Private Methods (for advanced use)

  • _conjugate() - Get the quaternion conjugate
  • _norma() - Calculate the quaternion norm
  • _inv() - Get the quaternion inverse
  • _prod_quaternions(q1, q2) - Multiply two quaternions
  • _vector_product(v1, v2) - Calculate vector cross product
  • _abs_vector(vector) - Calculate vector magnitude

Migration from Earlier Versions

If you're upgrading from an older version, note the following method name changes to comply with PEP8:

Old Name (camelCase) New Name (snake_case)
rotateVector() rotate_vector()
rotateBasis() rotate_basis()
getMatrix() get_matrix()
_prodQuaternions() _prod_quaternions()
_vectorProduct() _vector_product()
_absVector() _abs_vector()

The library also now uses np.array (ndarray) instead of the deprecated np.matrix type.

Running Tests

To run the test suite:

# Install development dependencies
pip install -r requirements.txt

# Run tests
pytest tests/

# Run tests with verbose output
pytest -v tests/

# Run specific test
pytest tests/test_num_quaternion.py::TestNumQuaternion::test_rotate_vector_90_degrees_x_axis

Requirements

  • Python >= 3.7
  • numpy >= 1.20.0

License

MIT License - see LICENSE file for details.

Author

Alexander Abramov (extremal.ru@gmail.com)

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

Links

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

num_quaternions-0.1.1.tar.gz (6.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

num_quaternions-0.1.1-py3-none-any.whl (5.4 kB view details)

Uploaded Python 3

File details

Details for the file num_quaternions-0.1.1.tar.gz.

File metadata

  • Download URL: num_quaternions-0.1.1.tar.gz
  • Upload date:
  • Size: 6.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.11

File hashes

Hashes for num_quaternions-0.1.1.tar.gz
Algorithm Hash digest
SHA256 8e2ff55dc9c986b4af947e670f704fee49f7cf386992ffad0ff893b21ce6fa71
MD5 5b7d346d1b875d8f23c1291ac90b9a45
BLAKE2b-256 cf2c84a641ca59558d0ed7ff6cb7e666db8fd96019b3a7c9cdfa1cdb875a1dc1

See more details on using hashes here.

File details

Details for the file num_quaternions-0.1.1-py3-none-any.whl.

File metadata

File hashes

Hashes for num_quaternions-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 b822aae40e77e0aa7c685318bfbfa0d8d7a01fc792785cd2b9a68b9e49eb280e
MD5 e8f5b9e203281e54d78bd6a5710687a0
BLAKE2b-256 2c9a4a7f6460ea62edc3432adcbc96f5eb66a0f918992fb3a8f8152f4e03c627

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page