// Copyright (c) 2004-2005 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. // // $URL$ // $Id$ // // // Author(s) : Laurent RINEAU #ifndef CGAL_IMPLICIT_SURFACES_MESHER_3_H #define CGAL_IMPLICIT_SURFACES_MESHER_3_H #include #include #include #include #include #include namespace CGAL { namespace Mesh_3 { } template < typename Tr, typename Oracle, typename Facets_criteria, typename Tets_criteria > class Implicit_surfaces_mesher_3 { public: typedef typename Tr::Point Point; // ** two mesher levels **/ typedef typename Surface_mesher::Surface_mesher Facets_level; typedef typename Mesh_3::Refine_tets, Facets_level> Tets_level; // ** visitors ** typedef typename Mesh_3::tets::Refine_facets_visitor Tets_facets_visitor; typedef typename Mesh_3::Visitor_for_surface < Tr, Null_mesh_visitor > Surface_facets_visitor; typedef Combine_mesh_visitor Facets_visitor; typedef Surface_mesher::Visitor Tets_visitor; // ** C2T3 ** typedef Complex_2_in_triangulation_3_surface_mesh C2t3; private: Null_mesher_level null_mesher_level; Null_mesh_visitor null_visitor; C2t3 c2t3; Oracle& oracle; Facets_level facets; Tets_level tets; Surface_facets_visitor surface_facets_visitor; Tets_facets_visitor tets_facets_visitor; Facets_visitor facets_visitor; Tets_visitor tets_visitor; bool initialized; public: Implicit_surfaces_mesher_3(Tr& t, Oracle& o, Facets_criteria& c, Tets_criteria tets_crit) : c2t3(t), oracle(o), facets(t, c2t3, oracle, c), tets(t, tets_crit, oracle, facets), surface_facets_visitor(&null_visitor), tets_facets_visitor(&tets, &null_visitor), facets_visitor(Facets_visitor(&surface_facets_visitor, &tets_facets_visitor)), tets_visitor(&facets, &facets_visitor), initialized(false) {} void init() { Tr& tr = tets.triangulation_ref_impl(); typedef typename Tr::Geom_traits Geom_traits; typename Geom_traits::Construct_circumcenter_3 circumcenter = tr.geom_traits().construct_circumcenter_3_object(); for(typename Tr::Finite_cells_iterator cit = tr.finite_cells_begin(); cit != tr.finite_cells_end(); ++cit) { const Point& p = cit->vertex(0)->point(); const Point& q = cit->vertex(1)->point(); const Point& r = cit->vertex(2)->point(); const Point& s = cit->vertex(3)->point(); cit->set_in_domain(oracle.is_in_volume(circumcenter(p,q,r,s))); } for(typename Tr::Finite_vertices_iterator vit = tr.finite_vertices_begin(); vit != tr.finite_vertices_end(); ++vit) vit->info()=true; std::cerr << "Restore infos.\n"; facets.scan_triangulation(); tets.scan_triangulation(); initialized = true; } C2t3& complex_2_in_triangulation_3() { return c2t3; } void refine_mesh() { if(!initialized) init(); tets.refine(tets_visitor); } void refine_surface() { if(!initialized) init(); std::cerr << "Starting refine_surface()\n"; while( ! facets.is_algorithm_done() ) { Tr& tr = tets.triangulation_ref_impl(); for(typename Tr::Finite_vertices_iterator vit = tr.finite_vertices_begin(); vit != tr.finite_vertices_end(); ++vit) CGAL_assertion(vit->info()==true); facets.one_step(tets_visitor.previous_level()); } } void step_by_step() { if(!initialized) init(); tets.try_to_insert_one_point(tets_visitor); } bool done() { return tets.no_longer_element_to_refine(); } }; // end Implicit_surfaces_mesher_3 } // end namespace CGAL #endif // CGAL_IMPLICIT_SURFACES_MESHER_3_H