#四元数 #运算符重载 #向量 #数学表达式

无需std quaternion-wrapper

运算符重载允许实现类似于数学表达式的功能

5个不稳定版本

0.3.1 2024年8月24日
0.3.0 2023年9月18日
0.2.0 2022年6月20日
0.1.1 2022年6月19日
0.1.0 2022年5月7日

1347数学

Download history

每月201次下载

MIT/Apache

43KB
466

quaternion-wrapper

Latest version Documentation Minimum rustc License

这是对quaternion-corecrate的包装。

提供四元数运算和与几种姿态表示的相互转换。

运算符重载允许实现类似于数学表达式的功能。

用法

将此添加到您的 Cargo.toml

[dependencies]
quaternion-wrapper = "0.3"

用于在 no_std 环境中

[dependencies.quaternion-wrapper]
version = "0.3"
default-features = false
features = ["libm"]

运算符重载

运算符重载允许在 QuaternionWrapperVector3WrapperScalarWrapper 之间执行操作。

支持的运算在下面的表格中列出

左↓ / 右→ QuaternionWrapper Vector3Wrapper ScalarWrapper
QuaternionWrapper +, -, *, +=, -=, *= +, -, * +, -, *, /
Vector3Wrapper +, -, * +, -, *, +=, -= +, -, *, /
ScalarWrapper +, -, * +, -, * +, -, *, /, +=, -=, *=, /=

为了防止用户实现错误,故意没有实现与 T (f32f64) 的运算。也就是说,ScalarWrapper<f64> * QuaternionWrapper<f64> 可以计算,但 f64 * QuaternionWrapper<f64> 不能。

特性

fma

当此特性启用时,将尽可能在内部使用 mul_add 方法。也就是说,(s * a) + b 将在编译时展开为 s.mul_add(a, b)

这个包主要使用 mul_add 方法来提高计算速度,但如果CPU不支持 FMA(融合乘加)指令或启用 libm 功能,则通过软件实现进行计算。在这种情况下,计算速度可能比未启用 fma 功能时要慢。

libm

如果您将 default-features=false(不导入 std)设置,则必须启用此功能。

在这种情况下,数学函数(例如 sincossqrt 等)由 libm 包提供。

norm-sqrt

默认情况下,a.norm() 方法实现得使得溢出和下溢发生的可能性低于 dot(a, a).sqrt()。然而,如果输入的值非常大并且下溢不是主要问题,则 dot(a, a).sqrt() 就足够了(并且大多数情况下,dot(a, a).sqrt() 比默认实现更快)。

示例

src/main.rs:

use quaternion_wrapper::{QuaternionWrapper, Vector3Wrapper};

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 = QuaternionWrapper::from_axis_angle([0.0, 1.0, 0.0], PI/2.0);

    // Point
    let v = Vector3Wrapper([2.0, 2.0, 0.0]);

    let result = (q * v * q.conj()).get_vector_part();
    //let result = q.point_rotation(v);  // <--- It could be written like this

    // Check if the calculation is correct.
    let true_val = Vector3Wrapper([0.0, 2.0, -2.0]);
    let diff: [f64; 3] = (true_val - result).unwrap();
    for val in diff {
        assert!(val.abs() < EPSILON);
    }
}

许可协议

根据您的选择,受Apache License 2.0或MIT许可协议的许可。

贡献

除非您明确说明,否则任何有意提交供您在Apache-2.0许可证定义的工作中包含的贡献,均将按上述方式双许可,没有任何额外的条款或条件。

依赖关系

~180–295KB