diff --git a/Skin_surface_3/examples/Skin_surface_3/skin_surface_writer.h b/Skin_surface_3/examples/Skin_surface_3/skin_surface_writer.h index c198781af10..c73f043dd32 100644 --- a/Skin_surface_3/examples/Skin_surface_3/skin_surface_writer.h +++ b/Skin_surface_3/examples/Skin_surface_3/skin_surface_writer.h @@ -29,7 +29,6 @@ void write_polyhedron_with_normals(SkinSurface &skin, // Write vertices - int i=p.size_of_vertices (); for (Vertex_iterator vit = p.vertices_begin(); vit != p.vertices_end(); vit ++) { Vector n = policy.normal(vit); diff --git a/Skin_surface_3/include/CGAL/Skin_surface_3.h b/Skin_surface_3/include/CGAL/Skin_surface_3.h index 6e78b4e15ad..d9a28d8dfdc 100644 --- a/Skin_surface_3/include/CGAL/Skin_surface_3.h +++ b/Skin_surface_3/include/CGAL/Skin_surface_3.h @@ -106,16 +106,16 @@ Skin_surface_3(WP_iterator begin, WP_iterator end, observer, verbose); CGAL_assertion(tmc().dimension() == 3); - { // NGHK: debug code: - CGAL_assertion(tmc().is_valid()); - std::vector ch_vertices; - tmc().incident_vertices(tmc().infinite_vertex(), - std::back_inserter(ch_vertices)); - for (typename std::vector::iterator - vit = ch_vertices.begin(); vit != ch_vertices.end(); vit++) { - CGAL_assertion(sign(*vit) == POSITIVE); - } - } +// { // NGHK: debug code: +// CGAL_assertion(tmc().is_valid()); +// std::vector ch_vertices; +// tmc().incident_vertices(tmc().infinite_vertex(), +// std::back_inserter(ch_vertices)); +// for (typename std::vector::iterator +// vit = ch_vertices.begin(); vit != ch_vertices.end(); vit++) { +// CGAL_assertion(sign(*vit) == POSITIVE); +// } +// } } CGAL_END_NAMESPACE diff --git a/Skin_surface_3/include/CGAL/Skin_surface_base_3.h b/Skin_surface_3/include/CGAL/Skin_surface_base_3.h index a156010ead8..5386ecffbcb 100644 --- a/Skin_surface_3/include/CGAL/Skin_surface_base_3.h +++ b/Skin_surface_3/include/CGAL/Skin_surface_base_3.h @@ -630,8 +630,6 @@ locate_in_tmc(const Bare_point &p0, Cartesian_converter converter_fk; TMC_Point p_inexact = converter_fk(p0); - Protect_FPU_rounding P(CGAL_FE_TONEAREST); - // Make sure we continue from here with a finite cell. if ( start == TMC_Cell_handle() ) start = _tmc.infinite_cell(); @@ -673,9 +671,17 @@ locate_in_tmc(const Bare_point &p0, const TMC_Point* backup = pts[i]; pts[i] = &p_inexact; try { + Protect_FPU_rounding P; + o = TMC_Geom_traits().orientation_3_object()(*pts[0], *pts[1], *pts[2], *pts[3]); + Skin_surface_traits_3 filtered_traits(shrink_factor()); + std::cout << *pts[i==0?1:0] << " == " + << get_anchor_point(c->vertex(i==0?1:0)->info(), + filtered_traits) + << std::endl; + Protect_FPU_rounding P2(CGAL_FE_TONEAREST); typedef Exact_predicates_exact_constructions_kernel EK; Cartesian_converter converter_ek; @@ -695,11 +701,11 @@ locate_in_tmc(const Bare_point &p0, } } - std::cout << *pts[i==0?1:0] << " == " << e_pts[i==0?1:0] << std::endl; - + //CGAL_assertion(o == orientation(e_pts[0], e_pts[1], e_pts[2], e_pts[3])); } catch (Interval_nt_advanced::unsafe_comparison) { + Protect_FPU_rounding P(CGAL_FE_TONEAREST); std::cout << "exact" << std::endl; typedef Exact_predicates_exact_constructions_kernel EK; Cartesian_converter converter_ek; diff --git a/Skin_surface_3/include/CGAL/Triangulated_mixed_complex_observer_3.h b/Skin_surface_3/include/CGAL/Triangulated_mixed_complex_observer_3.h index 5e23eee6df5..135190971f1 100644 --- a/Skin_surface_3/include/CGAL/Triangulated_mixed_complex_observer_3.h +++ b/Skin_surface_3/include/CGAL/Triangulated_mixed_complex_observer_3.h @@ -79,8 +79,8 @@ public: } void after_vertex_insertion(Rt_Simplex const &sDel, - Rt_Simplex const &sVor, - TMC_Vertex_handle &vh) + Rt_Simplex const &sVor, + TMC_Vertex_handle &vh) { vh->info() = typename SkinSurface_3::Vertex_info(sDel, sVor); } diff --git a/Skin_surface_3/include/CGAL/triangulate_mixed_complex_3.h b/Skin_surface_3/include/CGAL/triangulate_mixed_complex_3.h index e3d2c5b1c67..87415dd9b37 100644 --- a/Skin_surface_3/include/CGAL/triangulate_mixed_complex_3.h +++ b/Skin_surface_3/include/CGAL/triangulate_mixed_complex_3.h @@ -137,6 +137,7 @@ public: observer(observer), triangulation_incr_builder(triangulated_mixed_complex), compute_anchor_obj(regular), + construct_anchor_point_3_obj(shrink), verbose(verbose) { build(); @@ -217,14 +218,14 @@ private: } void construct_vertices(); - Tmc_Point get_orthocenter(Rt_Simplex const &s); + Tmc_Point get_weighted_circumcenter(Rt_Simplex const &s); Tmc_Point get_anchor(Rt_Simplex const &sDel, Rt_Simplex const &sVor); template Point construct_anchor_point(const Point ¢er_del, - const Point ¢er_vor) { - return center_del + shrink*(center_vor-center_del); + const Point ¢er_vor) { + return construct_anchor_point_3_obj(center_del,center_vor); } - + void construct_0_cell(Rt_Vertex_handle rt_vh); void construct_1_cell(const Rt_Finite_edges_iterator &eit); void construct_2_cell(const Rt_Finite_facets_iterator &fit); @@ -247,7 +248,11 @@ private: Construct_weighted_circumcenter_3< Regular_triangulation_euclidean_traits_3< - Triangulated_mixed_complex_traits> > orthocenter_obj; + Triangulated_mixed_complex_traits> > weighted_circumcenter_obj; + + Construct_anchor_point_3< + Regular_triangulation_euclidean_traits_3< + Triangulated_mixed_complex_traits> > construct_anchor_point_3_obj; Compute_squared_radius_smallest_orthogonal_sphere_3< Regular_triangulation_euclidean_traits_3< @@ -994,7 +999,7 @@ Mixed_complex_triangulator_3< RegularTriangulation_3, TriangulatedMixedComplex_3, TriangulatedMixedComplexObserver_3>:: -get_orthocenter(Rt_Simplex const &s) { +get_weighted_circumcenter(Rt_Simplex const &s) { Rt_Vertex_handle vh; Rt_Edge e; Rt_Facet f; @@ -1008,13 +1013,13 @@ get_orthocenter(Rt_Simplex const &s) { break; case 1: e=s; - result = orthocenter_obj( + result = weighted_circumcenter_obj( r2t_converter_object(e.first->vertex(e.second)->point()), r2t_converter_object(e.first->vertex(e.third)->point())); break; case 2: f=s; - result = orthocenter_obj( + result = weighted_circumcenter_obj( r2t_converter_object( f.first->vertex((f.second+1)&3)->point()), r2t_converter_object( @@ -1024,7 +1029,7 @@ get_orthocenter(Rt_Simplex const &s) { break; case 3: ch=s; - result = orthocenter_obj( + result = weighted_circumcenter_obj( r2t_converter_object(ch->vertex(0)->point()), r2t_converter_object(ch->vertex(1)->point()), r2t_converter_object(ch->vertex(2)->point()), @@ -1045,10 +1050,10 @@ Mixed_complex_triangulator_3< TriangulatedMixedComplexObserver_3>:: get_anchor(Rt_Simplex const &sDel, Rt_Simplex const &sVor) { - Protect_FPU_rounding P(CGAL_FE_TONEAREST); + Protect_FPU_rounding P; - Tmc_Point dfoc = get_orthocenter(sDel); - Tmc_Point vfoc = get_orthocenter(sVor); + Tmc_Point dfoc = get_weighted_circumcenter(sDel); + Tmc_Point vfoc = get_weighted_circumcenter(sVor); return construct_anchor_point(dfoc, vfoc); }