A class for representing polygon surface meshes. More...
#include <pmp/surface_mesh.h>
Classes | |
class | EdgeAroundVertexCirculator |
this class circulates through all edges incident to a vertex. More... | |
class | EdgeContainer |
helper class for iterating through all edges using range-based for-loops. More... | |
class | EdgeIterator |
this class iterates linearly over all edges More... | |
class | FaceAroundVertexCirculator |
this class circulates through all incident faces of a vertex. More... | |
class | FaceContainer |
helper class for iterating through all faces using range-based for-loops. More... | |
class | FaceIterator |
this class iterates linearly over all faces More... | |
class | HalfedgeAroundFaceCirculator |
this class circulates through all halfedges of a face. More... | |
class | HalfedgeAroundVertexCirculator |
this class circulates through all outgoing halfedges of a vertex. More... | |
class | HalfedgeContainer |
helper class for iterating through all halfedges using range-based for-loops. More... | |
class | HalfedgeIterator |
this class iterates linearly over all halfedges More... | |
class | VertexAroundFaceCirculator |
this class circulates through the vertices of a face. More... | |
class | VertexAroundVertexCirculator |
this class circulates through all one-ring neighbors of a vertex. More... | |
class | VertexContainer |
helper class for iterating through all vertices using range-based for-loops. More... | |
class | VertexIterator |
An iterator class to iterate linearly over all vertices. More... | |
Public Member Functions | |
Construction, destruction, assignment | |
SurfaceMesh () | |
default constructor | |
virtual | ~SurfaceMesh () |
destructor | |
SurfaceMesh (const SurfaceMesh &rhs) | |
copy constructor: copies rhs to *this . | |
SurfaceMesh & | operator= (const SurfaceMesh &rhs) |
assign rhs to *this . performs a deep copy of all properties. | |
SurfaceMesh & | assign (const SurfaceMesh &rhs) |
assign rhs to *this . does not copy custom properties. | |
Add new elements by hand | |
Vertex | add_vertex (const Point &p) |
add a new vertex with position p | |
Face | add_face (const std::vector< Vertex > &vertices) |
Add a new face with vertex list vertices . | |
Face | add_triangle (Vertex v0, Vertex v1, Vertex v2) |
add a new triangle connecting vertices v0 , v1 , v2 | |
Face | add_quad (Vertex v0, Vertex v1, Vertex v2, Vertex v3) |
add a new quad connecting vertices v0 , v1 , v2 , v3 | |
Memory Management | |
size_t | vertices_size () const |
size_t | halfedges_size () const |
size_t | edges_size () const |
size_t | faces_size () const |
size_t | n_vertices () const |
size_t | n_halfedges () const |
size_t | n_edges () const |
size_t | n_faces () const |
bool | is_empty () const |
virtual void | clear () |
clear mesh: remove all vertices, edges, faces | |
void | free_memory () |
remove unused memory from vectors | |
void | reserve (size_t nvertices, size_t nedges, size_t nfaces) |
reserve memory (mainly used in file readers) | |
void | garbage_collection () |
remove deleted elements | |
bool | is_deleted (Vertex v) const |
bool | is_deleted (Halfedge h) const |
bool | is_deleted (Edge e) const |
bool | is_deleted (Face f) const |
bool | is_valid (Vertex v) const |
bool | is_valid (Halfedge h) const |
bool | is_valid (Edge e) const |
bool | is_valid (Face f) const |
Low-level connectivity | |
Halfedge | halfedge (Vertex v) const |
void | set_halfedge (Vertex v, Halfedge h) |
set the outgoing halfedge of vertex v to h | |
bool | is_boundary (Vertex v) const |
bool | is_isolated (Vertex v) const |
bool | is_manifold (Vertex v) const |
Vertex | to_vertex (Halfedge h) const |
Vertex | from_vertex (Halfedge h) const |
void | set_vertex (Halfedge h, Vertex v) |
sets the vertex the halfedge h points to to v | |
Face | face (Halfedge h) const |
void | set_face (Halfedge h, Face f) |
sets the incident face to halfedge h to f | |
Halfedge | next_halfedge (Halfedge h) const |
void | set_next_halfedge (Halfedge h, Halfedge nh) |
sets the next halfedge of h within the face to nh | |
void | set_prev_halfedge (Halfedge h, Halfedge ph) |
sets the previous halfedge of h and the next halfedge of ph to nh | |
Halfedge | prev_halfedge (Halfedge h) const |
Halfedge | opposite_halfedge (Halfedge h) const |
Halfedge | ccw_rotated_halfedge (Halfedge h) const |
Halfedge | cw_rotated_halfedge (Halfedge h) const |
Edge | edge (Halfedge h) const |
bool | is_boundary (Halfedge h) const |
Halfedge | halfedge (Edge e, unsigned int i) const |
Vertex | vertex (Edge e, unsigned int i) const |
Face | face (Edge e, unsigned int i) const |
bool | is_boundary (Edge e) const |
Halfedge | halfedge (Face f) const |
void | set_halfedge (Face f, Halfedge h) |
sets the halfedge of face f to h | |
bool | is_boundary (Face f) const |
Property handling | |
template<class T > | |
VertexProperty< T > | add_vertex_property (const std::string &name, const T t=T()) |
add a vertex property of type T with name name and default value t . | |
template<class T > | |
VertexProperty< T > | get_vertex_property (const std::string &name) const |
get the vertex property named name of type T . | |
template<class T > | |
VertexProperty< T > | vertex_property (const std::string &name, const T t=T()) |
if a vertex property of type T with name name exists, it is returned. | |
template<class T > | |
void | remove_vertex_property (VertexProperty< T > &p) |
remove the vertex property p | |
bool | has_vertex_property (const std::string &name) const |
does the mesh have a vertex property with name name ? | |
template<class T > | |
HalfedgeProperty< T > | add_halfedge_property (const std::string &name, const T t=T()) |
add a halfedge property of type T with name name and default value t . | |
template<class T > | |
EdgeProperty< T > | add_edge_property (const std::string &name, const T t=T()) |
add a edge property of type T with name name and default value t . | |
template<class T > | |
HalfedgeProperty< T > | get_halfedge_property (const std::string &name) const |
get the halfedge property named name of type T . | |
template<class T > | |
EdgeProperty< T > | get_edge_property (const std::string &name) const |
get the edge property named name of type T . | |
template<class T > | |
HalfedgeProperty< T > | halfedge_property (const std::string &name, const T t=T()) |
if a halfedge property of type T with name name exists, it is returned. | |
template<class T > | |
EdgeProperty< T > | edge_property (const std::string &name, const T t=T()) |
if an edge property of type T with name name exists, it is returned. | |
template<class T > | |
void | remove_halfedge_property (HalfedgeProperty< T > &p) |
remove the halfedge property p | |
bool | has_halfedge_property (const std::string &name) const |
does the mesh have a halfedge property with name name ? | |
template<class T > | |
void | remove_edge_property (EdgeProperty< T > &p) |
remove the edge property p | |
bool | has_edge_property (const std::string &name) const |
does the mesh have an edge property with name name ? | |
std::vector< std::string > | vertex_properties () const |
std::vector< std::string > | halfedge_properties () const |
std::vector< std::string > | edge_properties () const |
template<class T > | |
FaceProperty< T > | add_face_property (const std::string &name, const T t=T()) |
add a face property of type T with name name and default value t . | |
template<class T > | |
FaceProperty< T > | get_face_property (const std::string &name) const |
get the face property named name of type T . | |
template<class T > | |
FaceProperty< T > | face_property (const std::string &name, const T t=T()) |
if a face property of type T with name name exists, it is returned. | |
template<class T > | |
void | remove_face_property (FaceProperty< T > &p) |
remove the face property p | |
bool | has_face_property (const std::string &name) const |
does the mesh have a face property with name name ? | |
std::vector< std::string > | face_properties () const |
Iterators and circulators | |
VertexIterator | vertices_begin () const |
VertexIterator | vertices_end () const |
VertexContainer | vertices () const |
HalfedgeIterator | halfedges_begin () const |
HalfedgeIterator | halfedges_end () const |
HalfedgeContainer | halfedges () const |
EdgeIterator | edges_begin () const |
EdgeIterator | edges_end () const |
EdgeContainer | edges () const |
VertexAroundVertexCirculator | vertices (Vertex v) const |
EdgeAroundVertexCirculator | edges (Vertex v) const |
HalfedgeAroundVertexCirculator | halfedges (Vertex v) const |
FaceIterator | faces_begin () const |
FaceIterator | faces_end () const |
FaceContainer | faces () const |
FaceAroundVertexCirculator | faces (Vertex v) const |
VertexAroundFaceCirculator | vertices (Face f) const |
HalfedgeAroundFaceCirculator | halfedges (Face f) const |
Higher-level Topological Operations | |
Halfedge | insert_vertex (Edge e, const Point &p) |
Subdivide the edge e = (v0,v1) by splitting it into the two edge (v0,p) and (p,v1). | |
Halfedge | insert_vertex (Edge e, Vertex v) |
Subdivide the edge e = (v0,v1) by splitting it into the two edge (v0,v) and (v,v1). | |
Halfedge | insert_vertex (Halfedge h0, Vertex v) |
Subdivide the halfedge h = (v0,v1) by splitting it into the two halfedges (v0,v) and (v,v1). | |
Halfedge | find_halfedge (Vertex start, Vertex end) const |
find the halfedge from start to end | |
Edge | find_edge (Vertex a, Vertex b) const |
find the edge (a,b) | |
bool | is_triangle_mesh () const |
bool | is_quad_mesh () const |
bool | is_collapse_ok (Halfedge v0v1) const |
void | collapse (Halfedge h) |
Collapse the halfedge h by moving its start vertex into its target vertex. | |
bool | is_removal_ok (Edge e) const |
bool | remove_edge (Edge e) |
Remove edge and merge its two incident faces into one. | |
Vertex | split (Face f, const Point &p) |
Split the face f by first adding point p to the mesh and then inserting edges between p and the vertices of f . | |
void | split (Face f, Vertex v) |
Split the face f by inserting edges between v and the vertices of f . | |
Halfedge | split (Edge e, const Point &p) |
Split the edge e by first adding point p to the mesh and then connecting it to the two vertices of the adjacent triangles that are opposite to edge e . | |
Halfedge | split (Edge e, Vertex v) |
Split the edge e by connecting vertex v it to the two vertices of the adjacent triangles that are opposite to edge e . | |
Halfedge | insert_edge (Halfedge h0, Halfedge h1) |
Insert edge between the to-vertices of h0 and h1 . | |
bool | is_flip_ok (Edge e) const |
Check whether flipping edge e is topologically OK. | |
void | flip (Edge e) |
Flip the edge e . | |
size_t | valence (Vertex v) const |
Compute the valence of vertex v (number of incident edges). | |
size_t | valence (Face f) const |
Compute the valence of face f (its number of vertices). | |
void | delete_vertex (Vertex v) |
Delete vertex v from the mesh. | |
void | delete_edge (Edge e) |
Delete edge e from the mesh. | |
void | delete_face (Face f) |
Deletes face f from the mesh. | |
Geometry-related Functions | |
const Point & | position (Vertex v) const |
position of a vertex (read only) | |
Point & | position (Vertex v) |
position of a vertex | |
std::vector< Point > & | positions () |
Allocate new elements | |
Vertex | new_vertex () |
Allocate a new vertex, resize vertex properties accordingly. | |
Halfedge | new_edge () |
Allocate a new edge, resize edge and halfedge properties accordingly. | |
Halfedge | new_edge (Vertex start, Vertex end) |
Allocate a new edge, resize edge and halfedge properties accordingly. | |
Face | new_face () |
Allocate a new face, resize face properties accordingly. | |
A class for representing polygon surface meshes.
This class implements a half-edge data structure for surface meshes. See [21] for details on the design and implementation.
|
inline |
copy constructor: copies rhs
to *this
.
performs a deep copy of all properties.
|
inline |
add a edge property of type T
with name name
and default value t
.
fails if a property named name
exists already, since the name has to be unique. in this case it returns an invalid property.
Add a new face with vertex list vertices
.
TopologyException | in case a topological error occurs. |
|
inline |
add a face property of type T
with name name
and default value t
.
fails if a property named name
exists already, since the name has to be unique. in this case it returns an invalid property
|
inline |
add a halfedge property of type T
with name name
and default value t
.
fails if a property named name
exists already, since the name has to be unique. in this case it returns an invalid property.
add a new quad connecting vertices v0
, v1
, v2
, v3
|
inline |
add a vertex property of type T
with name name
and default value t
.
fails if a property named name
exists already, since the name has to be unique. in this case it returns an invalid property
h
. it is the opposite halfedge of the previous halfedge of h
. void collapse | ( | Halfedge | h | ) |
Collapse the halfedge h
by moving its start vertex into its target vertex.
For non-boundary halfedges this function removes one vertex, three edges, and two faces. For boundary halfedges it removes one vertex, two edges and one face.
h
. it is the next halfedge of the opposite halfedge of h
. void delete_edge | ( | Edge | e | ) |
Delete edge e
from the mesh.
void delete_face | ( | Face | f | ) |
Deletes face f
from the mesh.
void delete_vertex | ( | Vertex | v | ) |
Delete vertex v
from the mesh.
h
as one of its two halfedges.
|
inline |
|
inline |
if an edge property of type T
with name name
exists, it is returned.
otherwise this property is added (with default value t
)
|
inline |
|
inline |
v
|
inline |
|
inline |
|
inline |
i'th
halfedge of edge e
. i
has to be 0 or 1.
|
inline |
|
inline |
if a face property of type T
with name name
exists, it is returned.
otherwise this property is added (with default value t
)
|
inline |
|
inline |
v
|
inline |
|
inline |
|
inline |
void flip | ( | Edge | e | ) |
Flip the edge e
.
Removes the edge e
and add an edge between the two vertices opposite to edge e
of the two incident triangles.
|
inline |
get the edge property named name
of type T
.
returns an invalid VertexProperty if the property does not exist or if the type does not match.
|
inline |
get the face property named name
of type T
.
returns an invalid VertexProperty if the property does not exist or if the type does not match.
|
inline |
get the halfedge property named name
of type T
.
returns an invalid VertexProperty if the property does not exist or if the type does not match.
|
inline |
get the vertex property named name
of type T
.
returns an invalid VertexProperty if the property does not exist or if the type does not match.
i'th
halfedge of edge e
. i
has to be 0 or 1. v
. if v
is a boundary vertex this will be a boundary halfedge.
|
inline |
|
inline |
if a halfedge property of type T
with name name
exists, it is returned.
otherwise this property is added (with default value t
)
|
inline |
|
inline |
f
|
inline |
v
|
inline |
|
inline |
|
inline |
Insert edge between the to-vertices of h0
and h1
.
h0
and h1
have to belong to the same face. Subdivide the edge e
= (v0,v1) by splitting it into the two edge (v0,p) and (p,v1).
Note that this function does not introduce any other edge or faces. It simply splits the edge. Returns halfedge that points to p
.
Subdivide the edge e
= (v0,v1) by splitting it into the two edge (v0,v) and (v,v1).
Note that this function does not introduce any other edge or faces. It simply splits the edge. Returns halfedge that points to p
.
Subdivide the halfedge h
= (v0,v1) by splitting it into the two halfedges (v0,v) and (v,v1).
Note that this function does not introduce any other edge or faces. It simply splits the edge. Returns the halfedge that points from v1 to v
.
|
inline |
e
is a boundary edge, i.e., if one of its halfedges is a boundary halfedge.
|
inline |
f
is a boundary face, i.e., it one of its edges is a boundary edge.
|
inline |
|
inline |
v
is a boundary vertex bool is_collapse_ok | ( | Halfedge | v0v1 | ) | const |
v0v1
is topologically legal.
|
inline |
e
is deleted
|
inline |
f
is deleted
|
inline |
h
is deleted
|
inline |
v
is deleted
|
inline |
bool is_flip_ok | ( | Edge | e | ) | const |
Check whether flipping edge e
is topologically OK.
|
inline |
v
is isolated, i.e., not incident to any edge
|
inline |
v
is a manifold vertex (not incident to several patches) bool is_quad_mesh | ( | ) | const |
bool is_removal_ok | ( | Edge | e | ) | const |
e
is topologically legal. bool is_triangle_mesh | ( | ) | const |
|
inline |
e
is valid.
|
inline |
f
is valid.
|
inline |
h
is valid.
|
inline |
v
is valid.
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
Allocate a new edge, resize edge and halfedge properties accordingly.
AllocationException | in case of failure to allocate a new edge. |
Allocate a new edge, resize edge and halfedge properties accordingly.
AllocationException | in case of failure to allocate a new edge. |
|
inline |
Allocate a new face, resize face properties accordingly.
AllocationException | in case of failure to allocate a new face. |
|
inline |
Allocate a new vertex, resize vertex properties accordingly.
AllocationException | in case of failure to allocate a new vertex. |
|
inline |
bool remove_edge | ( | Edge | e | ) |
Remove edge and merge its two incident faces into one.
This operation requires that the edge has two incident faces and that these two are not equal.
Split the edge e
by first adding point p
to the mesh and then connecting it to the two vertices of the adjacent triangles that are opposite to edge e
.
Returns the halfedge pointing to p
that is created by splitting the existing edge e
.
Split the edge e
by connecting vertex v
it to the two vertices of the adjacent triangles that are opposite to edge e
.
Returns the halfedge pointing to v
that is created by splitting the existing edge e
.
Split the face f
by first adding point p
to the mesh and then inserting edges between p
and the vertices of f
.
For a triangle this is a standard one-to-three split.
Split the face f
by inserting edges between v
and the vertices of f
.
For a triangle this is a standard one-to-three split.
i'th
vertex of edge e
. i
has to be 0 or 1.
|
inline |
|
inline |
if a vertex property of type T
with name name
exists, it is returned.
otherwise this property is added (with default value t
)
|
inline |
|
inline |
f
|
inline |
v
|
inline |
|
inline |
|
inline |