#vector #unit #computer-vision #integer-compression #normals

cuv

可以高效存储诸如法向量等数据的压缩单元向量

2个版本

0.1.1 2024年7月25日
0.1.0 2023年10月20日

#181 in 压缩

Download history 1/week @ 2024-04-20 93/week @ 2024-07-20 40/week @ 2024-07-27

每月133次下载

MIT许可

11KB
112

压缩单元向量

Build Status Crates.io Documentation No Unsafe License: MIT Dependencies

一个用于压缩单元向量的Rust库。它是某些C/C++代码的简单Rust移植。

它可以用于高效存储和传输诸如计算机图形中使用的法向量等数据。您可以使用它降低内存占用或减小磁盘上文件的大小。与三个32位浮点数相比,您可以使用单个16位无符号整数来表示单位向量。

压缩本身是有损的,因此大多数输入值在解包时将被映射到略有不同的值。对于许多用例,这种损失是可以接受的。请确保这也适用于您的用例。

入门指南

库提供低级函数来打包和解包值,以及高级“Rust化”接口。

低级接口需要手动创建查找表

let packed: u16 = cuv::pack(1.0, 0.0, 0.0);
let lut = cuv::create_lut();
let unpacked = cuv::unpack(packed, &lut);
assert_eq!(unpacked, [1.0, 0.0, 0.0]);

高级接口将为您处理查找表,并且使用起来更加方便

let input = [1.0, 0.0, 0.0];
let packed = cuv::CompUnitVec::from_slice(&input);
let unpacked = packed.get();
assert_eq!(unpacked, [1.0, 0.0, 0.0]);

原始来源

原始的C/C++代码来自Rafael Baptista,他在一篇已丢失的帖子中发表了该想法。该代码最初被描述为“单元向量到16位字转换算法”。

2013年,Rafael再次在他的博客上发布了描述和代码,网址为https://oroboro.com/compressed-unit-vectors/

基准测试

此仓库包含一些使用Criterion.rs实现的基准测试,以在开发过程中检测性能回归。您可以使用以下命令运行基准测试:cargo bench

无运行时依赖