14个版本
| 0.5.2 | 2024年8月3日 |
|---|---|
| 0.5.1 | 2024年7月15日 |
| 0.5.0 | 2023年11月30日 |
| 0.4.2 | 2023年6月2日 |
| 0.3.4 | 2022年7月27日 |
#65 在 数学
2,804 每月下载量
在 quaternion-wrapper 中使用
84KB
1K SLoC
quaternion-core
使用Rust编写的四元数库。
此库提供四元数运算及其与几种姿态表示的互转换,作为泛型函数(支持 f32 & f64)。
此外,它还可以在 no_std 环境中工作!
用法
将此添加到您的 Cargo.toml
[dependencies]
quaternion-core = "0.5"
用于 no_std 环境中
[dependencies.quaternion-core]
version = "0.5"
default-features = false
features = ["libm"]
转换

与24种不同的欧拉角(每种12个,分别为 Intrinsic 和 Extrinsic)的互转换是可能的!!
还可以与其他 axis/angle 和 rotation vector 进行其他互转换。
功能
fma
当此功能启用时,将尽可能在内部使用 mul_add 方法。也就是说,(s * a) + b 将在编译时展开为 s.mul_add(a, b)。
此Crate主要使用 mul_add 方法来提高计算速度,但如果CPU不支持 FMA (Fused Multiply-Add) 指令或启用了 libm 功能,则计算将由软件实现执行。在这种情况下,它可能比未启用 fma 功能时慢得多。
libm
如果您设置 default-features=false (不导入 std),则必须启用此功能。
在这种情况下,数学函数(例如 sin、cos、sqrt ...)由 libm Crate提供。
norm-sqrt
当此功能启用时,默认的 norm(a) 实现将与 dot(a, a).sqrt() 一起编译。
默认情况下,norm(a) 函数的实现方式使得溢出和下溢发生的机会比 dot(a, a).sqrt() 要小。然而,如果输入的值不是极端大的,并且下溢不是特别关注的问题,那么 dot(a, a).sqrt() 就足够了(并且 dot(a, a).sqrt() 在大多数情况下比默认实现更快)。
serde-serialize
当此功能启用时,RotationSequence 和 RotationType 将同时实现 serde::Serialize 和 serde::Deserialize。
示例
use quaternion_core as quat;
const PI: f64 = std::f64::consts::PI;
const EPSILON: f64 = 1e-12;
fn main() {
// Generates a quaternion representing the
// rotation of π/2[rad] around the y-axis.
let q = quat::from_axis_angle([0.0, 1.0, 0.0], PI/2.0);
// Rotate the point.
let r = quat::point_rotation(q, [2.0, 2.0, 0.0]);
// Check if the calculation is correct.
let diff = quat::sub([0.0, 2.0, -2.0], r);
for val in diff {
assert!( val.abs() < EPSILON );
}
}
开发概念
在创建这个包时,我尽量保持实现简单实用。
所有函数都实现得尽可能减少计算成本(但又不至于过于复杂以实现),这对所有人都是一个很大的优势。
此外,由于我在创建这个包时抱着实验精神,很多部分都是有意为之,以便在微控制器上运行(例如 norm-sqrt 功能)。
发布
发布说明可在 RELEASES.md 中查看。
许可证
根据您的选择,受 Apache License, Version 2.0 或 MIT License 许可。
贡献
除非您明确表示,否则您提交给工作的任何有意贡献,根据 Apache-2.0 许可证的定义,都应作为上述双重许可,不附加任何额外条款或条件。
依赖
~94–380KB