VCG Library

Class of static functions to clean//restore meshs. More...
#include <clean.h>
Static Public Member Functions  
static int  RemoveDuplicateVertex (MeshType &m, bool RemoveDegenerateFlag=true) 
static int  RemoveDuplicateFace (MeshType &m) 
static int  RemoveDuplicateEdge (MeshType &m) 
static int  RemoveUnreferencedVertex (MeshType &m, bool DeleteVertexFlag=true) 
static int  RemoveDegenerateVertex (MeshType &m) 
static int  RemoveDegenerateFace (MeshType &m) 
static int  SplitNonManifoldVertex (MeshType &m, ScalarType moveThreshold) 
Removal of faces that were incident on a non manifold edge.  
static size_t  SplitManifoldComponents (MeshType &m) 
This function expand current selection to cover the whole connected component.  
static int  RemoveNonManifoldFace (MeshType &m) 
Removal of faces that were incident on a non manifold edge.  
static bool  IsBitQuadOnly (const MeshType &m) 
static bool  IsBitTriOnly (const MeshType &m) 
static bool  IsBitTriQuadOnly (const MeshType &m) 
static int  CountBitQuads (const MeshType &m) 
static int  CountBitTris (const MeshType &m) 
static int  CountBitPolygons (const MeshType &m) 
static int  CountBitLargePolygons (MeshType &m) 
static bool  HasConsistentPerFaceFauxFlag (const MeshType &m) 
static int  CountNonManifoldEdgeEE (MeshType &m, bool SelectFlag=false) 
static int  CountNonManifoldEdgeFF (MeshType &m, bool SelectFlag=false) 
static int  CountNonManifoldVertexFF (MeshType &m, bool selectVert=true, bool clearSelection=true) 
static bool  IsWaterTight (MeshType &m) 
static int  MeshGenus (int nvert, int nedges, int nfaces, int numholes, int numcomponents) 
static void  IsRegularMesh (MeshType &m, bool &Regular, bool &Semiregular) 
static void  FlipMesh (MeshType &m, bool selected=false) 
Flip the orientation of the whole mesh flipping all the faces (by swapping the first two vertices)  
static bool  FlipNormalOutside (MeshType &m) 
static bool  IsSizeConsistent (MeshType &m) 
static bool  IsFFAdjacencyConsistent (MeshType &m) 
static bool  HasConsistentPerWedgeTexCoord (MeshType &m) 
static bool  HasZeroTexCoordFace (MeshType &m) 
static bool  TestFaceFaceIntersection (FaceType *f0, FaceType *f1) 
static int  MergeCloseVertex (MeshType &m, const ScalarType radius) 
static std::pair< int, int >  RemoveSmallConnectedComponentsDiameter (MeshType &m, ScalarType maxDiameter) 
Remove the connected components smaller than a given diameter.  
static std::pair< int, int >  RemoveHugeConnectedComponentsDiameter (MeshType &m, ScalarType minDiameter) 
Remove the connected components greater than a given diameter.  
static void  SelectFoldedFaceFromOneRingFaces (MeshType &m, ScalarType cosThreshold) 
static int  SelectIntersectingFaces (MeshType &m1, MeshType &m2) 
Class of static functions to clean//restore meshs.

inlinestatic 
The number of polygonal faces is FN  EN_f (each faux edge hides exactly one triangular face or in other words a polygon of n edges has n3 faux edges.) In the general case where a The number of polygonal faces is FN  EN_f + VN_f where: EN_f is the number of faux edges. VN_f is the number of faux vertices (e.g vertices completely surrounded by faux edges) as a intuitive proof think to a internal vertex that is collapsed onto a border of a polygon: it deletes 2 faces, 1 faux edges and 1 vertex so to keep the balance you have to add back the removed vertex.

inlinestatic 

inlinestatic 

inlinestatic 

inlinestatic 

inlinestatic 

inlinestatic 

inlinestatic 

inlinestatic 

inlinestatic 

inlinestatic 

inlinestatic 

inlinestatic 

inlinestatic 

inlinestatic 

inlinestatic 

inlinestatic 
Check if the given mesh is regular, semiregular or irregular.
Each vertex of a regular mesh has valence 6 except for border vertices which have valence 4.
A semiregular mesh is derived from an irregular one applying 1to4 subdivision recursively. (not checked for now)
All other meshes are irregular.

inlinestatic 

inlinestatic 
Very simple test of water tightness. No boundary and no non manifold edges. Assume that it is orientable. It could be debated if a closed non orientable surface is watertight or not.
The rationale of not testing orientability here is that it requires FFAdj while this test do not require any adjacency.

inlinestatic 

inlinestatic 
GENUS. A topologically invariant property of a surface defined as the largest number of nonintersecting simple closed curves that can be drawn on the surface without separating it.
Roughly speaking, it is the number of holes in a surface. The genus g of a closed surface, also called the geometric genus, is related to the Euler characteristic by the relation $chi$ by $chi==22g$.
The genus of a connected, orientable surface is an integer representing the maximum number of cuttings along closed simple curves without rendering the resultant manifold disconnected. It is equal to the number of handles on it.
For general polyhedra the Euler Formula is:
V  E + F = 2  2G  B
where V is the number of vertices, F is the number of faces, E is the number of edges, G is the genus and B is the number of boundary polygons.
The above formula is valid for a mesh with one single connected component. By considering multiple connected components the formula becomes:
V  E + F = 2C  2Gs  B > 2Gs =  ( VE+F +B 2C)
where C is the number of connected components and Gs is the sum of the genus of all connected components.
Note that in the case of a mesh with boundaries the intuitive meaning of Genus is less intuitive that it could seem. A closed sphere, a sphere with one hole (e.g. a disk) and a sphere with two holes (e.g. a tube) all of them have Genus == 0

inlinestatic 
Degenerate faces are faces that are Topologically degenerate, i.e. have two or more vertex reference that link the same vertex (and not only two vertexes with the same coordinates). All Degenerate faces are zero area faces BUT not all zero area faces are degenerate. We do not take care of topology because when we have degenerate faces the topology calculation functions crash.

inlinestatic 

inlinestatic 
This function removes all duplicate faces of the mesh by looking only at their vertex reference. So it should be called after unification of vertices. Note that it does not update any topology relation that could be affected by this like the VT or TT relation. the reason this function is usually performed BEFORE building any topology information.

inlinestatic 
This function removes all duplicate faces of the mesh by looking only at their vertex reference. So it should be called after unification of vertices. Note that it does not update any topology relation that could be affected by this like the VT or TT relation. the reason this function is usually performed BEFORE building any topology information.

inlinestatic 
This function removes all duplicate vertices of the mesh by looking only at their spatial positions. Note that it does not update any topology relation that could be affected by this like the VT or TT relation. the reason this function is usually performed BEFORE building any topology information.

inlinestatic 

inlinestatic 

inlinestatic 

inlinestatic 

inlinestatic 
Select the folded faces using an angle threshold on the face normal. The face is selected if the dot product between the face normal and the normal of the plane fitted using the vertices of the one ring faces is below the cosThreshold. The cosThreshold requires a negative cosine value (a positive value is clamp to zero).

inlinestatic 

inlinestatic 

inlinestatic 

inlinestatic 
This function test if two triangular faces of a mesh intersect. It assumes that the faces (as storage) are different (e.g different address) If the two faces are different but coincident (same set of vertexes) return true. if the faces share an edge no test is done. if the faces share only a vertex, the opposite edge is tested against the face