You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 10:15:27