Public Types | Public Member Functions | Protected Member Functions | Private Member Functions | Private Attributes | List of all members
SurgSim::DataStructures::TriangleMeshBase< VertexData, EdgeData, TriangleData > Class Template Reference

Basic class for storing Triangle Meshes, handling basic vertex, edge, and triangle functionality. More...

#include <SurgSim/DataStructures/TriangleMeshBase.h>

Inheritance diagram for SurgSim::DataStructures::TriangleMeshBase< VertexData, EdgeData, TriangleData >:
SurgSim::DataStructures::Vertices< VertexData >

Public Types

typedef MeshElement< 2, EdgeData > EdgeType
 Edge type for convenience (Ids of the 2 vertices) More...
 
typedef MeshElement< 3, TriangleData > TriangleType
 Triangle type for convenience (Ids of the 3 vertices) More...
 
- Public Types inherited from SurgSim::DataStructures::Vertices< VertexData >
typedef Vertex< VertexData > VertexType
 Vertex type for convenience. More...
 

Public Member Functions

 TriangleMeshBase ()
 Constructor. The mesh is initially empty (no vertices, no edges, no triangles). More...
 
template<class VertexDataSource , class EdgeDataSource , class TriangleDataSource >
 TriangleMeshBase (const TriangleMeshBase< VertexDataSource, EdgeDataSource, TriangleDataSource > &mesh)
 Copy constructor. More...
 
virtual ~TriangleMeshBase ()
 Destructor. More...
 
size_t addEdge (const EdgeType &edge)
 Adds an edge to the mesh. More...
 
size_t addTriangle (const TriangleType &triangle)
 Adds a triangle to the mesh. More...
 
size_t getNumEdges () const
 Get the number of edges. More...
 
size_t getNumTriangles () const
 Get the number of triangles. More...
 
const std::vector< EdgeType > & getEdges () const
 Retrieve all edges. More...
 
std::vector< EdgeType > & getEdges ()
 Retrieve all edges (non const version) More...
 
const std::vector< TriangleType > & getTriangles () const
 Retrieve all triangles. More...
 
std::vector< TriangleType > & getTriangles ()
 Retrieve all triangles (non const version) More...
 
const EdgeTypegetEdge (size_t id) const
 Retrieve a specific edge. More...
 
EdgeTypegetEdge (size_t id)
 Retrieve a specific edge (non const version) More...
 
const TriangleTypegetTriangle (size_t id) const
 Retrieve a specific triangle. More...
 
TriangleTypegetTriangle (size_t id)
 Retrieve a specific triangle (non const version) More...
 
void removeTriangle (size_t id)
 Marks a triangle as invalid, the triangle cannot be accessed via getTriangle anymore. More...
 
std::array< SurgSim::Math::Vector3d, 3 > getTrianglePositions (size_t id) const
 Returns an array of the triangle's vertices' positions. More...
 
bool isValid () const
 Test if the TriangleMeshBase is valid (valid vertex Ids used in all MeshElements) More...
 
- Public Member Functions inherited from SurgSim::DataStructures::Vertices< VertexData >
 Vertices ()
 Constructor. The mesh is initially empty (no vertices). More...
 
virtual ~Vertices ()
 Destructor. More...
 
void clear ()
 Clear mesh to return to an empty state (no vertices). More...
 
void update ()
 Performs any updates that are required when the vertices are modified. More...
 
size_t addVertex (const VertexType &vertex)
 Adds a vertex to the mesh. More...
 
size_t getNumVertices () const
 Returns the number of vertices in this mesh. More...
 
const VertexTypegetVertex (size_t id) const
 Returns the specified vertex. More...
 
VertexTypegetVertex (size_t id)
 Returns the specified vertex (non const version). More...
 
const std::vector< VertexType > & getVertices () const
 Returns a vector containing the position of each vertex. More...
 
std::vector< VertexType > & getVertices ()
 Returns a vector containing the position of each vertex (non const version). More...
 
void setVertexPosition (size_t id, const SurgSim::Math::Vector3d &position)
 Sets the position of a vertex. More...
 
const SurgSim::Math::Vector3dgetVertexPosition (size_t id) const
 Returns the position of a vertex. More...
 
void setVertexPositions (const std::vector< SurgSim::Math::Vector3d > &positions, bool doUpdate=true)
 Sets the position of each vertex. More...
 
bool operator== (const Vertices &mesh) const
 Compares the mesh with another one (equality) More...
 
bool operator!= (const Vertices &mesh) const
 Compares the mesh with another one (inequality) More...
 

Protected Member Functions

virtual void doClearEdges ()
 Remove all edges from the mesh. More...
 
virtual void doClearTriangles ()
 Remove all triangles from the mesh. More...
 
virtual bool isEqual (const Vertices< VertexData > &mesh) const
 Internal comparison of meshes of the same type: returns true if equal, false if not equal. More...
 
- Protected Member Functions inherited from SurgSim::DataStructures::Vertices< VertexData >
virtual void doClearVertices ()
 Remove all vertices from the mesh. More...
 

Private Member Functions

virtual void doClear ()
 Clear mesh to return to an empty state (no vertices, no edges, no triangles). More...
 

Private Attributes

std::vector< EdgeTypem_edges
 Edges. More...
 
std::vector< TriangleTypem_triangles
 Triangles. More...
 
std::vector< size_t > m_freeTriangles
 List of indices of deleted triangles, to be reused when another triangle is added. More...
 

Detailed Description

template<class VertexData, class EdgeData, class TriangleData>
class SurgSim::DataStructures::TriangleMeshBase< VertexData, EdgeData, TriangleData >

Basic class for storing Triangle Meshes, handling basic vertex, edge, and triangle functionality.

TriangleMeshBase is to be used purely as a data structure and not provide implementation of algorithms. For example, a physics 2D FEM is not a subclass of TriangleMeshBase, but may use a TriangleMeshBase for storing the structure of the FEM.

It is recommended that subclasses with a specific purpose (such as for use in collision detection) provide convenience methods for creation of vertices, edges, and triangles and the data each contains. Methods such as createVertex(position, other data...), createEdge(vertices, other data...), and createTriangle(vertices, other data...) simplify the creation of vertices and elements and the data required. These methods would use the addVertex(), addEdge(), and addTriangle() methods to add the created vertices and elements to the TriangleMeshBase.

Overriding isEqual(const Mesh&) is necessary to do more than just basic list comparison of the vertices, edges, and triangles, which is dependent on order in the list.

Override doUpdate() to provide update functionality when vertices are changes, such as recalculating surface normals.

A subclass that is designed for a specific use (such as collision detection) may also specify the VertexData, EdgeData, and TriangleData to what is required.

Template Parameters
VertexDataType of extra data stored in each vertex
EdgeDataType of extra data stored in each edge
TriangleDataType of extra data stored in each triangle
See also
Vertex
MeshElement

Member Typedef Documentation

template<class VertexData, class EdgeData, class TriangleData>
typedef MeshElement<2, EdgeData> SurgSim::DataStructures::TriangleMeshBase< VertexData, EdgeData, TriangleData >::EdgeType

Edge type for convenience (Ids of the 2 vertices)

template<class VertexData, class EdgeData, class TriangleData>
typedef MeshElement<3, TriangleData> SurgSim::DataStructures::TriangleMeshBase< VertexData, EdgeData, TriangleData >::TriangleType

Triangle type for convenience (Ids of the 3 vertices)

Constructor & Destructor Documentation

template<class VertexData , class EdgeData , class TriangleData >
SurgSim::DataStructures::TriangleMeshBase< VertexData, EdgeData, TriangleData >::TriangleMeshBase ( )

Constructor. The mesh is initially empty (no vertices, no edges, no triangles).

template<class VertexData , class EdgeData , class TriangleData >
template<class VertexDataSource , class EdgeDataSource , class TriangleDataSource >
SurgSim::DataStructures::TriangleMeshBase< VertexData, EdgeData, TriangleData >::TriangleMeshBase ( const TriangleMeshBase< VertexDataSource, EdgeDataSource, TriangleDataSource > &  mesh)
explicit

Copy constructor.

Template Parameters
VertexDataSourceType of extra data stored in each vertex
EdgeDataSourceType of extra data stored in each edge
TriangleDataSourceType of extra data stored in each triangle
Parameters
meshThe mesh to be copied from. Vertex, edge and triangle data will be emptied.
Note
: Data of the input mesh, i.e. VertexDataSource, EdgeDataSource and TrianleDataSource will not be copied.
template<class VertexData , class EdgeData , class TriangleData >
SurgSim::DataStructures::TriangleMeshBase< VertexData, EdgeData, TriangleData >::~TriangleMeshBase ( )
virtual

Destructor.

Member Function Documentation

template<class VertexData , class EdgeData , class TriangleData >
size_t SurgSim::DataStructures::TriangleMeshBase< VertexData, EdgeData, TriangleData >::addEdge ( const EdgeType edge)

Adds an edge to the mesh.

No checking on the edge's vertices is performed. Recommend that subclasses with a specific purpose (such as for use in collision detection) have a createEdge(vertices, other data...) method which performs any checking desired and sets up the edge data based on the vertices and other parameters.

Parameters
edgeEdge to add to the mesh
Returns
Unique ID of the new edge.
template<class VertexData , class EdgeData , class TriangleData >
size_t SurgSim::DataStructures::TriangleMeshBase< VertexData, EdgeData, TriangleData >::addTriangle ( const TriangleType triangle)

Adds a triangle to the mesh.

Parameters
triangleTriangle to add to the mesh Recommend that subclasses with a specific purpose (such as for use in collision detection) have a createTriangle(vertices, other data...) method which performs any checking desired and sets up the triangle data based on the vertices and other parameters.
Note
The ids of deleted triangles will be reused in no particular order
Returns
id of the new triangle.
template<class VertexData , class EdgeData , class TriangleData >
void SurgSim::DataStructures::TriangleMeshBase< VertexData, EdgeData, TriangleData >::doClear ( )
privatevirtual

Clear mesh to return to an empty state (no vertices, no edges, no triangles).

Reimplemented from SurgSim::DataStructures::Vertices< VertexData >.

template<class VertexData , class EdgeData , class TriangleData >
void SurgSim::DataStructures::TriangleMeshBase< VertexData, EdgeData, TriangleData >::doClearEdges ( )
protectedvirtual

Remove all edges from the mesh.

template<class VertexData , class EdgeData , class TriangleData >
void SurgSim::DataStructures::TriangleMeshBase< VertexData, EdgeData, TriangleData >::doClearTriangles ( )
protectedvirtual

Remove all triangles from the mesh.

template<class VertexData , class EdgeData , class TriangleData >
const TriangleMeshBase< VertexData, EdgeData, TriangleData >::EdgeType & SurgSim::DataStructures::TriangleMeshBase< VertexData, EdgeData, TriangleData >::getEdge ( size_t  id) const

Retrieve a specific edge.

Parameters
idthe edge to be retrieved.
Returns
the specified edge.
template<class VertexData , class EdgeData , class TriangleData >
TriangleMeshBase< VertexData, EdgeData, TriangleData >::EdgeType & SurgSim::DataStructures::TriangleMeshBase< VertexData, EdgeData, TriangleData >::getEdge ( size_t  id)

Retrieve a specific edge (non const version)

Parameters
idthe edge to be retrieved.
Returns
the specified edge.
template<class VertexData , class EdgeData , class TriangleData >
const std::vector< typename TriangleMeshBase< VertexData, EdgeData, TriangleData >::EdgeType > & SurgSim::DataStructures::TriangleMeshBase< VertexData, EdgeData, TriangleData >::getEdges ( ) const

Retrieve all edges.

Returns
a vector containing the position of each edge.
template<class VertexData , class EdgeData , class TriangleData >
std::vector< typename TriangleMeshBase< VertexData, EdgeData, TriangleData >::EdgeType > & SurgSim::DataStructures::TriangleMeshBase< VertexData, EdgeData, TriangleData >::getEdges ( )

Retrieve all edges (non const version)

Returns
a vector containing the position of each edge.
template<class VertexData , class EdgeData , class TriangleData >
size_t SurgSim::DataStructures::TriangleMeshBase< VertexData, EdgeData, TriangleData >::getNumEdges ( ) const

Get the number of edges.

Returns
the number of edges in this mesh.
template<class VertexData , class EdgeData , class TriangleData >
size_t SurgSim::DataStructures::TriangleMeshBase< VertexData, EdgeData, TriangleData >::getNumTriangles ( ) const

Get the number of triangles.

Note
The number of triangles might not match the size of the array returned by getTriangles(), after deletion has occurred it cannot be used to access all triangles.
Returns
the number of triangles in this mesh.
template<class VertexData , class EdgeData , class TriangleData >
const TriangleMeshBase< VertexData, EdgeData, TriangleData >::TriangleType & SurgSim::DataStructures::TriangleMeshBase< VertexData, EdgeData, TriangleData >::getTriangle ( size_t  id) const

Retrieve a specific triangle.

Exceptions
SurgSim::Framework::AssertionFailureif the given triangle was deleted
Parameters
idThe id of the triangle to retrieve
Returns
the specified triangle
template<class VertexData , class EdgeData , class TriangleData >
TriangleMeshBase< VertexData, EdgeData, TriangleData >::TriangleType & SurgSim::DataStructures::TriangleMeshBase< VertexData, EdgeData, TriangleData >::getTriangle ( size_t  id)

Retrieve a specific triangle (non const version)

Exceptions
SurgSim::Framework::AssertionFailureif the give triangle was deleted
Parameters
idThe id of the triangle to retrieve
Returns
the specified triangle
template<class VertexData , class EdgeData , class TriangleData >
std::array< SurgSim::Math::Vector3d, 3 > SurgSim::DataStructures::TriangleMeshBase< VertexData, EdgeData, TriangleData >::getTrianglePositions ( size_t  id) const

Returns an array of the triangle's vertices' positions.

Parameters
idthe id of the triangle
Returns
an array of the triangle's vertices' positions
template<class VertexData , class EdgeData , class TriangleData >
const std::vector< typename TriangleMeshBase< VertexData, EdgeData, TriangleData >::TriangleType > & SurgSim::DataStructures::TriangleMeshBase< VertexData, EdgeData, TriangleData >::getTriangles ( ) const

Retrieve all triangles.

Note
The number of triangles might not match the size of the array returned by getTriangles(), after deletion has occurred it cannot be used to access all triangles. When processing this array, check
See also
TriangleType::isValid to see wether to do something with this triangle
Returns
a vector containing the position of each triangle. Some of these triangles might be deleted, they need to be checked via
See also
isValid before further processing
template<class VertexData , class EdgeData , class TriangleData >
std::vector< typename TriangleMeshBase< VertexData, EdgeData, TriangleData >::TriangleType > & SurgSim::DataStructures::TriangleMeshBase< VertexData, EdgeData, TriangleData >::getTriangles ( )

Retrieve all triangles (non const version)

Note
The number of triangles might not match the size of the array returned by getTriangles(), after deletion has occurred it cannot be used to access all triangles. When processing this array, check
See also
TriangleType::isValid to see wether to do something with this triangle
Returns
a vector containing the position of each triangle. Some of these triangles might be deleted, they need to be checked via
See also
isValid before further processing
template<class VertexData, class EdgeData , class TriangleData >
bool SurgSim::DataStructures::TriangleMeshBase< VertexData, EdgeData, TriangleData >::isEqual ( const Vertices< VertexData > &  mesh) const
protectedvirtual

Internal comparison of meshes of the same type: returns true if equal, false if not equal.

Override this method to provide custom comparison. Basic TriangleMeshBase implementation compares vertices, edges and triangles: the order of vertices, edges, and triangles must also match to be considered equal.

Parameters
meshMesh must be of the same type as that which it is compared against
Returns
True if the vertices are equals, False otherwise

Reimplemented from SurgSim::DataStructures::Vertices< VertexData >.

template<class VertexData , class EdgeData , class TriangleData >
bool SurgSim::DataStructures::TriangleMeshBase< VertexData, EdgeData, TriangleData >::isValid ( ) const

Test if the TriangleMeshBase is valid (valid vertex Ids used in all MeshElements)

Returns
True if the TriangleMeshBase is valid, False otherwise (the topology is then broken)
template<class VertexData , class EdgeData , class TriangleData >
void SurgSim::DataStructures::TriangleMeshBase< VertexData, EdgeData, TriangleData >::removeTriangle ( size_t  id)

Marks a triangle as invalid, the triangle cannot be accessed via getTriangle anymore.

Note
users of getTriangles() will have to check for deleted triangles if this feature is used the size of the vector returned by getTriangles does not reflect the number of triangles anymore use getNumTriangles() to figure out the correct number.
Parameters
idtriangle to delete

Member Data Documentation

template<class VertexData, class EdgeData, class TriangleData>
std::vector<EdgeType> SurgSim::DataStructures::TriangleMeshBase< VertexData, EdgeData, TriangleData >::m_edges
private

Edges.

template<class VertexData, class EdgeData, class TriangleData>
std::vector<size_t> SurgSim::DataStructures::TriangleMeshBase< VertexData, EdgeData, TriangleData >::m_freeTriangles
private

List of indices of deleted triangles, to be reused when another triangle is added.

template<class VertexData, class EdgeData, class TriangleData>
std::vector<TriangleType> SurgSim::DataStructures::TriangleMeshBase< VertexData, EdgeData, TriangleData >::m_triangles
private

Triangles.


The documentation for this class was generated from the following files: