00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00027
#ifndef SHUTIL_SHMESH_HPP
00028
#define SHUTIL_SHMESH_HPP
00029
00030
#include <list>
00031
#include <map>
00032
#include <set>
00033
00034
#include "sh.hpp"
00035
00036
namespace ShUtil {
00037
00070
template<
typename VertexType,
typename FaceType,
typename EdgeType>
00071
struct ShMeshType {
00072
typedef VertexType Vertex;
00073
typedef FaceType Face;
00074
typedef EdgeType Edge;
00075 };
00076
00077
template<
typename M>
00078
struct ShMeshVertex {
00079
typedef typename M::Edge Edge;
00080 Edge *edge;
00081
00083 ShMeshVertex();
00084
00086 ShMeshVertex(
const ShMeshVertex<M> &other);
00087 };
00088
00089
template<
typename M>
00090
struct ShMeshFace {
00091
typedef typename M::Edge Edge;
00092 Edge *edge;
00093
00095 ShMeshFace();
00096
00098 ShMeshFace(
const ShMeshFace<M> &other);
00099 };
00100
00101
00102
template<
typename M>
00103
struct ShMeshEdge {
00104
typedef typename M::Vertex Vertex;
00105
typedef typename M::Face Face;
00106
typedef typename M::Edge Edge;
00107 Vertex *start;
00108 Vertex *end;
00109 Face *face;
00110 Edge *sym;
00111 Edge *next;
00112 Edge *prev;
00113
00115 ShMeshEdge();
00116
00118 ShMeshEdge(
const ShMeshEdge<M> &other);
00119
00122
void setLinks(Vertex *s, Vertex *e, Face *f,
00123 Edge *next, Edge *prev, Edge *sym);
00124
00126
void setNext(Edge *n);
00127
00129
void setPrev(Edge *p);
00130
00132
void setSym(Edge *s);
00133 };
00134
00135
00137
template<
typename M>
00138 class ShMesh {
00139
public:
00140
typedef M MeshType;
00141
typedef typename M::Vertex Vertex;
00142
typedef typename M::Edge Edge;
00143
typedef typename M::Face Face;
00144
00145
typedef std::set<Vertex*> VertexSet;
00146
typedef std::set<Edge*> EdgeSet;
00147
typedef std::set<Face*> FaceSet;
00148
typedef std::list<Vertex*> VertexList;
00149
00151
ShMesh();
00152
00155
ShMesh(
const ShMesh<M>& other);
00156
00158
~ShMesh();
00159
00161
ShMesh<M>&
operator=(
const ShMesh<M>& other);
00162
00164
void clear();
00165
00171 Face*
addFace(
const VertexList &vl);
00172
00176
void removeFace(Face *f);
00177
00182
template<
typename VertLess>
00183
void mergeVertices();
00184
00192
void mergeEdges();
00193
00196
bool earTriangulate();
00197
00198 VertexSet verts;
00199 EdgeSet edges;
00200 FaceSet faces;
00201
00202
protected:
00203
typedef std::map<Vertex*, Vertex*> VertexMap;
00204
typedef std::map<Edge*, Edge*> EdgeMap;
00205
typedef std::map<Face*, Face*> FaceMap;
00206
00207
00208
00209
00210
00211
00212
00213
00214
typedef std::multimap<Vertex*, Edge*> IncidenceMap;
00215
typedef typename IncidenceMap::value_type Incidence;
00216
typedef typename IncidenceMap::iterator IncidenceIterator;
00217
typedef std::pair<
typename IncidenceMap::iterator,
00218
typename IncidenceMap::iterator> IncidenceRange;
00219
00220 IncidenceMap m_incidences;
00221
00229
void removeHalfEdge(Edge *e);
00230
00232
void insertHalfEdge(Edge *e);
00233 };
00234
00235
00236 }
00237
00238
#include "ShMeshImpl.hpp"
00239
00240
#endif