From a1a82331e34b335fcbdb1e7bc88997fd84412f42 Mon Sep 17 00:00:00 2001 From: Max Lyon Date: Fri, 6 Dec 2019 11:14:27 +0100 Subject: [PATCH 1/3] add calc_centroid methods for all elements returning calc_face_centroid, calc_edge_midpoint and point respectively --- src/OpenMesh/Core/Mesh/PolyMeshT.hh | 17 +++++++- src/OpenMesh/Core/Mesh/PolyMeshT_impl.hh | 50 ++++++++++++++++++++++++ 2 files changed, 66 insertions(+), 1 deletion(-) diff --git a/src/OpenMesh/Core/Mesh/PolyMeshT.hh b/src/OpenMesh/Core/Mesh/PolyMeshT.hh index 0ffb4691..e2bf2dac 100644 --- a/src/OpenMesh/Core/Mesh/PolyMeshT.hh +++ b/src/OpenMesh/Core/Mesh/PolyMeshT.hh @@ -276,9 +276,24 @@ public: _pt = calc_face_centroid(_fh); } - /// Computes and returns the average of the vertices defining _gh + /// Computes and returns the average of the vertices defining _fh Point calc_face_centroid(FaceHandle _fh) const; + /// Computes and returns the average of the vertices defining _fh (same as calc_face_centroid) + Point calc_centroid(FaceHandle _fh) const; + + /// Computes and returns the average of the vertices defining _eh (same as calc_edge_midpoint) + Point calc_centroid(EdgeHandle _eh) const; + + /// Computes and returns the average of the vertices defining _heh (same as calc_edge_midpoint for edge of halfedge) + Point calc_centroid(HalfedgeHandle _heh) const; + + /// Returns the point of _vh + Point calc_centroid(VertexHandle _vh) const; + + /// Computes and returns the average of the vertices defining the mesh + Point calc_centroid(MeshHandle _mh) const; + /// Update normal for halfedge _heh void update_normal(HalfedgeHandle _heh, const double _feature_angle = 0.8) { this->set_normal(_heh, calc_halfedge_normal(_heh,_feature_angle)); } diff --git a/src/OpenMesh/Core/Mesh/PolyMeshT_impl.hh b/src/OpenMesh/Core/Mesh/PolyMeshT_impl.hh index 11d885c2..ba7cfd85 100644 --- a/src/OpenMesh/Core/Mesh/PolyMeshT_impl.hh +++ b/src/OpenMesh/Core/Mesh/PolyMeshT_impl.hh @@ -250,8 +250,58 @@ calc_face_centroid(FaceHandle _fh) const _pt /= valence; return _pt; } + //----------------------------------------------------------------------------- +template +typename PolyMeshT::Point +PolyMeshT:: +calc_centroid(FaceHandle _fh) const +{ + return calc_face_centroid(_fh); +} + +//----------------------------------------------------------------------------- + +template +typename PolyMeshT::Point +PolyMeshT:: +calc_centroid(EdgeHandle _eh) const +{ + return this->calc_edge_midpoint(_eh); +} + +//----------------------------------------------------------------------------- + +template +typename PolyMeshT::Point +PolyMeshT:: +calc_centroid(HalfedgeHandle _heh) const +{ + return this->calc_edge_midpoint(this->edge_handle(_heh)); +} + +//----------------------------------------------------------------------------- + +template +typename PolyMeshT::Point +PolyMeshT:: +calc_centroid(VertexHandle _vh) const +{ + return this->point(_vh); +} + +//----------------------------------------------------------------------------- + +template +typename PolyMeshT::Point +PolyMeshT:: +calc_centroid(MeshHandle /*_mh*/) const +{ + return this->vertices().avg(getPointsProperty(*this)); +} + +//----------------------------------------------------------------------------- template void From 6284fb4fc9475e3abedcf44cc020f46daa460b14 Mon Sep 17 00:00:00 2001 From: Max Lyon Date: Fri, 6 Dec 2019 11:16:34 +0100 Subject: [PATCH 2/3] add calc_normal method for all elements returning calc_face_normal, average of vertex normals, calc_halfedge_normal, and calc_vertex_normal_correct respectively --- src/OpenMesh/Core/Mesh/PolyMeshT.hh | 17 +++++++++++++ src/OpenMesh/Core/Mesh/PolyMeshT_impl.hh | 31 ++++++++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/src/OpenMesh/Core/Mesh/PolyMeshT.hh b/src/OpenMesh/Core/Mesh/PolyMeshT.hh index e2bf2dac..a06661f2 100644 --- a/src/OpenMesh/Core/Mesh/PolyMeshT.hh +++ b/src/OpenMesh/Core/Mesh/PolyMeshT.hh @@ -271,6 +271,10 @@ public: /** Calculate normal vector for face (_p0, _p1, _p2). */ Normal calc_face_normal(const Point& _p0, const Point& _p1, const Point& _p2) const; + + /// same as calc_face_normal + Normal calc_normal(FaceHandle _fh) const; + /// calculates the average of the vertices defining _fh void calc_face_centroid(FaceHandle _fh, Point& _pt) const { _pt = calc_face_centroid(_fh); @@ -323,6 +327,8 @@ public: */ virtual Normal calc_halfedge_normal(HalfedgeHandle _heh, const double _feature_angle = 0.8) const; + /// same as calc_halfedge_normal + Normal calc_normal(HalfedgeHandle, const double _feature_angle = 0.8) const; /** identifies feature edges w.r.t. the minimal dihedral angle for feature edges (in radians) */ /** and the status feature tag */ @@ -368,6 +374,8 @@ public: void calc_vertex_normal_correct(VertexHandle _vh, Normal& _n) const; void calc_vertex_normal_loop(VertexHandle _vh, Normal& _n) const; + /// same as calc_vertex_normal_correct + Normal calc_normal(VertexHandle _vh) const; //@} @@ -437,6 +445,15 @@ public: return calc_edge_midpoint(this->halfedge_handle(_eh, 0)); } + /// calculated and returns the average of the two vertex normals + Normal calc_normal(EdgeHandle _eh) const + { + HalfedgeHandle _heh = this->halfedge_handle(_eh, 0); + VertexHandle vh0 = this->from_vertex_handle(_heh); + VertexHandle vh1 = this->to_vertex_handle(_heh); + return 0.5 * (this->calc_normal(vh0) + this->calc_normal(vh1)); + } + /** defines a consistent representation of a sector geometry: the halfedge _in_heh defines the sector orientation the vertex pointed by _in_heh defines the sector center diff --git a/src/OpenMesh/Core/Mesh/PolyMeshT_impl.hh b/src/OpenMesh/Core/Mesh/PolyMeshT_impl.hh index ba7cfd85..e25fe37b 100644 --- a/src/OpenMesh/Core/Mesh/PolyMeshT_impl.hh +++ b/src/OpenMesh/Core/Mesh/PolyMeshT_impl.hh @@ -181,6 +181,14 @@ calc_face_normal(const Point& _p0, >::Result()); } +template +typename PolyMeshT::Normal +PolyMeshT:: +calc_normal(FaceHandle _fh) const +{ + return calc_face_normal(_fh); +} + template typename PolyMeshT::Normal PolyMeshT:: @@ -404,6 +412,18 @@ calc_halfedge_normal(HalfedgeHandle _heh, const double _feature_angle) const //----------------------------------------------------------------------------- +template +typename PolyMeshT::Normal +PolyMeshT:: +calc_normal(HalfedgeHandle _heh, const double _feature_angle) const +{ + return calc_halfedge_normal(_heh, _feature_angle); +} + + +//----------------------------------------------------------------------------- + + template bool PolyMeshT:: @@ -509,6 +529,17 @@ calc_vertex_normal_loop(VertexHandle _vh, Normal& _n) const //----------------------------------------------------------------------------- +template +typename PolyMeshT::Normal +PolyMeshT:: +calc_normal(VertexHandle _vh) const +{ + Normal n; + calc_vertex_normal_correct(_vh, n); + return n; +} + +//----------------------------------------------------------------------------- template void From 33f4941d66f0991c5cf7a6e860e3e108795868a0 Mon Sep 17 00:00:00 2001 From: Max Lyon Date: Fri, 6 Dec 2019 11:16:54 +0100 Subject: [PATCH 3/3] normalize normal at end of calc_vertex_normal_correct --- src/OpenMesh/Core/Mesh/PolyMeshT_impl.hh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/OpenMesh/Core/Mesh/PolyMeshT_impl.hh b/src/OpenMesh/Core/Mesh/PolyMeshT_impl.hh index e25fe37b..dabdacfe 100644 --- a/src/OpenMesh/Core/Mesh/PolyMeshT_impl.hh +++ b/src/OpenMesh/Core/Mesh/PolyMeshT_impl.hh @@ -505,6 +505,9 @@ calc_vertex_normal_correct(VertexHandle _vh, Normal& _n) const in_he_vec = out_he_vec; in_he_vec *= -1;//change the orientation } + Scalar length = norm(_n); + if (length != 0.0) + _n *= (Scalar(1.0)/length); } //-----------------------------------------------------------------------------