50 #ifndef OPENMESH_POLYMESHT_HH
51 #define OPENMESH_POLYMESHT_HH
57 #include <OpenMesh/Core/System/config.h>
58 #include <OpenMesh/Core/Geometry/MathDefs.hh>
59 #include <OpenMesh/Core/Mesh/PolyConnectivity.hh>
86 template <
class Kernel>
97 enum { IsPolyMesh = 1 };
98 enum { IsTriMesh = 0 };
108 typedef typename Kernel::Point
Point;
124 typedef typename Kernel::Edge
Edge;
126 typedef typename Kernel::Face
Face;
133 typedef typename Kernel::HalfedgeHandle HalfedgeHandle;
134 typedef typename Kernel::EdgeHandle EdgeHandle;
135 typedef typename Kernel::FaceHandle FaceHandle;
139 typedef typename Kernel::VertexIter VertexIter;
140 typedef typename Kernel::HalfedgeIter HalfedgeIter;
141 typedef typename Kernel::EdgeIter EdgeIter;
142 typedef typename Kernel::FaceIter FaceIter;
144 typedef typename Kernel::ConstVertexIter ConstVertexIter;
145 typedef typename Kernel::ConstHalfedgeIter ConstHalfedgeIter;
146 typedef typename Kernel::ConstEdgeIter ConstEdgeIter;
147 typedef typename Kernel::ConstFaceIter ConstFaceIter;
195 this->set_point(vh, _p);
233 const Point& _p2)
const;
325 _edge_vec = this->point(this->to_vertex_handle(_heh));
326 _edge_vec -= this->point(this->from_vertex_handle(_heh));
331 {
return calc_edge_length(this->halfedge_handle(_eh,0)); }
335 Scalar calc_edge_length(HalfedgeHandle _heh)
const
336 {
return (
Scalar)sqrt(calc_edge_sqr_length(_heh)); }
339 {
return calc_edge_sqr_length(halfedge_handle(_eh,0)); }
341 Scalar calc_edge_sqr_length(HalfedgeHandle _heh)
const
345 return edge_vec.sqrnorm();
367 Scalar denom = v0.norm()*v1.norm();
373 if (this->is_boundary(_in_heh))
375 FaceHandle fh(this->face_handle(this->opposite_halfedge_handle(_in_heh)));
378 return angle(cos_a, sign_a);
412 _sector_normal =
cross(vec0, vec1);
422 return sector_normal.norm()/2;
430 assert(Kernel::has_face_normals());
432 if (this->is_boundary(this->edge_handle(_heh)))
436 const Normal& n0 = this->normal(this->face_handle(_heh));
437 const Normal& n1 = this->normal(this->face_handle(this->opposite_halfedge_handle(_heh)));
443 return angle(da_cos, da_sin_sign);
454 if (this->is_boundary(this->edge_handle(_heh)))
462 Scalar denom = n0.norm()*n1.norm();
470 return angle(da_cos, da_sin_sign);
474 Scalar calc_dihedral_angle(EdgeHandle _eh)
const
475 {
return calc_dihedral_angle(this->halfedge_handle(_eh,0)); }
489 inline void split(EdgeHandle _eh,
const Point& _p)
490 { Kernel::split_edge(_eh, add_vertex(_p)); }
493 { Kernel::split_edge(_eh, _vh); }
501 #if defined(OM_INCLUDE_TEMPLATES) && !defined(OPENMESH_POLYMESH_C)
502 # define OPENMESH_POLYMESH_TEMPLATES
503 # include "PolyMeshT.cc"
506 #endif // OPENMESH_POLYMESHT_HH defined