Rust实现Marching Cubes算法:如何存储可变长度元组的三角化表?
在Rust中存储Marching Cubes三角化表的方案
Rust的元组属于固定长度类型,无法在同一个Vec中存放长度不同的元组,你可以采用以下几种实用方案解决:
1. 静态切片数组(推荐)
三角化表是编译期固定的常量,用&'static [u8]作为元素类型(边索引都是小整数,u8足够节省空间),直接将每个元组转为静态切片,无需运行时内存分配,性能最优:
pub fn tri_table() -> Vec<&'static [u8]> { vec![ &[], &[0, 8, 3], &[0, 1, 9], &[1, 8, 3, 9, 8, 1], &[1, 2, 10], &[0, 8, 3, 1, 2, 10], &[9, 2, 10, 0, 2, 9], &[2, 8, 3, 2, 10, 8, 10, 9, 8], &[3, 11, 2], &[0, 11, 2, 8, 11, 0], &[1, 9, 0, 2, 3, 11], &[1, 11, 2, 1, 9, 11, 9, 8, 11], &[3, 10, 1, 11, 10, 3], &[0, 10, 1, 0, 8, 10, 8, 11, 10], &[3, 9, 0, 3, 11, 9, 11, 10, 9], &[9, 8, 10, 10, 8, 11], &[4, 7, 8], // ... 剩余表项 ] }
2. 动态向量数组
如果需要在运行时修改表项,可以用Vec<Vec<u8>>,但会产生额外的内存分配开销:
pub fn tri_table() -> Vec<Vec<u8>> { vec![ vec![], vec![0, 8, 3], vec![0, 1, 9], vec![1, 8, 3, 9, 8, 1], // ... 剩余表项 ] }
3. 自定义枚举(不推荐)
如果非要显式区分不同长度的元组,可以定义枚举,但会增加代码复杂度,实际开发中没必要:
enum TriEntry { Empty, Tri3(u8, u8, u8), Tri6(u8, u8, u8, u8, u8, u8), Tri9(u8, u8, u8, u8, u8, u8, u8, u8, u8), } pub fn tri_table() -> Vec<TriEntry> { vec![ TriEntry::Empty, TriEntry::Tri3(0, 8, 3), TriEntry::Tri3(0, 1, 9), TriEntry::Tri6(1, 8, 3, 9, 8, 1), // ... 剩余表项 ] }
实际开发中优先选择第一种方案,因为Marching Cubes的三角化表是固定不变的常量,静态切片既高效又简洁。
内容的提问来源于stack exchange,提问作者Fyodor Raevskiy
相关产品推荐
相关产品推荐

