From b43f6e09adf200e569665f7cf4e671054e1a1628 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20M=C3=B6bius?= Date: Wed, 19 Sep 2012 15:42:03 +0000 Subject: [PATCH] Added split copy operations, which copy properties of splitted elements to the newly created ones. ( Thanks to Duncan Paterson for the patch ). Improved documentation on the split functions refs #971 git-svn-id: http://www.openmesh.org/svnrepo/OpenMesh/trunk@683 fdac6126-5c0c-442c-9429-916003d36597 --- src/OpenMesh/Core/Mesh/PolyConnectivity.cc | 37 +++++++---- src/OpenMesh/Core/Mesh/PolyConnectivity.hh | 52 +++++++++++++++- src/OpenMesh/Core/Mesh/TriConnectivity.cc | 14 +++++ src/OpenMesh/Core/Mesh/TriConnectivity.hh | 40 +++++++++++- src/OpenMesh/Core/Mesh/TriMeshT.hh | 72 +++++++++++++++++++++- 5 files changed, 199 insertions(+), 16 deletions(-) diff --git a/src/OpenMesh/Core/Mesh/PolyConnectivity.cc b/src/OpenMesh/Core/Mesh/PolyConnectivity.cc index a40fb348..b8d45ae0 100644 --- a/src/OpenMesh/Core/Mesh/PolyConnectivity.cc +++ b/src/OpenMesh/Core/Mesh/PolyConnectivity.cc @@ -939,16 +939,6 @@ void PolyConnectivity::triangulate() //----------------------------------------------------------------------------- void PolyConnectivity::split(FaceHandle fh, VertexHandle vh) { - /* - Split an arbitrary face into triangles by connecting - each vertex of fh to vh. - - - fh will remain valid (it will become one of the - triangles) - - the halfedge handles of the new triangles will - point to the old halfeges - */ - HalfedgeHandle hend = halfedge_handle(fh); HalfedgeHandle hh = next_halfedge_handle(hend); @@ -989,6 +979,17 @@ void PolyConnectivity::split(FaceHandle fh, VertexHandle vh) set_halfedge_handle(vh, hold); } + +void PolyConnectivity::split_copy(FaceHandle fh, VertexHandle vh) { + + // Split the given face (fh will still be valid) + split(fh, vh); + + // Copy the property of the original face to all new faces + for(VertexFaceIter vf_it = vf_iter(vh); vf_it; ++vf_it) + copy_all_properties(fh, vf_it); +} + //----------------------------------------------------------------------------- uint PolyConnectivity::valence(VertexHandle _vh) const { @@ -1071,5 +1072,19 @@ void PolyConnectivity::split_edge(EdgeHandle _eh, VertexHandle _vh) } } -}//namespace OpenMesh +//----------------------------------------------------------------------------- + +void PolyConnectivity::split_edge_copy(EdgeHandle _eh, VertexHandle _vh) +{ + // Split the edge (handle is kept!) + split_edge(_eh, _vh); + + // Navigate to the new edge + EdgeHandle eh0 = edge_handle( next_halfedge_handle( halfedge_handle(_eh, 1) ) ); + + // Copy the property from the original to the new edge + copy_all_properties(_eh, eh0); +} + +} // namespace OpenMesh diff --git a/src/OpenMesh/Core/Mesh/PolyConnectivity.hh b/src/OpenMesh/Core/Mesh/PolyConnectivity.hh index 48c65d81..95f61784 100644 --- a/src/OpenMesh/Core/Mesh/PolyConnectivity.hh +++ b/src/OpenMesh/Core/Mesh/PolyConnectivity.hh @@ -684,9 +684,35 @@ public: */ HalfedgeHandle insert_edge(HalfedgeHandle _prev_heh, HalfedgeHandle _next_heh); - /// Face split (= 1-to-n split) + /** \brief Face split (= 1-to-n split). + * + * Split an arbitrary face into triangles by connecting each vertex of fh to vh. + * + * \note fh will remain valid (it will become one of the triangles) + * \note the halfedge handles of the new triangles will point to the old halfeges + * + * \note The properties of the new faces and all other new primitives will be undefined! + * + * @param _fh Face handle that should be splitted + * @param _vh Vertex handle of the new vertex that will be inserted in the face + */ void split(FaceHandle _fh, VertexHandle _vh); + /** \brief Face split (= 1-to-n split). + * + * Split an arbitrary face into triangles by connecting each vertex of fh to vh. + * + * \note fh will remain valid (it will become one of the triangles) + * \note the halfedge handles of the new triangles will point to the old halfeges + * + * \note The properties of the new faces will be adjusted to the properties of the original faces + * \note Properties of the new edges and halfedges will be undefined + * + * @param _fh Face handle that should be splitted + * @param _vh Vertex handle of the new vertex that will be inserted in the face + */ + void split_copy(FaceHandle _fh, VertexHandle _vh); + /** \brief Triangulate the face _fh Split an arbitrary face into triangles by connecting @@ -706,9 +732,31 @@ public: */ void triangulate(); - /// Edge split (inserts a vertex on the edge only) + /** Edge split (inserts a vertex on the edge only) + * + * This edge split only splits the edge without introducing new faces! + * As this is for polygonal meshes, we can have valence 2 vertices here. + * + * \note The properties of the new edges and halfedges will be undefined! + * + * @param _eh Handle of the edge, that will be splitted + * @param _vh Handle of the vertex that will be inserted at the edge + */ void split_edge(EdgeHandle _eh, VertexHandle _vh); + /** Edge split (inserts a vertex on the edge only) + * + * This edge split only splits the edge without introducing new faces! + * As this is for polygonal meshes, we can have valence 2 vertices here. + * + * \note The properties of the new edge will be copied from the splitted edge + * \note Properties of the new halfedges will be undefined + * + * @param _eh Handle of the edge, that will be splitted + * @param _vh Handle of the vertex that will be inserted at the edge + */ + void split_edge_copy(EdgeHandle _eh, VertexHandle _vh); + /** \name Generic handle derefertiation. Calls the respective vertex(), halfedge(), edge(), face() diff --git a/src/OpenMesh/Core/Mesh/TriConnectivity.cc b/src/OpenMesh/Core/Mesh/TriConnectivity.cc index 1f8a6cc6..610e7627 100644 --- a/src/OpenMesh/Core/Mesh/TriConnectivity.cc +++ b/src/OpenMesh/Core/Mesh/TriConnectivity.cc @@ -384,6 +384,7 @@ void TriConnectivity::flip(EdgeHandle _eh) //----------------------------------------------------------------------------- + void TriConnectivity::split(EdgeHandle _eh, VertexHandle _vh) { HalfedgeHandle h0 = halfedge_handle(_eh, 0); @@ -479,4 +480,17 @@ void TriConnectivity::split(EdgeHandle _eh, VertexHandle _vh) set_halfedge_handle(v2, t1); } +//----------------------------------------------------------------------------- + +void TriConnectivity::split_copy(EdgeHandle _eh, VertexHandle _vh) +{ + // Split the halfedge ( handle will be preserved) + split(_eh, _vh); + + // Copy the properties of the original edge to all neighbor edges that + // have been created + for(VEIter ve_it = ve_iter(_vh); ve_it; ++ve_it) + copy_all_properties(_eh, ve_it); +} + }// namespace OpenMesh diff --git a/src/OpenMesh/Core/Mesh/TriConnectivity.hh b/src/OpenMesh/Core/Mesh/TriConnectivity.hh index c1e43fb4..9388460a 100644 --- a/src/OpenMesh/Core/Mesh/TriConnectivity.hh +++ b/src/OpenMesh/Core/Mesh/TriConnectivity.hh @@ -146,13 +146,49 @@ public: Check for topological correctness first using is_flip_ok(). */ void flip(EdgeHandle _eh); - /// Edge split (= 2-to-4 split) + + /** \brief Edge split (= 2-to-4 split) + * + * + * The function will introduce two new faces ( non-boundary case) or + * one additional face (if edge is boundary) + * + * \note The properties of the new edges, halfedges, and faces will be undefined! + * + * @param _eh Edge handle that should be splitted + * @param _vh Vertex handle that will be inserted at the edge + */ void split(EdgeHandle _eh, VertexHandle _vh); - /// Face split (= 1-to-3 split, calls corresponding PolyMeshT function). + /** \brief Edge split (= 2-to-4 split) + * + * The function will introduce two new faces ( non-boundary case) or + * one additional face (if edge is boundary) + * + * \note The properties of the new edges will be adjusted to the properties of the original edge + * \note The properties of the new faces and halfedges will be undefined + * + * @param _eh Edge handle that should be splitted + * @param _vh Vertex handle that will be inserted at the edge + */ + void split_copy(EdgeHandle _eh, VertexHandle _vh); + + /** \brief Face split (= 1-to-3 split, calls corresponding PolyMeshT function). + * + * @param _fh Face handle that should be splitted + * @param _vh Vertex handle that will be inserted at the face + */ inline void split(FaceHandle _fh, VertexHandle _vh) { PolyConnectivity::split(_fh, _vh); } + /** \brief Face split (= 1-to-3 split, calls corresponding PolyMeshT function). + * + * @param _fh Face handle that should be splitted + * @param _vh Vertex handle that will be inserted at the face + */ + inline void split_copy(FaceHandle _fh, VertexHandle _vh) + { PolyConnectivity::split_copy(_fh, _vh); } + //@} private: diff --git a/src/OpenMesh/Core/Mesh/TriMeshT.hh b/src/OpenMesh/Core/Mesh/TriMeshT.hh index 3f81d395..1515ef79 100644 --- a/src/OpenMesh/Core/Mesh/TriMeshT.hh +++ b/src/OpenMesh/Core/Mesh/TriMeshT.hh @@ -178,18 +178,88 @@ public: /// Edge split (= 2-to-4 split) /// Do not call PolyMeshT function below as this does the wrong operation + + /** \brief Edge split (= 2-to-4 split) + * + * The properties of the new edges will be undefined! + * + * @param _eh Edge handle that should be splitted + * @param _p New point position that will be inserted at the edge + * @return Vertex handle of the newly added vertex + */ inline VertexHandle split(EdgeHandle _eh, const Point& _p) { const VertexHandle vh = this->add_vertex(_p); Kernel::split(_eh, vh); return vh; } + /** \brief Edge split (= 2-to-4 split) + * + * The properties of the new edges will be adjusted to the properties of the original edge + * + * @param _eh Edge handle that should be splitted + * @param _p New point position that will be inserted at the edge + * @return Vertex handle of the newly added vertex + */ + inline VertexHandle split_copy(EdgeHandle _eh, const Point& _p) + { const VertexHandle vh = this->add_vertex(_p); Kernel::split_copy(_eh, vh); return vh; } + + /** \brief Edge split (= 2-to-4 split) + * + * The properties of the new edges will be undefined! + * + * @param _eh Edge handle that should be splitted + * @param _vh Vertex handle that will be inserted at the edge + */ inline void split(EdgeHandle _eh, VertexHandle _vh) { Kernel::split(_eh, _vh); } - /// Face split (= 1-to-3 split, calls corresponding PolyMeshT function). + /** \brief Edge split (= 2-to-4 split) + * + * The properties of the new edges will be adjusted to the properties of the original edge + * + * @param _eh Edge handle that should be splitted + * @param _vh Vertex handle that will be inserted at the edge + */ + inline void split_copy(EdgeHandle _eh, VertexHandle _vh) + { Kernel::split_copy(_eh, _vh); } + + /** \brief Face split (= 1-to-3 split, calls corresponding PolyMeshT function). + * + * The properties of the new faces will be undefined! + * + * @param _fh Face handle that should be splitted + * @param _p New point position that will be inserted in the face + */ inline void split(FaceHandle _fh, const Point& _p) { PolyMesh::split(_fh, _p); } + /** \brief Face split (= 1-to-3 split, calls corresponding PolyMeshT function). + * + * The properties of the new faces will be adjusted to the properties of the original face + * + * @param _fh Face handle that should be splitted + * @param _p New point position that will be inserted in the face + */ + inline void split_copy(FaceHandle _fh, const Point& _p) + { PolyMesh::split_copy(_fh, _p); } + + /** \brief Face split (= 1-to-3 split, calls corresponding PolyMeshT function). + * + * The properties of the new faces will be undefined! + * + * @param _fh Face handle that should be splitted + * @param _vh Vertex handle that will be inserted at the face + */ inline void split(FaceHandle _fh, VertexHandle _vh) { PolyMesh::split(_fh, _vh); } + + /** \brief Face split (= 1-to-3 split, calls corresponding PolyMeshT function). + * + * The properties of the new faces will be adjusted to the properties of the original face + * + * @param _fh Face handle that should be splitted + * @param _vh Vertex handle that will be inserted at the face + */ + inline void split_copy(FaceHandle _fh, VertexHandle _vh) + { PolyMesh::split_copy(_fh, _vh); } /** \name Normal vector computation */