refine_faces.h

来自「CGAL is a collaborative effort of severa」· C头文件 代码 · 共 429 行

H
429
字号
// Copyright (c) 2004  INRIA Sophia-Antipolis (France).// All rights reserved.//// This file is part of CGAL (www.cgal.org); you may redistribute it under// the terms of the Q Public License version 1.0.// See the file LICENSE.QPL distributed with CGAL.//// Licensees holding a valid commercial license may use this file in// accordance with the commercial license agreement provided with the software.//// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.//// $Source: /CVSROOT/CGAL/Packages/Mesh_2/include/CGAL/Mesh_2/Refine_faces.h,v $// $Revision: 1.11 $ $Date: 2004/11/16 17:32:14 $// $Name:  $//// Author(s)     : Laurent RINEAU#ifndef CGAL_MESH_2_REFINE_FACES_H#define CGAL_MESH_2_REFINE_FACES_H#include <CGAL/Mesh_2/Face_badness.h>#include <CGAL/Double_map.h>#include <boost/iterator/transform_iterator.hpp>namespace CGAL {namespace Mesh_2 {// Previous is the whole previous edges_level.template <typename Tr, typename Criteria, typename Previous>class Refine_faces_base{  /** \name Types from Tr. */  typedef typename Tr::Geom_traits Geom_traits;  typedef typename Geom_traits::FT FT;  typedef FT      Squared_length;  typedef typename Tr::Vertex_handle        Vertex_handle;  typedef typename Tr::Face_handle          Face_handle;  typedef typename Tr::Face_circulator        Face_circulator;  typedef typename Tr::Finite_faces_iterator  Finite_faces_iterator;  typedef typename Tr::All_faces_iterator     All_faces_iterator;  typedef typename Tr::Point                  Point;  typedef Triangulation_mesher_level_traits_2<Tr> Triangulation_traits;  typedef typename Triangulation_traits::Zone Zone;protected: // --- PROTECTED TYPES ---  /** Meshing criteria. */  typedef typename Criteria::Is_bad s_bad;  typedef typename Criteria::Quality Quality;  /** \name typedefs for private members types */  typedef CGAL::Double_map<Face_handle, Quality> Bad_faces;protected:  // --- PROTECTED MEMBER DATAS ---  Tr& tr; /**< The triangulation itself. */  Triangulation_mesher_level_traits_2<Tr> traits;  Criteria& criteria; /**<The meshing criteria */  Previous& previous;  /** List of bad finite faces */  Bad_faces bad_faces;  Mesh_2::Face_badness current_badness;public:  /** \name CONSTRUCTORS */  Refine_faces_base(Tr& t, Criteria& criteria_, Previous& prev)     : tr(t), criteria(criteria_), previous(prev)  {  }  /** \Name MESHER_LEVEL FUNCTIONS */  Tr& get_triangulation_ref()  {    return tr;  }  const Tr& get_triangulation_ref() const  {    return tr;  }  Triangulation_traits& get_triangulation_traits()  {    return traits;  }  const Triangulation_traits& get_triangulation_traits() const  {    return traits;  }  /** Scans all marked faces and put them in the map if they are      bad. */  void do_scan_triangulation()  {    for(typename Tr::Finite_faces_iterator fit = tr.finite_faces_begin();        fit != tr.finite_faces_end();        ++fit)    {      if( fit->is_marked() )	{	  Quality q;	  Mesh_2::Face_badness badness = is_bad(fit, q);	  if( badness != Mesh_2::NOT_BAD )	    push_in_bad_faces(fit, q);	}    }  }  /** Tells if the map of faces to be conformed is empty or not. */  bool is_no_longer_element_to_refine() const  {    return bad_faces.empty();  }  /** Get the next face to conform. */  Face_handle do_get_next_element()  {    Face_handle fh = bad_faces.front()->second;    current_badness = is_bad(bad_faces.front()->first);    CGAL_assertion_code(typename Geom_traits::Orientation_2 orientation =                        tr.geom_traits().orientation_2_object());    CGAL_assertion(orientation(fh->vertex(0)->point(),                               fh->vertex(1)->point(),                               fh->vertex(2)->point()) != COLLINEAR );    return fh;  }  /** Pop the first face of the map. */  void do_pop_next_element()  {    bad_faces.pop_front();  }  /** Returns the circumcenter of the face. */  Point get_refinement_point(const Face_handle& f) const  {    return tr.circumcenter(f);  }  /** Do nothing */  void do_before_conflicts(const Face_handle&, const Point&)  {    previous.set_imperative_refinement(current_badness == 				       Mesh_2::IMPERATIVELY_BAD);  }  /** Do nothing */  std::pair<bool, bool>  do_test_point_conflict_from_superior(const Point&,                                       Zone&)  {    return std::make_pair(true, true);  }  /** Do nothing */  std::pair<bool, bool>  do_private_test_point_conflict(const Point&, Zone& ) const  {    return std::make_pair(true, true);  }  /** Remove the conflicting faces from the bad faces map. */  void do_before_insertion(const Face_handle& fh, const Point&,                           Zone& zone)  {    /** @todo Perhaps this function is useless. */    for(typename Zone::Faces_iterator fh_it = zone.faces.begin();        fh_it != zone.faces.end();        ++fh_it)      {        if(*fh_it != fh && (*fh_it)->is_marked() )          remove_bad_face(*fh_it);        (*fh_it)->set_marked(false);      }  }  /** Do nothing. */  void do_after_no_insertion(const Face_handle&, const Point&,                             Zone&)  {  }  /** Restore markers in the star of \c v. */  void do_after_insertion(const Vertex_handle& v)  {    typename Tr::Face_circulator fc = tr.incident_faces(v), fcbegin(fc);    do {      fc->set_marked(true);    } while (++fc != fcbegin);    compute_new_bad_faces(v);  }private:  /** \name AUXILIARY FUNCTIONS */  /** Auxiliary function called to put a new face in the map. */  void push_in_bad_faces(Face_handle fh, const Quality& q);public:  /** \name Functions that maintain the map of bad faces. */  /**   * Updates the map with faces incident to the vertex \a v.   * @todo The visitor should be made friend, instead of this function to   * be public.   */  void compute_new_bad_faces(Vertex_handle v);  /** Auxiliary function called to erase a face handle from the map. */  void remove_bad_face(Face_handle fh);public:  /** \name ACCESS FUNCTION */  Mesh_2::Face_badness is_bad(const Face_handle fh, Quality& q) const;  Mesh_2::Face_badness is_bad(const Face_handle fh) const;  Mesh_2::Face_badness is_bad(Quality q) const;  /**   * Adds the sequence [\c begin, \c end[ to the list   * of bad faces.   * Use this overriden function if the list of bad faces can be   * computed easily without testing all faces.   * \param Fh_it is an iterator of \c Face_Handle.   */  template <class Fh_it>  void set_bad_faces(Fh_it begin, Fh_it end)  {    bad_faces.clear();    for(Fh_it pfit=begin; pfit!=end; ++pfit)      push_in_bad_faces(*pfit, Quality());  }}; // end class Refine_faces_base  // --- PRIVATE MEMBER FUNCTIONS ---template <typename Tr, typename Criteria, typename Previous>inlinevoid Refine_faces_base<Tr, Criteria, Previous>::push_in_bad_faces(Face_handle fh, const Quality& q){#ifdef DEBUG  std::cerr << "push_in_bad_faces("            << fh->vertex(0)->point() << ","            << fh->vertex(1)->point() << ","            << fh->vertex(2)->point() << ")\n";#endif // DEBUG  CGAL_assertion_code(typename Geom_traits::Orientation_2 orientation =                      tr.geom_traits().orientation_2_object());  CGAL_assertion( orientation(fh->vertex(0)->point(),                              fh->vertex(1)->point(),                              fh->vertex(2)->point()) != COLLINEAR );  CGAL_assertion(fh->is_marked());  bad_faces.insert(fh, q);}template <typename Tr, typename Criteria, typename Previous>inlinevoid Refine_faces_base<Tr, Criteria, Previous>::remove_bad_face(Face_handle fh){#ifdef DEBUG  std::cerr << "bad_faces.erase("            << fh->vertex(0)->point() << ","            << fh->vertex(1)->point() << ","            << fh->vertex(2)->point() << ")\n";#endif // DEBUG  bad_faces.erase(fh);}template <typename Tr, typename Criteria, typename Previous>void Refine_faces_base<Tr, Criteria, Previous>::compute_new_bad_faces(Vertex_handle v){  typename Tr::Face_circulator fc = v->incident_faces(), fcbegin(fc);  do {    if(!tr.is_infinite(fc))      if( fc->is_marked() )	{	  Quality q;	  Mesh_2::Face_badness badness = is_bad(fc, q);	  if( badness != Mesh_2::NOT_BAD )	    push_in_bad_faces(fc, q);	}    fc++;  } while(fc!=fcbegin);}template <typename Tr, typename Criteria, typename Previous>inlineMesh_2::Face_badnessRefine_faces_base<Tr, Criteria, Previous>::is_bad(const Face_handle f, Quality& q) const{  return criteria.is_bad_object()(f, q);}template <typename Tr, typename Criteria, typename Previous>inlineMesh_2::Face_badnessRefine_faces_base<Tr, Criteria, Previous>::is_bad(const Face_handle f) const{  Quality q;  return criteria.is_bad_object()(f, q);}template <typename Tr, typename Criteria, typename Previous>inlineMesh_2::Face_badnessRefine_faces_base<Tr, Criteria, Previous>::is_bad(Quality q) const{  return criteria.is_bad_object()(q);}  namespace details {    template <typename Tr, typename Self, typename Previous>    struct Refine_faces_types    {      typedef Mesher_level <        Triangulation_mesher_level_traits_2<Tr>,        Self,        typename Tr::Face_handle,        Previous > Faces_mesher_level;    }; // end Refine_faces_types  } // end namespace detailstemplate <typename Tr,          typename Criteria,          typename Previous,          typename Base = Refine_faces_base<Tr, Criteria, Previous> >class Refine_faces :   public Base,   public details::Refine_faces_types<Tr,     Refine_faces<Tr, Criteria, Previous, Base>,    Previous>::Faces_mesher_level{  typedef typename Tr::Geom_traits Geom_traits;  template <class Pair>  struct Pair_get_first: public std::unary_function<Pair,                                                    typename Pair::first_type>  {    typedef typename Pair::first_type result;    const result& operator()(const Pair& p) const    {      return p.first;    }  };public:  typedef Refine_faces<Tr, Criteria, Previous, Base> Self;  typedef typename details::Refine_faces_types<Tr, Self, Previous>    ::Faces_mesher_level Mesher;  typedef typename Base::Bad_faces Bad_faces;  typedef typename boost::transform_iterator<    Pair_get_first<typename Bad_faces::Direct_entry>,    typename Bad_faces::const_iterator>   Bad_faces_const_iterator;public:  Refine_faces(Tr& t, Criteria& criteria, Previous& previous)    : Base(t, criteria, previous), Mesher(previous)  {  }  /** \name DEBUGGING FUNCTIONS */  Bad_faces_const_iterator begin() const  {    return Bad_faces_const_iterator(this->bad_faces.begin());  }  Bad_faces_const_iterator end() const  {    return Bad_faces_const_iterator(this->bad_faces.end());  }  bool check_bad_faces()  {    CGAL_assertion_code(typename Geom_traits::Orientation_2 orientation =                        this->tr.geom_traits().orientation_2_object());    for(Bad_faces_const_iterator fit = begin();        fit != end();        ++fit)      if( orientation((*fit)->vertex(0)->point(),                      (*fit)->vertex(1)->point(),                      (*fit)->vertex(2)->point()) == COLLINEAR )        {          std::cerr << "collinear("                    << (*fit)->vertex(0)->point() << ", "                    << (*fit)->vertex(1)->point() << ", "                    << (*fit)->vertex(2)->point()<< ") == true"                    << std::endl;          std::cerr << "Dump of bad_faces:" << std::endl;          this->bad_faces.dump_direct_func(std::cerr);          return false;        }    return true;    }}; // end Refine_faces} // end namespace Mesh_2} // end namespace CGAL#endif // CGAL_MESH_2_REFINE_FACES_H

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?