Bit Flags
对每一个曲面, 都有一个叫做 BitFlags 的组件. 这个组件存储了一个固定尺寸的32bit的 vector
. 管理 Flags 的相关类:
vcg::tri::UpdateFlags
, 定义在 flag.hvcg::tri::UpdateSelection
, 定义在 selection.h
Delete Bit
IsD(),
ClearD(); // deprecated
SetD() // deprecated
这个位标记是经常使用的. 示例见 Allocating and Deleting mesh elements.
Border Bit
IsB(),
ClearB(),
SetB()
用来标记一个顶点或者面在边界上. 这些标记位默认是不会计算的. 使用或者不使用拓扑结构都可以计算这个标记位(显然, 使用 FF 邻接关系计算这些标记位会很快).
这些位的理由是有很多算法只需要边界信息进行正确的计算,所以计算一次就足够了,而不需要用整个FF拓扑结构来加载所有的东西。
Selection Bit
IsS(), ClearS(), SetS()
Visiting Bit
IsV(), ClearV(), SetV()
是很有用的标记位. 但是不要太依赖于这个位的状态. 因为其他算法可能会更改它. 使用 tri::UpdateFlags<YourMeshClass>::VertexClear(yourMesh)
清理所有标记位.
用户自定义 Bits
如果要在存储的网格元素中分配一些私有标记位,您可以通过返回一个可用于设置,清除和测试元素的掩码的NewBitFlag()
函数来执行此操作. 下面的例子为每一个面开辟和清理了三个新的标记位:
int e0bit = MyFace::NewBitFlag();
int e1bit = MyFace::NewBitFlag();
int e2bit = MyFace::NewBitFlag();
int ebit[3] = {e0bit,e1bit,e2bit};
for(MyMesh::FaceIterator fi=m.face.begin();fi!=m.face.end();++fi)
for(int i=0;i<3;++i)
(*fi).ClearUserBit(ebit[i]);
清理所有面的标记位可以通过
tri::UpdateFlags<YourMeshClass>::FaceClear(yourMesh,e0bit|e1bit|e2bit);