52 #ifndef OPENMESH_POLYMESHT_HH 
   53 #define OPENMESH_POLYMESHT_HH 
   59 #include <OpenMesh/Core/System/config.h> 
   60 #include <OpenMesh/Core/Geometry/MathDefs.hh> 
   61 #include <OpenMesh/Core/Mesh/PolyConnectivity.hh> 
   62 #include <OpenMesh/Core/Mesh/FinalMeshItemsT.hh> 
   63 #include <OpenMesh/Core/Mesh/Tags.hh> 
   89 template <
class Kernel>
 
   99   static constexpr 
bool is_polymesh() { 
return true;  }
 
  101   static constexpr 
bool is_trimesh()  { 
return false; }
 
  102   using ConnectivityTag = PolyConnectivityTag;
 
  103   enum { IsPolyMesh = 1 };
 
  104   enum { IsTriMesh  = 0 };
 
  109   typedef typename Kernel::Scalar    
Scalar;
 
  112   typedef typename Kernel::Point     
Point;
 
  128   typedef typename Kernel::Edge      
Edge;
 
  130   typedef typename Kernel::Face      
Face;
 
  202   { 
return make_smart(Kernel::new_vertex(), 
this); }
 
  216     this->set_point(vh, _p);
 
  234     this->set_point(vh, _p);
 
  283                                             const Point& _p2) 
const;
 
  419     return this->point(this->to_vertex_handle(_heh)) -
 
  420             this->point(this->from_vertex_handle(_heh));
 
  439     return sqrnorm(edge_vec);
 
  448     return 0.5 * (this->point(vh0) + this->point(vh1));
 
  486     Scalar denom = norm(v0)*norm(v1);
 
  492     if (this->is_boundary(_in_heh))
 
  494       FaceHandle fh(this->face_handle(this->opposite_halfedge_handle(_in_heh)));
 
  497       return angle(cos_a, sign_a);
 
  531     _sector_normal = cross(vec0, vec1);
 
  541     return norm(sector_normal)/2;
 
  549     assert(Kernel::has_face_normals());
 
  551     if (this->is_boundary(this->edge_handle(_heh)))
 
  555     const Normal& n0 = this->normal(this->face_handle(_heh));
 
  556     const Normal& n1 = this->normal(this->face_handle(this->opposite_halfedge_handle(_heh)));
 
  561     Scalar da_sin_sign = 
dot(cross(n0, n1), he);
 
  562     return angle(da_cos, da_sin_sign);
 
  573     if (this->is_boundary(this->edge_handle(_heh)))
 
  581     Scalar denom = norm(n0)*norm(n1);
 
  588     Scalar da_sin_sign = 
dot(cross(n0, n1), he);
 
  589     return angle(da_cos, da_sin_sign);
 
  606   { Kernel::split(_fh, _vh); }
 
  612   { Kernel::split_edge(_eh, _vh); }
 
  615   struct PointIs3DTag {};
 
  616   struct PointIsNot3DTag {};
 
  648 template<
typename LHS, 
typename KERNEL>
 
  653 template<
typename LHS, 
typename KERNEL>
 
  655     return MeshCast<LHS, PolyMeshT<KERNEL>*>::cast(rhs);
 
  658 template<
typename LHS, 
typename KERNEL>
 
  659 const LHS 
mesh_cast(
const PolyMeshT<KERNEL> &rhs) {
 
  660     return MeshCast<LHS, const PolyMeshT<KERNEL>&>::cast(rhs);
 
  663 template<
typename LHS, 
typename KERNEL>
 
  664 const LHS 
mesh_cast(
const PolyMeshT<KERNEL> *rhs) {
 
  665     return MeshCast<LHS, const PolyMeshT<KERNEL>*>::cast(rhs);
 
  671 #if defined(OM_INCLUDE_TEMPLATES) && !defined(OPENMESH_POLYMESH_C) 
  672 #  define OPENMESH_POLYMESH_TEMPLATES 
  673 #  include "PolyMeshT_impl.hh" 
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition: MeshItems.hh:59
 
SmartVertexHandle make_smart(VertexHandle _vh, const PolyConnectivity *_mesh)
Creats a SmartVertexHandle from a VertexHandle and a Mesh.
Definition: SmartHandles.hh:256
 
osg::Vec3f::ValueType dot(const osg::Vec3f &_v1, const osg::Vec3f &_v2)
Adapter for osg vector member computing a scalar product.
Definition: VectorAdapter.hh:176
 
T angle(T _cos_angle, T _sin_angle)
returns the angle determined by its cos and the sign of its sin result is positive if the angle is in...
Definition: MathDefs.hh:140
 
LHS mesh_cast(PolyMeshT< KERNEL > &rhs)
Cast a mesh with different but identical traits into each other.
Definition: PolyMeshT.hh:649
 
T sane_aarg(T _aarg)
Trigonometry/angles - related.
Definition: MathDefs.hh:122
 
@ Normal
Add normals to mesh item (vertices/faces)
Definition: Attributes.hh:82
 
@ TexCoord2D
Add 2D texture coordinates (vertices, halfedges)
Definition: Attributes.hh:87
 
@ TexCoord1D
Add 1D texture coordinates (vertices, halfedges)
Definition: Attributes.hh:86
 
@ TexCoord3D
Add 3D texture coordinates (vertices, halfedges)
Definition: Attributes.hh:88
 
@ Color
Add colors to mesh item (vertices/faces/edges)
Definition: Attributes.hh:83
 
Cast a mesh with different but identical traits into each other.
Definition: FinalMeshItemsT.hh:178
 
Handle for a vertex entity.
Definition: Handles.hh:121
 
Handle for a halfedge entity.
Definition: Handles.hh:128
 
Handle for a edge entity.
Definition: Handles.hh:135
 
Handle for a face entity.
Definition: Handles.hh:142
 
Handle type for meshes to simplify some template programming.
Definition: Handles.hh:149
 
Base type for a polygonal mesh.
Definition: PolyMeshT.hh:91
 
Kernel::Vertex Vertex
Vertex type.
Definition: PolyMeshT.hh:124
 
Kernel::FaceEdgeIter FaceEdgeIter
Circulator.
Definition: PolyMeshT.hh:169
 
void calc_face_centroid(FaceHandle _fh, Point &_pt) const
calculates the average of the vertices defining _fh
Definition: PolyMeshT.hh:289
 
Kernel::ConstFaceIter ConstFaceIter
Scalar type.
Definition: PolyMeshT.hh:151
 
Kernel::VertexHandle VertexHandle
Handle for referencing the corresponding item.
Definition: PolyMeshT.hh:136
 
SmartVertexHandle add_vertex_dirty(const Point &_p)
Alias for new_vertex_dirty().
Definition: PolyMeshT.hh:249
 
Kernel::Scalar Scalar
Scalar type.
Definition: PolyMeshT.hh:110
 
Kernel::ConstVertexVertexIter ConstVertexVertexIter
Circulator.
Definition: PolyMeshT.hh:172
 
void calc_edge_vector(HalfedgeHandle _heh, Normal &_edge_vec) const
Calculates the edge vector as the difference of the the points defined by to_vertex_handle() and from...
Definition: PolyMeshT.hh:410
 
Kernel::ConstFaceHalfedgeIter ConstFaceHalfedgeIter
Circulator.
Definition: PolyMeshT.hh:178
 
Kernel::EdgeHandle EdgeHandle
Scalar type.
Definition: PolyMeshT.hh:138
 
Kernel::VertexFaceIter VertexFaceIter
Circulator.
Definition: PolyMeshT.hh:166
 
Kernel::ConstFaceVertexIter ConstFaceVertexIter
Circulator.
Definition: PolyMeshT.hh:177
 
Kernel::Halfedge Halfedge
Halfedge type.
Definition: PolyMeshT.hh:126
 
void calc_vertex_normal_fast(VertexHandle _vh, Normal &_n) const
Different methods for calculation of the normal at _vh:
Definition: PolyMeshT_impl.hh:475
 
void calc_vertex_normal_correct(VertexHandle _vh, Normal &_n) const
Compute normals for all primitives.
Definition: PolyMeshT_impl.hh:485
 
PolyMeshT()
Circulator.
Definition: PolyMeshT.hh:185
 
Scalar calc_dihedral_angle(EdgeHandle _eh) const
Compute normals for all primitives.
Definition: PolyMeshT.hh:593
 
static constexpr bool is_polymesh()
Determine whether this is a PolyMeshT or TriMeshT (This function does not check the per face vertex c...
Definition: PolyMeshT.hh:100
 
Kernel::FaceIter FaceIter
Scalar type.
Definition: PolyMeshT.hh:146
 
Kernel::Normal Normal
Normal type.
Definition: PolyMeshT.hh:114
 
Kernel::FaceVertexIter FaceVertexIter
Circulator.
Definition: PolyMeshT.hh:167
 
Point calc_edge_midpoint(EdgeHandle _eh) const
Calculates the midpoint of the edge _eh, defined by the positions of the two incident vertices.
Definition: PolyMeshT.hh:453
 
SmartVertexHandle new_vertex()
Uses default copy and assignment operator.
Definition: PolyMeshT.hh:201
 
Kernel::VertexIHalfedgeIter VertexIHalfedgeIter
Circulator.
Definition: PolyMeshT.hh:164
 
void split(FaceHandle _fh, VertexHandle _vh)
Compute normals for all primitives.
Definition: PolyMeshT.hh:605
 
PolyMeshT(const T &t)
Circulator.
Definition: PolyMeshT.hh:187
 
Kernel::TexCoord2D TexCoord2D
TexCoord2D type.
Definition: PolyMeshT.hh:120
 
Scalar calc_sector_area(HalfedgeHandle _in_heh) const
calculates the area of the face sector defined by the angle <(_in_heh,next_halfedge(_in_heh)) NOTE: s...
Definition: PolyMeshT.hh:537
 
SmartVertexHandle add_vertex(const Point &_p)
Alias for new_vertex(const Point&).
Definition: PolyMeshT.hh:245
 
void update_face_normals()
Update normal vectors for all faces.
Definition: PolyMeshT_impl.hh:335
 
void update_halfedge_normals(const double _feature_angle=0.8)
Update normal vectors for all halfedges.
Definition: PolyMeshT_impl.hh:350
 
unsigned int find_feature_edges(Scalar _angle_tresh=OpenMesh::deg_to_rad(44.0))
tags an edge as a feature if its dihedral angle is larger than _angle_tresh returns the number of the...
Definition: PolyMeshT_impl.hh:74
 
virtual Normal calc_halfedge_normal(HalfedgeHandle _heh, const double _feature_angle=0.8) const
Calculate halfedge normal for one specific halfedge.
Definition: PolyMeshT_impl.hh:365
 
Scalar calc_sector_angle(HalfedgeHandle _in_heh) const
calculates the sector angle.
Definition: PolyMeshT.hh:482
 
Kernel::ConstFaceEdgeIter ConstFaceEdgeIter
Circulator.
Definition: PolyMeshT.hh:179
 
Kernel::TexCoord3D TexCoord3D
TexCoord3D type.
Definition: PolyMeshT.hh:122
 
void update_normals()
Compute normals for all primitives.
Definition: PolyMeshT_impl.hh:317
 
Kernel::ConstVertexFaceIter ConstVertexFaceIter
Circulator.
Definition: PolyMeshT.hh:176
 
Kernel::VertexOHalfedgeIter VertexOHalfedgeIter
Circulator.
Definition: PolyMeshT.hh:163
 
Point calc_centroid(FaceHandle _fh) const
Computes and returns the average of the vertices defining _fh (same as calc_face_centroid)
Definition: PolyMeshT_impl.hh:267
 
Kernel::VertexEdgeIter VertexEdgeIter
Circulator.
Definition: PolyMeshT.hh:165
 
Scalar calc_dihedral_angle(HalfedgeHandle _heh) const
Compute normals for all primitives.
Definition: PolyMeshT.hh:571
 
Kernel::Face Face
Face type.
Definition: PolyMeshT.hh:130
 
Kernel::ConstVertexIHalfedgeIter ConstVertexIHalfedgeIter
Circulator.
Definition: PolyMeshT.hh:174
 
SmartVertexHandle new_vertex(const Point &_p)
Adds a new vertex initialized to a custom position.
Definition: PolyMeshT.hh:213
 
virtual Normal calc_face_normal(FaceHandle _fh) const
Calculate normal vector for face _fh.
Definition: PolyMeshT_impl.hh:97
 
Normal calc_normal(EdgeHandle _eh) const
calculated and returns the average of the two vertex normals
Definition: PolyMeshT.hh:459
 
Scalar calc_edge_length(EdgeHandle _eh) const
Compute normals for all primitives.
Definition: PolyMeshT.hh:424
 
Kernel::ConstHalfedgeIter ConstHalfedgeIter
Scalar type.
Definition: PolyMeshT.hh:149
 
void update_normal(VertexHandle _vh)
Update normal for vertex _vh.
Definition: PolyMeshT.hh:348
 
void calc_sector_vectors(HalfedgeHandle _in_heh, Normal &_vec0, Normal &_vec1) const
defines a consistent representation of a sector geometry: the halfedge _in_heh defines the sector ori...
Definition: PolyMeshT.hh:471
 
Kernel::FaceFaceIter FaceFaceIter
Circulator.
Definition: PolyMeshT.hh:170
 
bool is_estimated_feature_edge(HalfedgeHandle _heh, const double _feature_angle) const
identifies feature edges w.r.t.
Definition: PolyMeshT_impl.hh:430
 
Normal calc_edge_vector(EdgeHandle _eh) const
Calculates the edge vector as the vector defined by the halfedge with id #0 (see below)
Definition: PolyMeshT.hh:403
 
virtual ~PolyMeshT()
Circulator.
Definition: PolyMeshT.hh:188
 
Kernel::ConstVertexEdgeIter ConstVertexEdgeIter
Circulator.
Definition: PolyMeshT.hh:175
 
Scalar calc_edge_sqr_length(HalfedgeHandle _heh) const
Compute normals for all primitives.
Definition: PolyMeshT.hh:435
 
void calc_edge_vector(EdgeHandle _eh, Normal &_edge_vec) const
Calculates the edge vector as the vector defined by the halfedge with id #0 (see below)
Definition: PolyMeshT.hh:396
 
Kernel::Edge Edge
Edge type.
Definition: PolyMeshT.hh:128
 
Kernel::FaceHandle FaceHandle
Scalar type.
Definition: PolyMeshT.hh:139
 
void update_normal(FaceHandle _fh)
Update normal for face _fh.
Definition: PolyMeshT.hh:268
 
Scalar calc_dihedral_angle_fast(EdgeHandle _eh) const
calculates the dihedral angle on the edge _eh
Definition: PolyMeshT.hh:567
 
void calc_vertex_normal_loop(VertexHandle _vh, Normal &_n) const
Compute normals for all primitives.
Definition: PolyMeshT_impl.hh:516
 
void split(EdgeHandle _eh, const Point &_p)
Compute normals for all primitives.
Definition: PolyMeshT.hh:608
 
Kernel::HalfedgeHandle HalfedgeHandle
Scalar type.
Definition: PolyMeshT.hh:137
 
Kernel::EdgeIter EdgeIter
Scalar type.
Definition: PolyMeshT.hh:145
 
void update_normal(HalfedgeHandle _heh, const double _feature_angle=0.8)
Update normal for halfedge _heh.
Definition: PolyMeshT.hh:312
 
Kernel::ConstEdgeIter ConstEdgeIter
Scalar type.
Definition: PolyMeshT.hh:150
 
Kernel::ConstVertexIter ConstVertexIter
Scalar type.
Definition: PolyMeshT.hh:148
 
void update_vertex_normals()
Update normal vectors for all vertices.
Definition: PolyMeshT_impl.hh:550
 
void calc_sector_normal(HalfedgeHandle _in_heh, Normal &_sector_normal) const
calculates the normal (non-normalized) of the face sector defined by the angle <(_in_heh,...
Definition: PolyMeshT.hh:527
 
Kernel::ConstVertexOHalfedgeIter ConstVertexOHalfedgeIter
Circulator.
Definition: PolyMeshT.hh:173
 
Normal calc_edge_vector(HalfedgeHandle _heh) const
Calculates the edge vector as the difference of the the points defined by to_vertex_handle() and from...
Definition: PolyMeshT.hh:417
 
Scalar calc_edge_sqr_length(EdgeHandle _eh) const
Compute normals for all primitives.
Definition: PolyMeshT.hh:432
 
Point calc_edge_midpoint(HalfedgeHandle _heh) const
Calculates the midpoint of the halfedge _heh, defined by the positions of the two incident vertices.
Definition: PolyMeshT.hh:444
 
Kernel::VertexVertexIter VertexVertexIter
Circulator.
Definition: PolyMeshT.hh:162
 
void split(EdgeHandle _eh, VertexHandle _vh)
Compute normals for all primitives.
Definition: PolyMeshT.hh:611
 
Kernel::HalfedgeIter HalfedgeIter
Scalar type.
Definition: PolyMeshT.hh:144
 
SmartVertexHandle new_vertex_dirty(const Point &_p)
Same as new_vertex(const Point&) but never shrinks, only enlarges the vertex property vectors.
Definition: PolyMeshT.hh:231
 
Scalar calc_edge_length(HalfedgeHandle _heh) const
Calculates the length of the edge _heh.
Definition: PolyMeshT.hh:429
 
Kernel::FaceHalfedgeIter FaceHalfedgeIter
Circulator.
Definition: PolyMeshT.hh:168
 
Kernel::Point Point
Coordinate type.
Definition: PolyMeshT.hh:112
 
PolyMeshT< Kernel > This
Self type. Used to specify iterators/circulators.
Definition: PolyMeshT.hh:95
 
Kernel::ConstFaceFaceIter ConstFaceFaceIter
Circulator.
Definition: PolyMeshT.hh:180
 
void split(FaceHandle _fh, const Point &_p)
Face split (= 1-to-n split)
Definition: PolyMeshT.hh:602
 
Kernel::Color Color
Color type.
Definition: PolyMeshT.hh:116
 
Kernel::TexCoord1D TexCoord1D
TexCoord1D type.
Definition: PolyMeshT.hh:118
 
Normal calc_normal(FaceHandle _fh) const
same as calc_face_normal
Definition: PolyMeshT_impl.hh:187
 
Kernel::VertexIter VertexIter
Scalar type.
Definition: PolyMeshT.hh:143
 
Scalar calc_dihedral_angle_fast(HalfedgeHandle _heh) const
calculates the dihedral angle on the halfedge _heh
Definition: PolyMeshT.hh:546
 
Normal calc_vertex_normal(VertexHandle _vh) const
Calculate vertex normal for one specific vertex.
Definition: PolyMeshT_impl.hh:461
 
Smart version of VertexHandle contains a pointer to the corresponding mesh and allows easier access t...
Definition: SmartHandles.hh:110