52 #include "HoleInfoT.hh" 59 template<
class MeshT >
61 : mesh_(_mesh), filler_(0)
66 template<
class MeshT >
74 template<
class MeshT >
82 mesh_->add_property( boundary_search,
"Boundary search" );
85 typename MeshT::EdgeIter e_it, e_end=mesh_->edges_end();
86 for (e_it=mesh_->edges_begin(); e_it!=e_end; ++e_it) {
87 mesh_->property( boundary_search , *e_it ) =
false;
92 for (e_it=mesh_->edges_begin(); e_it!=e_end; ++e_it) {
95 if ( mesh_->property( boundary_search , *e_it ) )
99 if ( !mesh_->is_boundary(*e_it))
103 typename MeshT::HalfedgeHandle hh = mesh_->halfedge_handle( *e_it, 0 );
104 if ( ! mesh_->is_boundary( hh ) )
105 hh = mesh_->opposite_halfedge_handle( hh );
108 typename MeshT::Point center(0,0,0);
113 typename MeshT::HalfedgeHandle ch = hh;
115 currentHole.push_back( mesh_->edge_handle(ch) );
117 center += mesh_->point( mesh_->from_vertex_handle(ch) );
119 mesh_->property( boundary_search , mesh_->edge_handle(ch) ) =
true;
123 typename MeshT::VertexHandle vh = mesh_->to_vertex_handle(ch);
125 for (
typename MeshT::VertexOHalfedgeIter voh_it(*mesh_,vh); voh_it.is_valid(); ++voh_it)
126 if ( mesh_->is_boundary( *voh_it ) )
130 typename MeshT::HalfedgeHandle op = mesh_->opposite_halfedge_handle( ch );
131 typename MeshT::VertexOHalfedgeIter voh_it(*mesh_,op);
136 ch = mesh_->next_halfedge_handle( ch );
138 }
while ( ch != hh );
141 center /= currentHole.size();
147 for (
unsigned int i=0; i < currentHole.size(); i++){
148 typename MeshT::HalfedgeHandle hh = mesh_->halfedge_handle( currentHole[i], 0 );
150 if ( ! mesh_->is_boundary( hh ) )
151 hh = mesh_->opposite_halfedge_handle( hh );
153 typename MeshT::VertexHandle vh = mesh_->from_vertex_handle(hh);
157 typename MeshT::Point p = mesh_->point( vh );
159 if ( (p - center).norm() < (p + n - center).norm() ){
168 holes_.push_back(currentHole);
171 mesh_->remove_property( boundary_search);
176 template<
class MeshT >
180 if ( (uint) _index > holes_.size()){
181 std::cerr <<
"Cannot fill hole. Index invalid." << std::endl;
188 filler_->fill_hole( holes_[_index][0], _stages );
190 mesh_->garbage_collection();
192 MeshSelection::clearEdgeSelection(mesh_);
194 mesh_->update_normals();
198 template<
class MeshT >
204 filler_->fill_hole( _eh, _stages );
206 mesh_->garbage_collection();
208 MeshSelection::clearEdgeSelection(mesh_);
210 mesh_->update_normals();
214 template<
class MeshT >
221 filler_->fill_all_holes( _stages );
226 template<
class MeshT >
230 if ( (uint) _index > holes_.size()){
231 std::cerr <<
"Cannot select hole. Index invalid." << std::endl;
235 for ( uint i = 0 ; i < (holes_[_index]).size() ; ++i ) {
236 mesh_->status( (holes_[_index])[i] ).set_selected(
true);
241 template<
class MeshT >
245 _holeCenter =
typename MeshT::Point(0.0,0.0,0.0);
249 for (
size_t i = 0 ; i < holes_[_index].size() ; ++i ) {
250 const typename MeshT::HalfedgeHandle he = mesh_->halfedge_handle(holes_[_index][i],0);
251 const typename MeshT::VertexHandle vh_to = mesh_->to_vertex_handle(he);
253 _holeCenter += mesh_->point(vh_to);
254 _holeNormal += mesh_->normal(vh_to);
257 _holeCenter /=
typename MeshT::Scalar(holes_[_index].size());
258 _holeNormal /=
typename MeshT::Scalar(holes_[_index].size());
259 _holeNormal.normalize();
263 template<
class MeshT >
267 if ( _index >= holes_.size() ) {
268 std::cerr <<
"Invalid hole index " << _index << std::endl;
272 _boundaryLength = 0.0;
274 typename MeshT::Point minCoord =
typename MeshT::Point(std::numeric_limits<typename MeshT::Scalar>::max(),std::numeric_limits<typename MeshT::Scalar>::max(),std::numeric_limits<typename MeshT::Scalar>::max());
275 typename MeshT::Point maxCoord =
typename MeshT::Point(-std::numeric_limits<typename MeshT::Scalar>::max(),-std::numeric_limits<typename MeshT::Scalar>::max(),-std::numeric_limits<typename MeshT::Scalar>::max());
277 for (
size_t i = 0 ; i < holes_[_index].size() ; ++i) {
278 _boundaryLength += mesh_->calc_edge_length(holes_[_index][i]);
280 typename MeshT::Point pos = mesh_->point(mesh_->from_vertex_handle(mesh_->halfedge_handle(holes_[_index][i],0)));
281 minCoord[0] = std::min(minCoord[0],pos[0]);
282 minCoord[1] = std::min(minCoord[1],pos[1]);
283 minCoord[2] = std::min(minCoord[2],pos[2]);
285 maxCoord[0] = std::max(maxCoord[0],pos[0]);
286 maxCoord[1] = std::max(maxCoord[1],pos[1]);
287 maxCoord[2] = std::max(maxCoord[2],pos[2]);
290 _edges = holes_[_index].size();
291 _diagonal = (maxCoord - minCoord).length();
297 template<
class MeshT >
Add normals to mesh item (vertices/faces)
void fillAllHoles(int _stages=3)
fill all holes
HoleInfo(MeshT *_mesh)
Konstruktor.
void getHoleInfo(const unsigned int _index, size_t &_edges, typename MeshT::Scalar &_diagonal, typename MeshT::Scalar &_boundaryLength) const
Functions for selection on a mesh.
void getHolePostitionInfo(const int _index, typename MeshT::Normal &_holeNormal, typename MeshT::Point &_holeCenter) const
Collect information to fly to a hole.
void fillHole(int _index, int _stages=3)
fill hole with given index
void getHoles()
get all holes and store them internally
std::vector< std::vector< typename MeshT::EdgeHandle > > * holes()
get the holes vector
void selectHole(int _index)
select a hole with given index