#quaternions #vector-math #vector

无std quaternion-core

提供四元数运算及其与几种姿态表示的互转换

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数学

Download history 466/week @ 2024-05-03 455/week @ 2024-05-10 521/week @ 2024-05-17 371/week @ 2024-05-24 330/week @ 2024-05-31 353/week @ 2024-06-07 490/week @ 2024-06-14 406/week @ 2024-06-21 398/week @ 2024-06-28 488/week @ 2024-07-05 641/week @ 2024-07-12 700/week @ 2024-07-19 859/week @ 2024-07-26 815/week @ 2024-08-02 574/week @ 2024-08-09 420/week @ 2024-08-16

2,804 每月下载量
quaternion-wrapper 中使用

MIT/Apache

84KB
1K SLoC

quaternion-core

Latest version Documentation Minimum rustc License

使用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"]

转换

Conversion

与24种不同的欧拉角(每种12个,分别为 IntrinsicExtrinsic)的互转换是可能的!!

还可以与其他 axis/anglerotation 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),则必须启用此功能。

在这种情况下,数学函数(例如 sincossqrt ...)由 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

当此功能启用时,RotationSequenceRotationType 将同时实现 serde::Serializeserde::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.0MIT License 许可。

贡献

除非您明确表示,否则您提交给工作的任何有意贡献,根据 Apache-2.0 许可证的定义,都应作为上述双重许可,不附加任何额外条款或条件。

依赖

~94–380KB