# zlibcell **Repository Path**: wujilingfeng/zlibcell ## Basic Information - **Project Name**: zlibcell - **Description**: zig语言的任意维网格库 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2025-08-10 - **Last Updated**: 2026-03-17 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 下面介绍一种向量进制的数据表示方式。比如N向量数,设集合为$B$是自然数的集合,那么N向量空间设为$C=B .. \times B$,也就是C中元素表示为$\left(t_0.. t_{N-1}\right) \in C$, 那么M深度的N向量数表示$D={s_0..s_m}$ 其中$s_l\in C$, 。 对于任意的M深度N向量数$d\in D,d=s_0..s_m$都有$0..0s_0..s_m$,其中0表示$\left(0,0,0 \right)$, 和d都不相等,因为表示的深度不一样。 现在定义进制的等价关系,对于给定的正整数P。 对于 $d\in D,d=s_0..s_m$,都有$d=s_0..\alpha_i\left(s_{l+1}\right)\beta_i\left(s_l\right)..s_m$, 其中$\alpha_i$表示对向量的第i个分量加1,$\beta_i$表示对向量的第i个分量减P。 满足上面定义的等价关系叫M深度N向量P进制数。 八叉树的节点和根节点的关系(或者路径)都可以用3向量2进制数表示,它的邻接关系也一目了然。 在zig语言中直接用`ArrayList([3]u1)`表示。 这样我完全不用像传统方式表示八叉树,也就是有parent和children指针,我完全可以申请一块内存即可,`const Oc_Node=struct{ArrayList([3]u1),isize};constr Octree=struct{octree:ArrayList(Oc_Node),octree_prop:ArrayList(T)}`,其中usize是指向Octree_Prop的索引,如果没有属性值,置为-1。 一般为了提高效率,节省内存,令`const Oc_Node=struct{[M][3]u1,isize}`; 如果要计算M深度N向量的id,可以按照P进制进行排列计算数值,但是该数值对于同一层深度的向量数具有唯一性,不同深度时id可能重复,因为上述表示法对于$0s$和$s$不具有唯一性。 如果想让M深度N向量数在不同深度都有唯一id表示,可以在上述表示法基础上加上,$TotalNodes(M-1) = 1 + P^N + (P^N)^2 + ... + (P^N)^(M-1)$ ### 我的贪婪投影法 它的核心是一个缝补算法,适用于任何情况的缝补重建算法。 所以先介绍一个局部的缝补重建算法: ##### 局部缝补重建算法 以该点法向为基础,投影到2d平面,在该平面缝补重建,涉及到去除法向大于阙值点,被已建网格遮挡的点,应该先按源泉顺序创建网格,再交换边调整网格 #### 整体的点云重建 因为缝补顺序影响整体,目前有几种缝补重建顺序: 1.按种子,边界一点点生长 2. 按点的得分顺序,每个点的得分是该点邻域点和该点法向的内积和