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 在 数学 中
每月201次下载
43KB
466 行
quaternion-wrapper
这是对quaternion-corecrate的包装。
提供四元数运算和与几种姿态表示的相互转换。
运算符重载允许实现类似于数学表达式的功能。
用法
将此添加到您的 Cargo.toml
[dependencies]
quaternion-wrapper = "0.3"
用于在 no_std
环境中
[dependencies.quaternion-wrapper]
version = "0.3"
default-features = false
features = ["libm"]
运算符重载
运算符重载允许在 QuaternionWrapper
、Vector3Wrapper
和 ScalarWrapper
之间执行操作。
支持的运算在下面的表格中列出
左↓ / 右→ | QuaternionWrapper | Vector3Wrapper | ScalarWrapper |
---|---|---|---|
QuaternionWrapper | + , - , * , += , -= , *= |
+ , - , * |
+ , - , * , / |
Vector3Wrapper | + , - , * |
+ , - , * , += , -= |
+ , - , * , / |
ScalarWrapper | + , - , * |
+ , - , * |
+ , - , * , / , += , -= , *= , /= |
为了防止用户实现错误,故意没有实现与 T
(f32 或
f64
) 的运算。也就是说,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
)设置,则必须启用此功能。
在这种情况下,数学函数(例如 sin
、cos
、sqrt
等)由 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