Add protection of border edges

This commit is contained in:
Andreas Fabri 2016-02-22 13:44:04 +01:00
parent 6e7c567cdb
commit 7f3d561fee
4 changed files with 45 additions and 0 deletions

View File

@ -85,6 +85,12 @@ those triangles is a feature edge.
*/
void detect_features(FT angle_bound=120);
/*!
Detects border edges of the bounding polyhedron and inserts them as features of the domain.
*/
void detect_borders();
/// @}
}; /* end Polyhedral_mesh_domain_with_features_3 */

Binary file not shown.

Before

Width:  |  Height:  |  Size: 133 KiB

After

Width:  |  Height:  |  Size: 114 KiB

View File

@ -41,6 +41,7 @@ int main()
// Get sharp features
domain.detect_features();
domain.detect_borders();
// Mesh criteria
Mesh_criteria criteria(edge_size = 0.025,

View File

@ -39,8 +39,11 @@
#include <CGAL/enum.h>
#include <CGAL/IO/Polyhedron_iostream.h>
#include <CGAL/boost/graph/graph_traits_Polyhedron_3.h>
#include <CGAL/boost/graph/helpers.h>
#include <boost/iterator/transform_iterator.hpp>
#include <boost/foreach.hpp>
#include <string>
#include <vector>
@ -127,6 +130,8 @@ public:
void detect_features(FT angle_in_degree, Polyhedron& p);
void detect_features(FT angle_in_degree = FT(60)) { detect_features(angle_in_degree, polyhedron_); }
void detect_borders();
private:
Polyhedron polyhedron_;
@ -236,6 +241,39 @@ detect_features(FT angle_in_degree, Polyhedron& p)
boost::make_transform_iterator(polylines.end(),extractor));
}
template < typename GT_, typename P_, typename TA_,
typename Tag_, typename E_tag_>
void
Polyhedral_mesh_domain_with_features_3<GT_,P_,TA_,Tag_,E_tag_>::
detect_borders()
{
typedef std::vector<Point_3> Polyline;
typedef std::vector<Polyline>Polylines;
Polylines polylines;
Polyline empty;
typedef boost::graph_traits<Polyhedron>::halfedge_descriptor halfedge_descriptor;
std::set<halfedge_descriptor> visited;
BOOST_FOREACH(halfedge_descriptor h, halfedges(polyhedron_)){
if(visited.find(h) == visited.end()){
if(is_border(h,polyhedron_)){
polylines.push_back(empty);
Polyline& polyline = polylines.back();
polyline.push_back(source(h,polyhedron_)->point());
BOOST_FOREACH(halfedge_descriptor h,halfedges_around_face(h,polyhedron_)){
polyline.push_back(target(h,polyhedron_)->point());
visited.insert(h);
}
} else {
visited.insert(h);
}
}
}
this->add_features(polylines.begin(), polylines.end());
}
} //namespace CGAL