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