Developer Documentation
TriMeshT.hh
1 /* ========================================================================= *
2  * *
3  * OpenMesh *
4  * Copyright (c) 2001-2015, RWTH-Aachen University *
5  * Department of Computer Graphics and Multimedia *
6  * All rights reserved. *
7  * www.openmesh.org *
8  * *
9  *---------------------------------------------------------------------------*
10  * This file is part of OpenMesh. *
11  *---------------------------------------------------------------------------*
12  * *
13  * Redistribution and use in source and binary forms, with or without *
14  * modification, are permitted provided that the following conditions *
15  * are met: *
16  * *
17  * 1. Redistributions of source code must retain the above copyright notice, *
18  * this list of conditions and the following disclaimer. *
19  * *
20  * 2. Redistributions in binary form must reproduce the above copyright *
21  * notice, this list of conditions and the following disclaimer in the *
22  * documentation and/or other materials provided with the distribution. *
23  * *
24  * 3. Neither the name of the copyright holder nor the names of its *
25  * contributors may be used to endorse or promote products derived from *
26  * this software without specific prior written permission. *
27  * *
28  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS *
29  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED *
30  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
31  * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER *
32  * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, *
33  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, *
34  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR *
35  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
36  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING *
37  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
38  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
39  * *
40  * ========================================================================= */
41 
42 
43 
44 
45 //=============================================================================
46 //
47 // CLASS TriMeshT
48 //
49 //=============================================================================
50 
51 
52 #ifndef OPENMESH_TRIMESH_HH
53 #define OPENMESH_TRIMESH_HH
54 
55 
56 //== INCLUDES =================================================================
57 
58 
60 #include <OpenMesh/Core/Mesh/PolyMeshT.hh>
61 #include <OpenMesh/Core/Mesh/Tags.hh>
62 #include <vector>
63 
64 
65 //== NAMESPACES ===============================================================
66 
67 
68 namespace OpenMesh {
69 
70 
71 //== CLASS DEFINITION =========================================================
72 
73 
90 template <class Kernel>
91 class TriMeshT : public PolyMeshT<Kernel>
92 {
93 
94 public:
95 
96 
97  // self
98  typedef TriMeshT<Kernel> This;
100 
102  static constexpr bool is_polymesh() { return false; }
104  static constexpr bool is_trimesh() { return true; }
106  enum { IsPolyMesh = 0 };
107  enum { IsTriMesh = 1 };
109 
110  //--- items ---
111 
112  typedef typename PolyMesh::Scalar Scalar;
113  typedef typename PolyMesh::Point Point;
114  typedef typename PolyMesh::Normal Normal;
115  typedef typename PolyMesh::Color Color;
116  typedef typename PolyMesh::TexCoord1D TexCoord1D;
117  typedef typename PolyMesh::TexCoord2D TexCoord2D;
118  typedef typename PolyMesh::TexCoord3D TexCoord3D;
119  typedef typename PolyMesh::Vertex Vertex;
120  typedef typename PolyMesh::Halfedge Halfedge;
121  typedef typename PolyMesh::Edge Edge;
122  typedef typename PolyMesh::Face Face;
123 
124 
125  //--- handles ---
126 
127  typedef typename PolyMesh::VertexHandle VertexHandle;
128  typedef typename PolyMesh::HalfedgeHandle HalfedgeHandle;
129  typedef typename PolyMesh::EdgeHandle EdgeHandle;
130  typedef typename PolyMesh::FaceHandle FaceHandle;
131 
132 
133  //--- iterators ---
134 
135  typedef typename PolyMesh::VertexIter VertexIter;
136  typedef typename PolyMesh::ConstVertexIter ConstVertexIter;
137  typedef typename PolyMesh::EdgeIter EdgeIter;
138  typedef typename PolyMesh::ConstEdgeIter ConstEdgeIter;
139  typedef typename PolyMesh::FaceIter FaceIter;
140  typedef typename PolyMesh::ConstFaceIter ConstFaceIter;
141 
142 
143 
144  //--- circulators ---
145 
149  typedef typename PolyMesh::VertexEdgeIter VertexEdgeIter;
150  typedef typename PolyMesh::VertexFaceIter VertexFaceIter;
151  typedef typename PolyMesh::FaceVertexIter FaceVertexIter;
153  typedef typename PolyMesh::FaceEdgeIter FaceEdgeIter;
154  typedef typename PolyMesh::FaceFaceIter FaceFaceIter;
164 
165  // --- constructor/destructor
166 
168  TriMeshT() : PolyMesh() {}
169  explicit TriMeshT(PolyMesh rhs) : PolyMesh((rhs.triangulate(), rhs))
170  {
171  }
172 
174  virtual ~TriMeshT() {}
175 
176  //--- halfedge collapse / vertex split ---
177 
214  inline HalfedgeHandle vertex_split(Point _v0_point, VertexHandle _v1,
215  VertexHandle _vl, VertexHandle _vr)
216  { return PolyMesh::vertex_split(this->add_vertex(_v0_point), _v1, _vl, _vr); }
217 
254  inline HalfedgeHandle vertex_split(VertexHandle _v0, VertexHandle _v1,
255  VertexHandle _vl, VertexHandle _vr)
256  { return PolyMesh::vertex_split(_v0, _v1, _vl, _vr); }
257 
267  inline VertexHandle split(EdgeHandle _eh, const Point& _p)
268  {
269  //Do not call PolyMeshT function below as this does the wrong operation
270  const VertexHandle vh = this->add_vertex(_p); Kernel::split(_eh, vh); return vh;
271  }
272 
281  inline VertexHandle split_copy(EdgeHandle _eh, const Point& _p)
282  {
283  //Do not call PolyMeshT function below as this does the wrong operation
284  const VertexHandle vh = this->add_vertex(_p); Kernel::split_copy(_eh, vh); return vh;
285  }
286 
294  inline void split(EdgeHandle _eh, VertexHandle _vh)
295  {
296  //Do not call PolyMeshT function below as this does the wrong operation
297  Kernel::split(_eh, _vh);
298  }
299 
307  inline void split_copy(EdgeHandle _eh, VertexHandle _vh)
308  {
309  //Do not call PolyMeshT function below as this does the wrong operation
310  Kernel::split_copy(_eh, _vh);
311  }
312 
322  inline VertexHandle split(FaceHandle _fh, const Point& _p)
323  { const VertexHandle vh = this->add_vertex(_p); PolyMesh::split(_fh, vh); return vh; }
324 
334  inline VertexHandle split_copy(FaceHandle _fh, const Point& _p)
335  { const VertexHandle vh = this->add_vertex(_p); PolyMesh::split_copy(_fh, vh); return vh; }
336 
337 
342  inline void split(FaceHandle _fh)
343  {
344  // Collect halfedges of face
345  HalfedgeHandle he0 = this->halfedge_handle(_fh);
346  HalfedgeHandle he1 = this->next_halfedge_handle(he0);
347  HalfedgeHandle he2 = this->next_halfedge_handle(he1);
348 
349  EdgeHandle eh0 = this->edge_handle(he0);
350  EdgeHandle eh1 = this->edge_handle(he1);
351  EdgeHandle eh2 = this->edge_handle(he2);
352 
353  // Collect points of face
354  VertexHandle p0 = this->to_vertex_handle(he0);
355  VertexHandle p1 = this->to_vertex_handle(he1);
356  VertexHandle p2 = this->to_vertex_handle(he2);
357 
358  // Calculate midpoint coordinates
359  const Point new0 = (this->point(p0) + this->point(p2)) * static_cast<typename vector_traits<Point>::value_type >(0.5);
360  const Point new1 = (this->point(p0) + this->point(p1)) * static_cast<typename vector_traits<Point>::value_type >(0.5);
361  const Point new2 = (this->point(p1) + this->point(p2)) * static_cast<typename vector_traits<Point>::value_type >(0.5);
362 
363  // Add vertices at midpoint coordinates
364  VertexHandle v0 = this->add_vertex(new0);
365  VertexHandle v1 = this->add_vertex(new1);
366  VertexHandle v2 = this->add_vertex(new2);
367 
368  const bool split0 = !this->is_boundary(eh0);
369  const bool split1 = !this->is_boundary(eh1);
370  const bool split2 = !this->is_boundary(eh2);
371 
372  // delete original face
373  this->delete_face(_fh);
374 
375  // split boundary edges of deleted face ( if not boundary )
376  if ( split0 ) {
377  this->split(eh0,v0);
378  }
379 
380  if ( split1 ) {
381  this->split(eh1,v1);
382  }
383 
384  if ( split2 ) {
385  this->split(eh2,v2);
386  }
387 
388  // Retriangulate
389  this->add_face(v0 , p0, v1);
390  this->add_face(p2, v0 , v2);
391  this->add_face(v2,v1,p1);
392  this->add_face(v2 , v0, v1);
393  }
394 
402  inline void split(FaceHandle _fh, VertexHandle _vh)
403  { PolyMesh::split(_fh, _vh); }
404 
412  inline void split_copy(FaceHandle _fh, VertexHandle _vh)
413  { PolyMesh::split_copy(_fh, _vh); }
414 
418 
420  Normal calc_face_normal(FaceHandle _fh) const;
421 
423 };
424 
425 
426 //=============================================================================
427 } // namespace OpenMesh
428 //=============================================================================
429 #if defined(OM_INCLUDE_TEMPLATES) && !defined(OPENMESH_TRIMESH_C)
430 #define OPENMESH_TRIMESH_TEMPLATES
431 #include "TriMeshT_impl.hh"
432 #endif
433 //=============================================================================
434 #endif // OPENMESH_TRIMESH_HH defined
435 //=============================================================================
Kernel::Halfedge Halfedge
Halfedge type.
Definition: PolyMeshT.hh:126
HalfedgeHandle vertex_split(VertexHandle _v0, VertexHandle _v1, VertexHandle _vl, VertexHandle _vr)
Vertex Split: inverse operation to collapse().
Definition: TriMeshT.hh:254
Connectivity tag indicating that the tagged mesh has triangle connectivity.
Definition: Tags.hh:49
Kernel::VertexIHalfedgeIter VertexIHalfedgeIter
Circulator.
Definition: PolyMeshT.hh:164
Kernel::VertexOHalfedgeIter VertexOHalfedgeIter
Circulator.
Definition: PolyMeshT.hh:163
Kernel::ConstFaceVertexIter ConstFaceVertexIter
Circulator.
Definition: PolyMeshT.hh:177
Kernel::Point Point
Coordinate type.
Definition: PolyMeshT.hh:112
Kernel::Color Color
Color type.
Definition: PolyMeshT.hh:116
VertexHandle add_vertex(const Point &_p)
Alias for new_vertex(const Point&).
Definition: PolyMeshT.hh:235
Kernel::VertexEdgeIter VertexEdgeIter
Circulator.
Definition: PolyMeshT.hh:165
Kernel::ConstFaceFaceIter ConstFaceFaceIter
Circulator.
Definition: PolyMeshT.hh:180
Kernel::Face Face
Face type.
Definition: PolyMeshT.hh:130
Kernel::Scalar Scalar
Scalar type.
Definition: PolyMeshT.hh:110
Kernel::ConstFaceHalfedgeIter ConstFaceHalfedgeIter
Circulator.
Definition: PolyMeshT.hh:178
Kernel::VertexFaceIter VertexFaceIter
Circulator.
Definition: PolyMeshT.hh:166
Kernel::FaceVertexIter FaceVertexIter
Circulator.
Definition: PolyMeshT.hh:167
Kernel::ConstVertexFaceIter ConstVertexFaceIter
Circulator.
Definition: PolyMeshT.hh:176
void split(FaceHandle _fh, VertexHandle _vh)
Face split (= 1-to-3 split, calls corresponding PolyMeshT function).
Definition: TriMeshT.hh:402
VertexHandle split_copy(EdgeHandle _eh, const Point &_p)
Edge split (= 2-to-4 split)
Definition: TriMeshT.hh:281
Kernel::TexCoord1D TexCoord1D
TexCoord1D type.
Definition: PolyMeshT.hh:118
HalfedgeHandle vertex_split(Point _v0_point, VertexHandle _v1, VertexHandle _vl, VertexHandle _vr)
Vertex Split: inverse operation to collapse().
Definition: TriMeshT.hh:214
void split(FaceHandle _fh)
Face split (= 1-to-4) split, splits edges at midpoints and adds 4 new faces in the interior)...
Definition: TriMeshT.hh:342
Kernel::VertexHandle VertexHandle
Handle for referencing the corresponding item.
Definition: PolyMeshT.hh:136
static constexpr bool is_trimesh()
Determine whether this is a PolyMeshT or TriMeshT (This function does not check the per face vertex c...
Definition: TriMeshT.hh:104
void split(EdgeHandle _eh, VertexHandle _vh)
Edge split (= 2-to-4 split)
Definition: TriMeshT.hh:294
Kernel::VertexVertexIter VertexVertexIter
Circulator.
Definition: PolyMeshT.hh:162
Kernel::TexCoord2D TexCoord2D
TexCoord2D type.
Definition: PolyMeshT.hh:120
void split_copy(FaceHandle _fh, VertexHandle _vh)
Face split (= 1-to-3 split, calls corresponding PolyMeshT function).
Definition: TriMeshT.hh:412
Kernel::FaceEdgeIter FaceEdgeIter
Circulator.
Definition: PolyMeshT.hh:169
Kernel::Normal Normal
Normal type.
Definition: PolyMeshT.hh:114
TriMeshT()
Default constructor.
Definition: TriMeshT.hh:168
virtual ~TriMeshT()
Destructor.
Definition: TriMeshT.hh:174
Kernel::FaceFaceIter FaceFaceIter
Circulator.
Definition: PolyMeshT.hh:170
Kernel::ConstVertexIHalfedgeIter ConstVertexIHalfedgeIter
Circulator.
Definition: PolyMeshT.hh:174
Connectivity tag indicating that the tagged mesh has polygon connectivity.
Definition: Tags.hh:47
VertexHandle split_copy(FaceHandle _fh, const Point &_p)
Face split (= 1-to-3 split, calls corresponding PolyMeshT function).
Definition: TriMeshT.hh:334
Kernel::TexCoord3D TexCoord3D
TexCoord3D type.
Definition: PolyMeshT.hh:122
void split_copy(EdgeHandle _eh, VertexHandle _vh)
Edge split (= 2-to-4 split)
Definition: TriMeshT.hh:307
Kernel::FaceHalfedgeIter FaceHalfedgeIter
Circulator.
Definition: PolyMeshT.hh:168
Kernel::ConstVertexOHalfedgeIter ConstVertexOHalfedgeIter
Circulator.
Definition: PolyMeshT.hh:173
Kernel::Vertex Vertex
Vertex type.
Definition: PolyMeshT.hh:124
void split(FaceHandle _fh, const Point &_p)
Face split (= 1-to-n split)
Definition: PolyMeshT.hh:560
Kernel::ConstVertexEdgeIter ConstVertexEdgeIter
Circulator.
Definition: PolyMeshT.hh:175
Kernel::ConstVertexVertexIter ConstVertexVertexIter
Circulator.
Definition: PolyMeshT.hh:172
static constexpr bool is_polymesh()
Determine whether this is a PolyMeshT or TriMeshT (This function does not check the per face vertex c...
Definition: TriMeshT.hh:103
VertexHandle split(FaceHandle _fh, const Point &_p)
Face split (= 1-to-3 split, calls corresponding PolyMeshT function).
Definition: TriMeshT.hh:322
Kernel::ConstFaceEdgeIter ConstFaceEdgeIter
Circulator.
Definition: PolyMeshT.hh:179
Kernel::Edge Edge
Edge type.
Definition: PolyMeshT.hh:128
Normal calc_face_normal(FaceHandle _fh) const
VertexHandle split(EdgeHandle _eh, const Point &_p)
Edge split (= 2-to-4 split)
Definition: TriMeshT.hh:267