Implement and test: - [ ] Add and test `frule`s - [ ] Add `r/frule`s for `log`, `sqrt`, etc. Maybe `squad` and `slerp`? - [ ] axis-angle converters - [ ] Find more precise conversion to spherical coordinates. Note that `acos` is not a stable approach. - [x] distance - [x] intrinsic rotor - [x] intrinsic rotation - [x] chordal rotor - [x] chordal rotation - [x] Subtypes - [x] Use AbstractQuaternion everywhere possible - [x] Add `Rotor` type (or maybe `UnitQuaternion`) - [x] Add `Vec` type - [x] Specialize functions to work with them — especially `exp`, `log`, and `sqrt` - [x] Extend `wrapper` to take an `op` argument along with two types, and return the appropriate wrapper type - [x] Look at every function and consider every combination of types - [x] Test new types and combinations - [x] interpolation - [x] squad - [x] slerp - [x] unflip rotors - [x] time series - [x] `from_angular_velocity` - [x] `to_angular_velocity` - [x] minimal rotation - [x] Add `conjugate` function to efficiently rotate vectors by rotors - [x] Reduce direct dependencies using [extensions](https://pkgdocs.julialang.org/dev/creating-packages/#Conditional-loading-of-code-in-packages-(Extensions)), with backwards compatibility via Requires - [x] Simplify `quaternion.jl` - [x] Remove parameters wherever possible - [x] Add `quaternion`, `rotor`, and `quatvec` functions - [x] Use `rotor(...; normalize=false)` - [x] Accept arbitrary arrays, and return arrays of the corresponding type - [x] Accept type parameter as optional argument or keyword argument, with default as detection
Implement and test:
frulesr/frules forlog,sqrt, etc. Maybesquadandslerp?acosis not a stable approach.Rotortype (or maybeUnitQuaternion)Vectypeexp,log, andsqrtwrapperto take anopargument along with two types, and return the appropriate wrapper typefrom_angular_velocityto_angular_velocityconjugatefunction to efficiently rotate vectors by rotorsquaternion.jlquaternion,rotor, andquatvecfunctionsrotor(...; normalize=false)