diff --git a/.travis.yml b/.travis.yml index ba756ef5249..981151439f8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -19,38 +19,38 @@ env: - PACKAGE='Distance_2 Distance_3 Envelope_2 ' - PACKAGE='Envelope_3 Filtered_kernel Generalized_map ' - PACKAGE='Generator Geomview GraphicsView ' - - PACKAGE='HalfedgeDS Hash_map Homogeneous_kernel ' - - PACKAGE='Inscribed_areas Installation Interpolation ' - - PACKAGE='Intersections_2 Intersections_3 Interval_skip_list ' - - PACKAGE='Interval_support Inventor Jet_fitting_3 ' - - PACKAGE='Kernel_23 Kernel_d LEDA ' - - PACKAGE='Linear_cell_complex MacOSX Maintenance ' - - PACKAGE='Matrix_search Mesh_2 Mesh_3 ' - - PACKAGE='Mesher_level Minkowski_sum_2 Minkowski_sum_3 ' - - PACKAGE='Modifier Modular_arithmetic Nef_2 ' - - PACKAGE='Nef_3 Nef_S2 NewKernel_d ' - - PACKAGE='Number_types OpenNL Optimal_transportation_reconstruction_2 ' - - PACKAGE='Optimisation_basic Partition_2 Periodic_2_triangulation_2 ' - - PACKAGE='Periodic_3_mesh_3 Periodic_3_triangulation_3 Point_set_2 ' - - PACKAGE='Point_set_3 Point_set_processing_3 Point_set_shape_detection_3 ' - - PACKAGE='Poisson_surface_reconstruction_3 Polygon Polygon_mesh_processing ' - - PACKAGE='Polyhedron Polyhedron_IO Polyline_simplification_2 ' - - PACKAGE='Polynomial Polytope_distance_d Principal_component_analysis ' - - PACKAGE='Principal_component_analysis_LGPL Profiling_tools Property_map ' - - PACKAGE='QP_solver Random_numbers Ridges_3 ' - - PACKAGE='Scale_space_reconstruction_3 Scripts SearchStructures ' - - PACKAGE='Segment_Delaunay_graph_2 Segment_Delaunay_graph_Linf_2 Set_movable_separability_2 ' - - PACKAGE='Skin_surface_3 Snap_rounding_2 Solver_interface ' - - PACKAGE='Spatial_searching Spatial_sorting STL_Extension ' - - PACKAGE='Straight_skeleton_2 Stream_lines_2 Stream_support ' - - PACKAGE='Subdivision_method_3 Surface_mesh Surface_mesh_approximation ' - - PACKAGE='Surface_mesh_deformation Surface_mesher Surface_mesh_parameterization ' - - PACKAGE='Surface_mesh_segmentation Surface_mesh_shortest_path Surface_mesh_simplification ' - - PACKAGE='Surface_mesh_skeletonization Surface_sweep_2 TDS_2 ' - - PACKAGE='TDS_3 Testsuite Three ' - - PACKAGE='Triangulation Triangulation_2 Triangulation_3 ' - - PACKAGE='Union_find Visibility_2 Voronoi_diagram_2 ' - - PACKAGE='wininst ' + - PACKAGE='HalfedgeDS Hash_map Heat_method_3 ' + - PACKAGE='Homogeneous_kernel Inscribed_areas Installation ' + - PACKAGE='Interpolation Intersections_2 Intersections_3 ' + - PACKAGE='Interval_skip_list Interval_support Inventor ' + - PACKAGE='Jet_fitting_3 Kernel_23 Kernel_d ' + - PACKAGE='LEDA Linear_cell_complex MacOSX ' + - PACKAGE='Maintenance Matrix_search Mesh_2 ' + - PACKAGE='Mesh_3 Mesher_level Minkowski_sum_2 ' + - PACKAGE='Minkowski_sum_3 Modifier Modular_arithmetic ' + - PACKAGE='Nef_2 Nef_3 Nef_S2 ' + - PACKAGE='NewKernel_d Number_types OpenNL ' + - PACKAGE='Optimal_transportation_reconstruction_2 Optimisation_basic Partition_2 ' + - PACKAGE='Periodic_2_triangulation_2 Periodic_3_mesh_3 Periodic_3_triangulation_3 ' + - PACKAGE='Point_set_2 Point_set_3 Point_set_processing_3 ' + - PACKAGE='Point_set_shape_detection_3 Poisson_surface_reconstruction_3 Polygon ' + - PACKAGE='Polygon_mesh_processing Polyhedron Polyhedron_IO ' + - PACKAGE='Polyline_simplification_2 Polynomial Polytope_distance_d ' + - PACKAGE='Principal_component_analysis Principal_component_analysis_LGPL Profiling_tools ' + - PACKAGE='Property_map QP_solver Random_numbers ' + - PACKAGE='Ridges_3 Scale_space_reconstruction_3 Scripts ' + - PACKAGE='SearchStructures Segment_Delaunay_graph_2 Segment_Delaunay_graph_Linf_2 ' + - PACKAGE='Set_movable_separability_2 Skin_surface_3 Snap_rounding_2 ' + - PACKAGE='Solver_interface Spatial_searching Spatial_sorting ' + - PACKAGE='STL_Extension Straight_skeleton_2 Stream_lines_2 ' + - PACKAGE='Stream_support Subdivision_method_3 Surface_mesh ' + - PACKAGE='Surface_mesh_approximation Surface_mesh_deformation Surface_mesher ' + - PACKAGE='Surface_mesh_parameterization Surface_mesh_segmentation Surface_mesh_shortest_path ' + - PACKAGE='Surface_mesh_simplification Surface_mesh_skeletonization Surface_sweep_2 ' + - PACKAGE='TDS_2 TDS_3 Testsuite ' + - PACKAGE='Three Triangulation Triangulation_2 ' + - PACKAGE='Triangulation_3 Union_find Visibility_2 ' + - PACKAGE='Voronoi_diagram_2 wininst ' compiler: clang-3.6 install: - echo "$PWD" diff --git a/.travis/packages.txt b/.travis/packages.txt index 70632cc769f..cae1ecd8f13 100644 --- a/.travis/packages.txt +++ b/.travis/packages.txt @@ -39,6 +39,7 @@ Geomview GraphicsView HalfedgeDS Hash_map +Heat_method_3 Homogeneous_kernel Inscribed_areas Installation diff --git a/AABB_tree/package_info/AABB_tree/dependencies b/AABB_tree/package_info/AABB_tree/dependencies index 68b30352078..c72f4088b6a 100644 --- a/AABB_tree/package_info/AABB_tree/dependencies +++ b/AABB_tree/package_info/AABB_tree/dependencies @@ -16,3 +16,4 @@ Property_map STL_Extension Spatial_searching Stream_support +Distance_3 diff --git a/Algebraic_kernel_d/test/Algebraic_kernel_d/Real_embeddable_traits_extension.cpp b/Algebraic_kernel_d/test/Algebraic_kernel_d/Real_embeddable_traits_extension.cpp index 3a642f9c366..40bea31f5bc 100644 --- a/Algebraic_kernel_d/test/Algebraic_kernel_d/Real_embeddable_traits_extension.cpp +++ b/Algebraic_kernel_d/test/Algebraic_kernel_d/Real_embeddable_traits_extension.cpp @@ -26,6 +26,7 @@ #include #include +#include #include #include diff --git a/Arithmetic_kernel/include/CGAL/BOOST_MP_arithmetic_kernel.h b/Arithmetic_kernel/include/CGAL/BOOST_MP_arithmetic_kernel.h new file mode 100644 index 00000000000..6cc5545c6ce --- /dev/null +++ b/Arithmetic_kernel/include/CGAL/BOOST_MP_arithmetic_kernel.h @@ -0,0 +1,78 @@ +// Copyright (c) 2017 Inria. +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org); you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 3 of the License, +// or (at your option) any later version. +// +// 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$ +// SPDX-License-Identifier: LGPL-3.0+ +// +// Author: Marc Glisse + +#ifndef CGAL_GMPXX_ARITHMETIC_KERNEL_H +#define CGAL_GMPXX_ARITHMETIC_KERNEL_H + +#include +#include + +#include + +#ifdef CGAL_USE_BOOST_MP + +//Currently already included in boost_mp.h +//#include +//#ifdef CGAL_USE_GMP +//#include +//#endif + +// FIXME: the could be several kernels based on Boost.Multiprecision. + +namespace CGAL { +/** \ingroup CGAL_Arithmetic_kernel + * \brief The Boost.Multiprecision set of exact number types + */ +struct BOOST_cpp_arithmetic_kernel : internal::Arithmetic_kernel_base { + typedef boost::multiprecision::cpp_int Integer; + typedef boost::multiprecision::cpp_rational Rational; +}; +#ifdef CGAL_USE_GMP +struct BOOST_gmp_arithmetic_kernel : internal::Arithmetic_kernel_base { + typedef boost::multiprecision::mpz_int Integer; + typedef boost::multiprecision::mpq_rational Rational; +}; +#endif + +template +struct Get_arithmetic_kernel > +: Get_arithmetic_kernel::result_type> {}; + +template <> +struct Get_arithmetic_kernel { + typedef BOOST_cpp_arithmetic_kernel Arithmetic_kernel; +}; +template <> +struct Get_arithmetic_kernel { + typedef BOOST_cpp_arithmetic_kernel Arithmetic_kernel; +}; +#ifdef CGAL_USE_GMP +template <> +struct Get_arithmetic_kernel { + typedef BOOST_gmp_arithmetic_kernel Arithmetic_kernel; +}; +template <> +struct Get_arithmetic_kernel { + typedef BOOST_gmp_arithmetic_kernel Arithmetic_kernel; +}; +#endif +} //namespace CGAL +#endif // CGAL_USE_BOOST_MP +#endif diff --git a/BGL/include/CGAL/boost/graph/Euler_operations.h b/BGL/include/CGAL/boost/graph/Euler_operations.h index eb63b9dc6df..11dd34b1922 100644 --- a/BGL/include/CGAL/boost/graph/Euler_operations.h +++ b/BGL/include/CGAL/boost/graph/Euler_operations.h @@ -1329,38 +1329,37 @@ flip_edge(typename boost::graph_traits::halfedge_descriptor h, /** * \returns `true` if `e` satisfies the *link condition* \cgalCite{degn-tpec-98}, which guarantees that the surface is also 2-manifold after the edge collapse. */ - template +template bool - does_satisfy_link_condition(typename boost::graph_traits::edge_descriptor e, - Graph& g) +does_satisfy_link_condition(typename boost::graph_traits::edge_descriptor e, + Graph& g) { - typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; - typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; - typedef CGAL::Halfedge_around_source_iterator out_edge_iterator; + typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; + typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; + typedef CGAL::Halfedge_around_source_iterator out_edge_iterator; - halfedge_descriptor v0_v1 = halfedge(e,g); - halfedge_descriptor v1_v0 = opposite(v0_v1,g); - - vertex_descriptor v0 = target(v1_v0,g), v1 = target(v0_v1,g); + halfedge_descriptor v0_v1 = halfedge(e,g); + halfedge_descriptor v1_v0 = opposite(v0_v1,g); - vertex_descriptor vL = target(next(v0_v1,g),g); - vertex_descriptor vR = target(next(v1_v0,g),g); + vertex_descriptor v0 = target(v1_v0,g), v1 = target(v0_v1,g); - out_edge_iterator eb1, ee1 ; - out_edge_iterator eb2, ee2 ; + vertex_descriptor vL = target(next(v0_v1,g),g); + vertex_descriptor vR = target(next(v1_v0,g),g); + out_edge_iterator eb1, ee1 ; + out_edge_iterator eb2, ee2 ; // The following loop checks the link condition for v0_v1. // Specifically, that for every vertex 'k' adjacent to both 'p and 'q', 'pkq' is a face of the mesh. - // + // for ( boost::tie(eb1,ee1) = halfedges_around_source(v0,g) ; eb1 != ee1 ; ++ eb1 ) { halfedge_descriptor v0_k = *eb1; - + if ( v0_k != v0_v1 ) { vertex_descriptor k = target(v0_k,g); - + for ( boost::tie(eb2,ee2) = halfedges_around_source(k,g) ; eb2 != ee2 ; ++ eb2 ) { halfedge_descriptor k_v1 = *eb2; @@ -1377,66 +1376,53 @@ bool // If k is either t or b then p-q-k *might* be a face of the mesh. It won't be if k==t but p->q is border // or k==b but q->b is a border (because in that case even though there exists triangles p->q->t (or q->p->b) // they are holes, not faces) - // - + // + bool lIsFace = ( vL == k && (! is_border(v0_v1,g)) ) || ( vR == k && (! is_border(v1_v0,g)) ) ; - - if ( !lIsFace ) { // CGAL_ECMS_TRACE(3," k=V" << get(Vertex_index_map,k) << " IS NOT in a face with p-q. NON-COLLAPSABLE edge." ) ; return false ; - } - else + } + else { //CGAL_ECMS_TRACE(4," k=V" << get(Vertex_index_map,k) << " is in a face with p-q") ; } } - } - } - } - - - if ( is_border(v0_v1,g) ) - { - if ( next(next(next(v0_v1,g),g),g) == v0_v1 ) - { - //CGAL_ECMS_TRACE(3," p-q belongs to an open triangle. NON-COLLAPSABLE edge." ) ; - return false ; } } - else if ( is_border(v1_v0,g) ) + } + + // detect isolated triangle (or triangle attached to a mesh with non-manifold vertices) + if (!is_border(v0_v1,g) && is_border(opposite(next(v0_v1,g), g), g) + && is_border(opposite(prev(v0_v1,g), g), g) ) return false; + if (!is_border(v1_v0,g) && is_border(opposite(next(v1_v0,g), g), g) + && is_border(opposite(prev(v1_v0,g), g), g) ) return false; + + if ( !is_border(v0_v1,g) && !is_border(v1_v0,g) ) + { + if ( is_border(v0,g) && is_border(v1,g) ) { - if ( next(next(next(v1_v0,g),g),g) == v1_v0 ) - { - //CGAL_ECMS_TRACE(3," p-q belongs to an open triangle. NON-COLLAPSABLE edge." ) ; - return false ; - } + //CGAL_ECMS_TRACE(3," both p and q are boundary vertices but p-q is not. NON-COLLAPSABLE edge." ) ; + return false ; } else { - if ( is_border(v0,g) && is_border(v1,g) ) + if ( is_tetrahedron(v0_v1,g) ) { - //CGAL_ECMS_TRACE(3," both p and q are boundary vertices but p-q is not. NON-COLLAPSABLE edge." ) ; + //CGAL_ECMS_TRACE(3," p-q belongs to a tetrahedron. NON-COLLAPSABLE edge." ) ; return false ; - } - else + } + if ( next(v0_v1, g) == opposite(prev(v1_v0, g), g) && + prev(v0_v1, g) == opposite(next(v1_v0, g), g) ) { - if ( is_tetrahedron(v0_v1,g) ) - { - //CGAL_ECMS_TRACE(3," p-q belongs to a tetrahedron. NON-COLLAPSABLE edge." ) ; - return false ; - } - if ( next(v0_v1, g) == opposite(prev(v1_v0, g), g) && - prev(v0_v1, g) == opposite(next(v1_v0, g), g) ) - { - //CGAL_ECMS_TRACE(3," degenerate volume." ) ; - return false ; - } + //CGAL_ECMS_TRACE(3," degenerate volume." ) ; + return false ; } } + } return true ; } diff --git a/BGL/include/CGAL/boost/graph/properties_OpenMesh.h b/BGL/include/CGAL/boost/graph/properties_OpenMesh.h index 1df488dc0e7..4a2569c348a 100644 --- a/BGL/include/CGAL/boost/graph/properties_OpenMesh.h +++ b/BGL/include/CGAL/boost/graph/properties_OpenMesh.h @@ -441,17 +441,17 @@ put(boost::vertex_point_t p, OPEN_MESH_CLASS& g, } // namespace OpenMesh - +// dynamic properties namespace boost { template - struct property_map > +struct property_map > { typedef OPEN_MESH_CLASS SM; typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; typedef CGAL::OM_pmap SMPM; typedef CGAL::internal::Dynamic type; - typedef type const_type; + typedef CGAL::internal::Dynamic_with_index const_type; }; template @@ -461,7 +461,7 @@ struct property_map > typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; typedef CGAL::OM_pmap SMPM; typedef CGAL::internal::Dynamic type; - typedef type const_type; + typedef CGAL::internal::Dynamic_with_index const_type; }; template @@ -471,7 +471,7 @@ struct property_map > typedef typename boost::graph_traits::edge_descriptor edge_descriptor; typedef CGAL::OM_pmap SMPM; typedef CGAL::internal::Dynamic type; - typedef type const_type; + typedef CGAL::internal::Dynamic_with_index const_type; }; template @@ -481,7 +481,7 @@ struct property_map > typedef typename boost::graph_traits::face_descriptor face_descriptor; typedef CGAL::OM_pmap SMPM; typedef CGAL::internal::Dynamic type; - typedef type const_type; + typedef CGAL::internal::Dynamic_with_index const_type; }; } // namespace boost @@ -489,46 +489,84 @@ struct property_map > namespace OpenMesh { +// get function for dynamic properties of mutable graph template -typename boost::property_map >::const_type +typename boost::property_map >::type get(CGAL::dynamic_vertex_property_t, OPEN_MESH_CLASS& om) { typedef OPEN_MESH_CLASS OM; typedef typename boost::property_map >::SMPM SMPM; - typedef typename boost::property_map >::const_type DPM; + typedef typename boost::property_map >::type DPM; return DPM(om, new SMPM(om)); } template -typename boost::property_map >::const_type +typename boost::property_map >::type get(CGAL::dynamic_halfedge_property_t, OPEN_MESH_CLASS& om) { typedef OPEN_MESH_CLASS OM; typedef typename boost::property_map >::SMPM SMPM; - typedef typename boost::property_map >::const_type DPM; + typedef typename boost::property_map >::type DPM; return DPM(om, new SMPM(om)); } template -typename boost::property_map >::const_type +typename boost::property_map >::type get(CGAL::dynamic_edge_property_t, OPEN_MESH_CLASS& om) { typedef OPEN_MESH_CLASS OM; typedef typename boost::property_map >::SMPM SMPM; - typedef typename boost::property_map >::const_type DPM; + typedef typename boost::property_map >::type DPM; return DPM(om, new SMPM(om)); } template -typename boost::property_map >::const_type +typename boost::property_map >::type get(CGAL::dynamic_face_property_t, OPEN_MESH_CLASS& om) { typedef OPEN_MESH_CLASS OM; typedef typename boost::property_map >::SMPM SMPM; - typedef typename boost::property_map >::const_type DPM; + typedef typename boost::property_map >::type DPM; return DPM(om, new SMPM(om)); } +// get function for dynamic properties of const graph +template +typename boost::property_map >::const_type +get(CGAL::dynamic_vertex_property_t, const OPEN_MESH_CLASS& om) +{ + typedef OPEN_MESH_CLASS OM; + typedef typename boost::property_map >::const_type DPM; + return DPM(num_vertices(om)); +} + +template +typename boost::property_map >::const_type +get(CGAL::dynamic_halfedge_property_t, const OPEN_MESH_CLASS& om) +{ + typedef OPEN_MESH_CLASS OM; + typedef typename boost::property_map >::const_type DPM; + return DPM(num_halfedges(om)); +} + +template +typename boost::property_map >::const_type +get(CGAL::dynamic_edge_property_t, const OPEN_MESH_CLASS& om) +{ + typedef OPEN_MESH_CLASS OM; + typedef typename boost::property_map >::const_type DPM; + return DPM(num_edges(om)); +} + +template +typename boost::property_map >::const_type +get(CGAL::dynamic_face_property_t, const OPEN_MESH_CLASS& om) +{ + typedef OPEN_MESH_CLASS OM; + typedef typename boost::property_map >::const_type DPM; + return DPM(num_faces(om)); +} + // implementation detail: required by Dynamic_property_map_deleter template void remove_property(Pmap pm, OPEN_MESH_CLASS& om) diff --git a/Bounding_volumes/include/CGAL/Min_annulus_d.h b/Bounding_volumes/include/CGAL/Min_annulus_d.h index 2a3f44419df..8a73a6ae74a 100644 --- a/Bounding_volumes/include/CGAL/Min_annulus_d.h +++ b/Bounding_volumes/include/CGAL/Min_annulus_d.h @@ -42,6 +42,7 @@ #include #include #include +#include // here is how it works. We have d+2 variables: // R (big radius), r (small radius), c (center). The problem is @@ -466,7 +467,8 @@ public: { CGAL_optimisation_precondition( is_empty() || tco.access_dimension_d_object()( p) == d); ET sqr_d = sqr_dist( p); - ET h_p_sqr = da_coord(p)[d] * da_coord(p)[d]; + ET h_p_sqr(da_coord(p)[d]); + h_p_sqr *= h_p_sqr; return ( ( sqr_d < h_p_sqr * sqr_i_rad_numer) || ( h_p_sqr * sqr_o_rad_numer < sqr_d)); } @@ -623,9 +625,10 @@ private: inner_indices.push_back( 0); outer_indices.push_back( 0); center_coords.resize( d+1); - std::copy( da_coord( points[ 0]), - da_coord( points[ 0])+d+1, - center_coords.begin()); + std::transform( da_coord( points[ 0]), + da_coord( points[ 0])+d+1, + center_coords.begin(), + NT_converter()); sqr_i_rad_numer = ET( 0); sqr_o_rad_numer = ET( 0); sqr_rad_denom = ET( 1); @@ -748,7 +751,8 @@ is_valid( bool verbose, int level) const // all inner support points on inner boundary? Inner_support_point_iterator i_pt_it = inner_support_points_begin(); for ( ; i_pt_it != inner_support_points_end(); ++i_pt_it) { - ET h_p_sqr = da_coord (*i_pt_it)[d] * da_coord (*i_pt_it)[d]; + ET h_p_sqr(da_coord (*i_pt_it)[d]); + h_p_sqr *= h_p_sqr; if ( sqr_dist( *i_pt_it) != h_p_sqr * sqr_i_rad_numer) return CGAL::_optimisation_is_valid_fail( verr, "annulus does not have all inner support points on its inner boundary"); @@ -757,7 +761,8 @@ is_valid( bool verbose, int level) const // all outer support points on outer boundary? Outer_support_point_iterator o_pt_it = outer_support_points_begin(); for ( ; o_pt_it != outer_support_points_end(); ++o_pt_it) { - ET h_p_sqr = da_coord (*o_pt_it)[d] * da_coord (*o_pt_it)[d]; + ET h_p_sqr(da_coord (*o_pt_it)[d]); + h_p_sqr *= h_p_sqr; if ( sqr_dist( *o_pt_it) != h_p_sqr * sqr_o_rad_numer) return CGAL::_optimisation_is_valid_fail( verr, "annulus does not have all outer support points on its outer boundary"); diff --git a/Bounding_volumes/include/CGAL/Rectangular_p_center_traits_2.h b/Bounding_volumes/include/CGAL/Rectangular_p_center_traits_2.h index 2762b0e9fa5..b55ea9eb879 100644 --- a/Bounding_volumes/include/CGAL/Rectangular_p_center_traits_2.h +++ b/Bounding_volumes/include/CGAL/Rectangular_p_center_traits_2.h @@ -68,6 +68,19 @@ struct I_Infinity_distance_2 : public CGAL::cpp98::binary_function< Point_2< R >, Point_2< R >, typename R::FT > { + // Added as workaround for VC2017 with /arch:AVX to fix + // https://cgal.geometryfactory.com/CGAL/testsuite/CGAL-4.14-I-95/Rectangular_p_center_2_Examples/TestReport_afabri_x64_Cygwin-Windows10_MSVC2017-Release-64bits.gz + I_Infinity_distance_2() + {} + + I_Infinity_distance_2(const I_Infinity_distance_2&) + {} + + I_Infinity_distance_2& operator=(const I_Infinity_distance_2&) + { + return *this; + } + typename R::FT operator()(const Point_2< R >& q1, const Point_2< R >& q2) const { return (std::max)(CGAL_NTS abs(q1.x() - q2.x()), diff --git a/Box_intersection_d/test/Box_intersection_d/util.h b/Box_intersection_d/test/Box_intersection_d/util.h index 256327541ca..6f1b351f6c8 100644 --- a/Box_intersection_d/test/Box_intersection_d/util.h +++ b/Box_intersection_d/test/Box_intersection_d/util.h @@ -27,14 +27,18 @@ struct Util { int numBoxes, numDim; int boxNum, dim; - std::fscanf(infile, "%d %d\n", &numBoxes, &numDim); + int n = std::fscanf(infile, "%d %d\n", &numBoxes, &numDim); + assert(n == 2); CGAL_USE(n); std::vector< int > minc( numDim ), maxc( numDim ); /* Read boxes */ for(boxNum = 0; boxNum < numBoxes; boxNum++) { - for(dim = 0; dim < numDim; dim++) - std::fscanf( infile, "[%d, %d) ", &minc[dim], &maxc[dim] ); + for(dim = 0; dim < numDim; dim++) { + n = std::fscanf( infile, "[%d, %d) ", &minc[dim], &maxc[dim] ); + assert( n == 2); + } boxes.push_back( Box( &minc[0], &maxc[0] ) ); - std::fscanf(infile, "\n"); + n = std::fscanf(infile, "\n"); + assert(n == 0); } } diff --git a/CGAL_Core/include/CGAL/CORE/Filter.h b/CGAL_Core/include/CGAL/CORE/Filter.h index 17d22a23b5f..e87ffc52b82 100644 --- a/CGAL_Core/include/CGAL/CORE/Filter.h +++ b/CGAL_Core/include/CGAL/CORE/Filter.h @@ -47,11 +47,13 @@ #if !defined CGAL_CFG_NO_CPP0X_ISFINITE #define CGAL_CORE_finite(x) std::isfinite(x) + #define CGAL_CORE_ilogb(x) ilogb(x) #elif defined (_MSC_VER) || defined (__MINGW32__) // add support for MinGW #define CGAL_CORE_finite(x) _finite(x) - #define ilogb(x) (int)_logb(x) + #define CGAL_CORE_ilogb(x) (int)_logb(x) #else #define CGAL_CORE_finite(x) finite(x) + #define CGAL_CORE_ilogb(x) ilogb(x) #endif #if defined(sun) || defined(__sun) @@ -126,11 +128,11 @@ public: ilogb(x) is floor(log_2(|x|)). Also, ilogb(0) = -INT_MAX. ilogb(NaN) = ilogb(+/-Inf) = INT_MAX */ extLong lMSB() const { - return extLong(ilogb(core_abs(fpVal)-maxAbs*ind*CORE_EPS)); + return extLong(CGAL_CORE_ilogb(core_abs(fpVal)-maxAbs*ind*CORE_EPS)); } /// upper bound on MSB extLong uMSB() const { - return extLong(ilogb(core_abs(fpVal)+maxAbs*ind*CORE_EPS)); + return extLong(CGAL_CORE_ilogb(core_abs(fpVal)+maxAbs*ind*CORE_EPS)); } //@} diff --git a/CGAL_ImageIO/include/CGAL/Image_3.h b/CGAL_ImageIO/include/CGAL/Image_3.h index 9b6e9bbd32c..b87ebe990d8 100644 --- a/CGAL_ImageIO/include/CGAL/Image_3.h +++ b/CGAL_ImageIO/include/CGAL/Image_3.h @@ -73,14 +73,23 @@ struct Indicator_factory class CGAL_IMAGEIO_EXPORT Image_3 { + class Image_deleter { + const bool own_the_data; + + public: + Image_deleter(bool own_the_data) : own_the_data(own_the_data) {} - struct Image_deleter { void operator()(_image* image) { + if(!own_the_data && image != 0) { + image->data = 0; + } ::_freeImage(image); } }; public: + enum Own { OWN_THE_DATA, DO_NOT_OWN_THE_DATA }; + typedef boost::shared_ptr<_image> Image_shared_ptr; typedef Image_shared_ptr Pointer; @@ -88,7 +97,7 @@ protected: Image_shared_ptr image_ptr; // implementation in src/CGAL_ImageIO/Image_3.cpp - bool private_read(_image* im); + bool private_read(_image* im, Own own_the_data = OWN_THE_DATA); public: Image_3() @@ -102,9 +111,9 @@ public: // std::cerr << "Image_3::copy_constructor\n"; } - Image_3(_image* im) + Image_3(_image* im, Own own_the_data = OWN_THE_DATA) { - private_read(im); + private_read(im, own_the_data); } ~Image_3() diff --git a/CGAL_ImageIO/include/CGAL/Image_3_impl.h b/CGAL_ImageIO/include/CGAL/Image_3_impl.h index b199d8ae2e2..5968c3a96c0 100644 --- a/CGAL_ImageIO/include/CGAL/Image_3_impl.h +++ b/CGAL_ImageIO/include/CGAL/Image_3_impl.h @@ -25,12 +25,12 @@ #define CGAL_INLINE_FUNCTION #endif -#include +#include namespace CGAL { CGAL_INLINE_FUNCTION -bool Image_3::private_read(_image* im) +bool Image_3::private_read(_image* im, Own own) { if(im != 0) { @@ -38,7 +38,7 @@ bool Image_3::private_read(_image* im) { ::_freeImage(image()); } - image_ptr = Image_shared_ptr(im, Image_deleter()); + image_ptr = Image_shared_ptr(im, Image_deleter(own == OWN_THE_DATA)); // std::cerr << // boost::format("image=%1% (xdim=%2%, ydim=%3%, zdim=%4%)\n") diff --git a/CGAL_ImageIO/include/CGAL/read_vtk_image_data.h b/CGAL_ImageIO/include/CGAL/read_vtk_image_data.h index c592d3a0be2..158f020c28d 100644 --- a/CGAL_ImageIO/include/CGAL/read_vtk_image_data.h +++ b/CGAL_ImageIO/include/CGAL/read_vtk_image_data.h @@ -55,7 +55,7 @@ static const VTK_to_ImageIO_type_mapper VTK_to_ImageIO_type[VTK_ID_TYPE] = inline Image_3 -read_vtk_image_data(vtkImageData* vtk_image) +read_vtk_image_data(vtkImageData* vtk_image, Image_3::Own owning = Image_3::OWN_THE_DATA) { if(!vtk_image) return Image_3(); @@ -85,16 +85,21 @@ read_vtk_image_data(vtkImageData* vtk_image) image->wdim = imageio_type.wdim; image->wordKind = imageio_type.wordKind; image->sign = imageio_type.sign; - image->data = ::ImageIO_alloc(dims[0]*dims[1]*dims[2]*image->wdim); - std::cerr << "GetNumberOfTuples()=" << vtk_image->GetPointData()->GetScalars()->GetNumberOfTuples() - << "\nimage->size()=" << dims[0]*dims[1]*dims[2] - << "\nwdim=" << image->wdim << '\n'; CGAL_assertion(vtk_image->GetPointData()->GetScalars()->GetNumberOfTuples() == dims[0]*dims[1]*dims[2]); - vtk_image->GetPointData()->GetScalars()->ExportToVoidPointer(image->data); + if(owning == Image_3::OWN_THE_DATA) { + image->data = ::ImageIO_alloc(dims[0]*dims[1]*dims[2]*image->wdim); + // std::cerr << "GetNumberOfTuples()=" << vtk_image->GetPointData()->GetScalars()->GetNumberOfTuples() + // << "\nimage->size()=" << dims[0]*dims[1]*dims[2] + // << "\nwdim=" << image->wdim << '\n'; + vtk_image->GetPointData()->GetScalars()->ExportToVoidPointer(image->data); + } else { + image->data = vtk_image->GetPointData()->GetScalars()->GetVoidPointer(0); + } - return Image_3(image); + return Image_3(image, owning); } } // namespace CGAL + #endif // CGAL_READ_VTK_IMAGE_DATA_H diff --git a/Cartesian_kernel/include/CGAL/Cartesian/Circle_3.h b/Cartesian_kernel/include/CGAL/Cartesian/Circle_3.h index 56d861345c0..d2ed2fc5362 100644 --- a/Cartesian_kernel/include/CGAL/Cartesian/Circle_3.h +++ b/Cartesian_kernel/include/CGAL/Cartesian/Circle_3.h @@ -81,7 +81,7 @@ public: CGAL_kernel_assertion((p.a() * center.x() + p.b() * center.y() + p.c() * center.z() + - p.d()) == CGAL::ZERO); + p.d()) == 0); CGAL_kernel_assertion(squared_r >= FT(0)); base = Rep(Sphere_3(center,squared_r), p); } diff --git a/Circular_kernel_2/include/CGAL/Circular_kernel_2/Circular_arc_2.h b/Circular_kernel_2/include/CGAL/Circular_kernel_2/Circular_arc_2.h index 514cadaeb17..a1ee4abbb5c 100644 --- a/Circular_kernel_2/include/CGAL/Circular_kernel_2/Circular_arc_2.h +++ b/Circular_kernel_2/include/CGAL/Circular_kernel_2/Circular_arc_2.h @@ -191,7 +191,7 @@ namespace internal { // the circles intersect const std::pair* - result = CGAL::internal::intersect_get< std::pair >(*it); + result = CGAL::Intersections::internal::intersect_get< std::pair >(*it); if ( result->second == 2 ){ // double solution _begin = result->first; _end = result->first; @@ -202,7 +202,7 @@ namespace internal { _end = result->first; if (!(b_1 && b_2)) { ++it; - result = CGAL::internal::intersect_get< std::pair >(*it); + result = CGAL::Intersections::internal::intersect_get< std::pair >(*it); if (!b_1) _begin = result->first; if (!b_2) diff --git a/Circular_kernel_2/include/CGAL/Circular_kernel_2/Line_arc_2.h b/Circular_kernel_2/include/CGAL/Circular_kernel_2/Line_arc_2.h index 4013c139755..1ee97d42289 100644 --- a/Circular_kernel_2/include/CGAL/Circular_kernel_2/Line_arc_2.h +++ b/Circular_kernel_2/include/CGAL/Circular_kernel_2/Line_arc_2.h @@ -92,13 +92,13 @@ public: // the circles intersect const std::pair* - result = CGAL::internal::intersect_get >(*it); + result = CGAL::Intersections::internal::intersect_get >(*it); // get must have succeeded if ( result->second == 2 ) // double solution return result->first; if (b) return result->first; ++it; - result = CGAL::internal::intersect_get >(*it); + result = CGAL::Intersections::internal::intersect_get >(*it); return result->first; } @@ -136,14 +136,14 @@ public: CGAL_kernel_precondition(do_intersect(support, l2)); //typedef typename Root_of_2::RT RT_2; typename Intersection_traits::result_type - v = CGAL::internal::intersection(support, l1, CK()); + v = CGAL::Intersections::internal::intersection(support, l1, CK()); CGAL_assertion(bool(v)); - const Point_2 *pt = CGAL::internal::intersect_get(v); + const Point_2 *pt = CGAL::Intersections::internal::intersect_get(v); CGAL_assertion(pt != NULL); _begin = Circular_arc_point_2(*pt); - v = CGAL::internal::intersection(support, l2, CK()); - const Point_2 *pt2 = CGAL::internal::intersect_get(v); + v = CGAL::Intersections::internal::intersection(support, l2, CK()); + const Point_2 *pt2 = CGAL::Intersections::internal::intersect_get(v); CGAL_assertion(pt2 != NULL); _end = Circular_arc_point_2(*pt2); reset_flags(); diff --git a/Circular_kernel_2/include/CGAL/Circular_kernel_2/function_objects_polynomial_circular.h b/Circular_kernel_2/include/CGAL/Circular_kernel_2/function_objects_polynomial_circular.h index 40758b51b4a..551fb6fd963 100644 --- a/Circular_kernel_2/include/CGAL/Circular_kernel_2/function_objects_polynomial_circular.h +++ b/Circular_kernel_2/include/CGAL/Circular_kernel_2/function_objects_polynomial_circular.h @@ -508,7 +508,7 @@ namespace CircularFunctors { template result_type operator()(const T1& t1, const T2& t2) const - { return internal::do_intersect(t1, t2, CK()); } + { return Intersections::internal::do_intersect(t1, t2, CK()); } }; template < class CK > diff --git a/Circular_kernel_2/include/CGAL/Circular_kernel_2/internal_functions_on_circle_2.h b/Circular_kernel_2/include/CGAL/Circular_kernel_2/internal_functions_on_circle_2.h index bd39cf5b175..f2293257eb6 100644 --- a/Circular_kernel_2/include/CGAL/Circular_kernel_2/internal_functions_on_circle_2.h +++ b/Circular_kernel_2/include/CGAL/Circular_kernel_2/internal_functions_on_circle_2.h @@ -54,7 +54,7 @@ circle_intersect( const typename CK::Circle_2 & c1, // the circles intersect const std::pair* - result = internal::intersect_get > (*it); + result = Intersections::internal::intersect_get > (*it); if ( result->second == 2 ) // double solution return result->first; @@ -63,7 +63,7 @@ circle_intersect( const typename CK::Circle_2 & c1, return result->first; ++it; - result = internal::intersect_get > (*it); + result = Intersections::internal::intersect_get > (*it); return result->first; } diff --git a/Circular_kernel_2/include/CGAL/Circular_kernel_2/internal_functions_on_line_arc_2.h b/Circular_kernel_2/include/CGAL/Circular_kernel_2/internal_functions_on_line_arc_2.h index d0ca21dba38..ad82a932929 100644 --- a/Circular_kernel_2/include/CGAL/Circular_kernel_2/internal_functions_on_line_arc_2.h +++ b/Circular_kernel_2/include/CGAL/Circular_kernel_2/internal_functions_on_line_arc_2.h @@ -488,10 +488,10 @@ namespace CircularFunctors { } typename Intersection_traits::result_type - v = CGAL::internal::intersection(a1.supporting_line(), a2.supporting_line(), CK()); + v = CGAL::Intersections::internal::intersection(a1.supporting_line(), a2.supporting_line(), CK()); if(!v) return res; - const Point_2 *pt = CGAL::internal::intersect_get(v); + const Point_2 *pt = CGAL::Intersections::internal::intersect_get(v); if(pt == NULL) return res; Circular_arc_point_2 intersect_point = Circular_arc_point_2(*pt); // (Root_for_circles_2_2(Root_of_2(pt->x()),Root_of_2(pt->y()))); diff --git a/Circular_kernel_2/include/CGAL/Circular_kernel_intersections.h b/Circular_kernel_2/include/CGAL/Circular_kernel_intersections.h index 37ba0d3e874..fcc0a32b932 100644 --- a/Circular_kernel_2/include/CGAL/Circular_kernel_intersections.h +++ b/Circular_kernel_2/include/CGAL/Circular_kernel_intersections.h @@ -48,7 +48,8 @@ intersection(const A &c1, const B &c2, OutputIterator res) \ { \ return typename K::Intersect_2()(c1, c2, res); \ } \ -namespace internal { \ +namespace Intersections { \ + namespace internal { \ template \ inline \ bool \ @@ -59,6 +60,7 @@ namespace internal { \ return !res.empty(); \ } \ } \ + } \ template \ inline \ bool \ diff --git a/Circular_kernel_2/test/Circular_kernel_2/test_Line_arc.cpp b/Circular_kernel_2/test/Circular_kernel_2/test_Line_arc.cpp index 07e3ae302bd..7264fb8f89b 100644 --- a/Circular_kernel_2/test/Circular_kernel_2/test_Line_arc.cpp +++ b/Circular_kernel_2/test/Circular_kernel_2/test_Line_arc.cpp @@ -30,7 +30,6 @@ #include #include #include -#include #include #include #include diff --git a/Circular_kernel_3/include/CGAL/Circular_kernel_3/Circular_arc_3.h b/Circular_kernel_3/include/CGAL/Circular_kernel_3/Circular_arc_3.h index cf5a804accb..7b315ad79f9 100644 --- a/Circular_kernel_3/include/CGAL/Circular_kernel_3/Circular_arc_3.h +++ b/Circular_kernel_3/include/CGAL/Circular_kernel_3/Circular_arc_3.h @@ -282,7 +282,15 @@ namespace CGAL { const double dz = z2-z1; const double d_sq = dx*dx + dy*dy + dz*dz; const double r_sq = to_double(squared_radius()); - const double ap_ang = 2.0 * std::asin(0.5 * std::sqrt(d_sq / r_sq)); + const double s = 0.5 * std::sqrt(d_sq / r_sq); + double ap_ang; + if(std::abs(s)<=1) { + ap_ang = 2.0 * std::asin(s); + } else { + // We only allow a small rounding error + CGAL_assertion(std::abs(s)<=1.0001); + ap_ang = (s < 0) ? -CGAL_PI : CGAL_PI; + } if(sign_cross_product() == NEGATIVE) return 2.0 * CGAL_PI - ap_ang; else return ap_ang; } diff --git a/Circular_kernel_3/include/CGAL/Circular_kernel_3/internal_function_compare_to_right_spherical_kernel.h b/Circular_kernel_3/include/CGAL/Circular_kernel_3/internal_function_compare_to_right_spherical_kernel.h index c658257eb75..adb1eb2146b 100644 --- a/Circular_kernel_3/include/CGAL/Circular_kernel_3/internal_function_compare_to_right_spherical_kernel.h +++ b/Circular_kernel_3/include/CGAL/Circular_kernel_3/internal_function_compare_to_right_spherical_kernel.h @@ -70,7 +70,7 @@ struct Trait_for_cmp_tgt_theta_0{ typename SK::FT unsigned_tkz_coeff_normal( const typename SK::Point_3& C,const typename SK::FT& gamma_k) const { - return - CGAL_NTS sign(gamma_k)*C.y(); + return - (int)CGAL_NTS sign(gamma_k)*C.y(); } Tk_type diff --git a/Circular_kernel_3/include/CGAL/Circular_kernel_3/internal_functions_on_circle_3.h b/Circular_kernel_3/include/CGAL/Circular_kernel_3/internal_functions_on_circle_3.h index 9e5fec4b652..295877da4e6 100644 --- a/Circular_kernel_3/include/CGAL/Circular_kernel_3/internal_functions_on_circle_3.h +++ b/Circular_kernel_3/include/CGAL/Circular_kernel_3/internal_functions_on_circle_3.h @@ -130,8 +130,8 @@ namespace CGAL { intersect_3(circle,plane,std::back_inserter(inters)); CGAL_kernel_precondition(inters.size()==2); const std::pair* pt[2]={NULL,NULL}; - pt[0]=CGAL::internal::intersect_get >(inters[0]); - pt[1]=CGAL::internal::intersect_get >(inters[1]); + pt[0]=CGAL::Intersections::internal::intersect_get >(inters[0]); + pt[1]=CGAL::Intersections::internal::intersect_get >(inters[1]); CGAL_kernel_precondition(pt[0]!=NULL); CGAL_kernel_precondition(pt[1]!=NULL); diff --git a/Circular_kernel_3/include/CGAL/Circular_kernel_3/internal_functions_on_circular_arc_3.h b/Circular_kernel_3/include/CGAL/Circular_kernel_3/internal_functions_on_circular_arc_3.h index 717f9116c83..5ec837de728 100644 --- a/Circular_kernel_3/include/CGAL/Circular_kernel_3/internal_functions_on_circular_arc_3.h +++ b/Circular_kernel_3/include/CGAL/Circular_kernel_3/internal_functions_on_circular_arc_3.h @@ -103,12 +103,12 @@ namespace CGAL { std::back_inserter(solutions) ); if(solutions.size() == 0) return res; if(solutions.size() == 1) { - const Solution& sol=*CGAL::internal::intersect_get(solutions[0]); + const Solution& sol=*CGAL::Intersections::internal::intersect_get(solutions[0]); if(SK().has_on_3_object()(ca,sol.first,true)) *res++ = solutions[0]; } else { - const Solution& sol1=*CGAL::internal::intersect_get(solutions[0]); - const Solution& sol2=*CGAL::internal::intersect_get(solutions[1]); + const Solution& sol1=*CGAL::Intersections::internal::intersect_get(solutions[0]); + const Solution& sol2=*CGAL::Intersections::internal::intersect_get(solutions[1]); if(SK().has_on_3_object()(ca,sol1.first,true)) *res++ = solutions[0]; if(SK().has_on_3_object()(ca,sol2.first,true)) @@ -140,12 +140,12 @@ namespace CGAL { std::back_inserter(solutions) ); if(solutions.size() == 0) return res; if(solutions.size() == 1) { - const Solution& sol=*CGAL::internal::intersect_get(solutions[0]); + const Solution& sol=*CGAL::Intersections::internal::intersect_get(solutions[0]); if(SK().has_on_3_object()(ca,sol.first,true)) *res++ = solutions[0]; } else { - const Solution& sol1=*CGAL::internal::intersect_get(solutions[0]); - const Solution& sol2=*CGAL::internal::intersect_get(solutions[1]); + const Solution& sol1=*CGAL::Intersections::internal::intersect_get(solutions[0]); + const Solution& sol2=*CGAL::Intersections::internal::intersect_get(solutions[1]); if(SK().has_on_3_object()(ca,sol1.first,true)) *res++ = solutions[0]; if(SK().has_on_3_object()(ca,sol2.first,true)) @@ -178,12 +178,12 @@ namespace CGAL { std::back_inserter(solutions) ); if(solutions.size() == 0) return res; if(solutions.size() == 1) { - const Solution& sol=*CGAL::internal::intersect_get(solutions[0]); + const Solution& sol=*CGAL::Intersections::internal::intersect_get(solutions[0]); if(SK().has_on_3_object()(c,sol.first,true)) *res++ = solutions[0]; } else { - const Solution& sol1=*CGAL::internal::intersect_get(solutions[0]); - const Solution& sol2=*CGAL::internal::intersect_get(solutions[1]); + const Solution& sol1=*CGAL::Intersections::internal::intersect_get(solutions[0]); + const Solution& sol2=*CGAL::Intersections::internal::intersect_get(solutions[1]); if(SK().has_on_3_object()(c,sol1.first,true)) *res++ = solutions[0]; if(SK().has_on_3_object()(c,sol2.first,true)) @@ -215,12 +215,12 @@ namespace CGAL { std::back_inserter(solutions) ); if(solutions.size() == 0) return res; if(solutions.size() == 1) { - const Solution& sol=*CGAL::internal::intersect_get(solutions[0]); + const Solution& sol=*CGAL::Intersections::internal::intersect_get(solutions[0]); if(SK().has_on_3_object()(ca,sol.first,true)) *res++ = CGAL::internal::sk3_intersection_return(sol); } else { - const Solution& sol1=*CGAL::internal::intersect_get(solutions[0]); - const Solution& sol2=*CGAL::internal::intersect_get(solutions[1]); + const Solution& sol1=*CGAL::Intersections::internal::intersect_get(solutions[0]); + const Solution& sol2=*CGAL::Intersections::internal::intersect_get(solutions[1]); if(SK().has_on_3_object()(ca,sol1.first,true)) *res++ = CGAL::internal::sk3_intersection_return(sol1); if(SK().has_on_3_object()(ca,sol2.first,true)) @@ -247,13 +247,13 @@ namespace CGAL { std::back_inserter(solutions) ); if(solutions.size() == 0) return res; if(solutions.size() == 1) { - const Solution& sol=*CGAL::internal::intersect_get(solutions[0]); + const Solution& sol=*CGAL::Intersections::internal::intersect_get(solutions[0]); if(SK().has_on_3_object()(ca,sol.first,true) && SK().has_on_3_object()(la,sol.first,true)) *res++ = solutions[0]; } else { - const Solution& sol1=*CGAL::internal::intersect_get(solutions[0]); - const Solution& sol2=*CGAL::internal::intersect_get(solutions[1]); + const Solution& sol1=*CGAL::Intersections::internal::intersect_get(solutions[0]); + const Solution& sol2=*CGAL::Intersections::internal::intersect_get(solutions[1]); if(SK().has_on_3_object()(ca,sol1.first,true) && SK().has_on_3_object()(la,sol1.first,true)) *res++ = solutions[0]; @@ -359,13 +359,13 @@ namespace CGAL { std::back_inserter(solutions) ); if(solutions.size() == 0) return res; if(solutions.size() == 1) { - const Solution& sol=*CGAL::internal::intersect_get(solutions[0]); + const Solution& sol=*CGAL::Intersections::internal::intersect_get(solutions[0]); if(SK().has_on_3_object()(a1,sol.first,true) && SK().has_on_3_object()(a2,sol.first,true)) *res++ = solutions[0]; } else { - const Solution& sol1=*CGAL::internal::intersect_get(solutions[0]); - const Solution& sol2=*CGAL::internal::intersect_get(solutions[1]); + const Solution& sol1=*CGAL::Intersections::internal::intersect_get(solutions[0]); + const Solution& sol2=*CGAL::Intersections::internal::intersect_get(solutions[1]); if(SK().has_on_3_object()(a1,sol1.first,true) && SK().has_on_3_object()(a2,sol1.first,true)) *res++ = solutions[0]; @@ -481,8 +481,8 @@ namespace CGAL { //one endpoint is extremal: just split the arc if (nb_extrem==1){ const std::pair* pt[2]={NULL,NULL}; - pt[0]=CGAL::internal::intersect_get >(inters[0]); - pt[1]=CGAL::internal::intersect_get >(inters[1]); + pt[0]=CGAL::Intersections::internal::intersect_get >(inters[0]); + pt[1]=CGAL::Intersections::internal::intersect_get >(inters[1]); CGAL_kernel_precondition(pt[0]!=NULL); CGAL_kernel_precondition(pt[1]!=NULL); const typename SK::Circular_arc_point_3& midpt=(arc.source()==pt[0]->first || arc.target()==pt[0]->first)?pt[1]->first:pt[0]->first; @@ -496,7 +496,7 @@ namespace CGAL { //only one intersection points if (inters.size()==1){ const std::pair* midpt=NULL; - midpt=CGAL::internal::intersect_get >(inters[0]); + midpt=CGAL::Intersections::internal::intersect_get >(inters[0]); CGAL_kernel_precondition(midpt!=NULL); *out_it++=typename SK::Circular_arc_3(arc.supporting_circle(),arc.source(),midpt->first); *out_it++=typename SK::Circular_arc_3(arc.supporting_circle(),midpt->first,arc.target()); @@ -505,8 +505,8 @@ namespace CGAL { //three arcs are defined by two intersection points const std::pair* pt[2]={NULL,NULL}; - pt[0]=CGAL::internal::intersect_get >(inters[0]); - pt[1]=CGAL::internal::intersect_get >(inters[1]); + pt[0]=CGAL::Intersections::internal::intersect_get >(inters[0]); + pt[1]=CGAL::Intersections::internal::intersect_get >(inters[1]); CGAL_kernel_precondition(pt[0]!=NULL); CGAL_kernel_precondition(pt[1]!=NULL); @@ -590,16 +590,16 @@ namespace CGAL { CGAL_kernel_precondition(!inters.empty()); if (inters.size()==1){ const typename SK::Circular_arc_point_3& pt= - CGAL::internal::intersect_get >(inters[0])->first; + CGAL::Intersections::internal::intersect_get >(inters[0])->first; return pt; } CGAL_kernel_precondition(classify_circle_3(arc.supporting_circle(),sphere)!=NORMAL); const typename SK::Circular_arc_point_3& pts1 = - CGAL::internal::intersect_get >(inters[0])->first; + CGAL::Intersections::internal::intersect_get >(inters[0])->first; const typename SK::Circular_arc_point_3& pts2 = - CGAL::internal::intersect_get >(inters[1])->first; + CGAL::Intersections::internal::intersect_get >(inters[1])->first; //either a polar (1 pole + 1 pt) or a threaded circle (2 pts with theta-coord = +/- pi) diff --git a/Circular_kernel_3/include/CGAL/Circular_kernel_3/internal_functions_on_line_arc_3.h b/Circular_kernel_3/include/CGAL/Circular_kernel_3/internal_functions_on_line_arc_3.h index 9a8858dc0fa..2c2e7b8c803 100644 --- a/Circular_kernel_3/include/CGAL/Circular_kernel_3/internal_functions_on_line_arc_3.h +++ b/Circular_kernel_3/include/CGAL/Circular_kernel_3/internal_functions_on_line_arc_3.h @@ -101,12 +101,12 @@ namespace CGAL { if(!o) return res; - if(const Point_3* inters_p = CGAL::internal::intersect_get(o)) { + if(const Point_3* inters_p = CGAL::Intersections::internal::intersect_get(o)) { Circular_arc_point_3 p = *inters_p; if(!SK().has_on_3_object()(l1,p,true)) return res; if(!SK().has_on_3_object()(l2,p,true)) return res; *res++ = CGAL::internal::sk3_intersection_return(std::make_pair(p,1u)); - } else if( CGAL::internal::intersect_get(o) ) { + } else if( CGAL::Intersections::internal::intersect_get(o) ) { if(SK().compare_xyz_3_object()(l1.lower_xyz_extremity(), l2.lower_xyz_extremity()) < 0) { int comparison = @@ -167,9 +167,9 @@ namespace CGAL { if(!o) return res; - if(const Line_3* inters_l = CGAL::internal::intersect_get(o)) { + if(const Line_3* inters_l = CGAL::Intersections::internal::intersect_get(o)) { *res++ = CGAL::internal::sk3_intersection_return(la); - } else if(const Point_3* inters_p = CGAL::internal::intersect_get(o)) { + } else if(const Point_3* inters_p = CGAL::Intersections::internal::intersect_get(o)) { Circular_arc_point_3 p = *inters_p; if(!SK().has_on_3_object()(la,p,true)) return res; *res++ = CGAL::internal::sk3_intersection_return(std::make_pair(p,1u)); @@ -195,12 +195,12 @@ namespace CGAL { std::back_inserter(solutions) ); if(solutions.size() == 0) return res; if(solutions.size() == 1) { - const Solution* sol = CGAL::internal::intersect_get(solutions[0]); + const Solution* sol = CGAL::Intersections::internal::intersect_get(solutions[0]); if(SK().has_on_3_object()(l,(*sol).first,true)) *res++ = solutions[0]; } else { - const Solution* sol1 = CGAL::internal::intersect_get(solutions[0]); - const Solution* sol2 = CGAL::internal::intersect_get(solutions[1]); + const Solution* sol1 = CGAL::Intersections::internal::intersect_get(solutions[0]); + const Solution* sol2 = CGAL::Intersections::internal::intersect_get(solutions[1]); if(SK().has_on_3_object()(l,(*sol1).first,true)) *res++ = solutions[0]; @@ -226,12 +226,12 @@ namespace CGAL { std::back_inserter(solutions) ); if(solutions.size() == 0) return res; if(solutions.size() == 1) { - const Solution* sol = CGAL::internal::intersect_get(solutions[0]); + const Solution* sol = CGAL::Intersections::internal::intersect_get(solutions[0]); if(SK().has_on_3_object()(l,(*sol).first,true)) *res++ = solutions[0]; } else { - const Solution* sol1 = CGAL::internal::intersect_get(solutions[0]); - const Solution* sol2 = CGAL::internal::intersect_get(solutions[1]); + const Solution* sol1 = CGAL::Intersections::internal::intersect_get(solutions[0]); + const Solution* sol2 = CGAL::Intersections::internal::intersect_get(solutions[1]); if(SK().has_on_3_object()(l,(*sol1).first,true)) *res++ = solutions[0]; if(SK().has_on_3_object()(l,(*sol2).first,true)) @@ -257,7 +257,7 @@ namespace CGAL { if(!o) return res; - if((sol = CGAL::internal::intersect_get(o))) { + if((sol = CGAL::Intersections::internal::intersect_get(o))) { if(!SK().has_on_3_object()(l,*sol)) return res; Circular_arc_point_3 point = sol; *res++ = result_type(std::make_pair(point,1u)); diff --git a/Circular_kernel_3/include/CGAL/Circular_kernel_3/internal_functions_on_sphere_3.h b/Circular_kernel_3/include/CGAL/Circular_kernel_3/internal_functions_on_sphere_3.h index 4c0936086ee..81c43824786 100644 --- a/Circular_kernel_3/include/CGAL/Circular_kernel_3/internal_functions_on_sphere_3.h +++ b/Circular_kernel_3/include/CGAL/Circular_kernel_3/internal_functions_on_sphere_3.h @@ -336,7 +336,7 @@ namespace CGAL { typename Intersection_traits::result_type v = SK().intersect_3_object()(s1, s2); if(!v) return res; - if(const Point_3* p = CGAL::internal::intersect_get(v)) { + if(const Point_3* p = CGAL::Intersections::internal::intersect_get(v)) { if(SK().has_on_3_object()(s3, *p)) { #if CGAL_INTERSECTION_VERSION < 2 *res++ = make_object(std::make_pair(Circular_arc_point_3(*p),2u)); @@ -346,7 +346,7 @@ namespace CGAL { } return res; } - if(const Circle_3* c = CGAL::internal::intersect_get(v)) { + if(const Circle_3* c = CGAL::Intersections::internal::intersect_get(v)) { if(SK().has_on_3_object()(s3, *c)) { #if CGAL_INTERSECTION_VERSION < 2 *res++ = make_object(*c); diff --git a/Circular_kernel_3/include/CGAL/Spherical_kernel_intersections.h b/Circular_kernel_3/include/CGAL/Spherical_kernel_intersections.h index 2adfd88f51e..1f2af032485 100644 --- a/Circular_kernel_3/include/CGAL/Spherical_kernel_intersections.h +++ b/Circular_kernel_3/include/CGAL/Spherical_kernel_intersections.h @@ -38,6 +38,14 @@ namespace CGAL { +#define CGAL_SPHERICAL_KERNEL_MACRO_GLOBAL_FUNCTION_JUST_INTERSECTION_2_(A,B) \ +template < class OutputIterator, class K > \ +OutputIterator \ +intersection(const A &c1, const B &c2, OutputIterator res) \ +{ \ + return typename K::Intersect_3()(c1, c2, res); \ +} + #define CGAL_SPHERICAL_KERNEL_MACRO_GLOBAL_FUNCTION_INTERSECTION_2_(A,B) \ template < class OutputIterator, class K > \ OutputIterator \ @@ -68,8 +76,8 @@ do_intersect(const A &c1, const B &c2, const C &c3) \ return typename K::Do_intersect_3()(c1, c2, c3); \ } -CGAL_SPHERICAL_KERNEL_MACRO_GLOBAL_FUNCTION_INTERSECTION_2_(Sphere_3, Line_3) -CGAL_SPHERICAL_KERNEL_MACRO_GLOBAL_FUNCTION_INTERSECTION_2_(Line_3, Sphere_3) +CGAL_SPHERICAL_KERNEL_MACRO_GLOBAL_FUNCTION_JUST_INTERSECTION_2_(Sphere_3, Line_3) +CGAL_SPHERICAL_KERNEL_MACRO_GLOBAL_FUNCTION_JUST_INTERSECTION_2_(Line_3, Sphere_3) CGAL_SPHERICAL_KERNEL_MACRO_GLOBAL_FUNCTION_INTERSECTION_3_(Sphere_3, Sphere_3, Sphere_3) CGAL_SPHERICAL_KERNEL_MACRO_GLOBAL_FUNCTION_INTERSECTION_3_(Sphere_3, Sphere_3, Plane_3) CGAL_SPHERICAL_KERNEL_MACRO_GLOBAL_FUNCTION_INTERSECTION_3_(Plane_3, Sphere_3, Sphere_3) diff --git a/Circular_kernel_3/test/Circular_kernel_3/include/CGAL/_test_sphere_compute.h b/Circular_kernel_3/test/Circular_kernel_3/include/CGAL/_test_sphere_compute.h index a5432bb4140..877f6a4bee2 100644 --- a/Circular_kernel_3/test/Circular_kernel_3/include/CGAL/_test_sphere_compute.h +++ b/Circular_kernel_3/test/Circular_kernel_3/include/CGAL/_test_sphere_compute.h @@ -87,7 +87,7 @@ void _test_spherical_kernel_compute(SK sk) cp[i] = theConstruct_circular_arc_point_3(rt[i]); } - const double pi = std::acos(-1.); + const double pi = CGAL_PI; const Polynomials_for_circle_3 pcc_test = std::make_pair(Polynomial_for_spheres_2_3(0,0,0,1), diff --git a/Convex_hull_2/include/CGAL/segment_intersection_points_2.h b/Convex_hull_2/include/CGAL/segment_intersection_points_2.h index b40dc0c2cbe..5346059e350 100644 --- a/Convex_hull_2/include/CGAL/segment_intersection_points_2.h +++ b/Convex_hull_2/include/CGAL/segment_intersection_points_2.h @@ -32,7 +32,7 @@ namespace CGAL { /* -#include +#include template OutputIterator si_brute_force(ForwardIterator first, ForwardIterator last, diff --git a/Convex_hull_d/package_info/Convex_hull_d/dependencies b/Convex_hull_d/package_info/Convex_hull_d/dependencies index acd33093f76..81659211144 100644 --- a/Convex_hull_d/package_info/Convex_hull_d/dependencies +++ b/Convex_hull_d/package_info/Convex_hull_d/dependencies @@ -14,3 +14,4 @@ Number_types Profiling_tools STL_Extension Stream_support +Distance_3 diff --git a/Documentation/doc/Documentation/dependencies b/Documentation/doc/Documentation/dependencies index 74dbea509d7..c318532df45 100644 --- a/Documentation/doc/Documentation/dependencies +++ b/Documentation/doc/Documentation/dependencies @@ -23,6 +23,7 @@ Generator Geomview GraphicsView HalfedgeDS +Heat_method_3 BGL Combinatorial_map Generalized_map diff --git a/Documentation/doc/Documentation/packages.txt b/Documentation/doc/Documentation/packages.txt index b8348fe0989..af0b7801c1d 100644 --- a/Documentation/doc/Documentation/packages.txt +++ b/Documentation/doc/Documentation/packages.txt @@ -124,7 +124,7 @@ h1 { \package_listing{Point_set_shape_detection_3} \package_listing{Stream_lines_2} \package_listing{Classification} - +\package_listing{Heat_method_3} \section PartSearchStructures Spatial Searching and Sorting diff --git a/Documentation/doc/biblio/cgal_manual.bib b/Documentation/doc/biblio/cgal_manual.bib index 524c68b9a45..d1b7cbf4c61 100644 --- a/Documentation/doc/biblio/cgal_manual.bib +++ b/Documentation/doc/biblio/cgal_manual.bib @@ -475,6 +475,30 @@ note="Conference version: Symp. on Geometry Processing 2003" ,update = "97.08 kettner" } + +@article{cgal:cww-ghnac-13, + author = {Crane, Keenan and Weischedel, Clarisse and Wardetzky, Max}, + title = {Geodesics in Heat: A New Approach to Computing Distance Based on Heat Flow}, + journal = {ACM Trans. Graph.}, + issue_date = {September 2013}, + volume = {32}, + number = {5}, + month = oct, + year = {2013}, + issn = {0730-0301}, + pages = {152:1--152:11}, + articleno = {152}, + numpages = {11}, + url = {http://doi.acm.org/10.1145/2516971.2516977}, + doi = {10.1145/2516971.2516977}, + acmid = {2516977}, + publisher = {ACM}, + address = {New York, NY, USA}, + keywords = {Digital geometry processing, discrete differential geometry, distance transform, geodesic distance, heat kernel}, +} + + + @PhdThesis{ cgal:d-ccccg-10, author = {Damiand, G.}, title = {Contributions aux Cartes Combinatoires et Cartes G\'en\'eralis\'ees : Simplification, Mod\`eles, Invariants Topologiques et Applications}, @@ -726,6 +750,23 @@ Teillaud" ,update = "95.09 mitchell" } +@inproceedings{cgal:fsbs-acidt-06, + author = {Fisher, Matthew and Springborn, Boris and Bobenko, Alexander I. and Schroder, Peter}, + title = {An Algorithm for the Construction of Intrinsic Delaunay Triangulations with Applications to Digital Geometry Processing}, + booktitle = {ACM SIGGRAPH 2006 Courses}, + series = {SIGGRAPH '06}, + year = {2006}, + isbn = {1-59593-364-6}, + location = {Boston, Massachusetts}, + pages = {69--74}, + numpages = {6}, + url = {http://doi.acm.org/10.1145/1185657.1185668}, + doi = {10.1145/1185657.1185668}, + acmid = {1185668}, + publisher = {ACM}, + address = {New York, NY, USA}, +} + @InCollection{ cgal:fh-survey-05, author = {M. S. Floater and K. Hormann}, title = {Surface Parameterization: a Tutorial and Survey}, @@ -1118,7 +1159,7 @@ Teillaud" isbn = {9781848002784}, edition = {3rd}, publisher = {Springer Publishing Company, Incorporated} -} +} @inproceedings { cgal:l-nmdgp-05, AUTHOR = {Bruno Levy}, diff --git a/Filtered_kernel/include/CGAL/internal/Static_filters/Do_intersect_2.h b/Filtered_kernel/include/CGAL/internal/Static_filters/Do_intersect_2.h index 2deb02212e4..86345327149 100644 --- a/Filtered_kernel/include/CGAL/internal/Static_filters/Do_intersect_2.h +++ b/Filtered_kernel/include/CGAL/internal/Static_filters/Do_intersect_2.h @@ -69,19 +69,19 @@ public: result_type operator()(const Segment_2 &s, const Segment_2& t) const { - return internal::do_intersect(s,t, SFK()); + return Intersections::internal::do_intersect(s,t, SFK()); } result_type operator()(const Point_2 &p, const Segment_2& t) const { - return internal::do_intersect(p,t, SFK()); + return Intersections::internal::do_intersect(p,t, SFK()); } result_type operator()(const Segment_2& t, const Point_2 &p) const { - return internal::do_intersect(p,t, SFK()); + return Intersections::internal::do_intersect(p,t, SFK()); } }; diff --git a/Filtered_kernel/include/CGAL/internal/Static_filters/Do_intersect_3.h b/Filtered_kernel/include/CGAL/internal/Static_filters/Do_intersect_3.h index 5f51183e530..43eaca91403 100644 --- a/Filtered_kernel/include/CGAL/internal/Static_filters/Do_intersect_3.h +++ b/Filtered_kernel/include/CGAL/internal/Static_filters/Do_intersect_3.h @@ -30,7 +30,7 @@ #include #include -#include +#include // for CGAL::internal::do_intersect_bbox_segment_aux #include @@ -89,13 +89,13 @@ public: result_type operator()(const Segment_3 &s, const Triangle_3& t) const { - return internal::do_intersect(t,s, SFK()); + return Intersections::internal::do_intersect(t,s, SFK()); } result_type operator()(const Triangle_3& t, const Segment_3 &s) const { - return internal::do_intersect(t,s, SFK()); + return Intersections::internal::do_intersect(t,s, SFK()); } result_type @@ -124,7 +124,7 @@ public: CGAL_BRANCH_PROFILER_BRANCH_1(tmp); const Uncertain ub = - do_intersect_bbox_segment_aux + Intersections::internal::do_intersect_bbox_segment_aux ub = - do_intersect_bbox_segment_aux + Intersections::internal::do_intersect_bbox_segment_aux x() - pp1->x(); FT delta_y = pp2->y() - pp1->y(); - FT sign_x = CGAL::sign(delta_x); - FT sign_y = CGAL::sign(delta_y); + FT sign_x = (int)CGAL::sign(delta_x); + FT sign_y = (int)CGAL::sign(delta_y); FT abs_x = CGAL::abs(delta_x); FT abs_y = CGAL::abs(delta_y); diff --git a/Heat_method_3/doc/Heat_method_3/Concepts/HeatMethodTraits_3.h b/Heat_method_3/doc/Heat_method_3/Concepts/HeatMethodTraits_3.h new file mode 100644 index 00000000000..0a607e61c72 --- /dev/null +++ b/Heat_method_3/doc/Heat_method_3/Concepts/HeatMethodTraits_3.h @@ -0,0 +1,70 @@ +/*! +\ingroup PkgHeatMethodConcepts + +\cgalConcept + +The concept `HeatMethodTraits_3` describes the types, +predicates, and constructions required by the traits class parameter of +`CGAL::Heat_method_3::Surface_mesh_geodesic_distances_3`. + +\cgalHasModel All the \cgal kernels + + +*/ + +class HeatMethodTraits_3 +{ +public: + +/// \name Types +/// @{ + + // The number type. It must be `CopyConstructible` and `DefaultConstructible`, + // and be constructible from `double`. + typedef unspecified_type FT; + + /// The 3D point type. It must be `CopyConstructible` and `DefaultConstructible`, + /// and have a constructor with three parameters of a type constructibe from `double`. + typedef unspecified_type Point_3; + + /// The 3D vector type. It must be `CopyConstructible` and `DefaultConstructible`, + /// and have a constructor with three parameters of a type constructibe from `double`. + typedef unspecified_type Vector_3; + + /// Functor with operator: `Vector_3 operator()(const Point_3& from, const Point_3& to) const`, which constructs the vector from `to - from` . + typedef unspecified_type Construct_vector_3; + + /// Functor with operator: `Vector_3 operator()(const Vector_3& v, const Vector_3& w) const`, which constructs the vector `v + w`. + typedef unspecified_type Construct_sum_of_vectors_3; + + /// Functor with operator: `Vector_3 operator()(const Vector_3& v, double d) const`, which constructs the vector `d * v`. + typedef unspecified_type Construct_scaled_vector_3; + + /// Functor with operator: `Vector_3 operator()(const Vector_3& v, const Vector_3& w) const`, which constructs the cross product of `v` and `w`. + typedef unspecified_type Construct_cross_product_vector_3; + + /// Functor with operator: `FT operator()(const Vector_3& v, const Vector_3& w) const, which constructs the scalar product of `v` and `w`. + typedef unspecified_type Compute_scalar_product_3; + + /// Functor with operator: `FT operator()(const Point_3& p, const Point_3& q) const` which computes the squared distance between `p` and `q`. + typedef unspecified_type Compute_squared_distance_3; + + +/// @} + +/*! \name Operations +For each of the above function object types, +`Func_obj_type`, a function must exist with the name +`func_obj_type_object` that creates an instance of the function or +predicate object type. For example: +*/ +/// @{ + +/*! + +*/ +Construct_vector_3 construct_vector_3_object(); + +/// @} + +}; diff --git a/Heat_method_3/doc/Heat_method_3/Doxyfile.in b/Heat_method_3/doc/Heat_method_3/Doxyfile.in new file mode 100644 index 00000000000..ac8b54185e0 --- /dev/null +++ b/Heat_method_3/doc/Heat_method_3/Doxyfile.in @@ -0,0 +1,2 @@ +@INCLUDE = ${CGAL_DOC_PACKAGE_DEFAULTS} +PROJECT_NAME = "CGAL ${CGAL_DOC_VERSION} - The Heat Method" diff --git a/Heat_method_3/doc/Heat_method_3/Heat_method_3.txt b/Heat_method_3/doc/Heat_method_3/Heat_method_3.txt new file mode 100644 index 00000000000..5ab3a5be38e --- /dev/null +++ b/Heat_method_3/doc/Heat_method_3/Heat_method_3.txt @@ -0,0 +1,256 @@ +namespace CGAL { +/*! + +\mainpage User Manual +\anchor Chapter_HeatMethod +\cgalAutoToc +\author Christina Vaz, Keenan Crane, Andreas Fabri + +\image html octopus.png + +\section sec_HM_introduction Introduction + +The heat method is an algorithm that solves the single- or +multiple-source shortest path problem by returning an approximation of the +geodesic distance for all vertices of a triangle mesh to the closest vertex in a given set of +source vertices. The geodesic distance between two vertices of a mesh +is the distance when walking on the surface, potentially through the interior of faces. +Two vertices that are close in 3D space may be far away on the surface, for example +on neighboring arms of the octopus. In the figures we color code the distance +as a gradient red/green corresponding to close/far from the source vertices. + +The heat method is highly efficient, since the algorithm +boils down to two standard sparse linear algebra problems. It is especially +useful in situations where one wishes to perform repeated distance queries +on a fixed domain, since precomputation done for the first query can be re-used. + +As a rule of thumb, the method works well on triangle meshes, which are +Delaunay, though in practice may also work fine for meshes that are far from +Delaunay. In order to ensure good behavior, we enable a +preprocessing step that constructs an intrinsic Delaunay triangulation +(iDT); this triangulation does not change the input geometry, but +generally improves the quality of the solution. The cost of this preprocessing +step roughly doubles the overall preprocessing cost. + +\cgalFigureBegin{landscape_meshes, landscape.jpg} + Isolines placed on a mesh without and with iDT remeshing. +\cgalFigureEnd + +In the next section we give some examples. Section \ref sec_HM_definitions presents +the mathematical theory of the Heat method. The last section is about the \ref sec_HM_history. + +Note that this package depends on the third party \ref thirdpartyEigen library (3.3 or greater), or another +model of the concept `SparseLinearAlgebraWithFactorTraits_d`. +This implementation is based on \cgalCite{cgal:cww-ghnac-13} and \cgalCite{cgal:fsbs-acidt-06} + +This package is related to the package \ref PkgSurfaceMeshShortestPath. Both deal with geodesic distances. +The heat method package computes for every vertex of a mesh an approximate distance to one or several source vertices. +The geodesic shortest path package computes the exact shortest path between any two points on the surface. + + + +\section sec_HM_examples Examples + +We give examples for the free function `CGAL::Heat_method_3::estimate_geodesic_distances()`, +for the class template `CGAL::Heat_method_3::Surface_mesh_geodesic_distances_3`, with and without the use +of intrinsic Delaunay triangulation. + +\subsection HM_example_Free_function Using a Free Function + +The first example calls the free function `Heat_method_3::estimate_geodesic_distances()`, +which computes for all vertices of a triangle mesh the distances to a single source vertex. + +The distances are written into an internal property map of the surface mesh. + +\cgalExample{Heat_method_3/heat_method.cpp} + +For a `Polyhedron_3` you can either add a data field to the vertex type, or, as shown +in the following example, create a `boost::unordered_map` and pass it to the function +`boost::make_assoc_property_map()`, which generates a vertex distance property map. + +\cgalExample{Heat_method_3/heat_method_polyhedron.cpp} + + +\subsection HM_example_Class Using the Heat Method Class + +The following example shows the heat method class. It can be used +when one adds and removes source vertices. It performs a precomputation, +which depend only on the input mesh and not the particular +set of source vertices. In the example we compute the distances to one +source, add the farthest vertex as a second source vertex, and then compute +the distances with respect to these two sources. + +\cgalExample{Heat_method_3/heat_method_surface_mesh.cpp} + + +\subsection HM_example_Intrinsic Switching off the Intrinsic Delaunay Triangulation + +The following example shows the heat method on a triangle mesh without using the +intrinsic Delaunay triangulation (iDT) algorithm, for example because by construction +your meshes have a good quality (Poor quality in this case means that the input +is far from Delaunay, though even in this case one may still get good results without iDT, +depending on the specific geometry of the surface). The iDT algorithm is switched off +by the template parameter `Heat_method_3::Direct`. + +\cgalExample{Heat_method_3/heat_method_surface_mesh_direct.cpp} + + + +\section sec_HM_definitions Theoretical Background + +Section \ref Subsection_HM_Definitions_Intro gives an overview of the theory needed by the Heat method. +Section \ref Subsection_HM_IDT_Definitions gives the background needed for the Intrinsic Delaunay triangulation. + +\subsection Subsection_HM_Definitions_Intro The Heat Method Algorithm + +For a detailed overview of the heat method, the reader may consult +\cgalCite{cgal:cww-ghnac-13} to read the original article. In the +sequel, we introduce the basic notions so as to explain our +algorithms. In general, the heat method is applicable to any setting +if there exists a gradient operator \f$ \nabla\f$, a divergence +operator \f$\nabla \cdot\f$ and a Laplace operator \f$\Delta = \nabla \cdot +\nabla\f$, which are standard derivatives from vector calculus. + +The Heat Method consists of three main steps: + -# Integrate the heat flow \f$ \dot u = \Delta u\f$ for some fixed time \f$t\f$. + -# Evaluate the vector field \f$ X = -\nabla u_t / |\nabla u_t| \f$. + -# Solve the Poisson Equation \f$ \Delta \phi = \nabla \cdot X \f$. + + +The function \f$ \phi \f$ is an approximation of the distance to the given source set and approaches the true distance as t goes to zero. +The algorithm must then be translated in to a discrete algorithm by replacing the derivatives in space and time with approximations. + +The heat equation can be discretized in time using a single backward Euler step. This means the following equation must be solved: + +\f$(id-t\Delta)u_t = \delta_{\gamma}(x) \f$ where \f$\delta_{\gamma}(x)\f$ is a Dirac delta encoding an "infinite" spike of heat (1 if x is in the source set \f$\gamma\f$, 0 otherwise), where id is the identity operator. + +The spatial discretization depends on the choice of discrete surface representation. +For this package, we use triangle meshes exclusively. +Let \f$ u \in \R^{|V|}\f$ specify a piecewise linear function on a +triangulated surface with vertices \f$V\f$, edges \f$E\f$ and faces +\f$F\f$. A standard discretization of the Laplacian at vertex \f$i\f$ +is: + +\f$ {Lu}_i = \frac{1}{2A_i} \sum_{j}(cot \alpha_{ij} + cot \beta_{ij})(u_j-u_i)\f$ where \f$A_i\f$ is one third the area of all triangles incident on vertex \f$i\f$. + +The sum is taken over all of the neighboring vertices +\f$j\f$. Further, \f$\alpha_{ij}\f$ and \f$\beta_{ij}\f$ are the +angles opposing the corresponding edge \f$ij\f$. We express this +operation via a matrix \f$L = M^{-1}L_c\f$ where \f$M \in +R^{|V|x|V|}\f$ is a diagonal matrix containing the vertex areas and +\f$L_c \in R^{|V|x|V|} \f$ is the cotan operator representing the +remaining sum. + +From this, the symmetric positive-definite system +\f$(M-tL_C)u = \delta_{\gamma}\f$ can be solved to find +\f$u\f$ where \f$\delta_{\gamma}\f$ is the Kronecker delta over \f$\gamma\f$. + +Next, the gradient in a given triangle can be expressed as + +\f$\nabla u = \frac{1}{2 A_f} \sum_i u_i ( N \times e_i ) \f$ + +where \f$A_f\f$ is the area of the triangle, \f$N\f$ is its outward unit normal, \f$e_i\f$ is the \f$i\f$th edge vector (oriented counter-clockwise), and \f$u_i\f$ is the value of \f$u\f$ at the opposing vertex. The integrated divergence associated with vertex \f$i\f$ can be written as + +\f$\nabla \cdot X = \frac{1}{2} \sum_j cot\theta_1 (e_1 \cdot X_j) + cot \theta_2 (e_2 \cdot X_j)\f$ + +where the sum is taken over incident triangles \f$j\f$ each with a vector \f$X_j\f$, +\f$e_1\f$ and \f$e_2\f$ are the two edge vectors of triangle \f$j\f$ +containing \f$i\f$ and \f$\theta_1\f$, \f$\theta_2\f$ are the opposing angles. + +Finally, let \f$b \in R^{|V|}\f$ be the integrated divergences of the normalized vector field X. +Thus, solving the symmetric Poisson problem \f$ L_c \phi = b\f$ computes the final distance function. + +\subsection Subsection_HM_IDT_Definitions Intrinsic Delaunay Triangulation + +The standard discretization of the cotan Laplace operator uses the cotangents of the angles in the triangle mesh. +The intrinsic Delaunay algorithm constructs an alternative triangulation of the same polyhedral surface, which +in turn yields a different (typically more accurate) cotan Laplace operator. Conceptually, the edges of the iDT +still connect pairs of vertices from the original (input) surface, but are now allowed to be geodesic paths along +the polyhedron and do not have to correspond to edges of the input triangulation. These paths are not stored +explicitly; instead, we simply keep track of their lengths as the triangulation is updated. These lengths are +sufficient to determine areas and angles of the intrinsic triangles, and in turn, the new cotan Laplace matrix. + +An edge of a mesh is locally Delaunay if the sum of opposite angles is not smaller than pi, or equivalently, +if the cotangents of the opposing angles are non-negative. A mesh is Delaunay if all of its edges are locally Delaunay. + +A standard algorithm to convert a given planar triangulation into a Delaunay triangulation is +to flip non-Delaunay edges in a mesh until the mesh is Delaunay. +Similarly, the intrinsic Delaunay triangulation of a simplicial surface +is constructed by performing intrinsic edge flips. + +Let \f$ K = (V,E,T) \f$ be a 2-manifold triangle mesh, where \f$V\f$ is the vertex set, +\f$ E \f$ is the edge set and \f$ T \f$ is the face set (triangle set). +Let \f$ L \f$ be the set of Euclidean distances, where \f$ L(e_{ij}) = l_{ij} = || p_i - p_j || \f$ , +where \f$ p_i \f$ and \f$ p_j \f$ are the point positions \f$ \in R^3 \f$ of vertices \f$ i \f$ and \f$ j \f$ respectively. +Then, let the pair \f$ (K,L) \f$ be the input to the iDT algorithm, which returns the pair \f$(\tilde K, \tilde L)\f$, +which are the intrinsic Delaunay mesh and the intrinsic lengths. +The algorithm is as follows: + + \code + for all edge e in E : Mark(e) + Stack s <-- E + while !Empty(s) do + edge(ij) = Pop(s) and Unmark(edge(ij)) + if !Delaunay(edge(ij)) then + edge(kl) = Flip(edge(ij)) and compute the new length length(kl) using the Cosine Theorem + for all edge e in {edge(kj), edge(jl), edge(li), edge(ik)} do + if !Mark(e) then + Mark(e) and Push(s,e) + end if + end for + end if + end while + return (~K,~L) + \endcode + + + The new \f$(\tilde K, \tilde L)\f$ are then used to implement the heat method as usual. + + We already in the beginning gave an example where the intrinsic Delaunay triangulation improves the results. + The mesh was obtained by giving elevation to a 2D triangulation, which lead to highly elongated triangles. + + The situation is similar for any triangle mesh that has faces with very small angles as can be seen in the figures below. + + \cgalFigureBegin{circle_box, red_circle_box_without_idt_bottom.png} + Isolines placed on a mesh without iDT remeshing + \cgalFigureEnd + \cgalFigureBegin{circle_box_idt, red_circle_box_with_idt_bottom.png} + Isolines placed on a mesh with iDT remeshing + \cgalFigureEnd + + +\section sec_HM_Performance Performance + +The time complexity of the algorithm is determined primarily by the +choice of linear solver. In the current implementation, Cholesky +prefactorization is roughly \f$ O(N^{1.5})\f$ and computation of distances is +roughly \f$ O(N)\f$, where \f$ N\f$ is the number of vertices in the triangulation. +The algorithm uses two \f$ N \times N\f$ matrices, both with the same pattern of +non-zeros (in average 7 non-zeros +per row/column). The cost of computation is independent of the size +of the source set. Primitive operations include sparse numerical +linear algebra (in double precision), and basic arithmetic operations +(including square roots). + +We perform the benchmark on an Intel Core i7-7700HQ, 2.8HGz, and compiled with Visual Studio 2013. + +
+Number of triangles | Initialization iDT (sec) | Distance computation iDT (sec) | Initialization Direct (sec) | Distance computation Direct (sec) +--------------------:| ----------- : | ---------------- : | ------------------: | --------------: +30,000 | 0.18 | 0.02 | 0.12 | 0.01 +200,000 | 1.82 | 1.31 | 1.32 | 0.11 +500,000 | 10.45 | 0.75 | 8.07 | 0.55 +1,800,000 | 38.91 | 2.24 | 35.68 | 1.1 + +
+ + +\section sec_HM_history Implementation History + +This package was developed by Christina Vaz, Keenan Crane and Andreas +Fabri as a project of the Google Summer of Code 2018. + + + +*/ +} /* namespace CGAL */ diff --git a/Heat_method_3/doc/Heat_method_3/PackageDescription.txt b/Heat_method_3/doc/Heat_method_3/PackageDescription.txt new file mode 100644 index 00000000000..1c6b07bf298 --- /dev/null +++ b/Heat_method_3/doc/Heat_method_3/PackageDescription.txt @@ -0,0 +1,48 @@ +// The Heat Method + +/// \defgroup PkgHeatMethod Heat Method Reference + +/// \defgroup PkgHeatMethodConcepts Concepts +/// \ingroup PkgHeatMethod + + +/*! +\addtogroup PkgHeatMethod + +\cgalPkgDescriptionBegin{The Heat Method,PkgHeatMethodSummary} +\cgalPkgPicture{heat-method-small.png} + +\cgalPkgSummaryBegin +\cgalPkgAuthors{Keenan Crane, Christina Vaz, Andreas Fabri} +\cgalPkgDesc{The package provides an algorithm that solves the single- or +multiple-source shortest path problem by returning an approximation of the geodesic distance +for all vertices of a triangle mesh to the closest vertex in a given set of +source vertices. } +\cgalPkgManuals{Chapter_HeatMethod,PkgHeatMethod} +\cgalPkgSummaryEnd +\cgalPkgShortInfoBegin +\cgalPkgSince{4.14} +\cgalPkgDependsOn{ \ref PkgSolverInterface} +\cgalPkgBib{cgal:cvf-hm3} +\cgalPkgLicense{\ref licensesGPL "GPL"} +\cgalPkgDemo{Polyhedron demo,polyhedron_3.zip} +\cgalPkgShortInfoEnd + +\cgalPkgDescriptionEnd + +\cgalClassifedRefPages + +## Concepts ## +- `HeatMethodTraits_3` + +## Classes ## +- `CGAL::Heat_method_3::Surface_mesh_geodesic_distances_3` +- `CGAL::Heat_method_3::Direct` +- `CGAL::Heat_method_3::Intrinsic_Delaunay` + +## Functions ## + +- `CGAL::Heat_method_3::estimate_geodesic_distances()` + +*/ + diff --git a/Heat_method_3/doc/Heat_method_3/dependencies b/Heat_method_3/doc/Heat_method_3/dependencies new file mode 100644 index 00000000000..26b4271db03 --- /dev/null +++ b/Heat_method_3/doc/Heat_method_3/dependencies @@ -0,0 +1,11 @@ +Manual +Kernel_23 +STL_Extension +Algebraic_foundations +Circulator +Stream_support +Surface_mesh +Surface_mesh_shortest_path +Solver_interface +BGL +Polyhedron diff --git a/Heat_method_3/doc/Heat_method_3/examples.txt b/Heat_method_3/doc/Heat_method_3/examples.txt new file mode 100644 index 00000000000..0d5ef9a3621 --- /dev/null +++ b/Heat_method_3/doc/Heat_method_3/examples.txt @@ -0,0 +1,6 @@ +/*! +\example Heat_method_3/heat_method.cpp +\example Heat_method_3/heat_method_polyhedron.cpp +\example Heat_method_3/heat_method_surface_mesh.cpp +\example Heat_method_3/heat_method_surface_mesh_direct.cpp +*/ diff --git a/Heat_method_3/doc/Heat_method_3/fig/heat-method-small.png b/Heat_method_3/doc/Heat_method_3/fig/heat-method-small.png new file mode 100644 index 00000000000..fce3cb04abe Binary files /dev/null and b/Heat_method_3/doc/Heat_method_3/fig/heat-method-small.png differ diff --git a/Heat_method_3/doc/Heat_method_3/fig/landscape.jpg b/Heat_method_3/doc/Heat_method_3/fig/landscape.jpg new file mode 100644 index 00000000000..e28dfa4b237 Binary files /dev/null and b/Heat_method_3/doc/Heat_method_3/fig/landscape.jpg differ diff --git a/Heat_method_3/doc/Heat_method_3/fig/octopus.png b/Heat_method_3/doc/Heat_method_3/fig/octopus.png new file mode 100644 index 00000000000..11a4888c425 Binary files /dev/null and b/Heat_method_3/doc/Heat_method_3/fig/octopus.png differ diff --git a/Heat_method_3/doc/Heat_method_3/fig/red_circle_box_with_idt_bottom.png b/Heat_method_3/doc/Heat_method_3/fig/red_circle_box_with_idt_bottom.png new file mode 100644 index 00000000000..31cfd68693a Binary files /dev/null and b/Heat_method_3/doc/Heat_method_3/fig/red_circle_box_with_idt_bottom.png differ diff --git a/Heat_method_3/doc/Heat_method_3/fig/red_circle_box_without_idt_bottom.png b/Heat_method_3/doc/Heat_method_3/fig/red_circle_box_without_idt_bottom.png new file mode 100644 index 00000000000..8890be3b9f5 Binary files /dev/null and b/Heat_method_3/doc/Heat_method_3/fig/red_circle_box_without_idt_bottom.png differ diff --git a/Heat_method_3/examples/Heat_method_3/CMakeLists.txt b/Heat_method_3/examples/Heat_method_3/CMakeLists.txt new file mode 100644 index 00000000000..bd784bb1f76 --- /dev/null +++ b/Heat_method_3/examples/Heat_method_3/CMakeLists.txt @@ -0,0 +1,59 @@ +# Created by the script cgal_create_CMakeLists +# This is the CMake script for compiling a set of CGAL applications. + +project( Heat_method_3_Examples ) + + +cmake_minimum_required(VERSION 2.8.11) + +# CGAL and its components +find_package( CGAL QUIET COMPONENTS ) + +if ( NOT CGAL_FOUND ) + + message(STATUS "This project requires the CGAL library, and will not be compiled.") + return() + +endif() + +# include helper file +include( ${CGAL_USE_FILE} ) + + +# Boost and its components +find_package( Boost REQUIRED ) + +if ( NOT Boost_FOUND ) + + message(STATUS "This project requires the Boost library, and will not be compiled.") + + return() + +endif() + + +find_package(Eigen3 3.3.0) + +if (EIGEN3_FOUND) + include( ${EIGEN3_USE_FILE} ) +else() + message(STATUS "This project requires the Eigen library (3.3 or greater), and will not be compiled.") + + return() +endif() + + +# include for local directory +include_directories( BEFORE include ) + + + +# Creating entries for all C++ files with "main" routine +# ########################################################## + +include( CGAL_CreateSingleSourceCGALProgram ) + +create_single_source_cgal_program( "heat_method.cpp" ) +create_single_source_cgal_program( "heat_method_polyhedron.cpp" ) +create_single_source_cgal_program( "heat_method_surface_mesh.cpp" ) +create_single_source_cgal_program( "heat_method_surface_mesh_direct.cpp" ) diff --git a/Heat_method_3/examples/Heat_method_3/data/elephant.off b/Heat_method_3/examples/Heat_method_3/data/elephant.off new file mode 100644 index 00000000000..c4121d0dbdc --- /dev/null +++ b/Heat_method_3/examples/Heat_method_3/data/elephant.off @@ -0,0 +1,8336 @@ +OFF +2775 5558 0 +0.262933 0.102269 0.138247 +0.0843142 0.0418575 -0.0419302 +0.0676609 -0.0308717 0.133371 +0.202895 0.468475 0.0802072 +0.113075 -0.465378 -0.0546734 +0.225577 -0.277149 -0.193776 +-0.146525 -0.22403 -0.169286 +-0.0249865 -0.129931 -0.13238 +-0.160965 -0.480027 -0.0707824 +0.0794063 -0.415277 -0.0839096 +0.0469116 -0.050008 0.252355 +-0.0998372 -0.193745 -0.16268 +-0.111131 -0.104825 -0.14166 +-0.061459 -0.0977343 -0.133353 +-0.247783 -0.131539 0.0722694 +-0.145972 -0.486627 -0.0633275 +0.0916759 0.0333604 -0.133002 +-0.184954 -0.325468 -0.133853 +0.0847778 -0.432659 -0.0978527 +-0.210776 -0.299151 0.0751516 +-0.151539 -0.388715 0.01282 +-0.154564 -0.438244 -0.0249412 +-0.123411 -0.0182656 0.0135824 +0.00773278 -0.053391 -0.0428874 +-0.0774524 -0.292395 -0.106335 +0.0201594 -0.263586 0.119859 +-0.105646 -0.0365155 -0.0770751 +-0.113391 -0.41896 -0.0906771 +-0.128213 -0.46259 -0.0994907 +-0.160526 -0.468057 -0.0393445 +0.197609 -0.127492 -0.0574767 +0.0757306 -0.449539 -0.0614557 +0.147148 -0.412461 -0.0801639 +0.103782 -0.333007 0.0288926 +0.108917 -0.401981 -0.00841926 +0.11392 -0.408931 -0.0973654 +0.129733 -0.31331 -0.0672325 +0.0904388 -0.356531 -0.0803906 +0.0359798 -0.255445 -0.113562 +-0.22312 -0.107007 -0.0611904 +-0.163408 -0.433458 -0.0704785 +-0.0915185 -0.473885 -0.0165533 +-0.141417 -0.474418 -0.0834065 +-0.0944539 -0.479454 -0.0663683 +-0.085985 -0.101282 0.158093 +-0.0225438 -0.0889567 -0.0848587 +0.092707 -0.109496 -0.114561 +-0.159213 -0.159272 -0.138793 +-0.24541 -0.230248 -0.110578 +0.183744 -0.231931 0.0176086 +0.294273 -0.0955008 0.116328 +-0.16477 -0.385872 -0.0413331 +-0.185303 -0.313456 -0.00374653 +-0.297084 -0.262835 -0.00415653 +0.167756 -0.128776 0.197921 +-0.0273811 0.0608812 -0.0989637 +0.208303 0.00452459 -0.0746544 +-0.150831 -0.448909 -0.0901866 +-0.0720206 -0.147118 -0.154796 +-0.0197986 -0.210658 -0.154154 +-0.130593 -0.498558 -0.021161 +0.129662 -0.373473 -0.0794411 +-0.120692 -0.481168 -0.0685411 +-0.108692 -0.494274 -0.0429275 +-0.0970902 -0.252938 -0.14843 +-0.0098054 -0.335319 -0.0147292 +0.0769246 -0.410346 -0.0391239 +-0.132409 -0.464154 -0.0197707 +-0.102806 -0.4217 0.00855496 +-0.0760332 -0.34128 0.100617 +-0.104435 -0.377391 0.0553722 +-0.14788 -0.33188 0.0922673 +-0.151409 -0.218926 0.165812 +-0.111518 -0.286925 0.148566 +-0.0458796 -0.210094 0.18627 +0.0439919 -0.147905 0.137964 +-0.0358575 -0.361749 0.0457868 +0.0284346 -0.311464 0.0537885 +0.0409609 -0.0869988 -0.085353 +0.118462 -0.0465078 -0.0483438 +-0.141108 -0.422593 -0.0846889 +-0.129145 -0.379198 -0.0712284 +-0.149426 -0.329507 -0.0473837 +-0.212723 -0.300322 -0.0706413 +-0.156151 -0.403775 -0.0651516 +-0.077704 -0.400019 -0.0437424 +-0.0783601 -0.342543 -0.0687412 +-0.0202922 -0.309739 -0.0758353 +0.0501325 -0.290557 -0.0430839 +0.0954448 -0.256567 0.0733017 +0.144565 -0.158299 0.0913557 +0.0562207 -0.179498 -0.140905 +0.16863 -0.175124 -0.176771 +0.121523 -0.241503 -0.138152 +0.196749 0.136407 0.00365942 +0.14057 0.277481 0.154966 +0.156168 -0.385879 -0.0324162 +-0.146564 -0.288069 -0.168907 +-0.212533 -0.256019 -0.170893 +0.0775241 -0.353084 -0.0221894 +-0.161054 -0.48311 -0.0516067 +-0.151386 -0.488726 -0.0297486 +-0.167299 -0.464731 -0.058517 +-0.167494 -0.44542 -0.0440266 +-0.166175 -0.416312 -0.0405929 +-0.155665 -0.409399 -0.0112037 +-0.130777 -0.428881 -0.00549876 +-0.162855 -0.460869 -0.0783452 +-0.0949104 -0.0628065 -0.118829 +-0.171364 -0.0681205 -0.104606 +-0.189411 -0.0391257 -0.0301772 +-0.201329 -0.0450332 0.0672375 +-0.0621659 -0.0595357 -0.0819357 +-0.0724451 -0.0386843 -0.0212262 +-0.0317016 -0.00827391 0.0812953 +0.125617 -0.445138 -0.086335 +0.16914 -0.45638 -0.0514974 +-0.188699 -0.102786 0.151505 +-0.127982 -0.406882 0.0143939 +-0.130706 -0.384 0.0373578 +-0.17253 -0.34721 0.0442322 +-0.136499 -0.357829 0.0655808 +-0.101729 -0.398953 0.0314689 +-0.06477 -0.393705 0.00175031 +-0.0683606 -0.382507 0.0422398 +-0.0619729 -0.361557 0.0725343 +-0.0129886 -0.329893 0.099078 +-0.0485077 -0.306718 0.14972 +-0.0586671 -0.359537 -0.0297503 +-0.105132 -0.354471 0.0834642 +-0.111953 -0.324339 0.110194 +-0.146952 -0.298663 0.122985 +-0.147935 -0.259899 0.146585 +-0.224685 -0.230598 0.12386 +-0.194785 -0.274899 0.125615 +-0.1144 -0.250007 0.185149 +-0.10665 -0.185071 0.204627 +-0.155805 -0.154327 0.174517 +-0.215755 -0.165279 0.142947 +-0.0743299 -0.277016 0.17853 +-0.0218198 -0.257755 0.16445 +0.000800113 -0.199671 0.138749 +-0.0254547 -0.133829 0.140633 +0.0635315 -0.20852 0.111271 +-0.0256804 -0.0569419 0.140514 +-0.0948894 -0.0414189 0.110395 +-0.0705488 -0.0374163 0.0415111 +-0.00760713 -0.0195458 0.0164934 +0.0499878 0.0289775 0.0673286 +0.140466 0.0718009 0.144428 +-0.00188983 0.0792593 -0.003093 +0.0559872 -0.0140882 -0.011506 +-0.227407 -0.0888195 0.0117762 +-0.273528 -0.167121 -0.0102922 +-0.0402782 -0.263586 -0.140793 +-0.137564 -0.296782 -0.109847 +-0.166109 -0.381665 -0.0120175 +-0.16983 -0.360755 0.0137933 +-0.16456 -0.354211 -0.0308766 +-0.185156 -0.334386 0.0190529 +-0.207978 -0.298552 0.0310885 +-0.252507 -0.243462 0.0511336 +-0.223388 -0.268692 -0.019703 +-0.193938 -0.322649 0.048456 +-0.175095 -0.332532 0.0736524 +-0.176111 -0.310734 0.103586 +-0.147337 -0.494175 -0.0467278 +-0.129359 -0.490613 -0.0537016 +-0.148829 -0.364106 -0.0543963 +-0.120087 -0.343197 -0.0662243 +-0.130345 -0.305692 -0.0722136 +-0.171529 -0.299424 -0.0833938 +-0.181343 -0.292949 -0.0416997 +0.207831 -0.217496 -0.0966998 +0.180453 0.174523 0.151623 +0.0997558 -0.44202 -0.0211251 +0.141829 -0.427452 -0.0246256 +0.231902 -0.0518172 0.0262484 +0.222165 -0.00765217 0.131632 +0.257605 0.0468554 0.0496674 +0.134457 -0.362329 0.00455646 +0.162364 -0.298449 0.0119315 +0.167632 -0.334853 -0.0258239 +0.166781 -0.258058 -0.0451734 +0.196618 -0.203737 -0.0367216 +0.204966 -0.148702 0.029823 +0.188775 -0.0899398 0.0842549 +0.118735 -0.0897053 0.120666 +0.108518 -0.0623755 0.19827 +0.0943505 -0.134977 0.262277 +0.0987744 0.0186293 0.19077 +0.164162 -0.016078 0.17849 +0.217401 -0.0732307 0.174029 +0.244384 -0.159022 0.158735 +0.0938974 -0.414078 -0.0986619 +0.0882094 -0.386204 -0.0874415 +0.110237 -0.433985 -0.106491 +0.0752909 -0.377302 -0.0545033 +0.136893 -0.424401 -0.103861 +0.101623 -0.446793 -0.0879738 +0.0803589 -0.447974 -0.0828166 +0.0955794 -0.458697 -0.0690652 +0.0852254 -0.472952 -0.043714 +0.0423481 -0.131534 -0.117698 +0.0102534 -0.163639 -0.135844 +-0.0294235 -0.16777 -0.154302 +-0.0581903 -0.19678 -0.162941 +-0.0495263 -0.23206 -0.157295 +0.0213258 -0.204668 -0.142847 +0.0591534 -0.221375 -0.128414 +0.094939 -0.204956 -0.158559 +0.102368 -0.149902 -0.152017 +0.161838 -0.127189 -0.119413 +0.0883157 -0.255475 -0.0965547 +0.00337956 -0.243572 -0.138992 +-0.00441584 -0.28038 -0.109802 +0.139454 -0.244447 -0.0884262 +0.17799 -0.253819 -0.13106 +0.239512 -0.249475 -0.139746 +0.239769 -0.199663 -0.201225 +0.139899 -0.220537 -0.184787 +0.188104 -0.214287 -0.208834 +0.241446 -0.186766 -0.139849 +0.209446 -0.161297 -0.101029 +-0.199048 -0.317265 -0.100601 +-0.293252 -0.31357 -0.122798 +-0.243299 -0.355691 -0.130502 +-0.247594 -0.319033 -0.0988683 +-0.291668 -0.287409 -0.0637038 +-0.248832 -0.272185 -0.0865389 +-0.259174 -0.220646 -0.0469428 +-0.282126 -0.263379 -0.124759 +-0.269731 -0.294935 -0.18724 +-0.247297 -0.165961 -0.0866554 +0.0601914 -0.0464014 -0.0549033 +-0.211085 -0.18579 -0.128927 +-0.200721 -0.132547 -0.108259 +-0.0634953 -0.15489 0.179525 +0.153912 -0.0887253 -0.0733484 +0.185145 -0.0471144 -0.0260532 +0.211443 0.0144377 0.0032337 +0.139575 0.0029693 0.000737671 +0.166751 0.0710484 -0.0323169 +0.107842 0.107181 0.0410238 +0.241648 0.0800111 -0.0150955 +-0.140262 -0.4992 -0.033581 +-0.123763 -0.497978 -0.0364981 +-0.108133 -0.495253 -0.0202341 +-0.1219 -0.481038 -0.0158085 +-0.110456 -0.461331 -0.014079 +-0.087635 -0.441699 -0.0445804 +-0.0916102 -0.451765 -0.0239283 +-0.0811529 -0.421697 -0.020421 +-0.0723115 -0.470105 -0.0423155 +-0.102577 -0.44033 -0.0062072 +-0.139118 -0.480546 -0.0199347 +-0.149266 -0.466768 -0.0254061 +0.222317 -0.0925366 -0.0161067 +-0.0417433 -0.361447 0.00632817 +-0.00965295 -0.347119 0.0218202 +0.0216724 -0.318231 0.010836 +-0.00474667 -0.341486 0.0613973 +0.0698488 -0.285166 0.0205835 +-0.108371 -0.29389 -0.0941984 +-0.11094 -0.279255 -0.127432 +-0.0852691 -0.31423 -0.083395 +-0.0516331 -0.309713 -0.0908278 +-0.0463843 -0.329032 -0.0615785 +-0.13427 -0.295211 -0.140976 +-0.16029 -0.312528 -0.151535 +-0.208046 -0.313472 -0.188061 +-0.177638 -0.29982 -0.178676 +-0.173332 -0.259819 -0.179118 +-0.186949 -0.225139 -0.161631 +-0.121077 -0.271737 -0.158365 +-0.222098 -0.229029 -0.143015 +-0.254895 -0.254361 -0.158387 +-0.119307 -0.241249 -0.168619 +-0.0940058 -0.224454 -0.161034 +-0.119452 -0.213541 -0.164903 +-0.133444 -0.181194 -0.153714 +-0.123212 -0.142937 -0.146434 +-0.154852 -0.114002 -0.127562 +-0.16919 -0.193253 -0.151916 +-0.202578 -0.281459 -0.18846 +-0.238459 -0.276537 -0.185897 +-0.240282 -0.308392 -0.197824 +-0.31592 -0.411023 -0.222975 +-0.28556 -0.354091 -0.210885 +-0.235315 -0.349789 -0.176342 +-0.247249 -0.413591 -0.205119 +-0.313616 -0.39085 -0.145549 +-0.265064 -0.38952 -0.162643 +-0.137308 -0.0765217 -0.126585 +-0.138269 -0.043252 -0.101811 +-0.149787 -0.024537 -0.0569204 +-0.190238 -0.325155 -0.164883 +-0.214126 -0.342005 -0.145019 +-0.11169 -0.0249744 -0.0351987 +-0.154494 -0.0206052 -0.0150451 +-0.170024 -0.0235376 0.033341 +-0.149964 -0.0212297 0.0915499 +-0.146292 -0.0570396 0.143171 +-0.204533 -0.050976 0.0222898 +-0.222839 -0.0748301 0.0497298 +-0.218112 -0.0836084 0.106186 +-0.241131 -0.10804 0.0423425 +-0.253857 -0.126023 0.000914005 +-0.268045 -0.155579 0.0359862 +-0.254096 -0.191499 0.0837602 +-0.284127 -0.206805 0.0257642 +-0.255388 -0.139415 -0.0455141 +-0.266486 -0.179542 -0.0496151 +-0.255448 -0.200689 -0.0776309 +-0.238672 -0.192995 -0.107883 +-0.225097 -0.163824 -0.109937 +-0.22995 -0.135947 -0.0896828 +-0.209528 -0.114818 -0.0862766 +-0.197715 -0.0771741 -0.074156 +-0.18152 -0.102481 -0.104911 +-0.212552 -0.0754645 -0.0336012 +-0.179069 -0.0426745 -0.0757348 +-0.191113 -0.0400122 0.118805 +0.0761558 -0.344791 -0.0536197 +0.0734921 -0.316433 -0.0291825 +0.0865869 -0.298841 -0.0691012 +0.0805876 -0.328744 0.0029047 +0.0952029 -0.361348 0.00820626 +0.11906 -0.273469 -0.0673767 +0.0841053 -0.310717 0.0264162 +0.125408 -0.292597 0.041066 +0.0878905 -0.285295 0.052224 +0.0491288 -0.272854 0.0806291 +0.143869 -0.242882 0.0528378 +0.117789 -0.207199 0.0870858 +0.169353 -0.193132 0.0552639 +0.0969256 -0.166289 0.115505 +0.054006 -0.288058 0.0505697 +0.0199581 -0.301066 0.0971587 +-0.00766116 -0.296894 0.132807 +0.0766599 -0.302889 0.00259846 +0.0459981 -0.299327 0.00649094 +0.0275534 -0.307808 -0.0222832 +0.0149271 -0.300169 -0.0594622 +0.0407712 -0.276916 -0.0798141 +0.0598138 -0.291021 -0.0166231 +0.105499 -0.310063 0.042044 +0.129965 -0.318676 0.0271739 +-0.0843085 -0.494264 -0.0321529 +-0.0752323 -0.238787 0.196776 +-0.295928 -0.43397 -0.176216 +0.0851801 -0.382062 -0.0130588 +0.0187394 -0.0952484 0.145146 +0.0700063 -0.10227 0.135872 +0.0221841 -0.0461712 0.144279 +0.0234739 0.0145751 0.123876 +-0.00955997 -0.0145334 0.135796 +-0.0455413 -0.0274983 0.116817 +-0.0630042 -0.0646849 0.123712 +-0.0996182 -0.0685448 0.139479 +-0.129134 -0.0937854 0.159793 +-0.112763 -0.133107 0.183753 +-0.0586283 -0.0384282 0.0801443 +-0.0976008 -0.0306336 0.0712047 +-0.187313 -0.236737 0.146886 +-0.186919 -0.194456 0.158247 +-0.276732 -0.200888 -0.0224537 +-0.291326 -0.23573 -0.0313163 +-0.262172 -0.26119 -0.0228289 +-0.244304 -0.258186 0.0138536 +-0.238049 -0.253808 -0.053252 +-0.278468 -0.245353 0.0237178 +-0.250374 -0.233381 -0.0762153 +-0.317786 -0.266287 -0.0397057 +-0.29694 -0.227134 0.00135872 +-0.28761 -0.282597 -0.0302299 +-0.0768305 -0.203891 0.202176 +-0.107975 -0.220055 0.202264 +-0.134773 -0.20066 0.190676 +-0.13214 -0.167949 0.192848 +-0.157713 -0.187173 0.17141 +-0.0792541 -0.17391 0.197354 +-0.103166 -0.157466 0.196315 +-0.0861693 -0.139966 0.183699 +-0.0642112 -0.126048 0.16286 +-0.0525585 -0.0978366 0.139755 +0.173523 -0.0454835 0.124705 +0.124762 -0.0100876 0.132612 +0.0801162 0.0231847 0.117816 +0.0903158 0.0691509 0.0824377 +0.111706 0.138719 0.113497 +0.109897 0.0476799 0.0291314 +0.0568194 0.0789592 0.018431 +0.166721 0.186565 0.0672199 +0.252858 0.160254 0.0700128 +0.103948 0.0891733 -0.0142249 +0.151331 0.103958 0.00831307 +0.156258 0.148984 0.0332697 +0.195526 0.176469 0.0301312 +0.246249 0.159404 0.0147221 +0.272985 0.107792 0.0403664 +0.220496 0.208803 0.0718273 +0.172006 0.242405 0.105809 +0.284857 0.213191 0.163319 +0.220004 0.262975 0.168971 +0.243752 0.187223 0.124992 +0.303317 0.156118 0.132187 +0.124557 0.160014 0.070217 +0.145476 0.178627 0.113721 +0.143822 0.145597 0.146983 +0.199699 0.112576 0.148784 +0.221259 0.0552492 0.134196 +0.124553 0.109697 0.139987 +0.100062 0.0751807 0.125633 +0.107686 0.0453443 0.15701 +0.152453 0.0251604 0.154394 +0.160741 0.1045 0.158385 +0.183054 0.0708926 0.1447 +0.188656 0.0314673 0.13741 +0.286002 0.0789154 0.0896861 +0.044874 0.0868553 -0.0397086 +0.0292084 0.0351428 -0.0773123 +-0.00652383 0.0868322 -0.0563984 +0.153395 -0.330946 0.00521793 +0.165687 0.227811 0.159326 +0.176713 -0.253714 -0.180764 +0.276141 0.126578 0.0974557 +-0.0329659 -0.0648403 -0.0508016 +-0.022748 -0.0460692 -0.0136176 +-0.0397109 -0.0394184 0.0195973 +0.00993129 -0.0278328 -0.0155697 +0.0270531 -0.00832198 0.0106523 +0.0103826 0.00500549 0.0538795 +0.0666135 0.0125544 0.0261568 +0.103369 0.00889595 0.155654 +0.11659 -0.0298082 0.170544 +0.153029 -0.0696813 0.168481 +0.113461 -0.0186162 0.216944 +0.10035 -0.0580327 0.251516 +0.150235 -0.084971 0.233939 +0.0675669 -0.0946043 0.253879 +0.0719166 -0.0391569 0.214813 +0.10687 -0.103697 0.22877 +0.136543 -0.144876 0.235107 +0.147147 -0.0351617 0.149371 +0.1197 -0.0491892 0.122959 +0.148505 -0.0696344 0.112799 +0.152678 -0.114026 0.101195 +0.181641 -0.136376 0.0700095 +0.177794 -0.0667748 0.102185 +0.219377 -0.0856118 0.124697 +0.231869 -0.0572983 0.0801841 +0.250938 -0.00881912 0.0578761 +0.198815 -0.0628459 0.124187 +0.177363 -0.0676828 0.147605 +0.177944 -0.101552 0.169756 +0.213844 -0.114113 0.199683 +0.250347 -0.109904 0.165803 +0.259893 -0.130195 0.122038 +0.180633 -0.0723966 0.203599 +0.114076 -0.0955963 0.272717 +0.201886 -0.0333539 0.161782 +0.240288 -0.0485439 0.141813 +0.261312 -0.0227503 0.104643 +0.273982 -0.0593402 0.119899 +0.280362 -0.074792 0.0701015 +0.238595 0.0177583 0.0951404 +0.14643 -0.0478943 0.212489 +-0.227331 -0.265687 0.0979085 +-0.244646 -0.230401 0.0887962 +-0.293688 -0.268968 -0.164669 +-0.297979 -0.308788 -0.162348 +-0.312868 -0.346598 -0.144794 +-0.344082 -0.367401 -0.192127 +-0.317302 -0.337357 -0.184462 +-0.280828 -0.350074 -0.123607 +0.105148 0.105807 0.112878 +0.112708 0.122082 0.0774818 +0.133565 0.128779 0.0503619 +-0.153371 -0.370618 0.0324641 +0.254239 -0.0926281 0.0998171 +-0.0128437 0.0136567 0.10826 +0.0175667 0.0217155 0.0871281 +0.0477136 0.0340255 0.104217 +0.0750182 0.0489044 0.100742 +0.0776037 0.0433948 0.0700673 +0.0973389 0.0603657 0.0539823 +0.0861821 0.0686274 0.0252903 +0.0735784 0.0589072 -0.0094551 +0.0829016 0.102631 0.0164944 +0.0811061 0.0911963 0.0569078 +0.0940457 0.0476479 0.121838 +0.105428 0.0231317 0.131003 +0.0916425 -0.00738665 0.126455 +0.0604145 5.34629e-005 0.128347 +0.10359 0.0595398 0.00049955 +0.144344 0.0457444 0.00327488 +0.122523 0.0419513 -0.0300499 +0.11811 0.0162342 -0.0830375 +0.170091 0.0155571 -0.145681 +0.138389 0.0626357 -0.0743287 +0.165069 0.0235027 -0.0532363 +0.177768 0.0409007 -0.100742 +0.136707 0.0380317 -0.122381 +0.124141 0.00775387 -0.157586 +0.154959 -0.000810753 -0.105169 +0.105591 0.0562623 -0.100272 +0.0594242 0.0548004 -0.106957 +0.201162 -0.0168583 -0.120783 +0.0976411 0.0972697 0.0801317 +0.0943337 0.0848541 0.102457 +0.0890479 0.0650811 0.109825 +0.0389773 0.0745551 -0.0779593 +0.0138551 0.0593589 -0.108474 +0.0773146 0.0765993 -0.0629692 +0.118409 0.00125651 -0.11931 +0.14578 -0.0101392 -0.137264 +0.178622 -0.0192175 -0.148664 +0.15461 0.0388676 -0.0266866 +0.193622 0.0322602 -0.0272748 +0.1942 0.050466 -0.0642106 +0.173634 0.0303747 -0.00069076 +0.179101 -0.0110744 -0.00523936 +0.230507 0.0422098 -0.0173425 +0.202418 0.070871 -0.0135348 +0.22302 0.0184239 -0.0441485 +0.215157 -0.0248187 0.00288885 +0.233855 -0.00344678 0.0259658 +0.238719 0.033163 0.0205233 +0.25481 0.0672767 0.0179763 +0.222129 -0.0581209 -0.00731524 +0.227145 -0.0819987 0.0145053 +0.219253 -0.118982 0.0109807 +0.211654 -0.158762 -0.0192499 +0.210611 -0.101269 0.0490966 +0.200451 -0.190104 0.0116714 +0.203938 -0.0712158 -0.0282028 +0.173774 -0.0735362 -0.0475631 +0.2027 -0.10102 -0.0400541 +0.212795 -0.129107 -0.0298945 +0.206091 -0.151217 -0.0455168 +0.202467 -0.150775 -0.0745887 +0.209378 -0.187531 -0.0743719 +0.181149 -0.126003 -0.0892617 +0.205972 -0.177843 -0.0383337 +0.188301 -0.142819 -0.114464 +0.208779 -0.164491 -0.140437 +0.171227 -0.151151 -0.147387 +0.136617 -0.138704 -0.143839 +0.131975 -0.166643 -0.169617 +0.128263 -0.113939 -0.11894 +0.116875 -0.0858965 -0.091059 +0.0786764 -0.0829677 -0.090746 +0.187859 -0.214057 -0.0686071 +0.175679 -0.237132 -0.0957975 +0.178163 -0.10588 -0.0665832 +0.269129 0.0763722 0.0451229 +0.27889 0.058723 0.0679827 +0.267652 0.0453551 0.105512 +0.2613 0.0363273 0.0775663 +0.250278 0.0199214 0.0566543 +0.250269 0.00638094 0.0769677 +0.262967 -0.0160504 0.0796628 +0.285344 -0.0433845 0.0872574 +0.24971 -0.0386027 0.0640826 +0.229012 -0.0528564 0.0533874 +0.210073 -0.0746435 0.0657137 +0.221889 -0.0775407 0.0410909 +0.302572 -0.0710887 0.0949218 +0.236871 -0.0290995 0.0413907 +0.21774 0.0486965 -0.0445342 +0.224846 0.0339602 -0.0740774 +0.244042 0.0044793 -0.10874 +0.254336 0.102378 0.0100739 +0.220262 0.108437 -0.00385435 +0.184431 0.103867 -0.0063665 +0.227766 0.138272 0.00117268 +0.21603 0.168687 0.00560537 +0.214962 0.252952 4.36931e-005 +0.24674 0.211475 0.00674743 +0.208103 0.206716 0.00898043 +0.198252 0.239152 0.0425261 +0.241235 0.183275 -0.00372162 +0.24846 0.187657 0.0253371 +0.236173 0.217937 0.0406376 +0.208251 0.202717 0.0430183 +0.190765 0.204953 0.0676283 +0.199822 0.228771 0.0907818 +0.212055 0.262964 0.121847 +0.167888 0.20936 0.0941323 +0.230768 0.216285 0.106419 +0.226441 0.220307 0.1523 +0.160904 0.217518 0.126833 +0.151535 0.251202 0.133586 +0.158786 0.306935 0.0984538 +0.193903 0.396086 0.195106 +0.119767 0.364922 0.154966 +0.158434 0.284691 0.125614 +0.188265 0.327264 0.175224 +0.139712 0.323472 0.144742 +0.247398 0.226772 0.208026 +0.162628 0.357991 0.158091 +0.132463 0.334186 0.215838 +0.184892 0.418747 0.128073 +0.148158 0.405567 0.1589 +0.116952 0.392105 0.208798 +0.128904 0.307582 0.18276 +0.173163 0.280669 0.197839 +0.237808 0.190239 0.0542196 +0.242415 0.187695 0.0885314 +0.257589 0.159811 0.105872 +0.25799 0.149475 0.1552 +0.249199 0.167605 0.0439231 +0.270589 0.141138 0.0478035 +0.291007 0.120776 0.0668204 +0.27986 0.0943457 0.0648346 +0.262028 0.128688 0.0220064 +0.283888 0.104244 0.08796 +0.278117 0.09277 0.114653 +0.296211 0.119268 0.134225 +0.25745 0.0686993 0.129638 +0.231499 0.0874258 0.144645 +0.23624 0.121986 0.150481 +0.21822 0.158716 0.152133 +0.276736 0.0681718 0.110294 +0.286087 0.0545245 0.0921962 +0.114064 0.342002 0.184102 +0.184346 0.361594 0.187357 +0.161147 0.378013 0.229421 +0.186402 0.32651 0.232026 +0.224199 0.278314 0.231623 +0.178684 0.387524 0.165454 +0.207571 0.416517 0.162223 +0.115261 0.360345 0.210089 +0.111327 0.375408 0.183082 +0.123148 0.405595 0.17979 +0.161317 0.441861 0.200022 +0.134075 0.42215 0.208124 +0.166581 0.413272 0.221996 +0.184888 0.467555 0.155941 +0.139501 0.435526 0.173911 +0.158717 0.435906 0.144337 +0.167498 0.45215 0.103084 +0.137763 0.359978 0.22921 +0.165611 0.348074 0.227085 +0.15984 0.318857 0.217125 +0.185554 0.304169 0.211919 +0.205103 0.278784 0.204981 +0.244841 0.279219 0.196675 +0.226891 0.25345 0.209087 +0.216714 0.31142 0.225032 +0.18164 0.33693 0.20427 +0.203702 0.303717 0.18726 +0.193627 0.296232 0.146589 +0.191637 0.257284 0.18429 +0.157803 0.257523 0.177293 +0.175634 0.311565 0.125155 +0.161107 0.457828 0.173386 +0.194169 0.447882 0.185268 +0.194408 0.477711 0.118315 +0.219599 0.449898 0.13857 +0.135294 0.387364 0.228733 +0.145147 0.282789 0.187345 +0.143956 0.303159 0.203618 +0.177446 0.366384 0.212315 +0.179329 0.391491 0.217312 +0.18672 0.412483 0.210145 +0.202606 0.421792 0.189409 +0.174085 0.42914 0.210627 +0.153641 0.426813 0.21312 +0.144424 0.408706 0.223131 +0.190464 0.428693 0.201747 +0.178837 0.441581 0.19921 +0.169704 0.452082 0.187978 +0.180705 0.459908 0.173619 +0.202088 0.458198 0.166952 +0.151672 0.449754 0.186725 +0.142475 0.436806 0.198199 +0.127991 0.425256 0.188222 +0.210178 0.437176 0.172385 +0.119636 0.410278 0.199562 +0.206557 0.46857 0.145869 +0.215386 0.468035 0.123827 +0.207969 0.436894 0.106764 +0.212477 0.477963 0.10116 +0.128023 0.4054 0.215288 +0.223073 0.454408 0.0921651 +0.184017 0.321535 0.149004 +0.164058 0.339436 0.133054 +0.141763 0.356765 0.138374 +0.138767 0.331395 0.111494 +0.18387 0.5 0.0894472 +0.178253 0.341112 0.15974 +0.158692 0.397227 0.229447 +0.261987 0.258572 0.22454 +0.209557 0.191204 0.156985 +0.19703 0.220129 0.168363 +0.114158 0.395299 0.191384 +0.237163 0.239354 0.0176536 +0.22873 0.228755 -0.0079498 +0.204237 0.229854 -0.000985107 +0.191898 0.248869 0.0164149 +0.195144 0.299533 0.0501168 +0.211408 0.277777 0.0261684 +0.181525 0.269092 0.042102 +0.232338 -0.0296485 0.018274 +0.220704 0.448894 0.117889 +0.211836 0.430361 0.128709 +0.200007 0.22745 0.0221073 +0.206622 0.221816 0.0395427 +0.223655 0.239447 0.0484776 +0.206846 0.263872 0.061817 +0.192412 0.289403 0.0880222 +0.200823 -0.0669613 0.089238 +0.1998 0.487191 0.0879627 +0.178418 0.478766 0.0726805 +0.171907 0.478 0.098484 +0.179607 0.4432 0.070784 +0.215421 0.44036 0.0572748 +0.206111 0.438517 0.081171 +0.184196 0.432818 0.0953164 +0.172787 0.433405 0.115219 +0.16681 0.454422 0.128591 +0.158037 0.463512 0.080819 +0.300027 -0.106441 0.0798503 +0.301565 -0.138608 0.110073 +0.223785 -0.0676095 0.104371 +0.244386 -0.0720528 0.0937201 +0.25624 -0.0594904 0.0758547 +0.271472 -0.0437947 0.0690266 +0.283677 -0.0568988 0.0744319 +0.294284 -0.0698767 0.0795338 +0.293906 -0.0887216 0.0736412 +0.275743 -0.101071 0.0877101 +0.309738 -0.0894098 0.0874741 +0.287014 -0.123527 0.0945964 +0.311125 -0.118131 0.0991123 +0.298899 -0.117613 0.118193 +0.276193 -0.109289 0.135451 +0.270493 -0.137621 0.153632 +0.286312 -0.136798 0.132025 +0.257826 -0.0797919 0.144654 +0.303792 -0.0864306 0.104131 +0.28817 -0.0747287 0.113826 +0.276632 -0.0878111 0.128274 +0.30695 -0.103289 0.107245 +0.287682 -0.0559229 0.10414 +0.272738 -0.0407993 0.108633 +0.253435 -0.0365139 0.124117 +0.295415 -0.0573592 0.0898843 +0.270105 -0.0629299 0.0693418 +0.263375 -0.0783235 0.0820667 +-0.216962 -0.20051 0.140681 +-0.236047 -0.180496 0.115013 +-0.230292 -0.136771 0.112494 +-0.247625 -0.159292 0.0914591 +-0.209896 -0.129892 0.141237 +0.222682 0.288177 0.190351 +0.233778 0.296853 0.212089 +0.209365 0.287061 0.167624 +0.208618 0.271128 0.146657 +0.223776 0.247151 0.14266 +0.250594 0.280585 0.221005 +0.215525 0.238928 0.164607 +0.248724 0.243405 0.176599 +0.282927 0.23674 0.194658 +0.253819 0.208937 0.178714 +0.265424 0.184312 0.155732 +0.308614 0.169998 0.183237 +0.273365 0.179729 0.192265 +0.265912 0.204786 0.204674 +0.300509 0.203464 0.194384 +0.281969 0.151677 0.177526 +0.279246 0.127373 0.158699 +0.31079 0.143896 0.162421 +0.30954 0.171009 0.155179 +0.288086 0.1804 0.137744 +0.264265 0.175268 0.132545 +0.241184 0.168571 0.143536 +0.282052 0.162312 0.123541 +0.290218 0.138764 0.11928 +0.232003 0.191432 0.146429 +0.237199 0.211128 0.131059 +0.175486 0.13591 0.157401 +0.244193 0.0453066 0.121153 +0.216838 0.0295154 0.115567 +0.0778181 0.0182774 -0.0959304 +0.132697 0.385267 0.165833 +0.155812 0.38306 0.160495 +-0.00373338 0.0386319 -0.0871428 +0.0052284 0.0508015 -0.0521262 +-0.0272532 0.0521944 -0.0650671 +-0.0417118 0.0760468 -0.0274796 +0.0432101 0.0478592 -0.0430105 +0.0360437 0.064037 -0.0095129 +0.0264403 0.0878588 0.0105855 +0.0200841 0.0963175 -0.0204482 +0.0508265 0.0939603 -0.0091335 +0.0753367 0.087282 -0.0290458 +-0.0114666 0.0989277 -0.0268583 +0.189464 0.426182 0.111762 +-0.04038 -0.0265907 0.0536548 +0.188037 0.19051 0.048384 +0.170897 0.170857 0.0404072 +0.180803 0.154042 0.0195245 +0.168583 0.128396 0.0100026 +0.150344 0.161847 0.0580756 +0.146195 0.173828 0.0846654 +0.123104 0.163389 0.100752 +0.131952 0.158423 0.126057 +0.154039 0.169296 0.137953 +0.163282 0.191526 0.127822 +0.170691 0.206066 0.147249 +0.123979 0.136658 0.135 +0.136161 0.125537 0.148878 +0.153818 0.131557 0.161379 +0.111897 0.12133 0.126074 +0.111889 0.144276 0.0890707 +0.11658 0.140768 0.0690434 +0.119959 0.124948 0.0613596 +0.107779 0.107117 0.0626571 +0.122618 0.115267 0.0466942 +0.127454 0.104238 0.0219653 +0.136258 0.119892 0.0320023 +0.129073 0.0915077 -0.00265103 +0.130797 0.0780035 -0.0369633 +0.10768 0.094992 0.00979378 +0.163926 0.154671 0.152149 +0.0894836 0.0909923 0.00058556 +0.0689505 0.0963924 0.00171312 +0.0612997 0.100634 0.0224348 +0.0675451 0.0846698 0.038694 +0.0795109 0.103357 0.0384133 +0.0848094 0.0754581 0.0444653 +0.110567 0.10366 0.130086 +0.12281 0.0864143 0.139975 +0.117855 0.062854 0.143513 +0.13666 0.0472165 0.155281 +0.128164 0.0235742 0.176647 +0.163067 0.0498951 0.143567 +0.143932 0.0949004 0.145284 +0.179917 0.317727 0.0742859 +0.183725 0.275085 0.0676723 +0.16838 0.29297 0.0787056 +0.0930951 0.102542 0.05002 +0.100339 0.0681106 0.0373411 +0.102886 0.0622715 0.0197467 +0.121511 0.0540863 0.0117598 +0.124719 0.0242285 0.0166428 +0.0967861 -0.00310471 -0.0020113 +0.12138 0.0519179 -0.0102922 +0.0990646 0.0492208 -0.022422 +0.0873807 -0.0275369 -0.03209 +0.200694 -0.191636 -0.0546067 +0.206298 -0.170055 -0.0598788 +0.209964 -0.168421 -0.0791806 +0.221182 -0.183261 -0.0963771 +0.222775 -0.172837 -0.120159 +0.235715 -0.195921 -0.115182 +0.253933 -0.218526 -0.134037 +0.311213 -0.253911 -0.191866 +0.279294 -0.244732 -0.16099 +0.266185 -0.201338 -0.169529 +0.285572 -0.216415 -0.213382 +0.273765 -0.285731 -0.187819 +0.259679 -0.265381 -0.248632 +0.24894 -0.227823 -0.231771 +0.232153 -0.25966 -0.225227 +0.254118 -0.290735 -0.220386 +0.336364 -0.328047 -0.241676 +0.281317 -0.319577 -0.26697 +0.295033 -0.317038 -0.218433 +0.327766 -0.263669 -0.27537 +0.320681 -0.238904 -0.235706 +0.333487 -0.28367 -0.222752 +0.25789 -0.299076 -0.25318 +0.280382 -0.278404 -0.287734 +0.262726 -0.334272 -0.234674 +0.315714 -0.303377 -0.28762 +0.358898 -0.298323 -0.270079 +0.292961 -0.250812 -0.263064 +0.260427 0.269097 0.206442 +0.273912 0.251948 0.207483 +0.274266 0.226866 0.218876 +0.254508 0.262332 0.186312 +0.268737 0.247011 0.182676 +0.278883 0.230014 0.174886 +0.292676 0.216891 0.181537 +0.301666 0.196568 0.170643 +0.235991 0.25839 0.179999 +0.216996 0.262302 0.191107 +0.233602 0.240223 0.192553 +0.26623 0.217767 0.166603 +0.291208 0.219735 0.206357 +0.285626 0.200003 0.208179 +0.295054 0.181857 0.198439 +-0.119559 -0.0454446 0.130205 +-0.148541 -0.0288065 0.124554 +-0.122421 -0.0280036 0.104512 +-0.169628 -0.0428483 0.136658 +-0.192691 -0.0700149 0.138018 +-0.165949 -0.0805689 0.151606 +-0.157867 -0.111652 0.162619 +-0.182289 -0.134815 0.160033 +-0.171616 -0.0265274 0.119564 +-0.182821 -0.0294707 0.089096 +-0.207158 -0.0941133 0.130893 +-0.0813687 -0.408143 0.0168626 +-0.0493082 -0.255289 0.183439 +-0.0417823 -0.281988 0.16825 +-0.0232624 -0.242141 -0.150317 +0.237084 0.148575 0.150278 +0.21825 0.135883 0.152701 +0.196547 0.147262 0.152063 +0.248839 0.134889 0.149793 +0.25417 0.116897 0.146677 +0.154738 -0.248351 -0.113516 +0.149894 -0.252291 -0.14374 +0.127807 -0.247316 -0.112579 +0.100037 -0.239188 -0.118127 +0.171952 -0.258325 -0.155783 +0.206243 -0.267544 -0.164319 +0.152779 -0.244265 -0.170212 +0.238869 -0.271194 -0.164355 +0.19948 -0.240785 -0.114164 +0.228533 -0.228656 -0.117975 +0.0806348 -0.448964 -0.0364622 +0.092817 -0.46403 -0.0236687 +0.131465 -0.464547 -0.0186627 +0.111576 -0.45856 -0.0162136 +0.12236 -0.437795 -0.0167687 +0.116113 -0.473014 -0.0333379 +0.141834 -0.466374 -0.0462667 +0.15629 -0.45187 -0.0265272 +0.162053 -0.430562 -0.0436087 +0.170805 -0.433786 -0.074571 +0.150694 -0.440322 -0.089161 +0.142403 -0.453672 -0.0687084 +0.20922 0.0225383 -0.118012 +0.245897 0.00269769 -0.0710137 +-0.0868896 -0.445579 -0.0827631 +-0.0899978 -0.418668 -0.0662628 +-0.0919895 -0.382051 -0.0731611 +-0.286076 -0.18977 0.00251657 +0.166397 -0.235956 -0.0665238 +0.18289 -0.231659 -0.0402536 +0.183601 -0.256036 -0.0114407 +0.19304 -0.222737 -0.0114233 +0.168396 -0.264129 0.0198747 +0.175145 -0.292863 -0.0261367 +0.159612 -0.311932 -0.0502102 +0.151795 -0.349231 -0.058414 +0.168467 0.120276 0.165442 +0.179322 0.109989 0.151163 +0.191745 0.091503 0.1476 +0.207409 0.0731218 0.143583 +0.170472 0.088013 0.148441 +0.198308 0.0526608 0.137187 +-0.288444 -0.322548 -0.196751 +-0.258254 -0.336596 -0.201797 +-0.260706 -0.370334 -0.191889 +-0.262012 -0.38355 -0.234182 +0.169409 0.331718 0.106522 +-0.0883279 -0.427369 -0.00320489 +-0.0757242 -0.410706 -0.00350047 +-0.0694098 -0.396348 -0.0215868 +-0.339105 -0.28249 -0.133907 +0.14338 -0.190029 -0.185968 +0.113197 -0.189729 -0.178573 +0.161752 -0.208101 -0.1989 +0.163143 -0.233988 -0.192556 +0.187542 -0.24244 -0.20457 +0.214342 -0.231174 -0.221761 +0.200695 -0.263551 -0.191549 +0.0888974 -0.174918 -0.165344 +0.0728578 -0.155488 -0.148655 +0.0857975 -0.13271 -0.133069 +0.0496654 -0.153477 -0.133288 +0.208417 -0.252602 -0.211864 +0.214499 -0.20684 -0.209109 +0.212326 -0.182246 -0.176825 +0.196622 -0.193456 -0.194925 +-0.0366034 0.0848157 -0.0747335 +-0.0106036 0.0767347 -0.0825468 +-0.248014 -0.143811 -0.0711582 +0.156176 -0.353723 -0.00967102 +0.161881 -0.35946 -0.0354879 +0.154192 -0.374021 -0.054565 +0.153835 -0.401954 -0.0551512 +0.147106 -0.376782 -0.0111704 +0.141013 -0.401853 -0.0175381 +0.127378 -0.38782 -0.00428773 +0.152558 -0.410563 -0.0345712 +0.144573 -0.387551 -0.0699167 +0.129797 -0.395951 -0.0860393 +0.110844 -0.383365 -0.0877166 +0.111358 -0.362136 -0.0828181 +0.10863 -0.332992 -0.0757964 +0.131091 -0.348484 -0.0736181 +0.114528 -0.372564 0.00601769 +0.116893 -0.350867 0.0177725 +0.143657 -0.369483 -0.0686154 +0.0433039 -0.239647 0.0998892 +-0.318832 -0.357055 -0.211401 +-0.299837 -0.377374 -0.238049 +-0.340344 -0.383626 -0.224893 +-0.356366 -0.419986 -0.188103 +-0.285529 -0.404192 -0.228972 +-0.356375 -0.393121 -0.201407 +-0.349321 -0.392013 -0.165399 +-0.328811 -0.42272 -0.163607 +-0.345548 -0.417553 -0.216974 +-0.322795 -0.427865 -0.195551 +-0.33518 -0.363207 -0.161311 +-0.0812327 -0.396788 0.0342935 +-0.065289 -0.38943 0.0224745 +-0.0508718 -0.371639 0.0298172 +-0.260668 -0.216401 0.0653687 +-0.2704 -0.185201 0.0538295 +0.187032 0.486356 0.0996338 +0.279593 -0.136382 0.110973 +0.26837 -0.117918 0.105466 +0.248285 -0.109463 0.116456 +0.232397 -0.125931 0.141691 +0.210603 -0.141776 0.171116 +0.137574 -0.108705 0.207737 +0.169921 0.29167 0.0522744 +0.00992085 -0.113945 -0.0964453 +0.258261 -0.257702 -0.154872 +0.275321 -0.267702 -0.17038 +0.295633 -0.272896 -0.184932 +0.295815 -0.294739 -0.20199 +0.314713 -0.27743 -0.201437 +0.327332 -0.256197 -0.214678 +0.340385 -0.261017 -0.241446 +0.313356 -0.232789 -0.209684 +0.296344 -0.226073 -0.182212 +0.31592 -0.301772 -0.216769 +0.318635 -0.326842 -0.222796 +0.307178 -0.325937 -0.251416 +0.274745 -0.303144 -0.21295 +0.263287 -0.308346 -0.232527 +0.255382 -0.319889 -0.248754 +0.332002 -0.310475 -0.229091 +0.353636 -0.307458 -0.245121 +0.335859 -0.313851 -0.265914 +0.340499 -0.300896 -0.286697 +0.344989 -0.280039 -0.276203 +0.327449 -0.28026 -0.295194 +0.304942 -0.268737 -0.28762 +0.34983 -0.283684 -0.251927 +0.343136 -0.265469 -0.261534 +0.326713 -0.248963 -0.256716 +0.307917 -0.24034 -0.252462 +0.279159 -0.231625 -0.241522 +0.300353 -0.229376 -0.234338 +0.311358 -0.251222 -0.26759 +0.299024 -0.289572 -0.301481 +0.279907 -0.305571 -0.290358 +0.263002 -0.29286 -0.276914 +0.260616 -0.313748 -0.268771 +0.275922 -0.322371 -0.224156 +0.284975 -0.33259 -0.244221 +0.303023 -0.336946 -0.233483 +0.289605 -0.333838 -0.221905 +0.166435 0.39886 0.154509 +0.189152 0.404825 0.153461 +0.197133 0.400723 0.1737 +0.17424 0.413608 0.143911 +0.169142 0.426834 0.132439 +0.188725 0.386035 0.180698 +0.186219 0.378081 0.198788 +-0.267025 -0.372115 -0.138391 +-0.248022 -0.367522 -0.158602 +0.174505 0.292586 0.0990952 +0.186251 0.309263 0.0928235 +0.181697 0.30513 0.109614 +0.189499 0.279776 0.119317 +0.172647 0.294457 0.120787 +0.158057 0.303956 0.130265 +0.143476 0.291331 0.139139 +0.131312 0.30031 0.159002 +0.186095 0.298863 0.131041 +0.198975 0.28677 0.132576 +0.172236 0.277192 0.117866 +0.184313 0.260452 0.109718 +0.15755 0.265746 0.122578 +0.145983 0.269471 0.137935 +0.151234 0.256355 0.155644 +0.124293 0.323596 0.164277 +0.126678 0.342635 0.150186 +0.129524 0.341544 0.128525 +0.146576 0.349856 0.118779 +0.192269 0.30374 0.0759625 +0.202728 0.285813 0.0690781 +0.210479 0.281567 0.0483558 +0.222196 0.26209 0.0407369 +0.224073 0.261141 0.0186008 +0.162756 0.306191 0.114529 +0.149682 0.318744 0.121136 +0.152677 0.341974 0.100993 +0.164071 0.331208 0.0841361 +0.146523 0.323278 0.093798 +0.15695 0.312461 0.0714443 +0.22266 -0.203518 -0.100877 +0.262076 -0.292278 -0.202356 +0.249754 -0.28212 -0.183581 +0.242451 -0.284733 -0.203885 +0.229725 -0.273053 -0.211906 +0.243386 -0.275428 -0.225419 +0.255999 -0.283472 -0.239546 +-0.261873 -0.405224 -0.222848 +-0.280772 -0.420055 -0.201182 +-0.274389 -0.414773 -0.173401 +-0.298626 -0.411672 -0.158377 +-0.28738 -0.389898 -0.148508 +-0.300008 -0.369107 -0.135836 +-0.257381 -0.39915 -0.185758 +-0.257531 -0.421709 -0.186727 +-0.319983 -0.369357 -0.146016 +-0.25404 -0.39271 -0.206532 +-0.269186 -0.375948 -0.213104 +0.171129 0.312683 0.0555484 +0.186538 0.309469 0.0612947 +0.17697 0.322584 0.0897939 +0.180094 0.317456 0.102692 +0.0389455 -0.294719 0.0707663 +0.19085 0.129482 0.148059 +0.26893 -0.330546 -0.250405 +0.261495 -0.324416 -0.260179 +0.163955 0.0845671 -0.00775852 +0.172992 0.467003 0.114773 +0.17962 0.47069 0.135115 +0.167392 0.460661 0.148013 +0.0927702 -0.0102964 0.178794 +0.0791092 -0.00358862 0.211868 +0.0484002 -0.0727004 0.143042 +0.0857054 -0.0664246 0.132462 +0.170606 0.462905 0.162683 +0.107346 -0.291576 0.0507084 +0.123054 -0.26548 0.0555752 +0.1033 -0.273351 0.0618915 +-0.217347 -0.0684085 0.0793768 +-0.232534 -0.1003 0.0785864 +0.160705 0.203815 0.112095 +0.157448 0.189802 0.0951937 +0.163855 0.222961 0.107992 +0.178039 0.226994 0.0939715 +0.157779 0.236558 0.121407 +0.156862 0.233096 0.141593 +0.254115 0.147478 0.0328869 +0.246739 0.139758 0.0163119 +-0.313249 -0.26088 -0.138114 +-0.319034 -0.272336 -0.0954566 +-0.312031 -0.286413 -0.151154 +-0.318615 -0.301412 -0.127758 +-0.31358 -0.30952 -0.0911544 +-0.342054 -0.297563 -0.104135 +-0.285707 -0.289103 -0.098473 +-0.332554 -0.290038 -0.0650158 +0.224391 0.444149 0.0748945 +0.224127 0.466497 0.0733316 +0.00933378 -0.0890982 -0.073455 +-0.196836 -0.0544369 -0.0547609 +-0.268852 -0.35939 -0.204575 +-0.134821 -0.144762 0.184037 +-0.134018 -0.119846 0.172991 +-0.108849 -0.110436 0.169417 +-0.142893 -0.258813 -0.176858 +0.163435 0.422628 0.144619 +0.149105 0.425301 0.157986 +0.151653 0.445126 0.160854 +0.205634 0.453218 0.0682861 +0.196116 0.437078 0.0613117 +0.305429 0.136514 0.131635 +0.304223 0.128705 0.150462 +0.294739 0.1352 0.16485 +0.29983 0.148475 0.176204 +0.293633 0.16134 0.186506 +0.312816 0.146868 0.144611 +0.290574 0.119539 0.149687 +0.280449 0.10933 0.137413 +0.285959 0.112117 0.117297 +0.154398 0.116961 0.162863 +0.147042 0.108372 0.152274 +0.179394 0.214392 0.162515 +0.185651 0.194518 0.157404 +0.180628 0.232354 0.173507 +0.198969 0.238329 0.174545 +0.207694 0.253512 0.177641 +0.203869 0.264161 0.186147 +0.189501 0.273156 0.193533 +0.17312 0.263127 0.188581 +-0.206119 -0.0619918 0.116346 +-0.201545 -0.0465532 0.095691 +0.256266 0.152102 0.0503785 +0.264034 0.143148 0.0672501 +0.26342 0.152022 0.0867622 +0.269601 0.144159 0.103885 +0.281713 0.137095 0.0629023 +0.296165 0.127981 0.0376256 +0.300117 0.13462 0.0559043 +0.287642 0.140563 0.0456708 +0.278661 0.132147 0.0309413 +0.271646 0.118273 0.028754 +0.262921 0.1025 0.0261376 +0.261118 0.0855637 0.0169037 +0.25422 0.0767023 0.000233527 +0.237362 0.0575218 0.00198963 +0.283388 0.119704 0.0383643 +0.282941 0.112062 0.0540402 +0.249937 0.0937398 -0.00575339 +0.231931 0.0954578 -0.0107377 +0.210437 0.0914748 -0.0140972 +0.239252 0.109782 0.000233887 +0.191402 0.0870306 -0.0134669 +0.184376 0.0704441 -0.0225342 +0.184719 0.0606504 -0.044543 +0.166145 0.0578967 -0.0668264 +0.200251 0.061117 -0.0313226 +0.217304 0.057967 -0.0199728 +0.227686 0.12158 0.00370932 +0.20937 0.123042 0.000300618 +0.244333 0.124524 0.00810813 +0.295429 0.120597 0.0522453 +0.178132 0.0791963 -0.0112798 +0.177197 -0.279627 -0.000252101 +0.173639 -0.299787 -0.00606886 +0.172196 -0.313975 -0.0223573 +0.166117 -0.326159 -0.00858114 +0.168079 -0.321719 -0.0379096 +0.162521 -0.339731 -0.0445028 +0.151373 -0.32895 -0.0576036 +0.312369 -0.105021 0.0899766 +0.306 -0.11652 0.0866674 +0.301418 -0.129182 0.0942967 +0.290875 -0.135236 0.101483 +0.289966 -0.143698 0.1109 +0.295915 -0.13953 0.122573 +0.279108 -0.148197 0.122497 +0.27841 -0.152315 0.142258 +0.265867 -0.157983 0.158785 +0.256687 -0.14661 0.137703 +0.25422 -0.140442 0.172759 +0.232237 -0.161116 0.192798 +0.192807 -0.160413 0.202508 +0.178601 -0.140578 0.237092 +0.154384 -0.117167 0.24831 +0.13004 -0.134226 0.269277 +0.17845 -0.105479 0.223698 +0.247464 -0.158843 0.179106 +0.226891 -0.158442 0.171794 +0.209982 -0.159856 0.187271 +0.217821 -0.141328 0.207646 +0.23745 -0.141109 0.186416 +0.229503 -0.142546 0.156329 +0.214657 -0.125289 0.155947 +0.193847 -0.12199 0.171057 +0.217246 -0.105649 0.140104 +0.198069 -0.0856194 0.142621 +0.193693 -0.14343 0.18682 +0.198045 -0.145975 0.222277 +0.178989 -0.164931 0.225321 +0.158831 -0.146831 0.218292 +0.158889 -0.159611 0.244735 +0.138513 -0.154491 0.257842 +0.156487 -0.13924 0.256434 +-0.290841 -0.208347 -0.00770324 +-0.29533 -0.224009 -0.017137 +-0.30561 -0.24462 -0.0155011 +-0.278365 -0.220452 -0.0277869 +-0.267819 -0.241114 -0.0357093 +-0.286737 -0.259306 -0.0462551 +-0.310093 -0.264404 -0.0203987 +-0.307167 -0.250649 -0.0341839 +-0.307612 -0.281242 -0.0310235 +-0.321036 -0.286281 -0.0471544 +-0.310491 -0.270102 -0.0639157 +-0.311345 -0.301149 -0.0633156 +-0.297683 -0.291436 -0.0450671 +-0.294949 -0.304108 -0.0790095 +-0.285459 -0.27779 -0.0488974 +-0.296472 -0.275126 -0.0168658 +-0.276222 -0.270671 -0.00788631 +-0.246454 -0.248267 -0.0329014 +-0.244456 -0.252303 -0.00937036 +-0.304286 -0.259682 -0.0492577 +-0.294933 -0.27203 -0.0604957 +-0.300998 -0.278796 -0.0743602 +-0.316674 -0.274623 -0.0789273 +-0.337714 -0.280945 -0.0853892 +-0.325825 -0.275251 -0.0655092 +-0.332977 -0.302425 -0.0833069 +-0.293564 -0.290291 -0.0772666 +-0.298024 -0.281309 -0.0905074 +-0.293634 -0.272694 -0.109468 +-0.270428 -0.274072 -0.107657 +-0.256077 -0.253991 -0.120812 +-0.261078 -0.296954 -0.0999473 +-0.2381 -0.297373 -0.0849839 +-0.232752 -0.278906 -0.0645746 +-0.272041 -0.319246 -0.10842 +-0.21032 -0.284441 -0.0448701 +-0.256436 -0.341131 -0.11181 +-0.225098 -0.336223 -0.113241 +-0.200175 -0.288996 -0.0158483 +-0.223009 -0.317757 -0.0905879 +-0.301096 -0.262202 -0.123506 +-0.32405 -0.263071 -0.116908 +-0.292477 -0.257052 -0.14263 +-0.270149 -0.255918 -0.142108 +-0.275486 -0.258003 -0.162669 +-0.259523 -0.2674 -0.178244 +-0.251069 -0.250018 -0.0970302 +-0.24056 -0.260706 -0.172311 +-0.232499 -0.247239 -0.154361 +-0.34182 -0.274562 -0.107339 +-0.294559 -0.307923 -0.0994756 +-0.275844 -0.269552 -0.0355918 +-0.227344 -0.270897 -0.045083 +0.25093 0.170443 0.120028 +0.248384 0.184009 0.106523 +0.235777 0.198062 0.103222 +0.23641 0.211305 0.086191 +0.221152 0.226047 0.0898201 +0.223243 0.24123 0.111495 +0.203883 0.250541 0.105061 +0.226958 0.225862 0.123117 +0.219737 0.240254 0.12789 +0.214138 0.253162 0.132941 +0.232275 0.224561 0.138088 +0.109391 -0.247931 -0.0995264 +0.104952 -0.262437 -0.0820427 +0.080763 -0.274056 -0.0783487 +0.0604155 -0.262392 -0.0950373 +-0.227936 -0.329497 -0.190147 +-0.214125 -0.337031 -0.170051 +0.263325 -0.0528405 0.0685009 +0.251926 -0.0484757 0.0715634 +0.237277 -0.0480579 0.0658708 +0.244491 -0.055646 0.0790843 +0.239659 -0.0616442 0.0888399 +0.226162 -0.0616059 0.0920824 +0.21522 -0.0631162 0.0781895 +0.212545 -0.0629682 0.0966232 +0.196781 -0.0599901 0.105959 +0.210127 -0.0657511 0.11188 +0.250495 -0.0660959 0.0846797 +0.234672 -0.0671026 0.0978575 +0.237261 -0.0846396 0.108485 +0.25989 -0.0423809 0.0666642 +0.259987 -0.0257531 0.0664908 +0.247883 -0.0247631 0.0554477 +0.242689 -0.0135836 0.0440572 +0.246291 0.00496067 0.0457059 +0.245187 0.0234669 0.0372413 +0.250061 0.17416 0.133813 +0.259114 0.167602 0.148828 +0.26511 0.166925 0.171546 +0.238618 0.181672 0.138204 +0.229669 0.176644 0.149535 +0.262049 0.187134 0.176237 +0.261795 0.200868 0.165371 +0.276513 0.199318 0.153854 +0.292677 0.199982 0.157209 +0.302715 0.186361 0.157188 +0.308755 0.181779 0.171774 +0.305926 0.190608 0.185482 +0.312423 0.167782 0.169221 +0.31381 0.157653 0.158921 +0.310783 0.154703 0.171639 +0.301108 0.177938 0.144841 +0.293264 0.189309 0.147256 +0.279322 0.188458 0.145304 +0.262483 0.193127 0.192418 +0.274289 0.192768 0.20161 +0.254841 0.206509 0.193978 +0.245154 0.222549 0.189318 +0.253012 0.22552 0.174345 +0.265429 0.23121 0.17081 +-0.253206 -0.236908 -0.0443888 +0.149428 0.386275 0.232451 +0.147867 0.371017 0.232576 +0.152926 0.356705 0.229375 +0.149032 0.338169 0.225131 +0.166114 0.363727 0.223417 +0.172256 0.353426 0.215568 +0.179541 0.338962 0.221969 +0.181625 0.354174 0.201921 +0.186426 0.343494 0.187951 +0.192075 0.328517 0.215563 +0.192453 0.320313 0.195502 +0.17815 0.351274 0.174302 +0.17655 0.370022 0.172318 +0.165276 0.33179 0.225541 +0.00939661 -0.323412 0.0804555 +0.117561 -0.144032 0.250595 +0.120353 -0.125008 0.233582 +0.111251 -0.145731 0.271784 +0.11093 -0.120815 0.285658 +0.0754192 -0.0921393 0.301481 +0.0769558 -0.124739 0.290267 +0.0748528 -0.117401 0.265004 +0.0426218 -0.103655 0.282975 +0.0504123 -0.0659143 0.287583 +0.0836935 -0.0669285 0.279976 +0.0588543 -0.11803 0.279938 +0.0586609 -0.105277 0.297458 +0.0557269 -0.0839063 0.29826 +0.0381914 -0.083198 0.286361 +0.0371995 -0.0680895 0.266535 +0.047335 -0.0888232 0.265922 +0.05563 -0.0732275 0.247968 +0.0616189 -0.0543441 0.232231 +0.0811821 -0.0784737 0.231059 +0.0764784 -0.0353683 0.254905 +0.0689625 -0.0703705 0.29266 +0.0661415 -0.0548095 0.278244 +0.0608765 -0.028919 0.235586 +0.087271 -0.018263 0.234864 +0.0756435 -0.10953 0.298971 +0.0951645 -0.0988538 0.288259 +0.0930654 -0.116235 0.295574 +0.0947803 -0.133863 0.284699 +0.0966033 -0.0830131 0.273711 +0.113798 -0.076403 0.258582 +0.127442 -0.0600385 0.234949 +0.132794 -0.0953943 0.252522 +0.0489111 -0.0556973 0.272686 +0.0606107 -0.0431898 0.263976 +0.0971312 -0.036293 0.245012 +0.110687 -0.0488392 0.23675 +0.126176 -0.0414728 0.221378 +0.136057 -0.0243951 0.201716 +0.122078 0.00127519 0.196707 +0.142291 0.00027007 0.178375 +0.0664164 -0.0191578 0.217877 +0.0802696 -0.0234954 0.199319 +0.0910082 -0.0454502 0.20083 +0.0798776 -0.132726 0.273919 +0.102454 0.00166634 0.210465 +0.0802091 -0.00534582 0.192641 +0.0863635 0.00814252 0.179895 +0.0946306 0.0282399 0.168655 +0.0981336 0.029523 0.148764 +0.101777 0.0395859 0.135111 +0.102082 0.0581642 0.134881 +0.0956437 0.0321468 0.122829 +0.0938658 0.0161985 0.122282 +0.107901 0.00369122 0.128399 +0.078491 0.00576055 0.124425 +0.0841199 0.0382034 0.11313 +0.0659972 0.0331947 0.109714 +0.0520056 0.0196069 0.12098 +0.108345 -0.0142416 0.126349 +0.0915975 -0.0313276 0.129913 +0.122833 -0.0287943 0.124051 +0.146418 -0.0426624 0.119895 +0.142658 -0.0228961 0.131632 +0.132595 -0.0194368 0.150249 +0.160419 -0.0327892 0.133975 +0.163125 -0.050543 0.147173 +0.060233 0.0422739 0.0970401 +0.0469107 0.0353785 0.0851224 +0.0330985 0.0252247 0.0760721 +0.0344131 0.0145341 0.0525338 +0.0185411 0.0141735 0.0691085 +-0.00651953 0.00766464 0.081092 +0.0314926 0.0314677 0.0951056 +0.0155266 0.0258059 0.107793 +0.11957 0.0050674 0.144577 +0.11348 -0.010764 0.15919 +0.0864989 0.00930931 0.196192 +0.112679 0.0343949 0.172228 +0.110056 0.0172326 0.144505 +-0.231861 -0.256194 -0.0373807 +-0.233847 -0.249852 -0.0220477 +-0.230235 -0.258784 -0.00973726 +-0.217151 -0.280061 0.00814621 +-0.228026 -0.273051 0.0389012 +-0.222798 -0.271648 -0.00409819 +-0.229682 -0.268052 0.0118625 +-0.212876 -0.279385 -0.0140325 +-0.214439 -0.277583 -0.0303969 +-0.199886 -0.285356 -0.0320197 +-0.187179 -0.295224 -0.0255156 +-0.167219 -0.315028 -0.0304058 +-0.156845 -0.302235 -0.0544314 +-0.236758 -0.254924 0.00227314 +0.0884351 -0.404348 -0.0195924 +0.0722252 -0.268984 0.0670772 +0.070147 -0.245252 0.0862941 +0.0966471 -0.229612 0.0882203 +0.0926053 -0.203806 0.103764 +0.0777673 -0.186021 0.118999 +0.0417862 -0.182948 0.126604 +0.0709209 -0.158179 0.128709 +0.095465 -0.128791 0.124296 +0.0102764 -0.16375 0.133447 +-0.0233099 -0.171526 0.153541 +-0.0499934 -0.0465621 -0.00582837 +-0.0749973 -0.0355191 0.0101971 +-0.0645299 -0.324704 -0.077104 +0.221779 0.470802 0.0892895 +0.219761 0.464582 0.1032 +0.246597 0.0246927 0.0795416 +0.253586 0.0320272 0.0977802 +0.252394 0.0305168 0.0670227 +0.261064 0.0424817 0.0637394 +0.267205 0.0556508 0.058182 +0.262106 0.0615289 0.0436471 +0.250683 0.0500973 0.0298185 +0.272972 0.0454164 0.0731281 +0.274554 0.0385023 0.090004 +0.285852 0.0505507 0.0780368 +0.287544 0.066644 0.0791877 +0.280213 0.0764884 0.0661465 +0.226162 0.0537579 -0.00800313 +0.231726 0.0372941 0.00212281 +0.226833 0.070796 -0.0125112 +-0.0228881 0.0822405 -0.0141151 +-0.0164496 0.062439 -0.0353807 +-0.0311204 0.09353 -0.0291259 +-0.0468617 0.0890411 -0.0503417 +-0.0192694 0.0958145 -0.0445491 +-0.0451838 0.0631149 -0.0497516 +-0.0349277 0.0970377 -0.0439657 +-0.0281121 0.0908295 -0.0597278 +-0.0422149 0.0875756 -0.0360098 +-0.0493018 0.0748281 -0.0407497 +-0.0508974 0.0756362 -0.0555946 +-0.045787 0.0616401 -0.0714534 +-0.0463878 0.0860458 -0.0643425 +-0.0469 0.0754389 -0.0734442 +-0.0361876 0.0721397 -0.0877453 +-0.0344753 0.0506229 -0.0835042 +-0.0209274 0.0429352 -0.0951495 +-0.00835098 0.0548898 -0.109767 +-0.0439408 0.0675081 -0.0809412 +-0.0384794 0.0604865 -0.0888934 +-0.0325578 0.0529818 -0.0938199 +-0.0250287 0.0507859 -0.100857 +-0.0171358 0.0586173 -0.103485 +-0.00108771 0.0669554 -0.09638 +0.0141047 0.0764389 -0.0789872 +-0.0166767 0.0687863 -0.0931008 +-0.0154196 0.0443974 -0.106822 +0.00804033 0.0334573 -0.118139 +-0.00353356 0.0420783 -0.115203 +0.00267945 0.0333406 -0.10199 +0.0284162 0.0260832 -0.102463 +0.0140719 0.0342408 -0.0876383 +0.01206 0.042083 -0.0690778 +0.0262722 0.0834922 -0.057317 +0.052314 0.0257381 -0.0888721 +0.0550064 0.0153199 -0.121681 +0.0742668 0.0307726 -0.0684202 +0.0254542 0.0462258 -0.0537161 +0.0192751 0.0579365 -0.0299961 +0.043388 0.0389601 -0.0621497 +0.0632571 0.0407552 -0.0511604 +0.0628168 0.0511918 -0.0295138 +-0.00769957 0.0468719 -0.0674097 +0.0356439 0.036944 -0.129564 +0.00985644 0.0486694 -0.11871 +0.0293481 0.0500299 -0.116265 +0.034304 0.0639803 -0.0982281 +0.0203799 0.0394103 -0.126099 +0.0274107 0.0238815 -0.120304 +-0.00989932 0.038173 -0.0977698 +0.0409915 0.0204434 -0.130582 +0.0603476 0.0361414 -0.135064 +0.0745924 0.0111822 -0.144256 +0.0995383 0.0164619 -0.152082 +0.079494 0.0098491 -0.119596 +0.109969 -0.00178903 -0.14121 +0.128369 -0.00667529 -0.145234 +0.147176 -0.000628591 -0.159936 +0.143478 0.0207956 -0.143584 +0.15945 -0.0140125 -0.151421 +0.167046 -0.013357 -0.130058 +0.175024 -0.000463673 -0.161193 +0.200548 0.00730904 -0.144289 +0.228188 0.00606999 -0.13371 +0.232374 -0.0225206 -0.12062 +0.217352 -0.0205681 -0.149989 +0.196446 -0.0094088 -0.159916 +0.0468892 0.0318746 -0.136603 +0.0588847 0.0194871 -0.141629 +0.0497176 0.0425705 -0.12546 +0.067316 0.0466181 -0.121528 +0.0829023 0.0554408 -0.10632 +0.0702884 0.0671402 -0.0864572 +0.0736048 0.0280122 -0.141966 +-0.0393368 0.0927115 -0.058201 +-0.074253 -0.462729 -0.0674302 +-0.0882268 -0.46748 -0.0836924 +-0.10265 -0.454789 -0.102517 +-0.100302 -0.434985 -0.0953132 +-0.123508 -0.439573 -0.0964816 +0.30376 -0.329009 -0.220778 +-0.34576 -0.287787 -0.1184 +-0.333412 -0.299886 -0.118936 +-0.318278 -0.306436 -0.109371 +-0.342798 -0.273541 -0.122349 +-0.330946 -0.265681 -0.13448 +-0.32759 -0.278136 -0.147142 +-0.313986 -0.269795 -0.152301 +-0.304937 -0.277784 -0.160852 +-0.289134 -0.290053 -0.171285 +-0.300398 -0.29313 -0.159904 +-0.305136 -0.304081 -0.143109 +-0.303823 -0.326091 -0.148763 +-0.297334 -0.338307 -0.131821 +-0.0297344 -0.320795 0.126249 +-0.0440833 -0.337561 0.102751 +-0.0635963 -0.3222 0.124646 +-0.0820192 -0.303394 0.145977 +-0.0280108 -0.346215 0.0792887 +0.190023 -0.166658 -0.160984 +0.187606 0.489479 0.0788413 +0.169798 0.492699 0.0805537 +0.160239 0.479513 0.0724411 +0.160997 0.477019 0.0876359 +0.167909 0.48647 0.0907839 +0.168839 0.465921 0.0685027 +0.185848 0.461592 0.0756332 +0.163713 0.449815 0.0719867 +0.171034 0.442192 0.0868531 +0.172622 0.439121 0.100638 +0.176648 -0.0540189 0.138439 +0.191763 0.435033 0.0761478 +0.150024 0.450095 0.173316 +0.142684 0.444609 0.180888 +0.134925 0.435737 0.185852 +0.0901553 -0.0455623 0.257862 +0.0764097 -0.0467149 0.266788 +0.218445 0.190081 -0.00453558 +0.212983 0.187132 0.0158667 +0.234912 0.203072 -0.0090602 +0.217724 0.208098 -0.00630956 +0.209095 0.231498 0.0538229 +0.223398 0.222537 0.0510417 +0.229495 0.205818 0.051858 +0.241614 0.200114 0.0387668 +0.245196 0.212463 0.0252865 +0.232616 0.199508 0.066443 +0.245867 0.187445 0.0704899 +0.218046 0.211438 0.0580939 +0.206013 0.207163 0.0667587 +0.208167 0.217137 0.0808695 +0.189985 0.216171 0.0819923 +-0.328288 -0.282754 -0.0562593 +-0.321215 -0.270892 -0.0527491 +-0.321885 -0.294532 -0.0580289 +-0.324301 -0.301836 -0.070993 +-0.309665 -0.294095 -0.0515043 +-0.298437 -0.298535 -0.0585809 +-0.293755 -0.297175 -0.0685565 +-0.301865 -0.303693 -0.0670723 +-0.312242 -0.307406 -0.0760424 +0.113855 0.0103494 0.135894 +0.117356 -0.000872108 0.134011 +0.24192 0.231796 0.179613 +0.236568 0.24336 0.180529 +0.226028 0.250706 0.186633 +0.280884 -0.220307 -0.163899 +0.26654 -0.211351 -0.150233 +0.265056 -0.233891 -0.14678 +0.318482 -0.331697 -0.239506 +0.324395 -0.322699 -0.253479 +0.31194 -0.314679 -0.269415 +0.329739 -0.334727 -0.229668 +0.336703 -0.323152 -0.229076 +0.344428 -0.313085 -0.23571 +0.342498 -0.293727 -0.236916 +0.350543 -0.322922 -0.2465 +0.353252 -0.314 -0.261759 +0.347047 -0.326986 -0.235121 +0.0827363 -0.465408 -0.0592863 +0.0757733 -0.45735 -0.0483001 +0.0758332 -0.442944 -0.0486429 +0.0763754 -0.427162 -0.064874 +0.0810297 -0.429275 -0.0354104 +0.0760881 -0.402196 -0.0628009 +0.0803331 -0.462498 -0.0366385 +0.075746 -0.427719 -0.0496393 +0.213629 0.454927 0.154222 +0.216172 0.433851 0.152191 +0.213875 -0.163106 0.208849 +0.228479 0.0837143 -0.0171959 +0.214862 0.0777937 -0.0178642 +0.203914 0.0820668 -0.0169156 +0.213551 0.066976 -0.0133462 +-0.291696 -0.291685 -0.053913 +-0.288445 -0.286967 -0.0453936 +-0.283457 -0.280518 -0.0392925 +0.198493 0.267303 0.113918 +-0.00816198 -0.315253 0.11742 +0.312224 -0.337685 -0.224702 +0.0776115 -0.0114015 0.225043 +0.094616 -0.00802053 0.222738 +0.212523 -0.00317223 -0.153514 +0.228944 -0.0069181 -0.146501 +0.230166 -0.0223035 -0.138067 +0.212902 -0.0238532 -0.132712 +0.194522 -0.0219296 -0.138137 +0.240306 -0.00819778 -0.130311 +0.24497 -0.0122967 -0.113875 +0.221562 -0.0094445 -0.0973672 +0.242491 -0.00970392 -0.0927411 +-0.195428 -0.293105 -0.0588105 +-0.174639 -0.293714 -0.0615636 +-0.159198 -0.295096 -0.0708856 +-0.150745 -0.297027 -0.0916319 +-0.165094 -0.309633 -0.116063 +-0.129532 -0.293794 -0.0901166 +-0.12154 -0.29002 -0.105668 +-0.103655 -0.284754 -0.110478 +-0.083304 -0.273535 -0.126518 +-0.126229 -0.291149 -0.124142 +-0.0551206 -0.282297 -0.123125 +-0.0279253 -0.280704 -0.123568 +-0.0254074 -0.296918 -0.100527 +-0.143636 -0.296672 -0.0765836 +0.228772 0.249576 0.00807469 +0.246793 0.197559 -0.000456927 +0.249351 0.185655 0.00965958 +0.077471 -0.38535 -0.0716786 +0.0780138 -0.366405 -0.0698751 +0.0796117 -0.349597 -0.0694382 +0.0817673 -0.324046 -0.067713 +0.0920794 -0.339278 -0.0766687 +0.0745961 -0.308674 -0.0513846 +0.0686559 -0.285979 -0.0584538 +0.0701691 -0.296007 -0.0346939 +0.0958416 -0.324563 -0.0739969 +0.111686 -0.315208 -0.0712996 +0.118212 -0.295045 -0.0671537 +0.145789 -0.285221 -0.0572786 +0.142444 -0.258951 -0.0651148 +0.125807 -0.256448 -0.0777825 +0.0725557 -0.302564 -0.0188272 +0.0757738 -0.318738 -0.0113816 +0.0755625 -0.334153 -0.022547 +0.0716925 -0.292684 -0.00740334 +0.0574002 -0.292216 -0.00131701 +0.0442788 -0.29974 -0.0118635 +0.0322898 -0.309073 -0.00126775 +0.0158934 -0.319374 -0.00927168 +0.00270388 -0.318254 -0.036966 +0.00321031 -0.33353 0.006095 +0.0101246 -0.330737 0.0331595 +0.0571801 -0.291727 0.0142738 +0.0411549 -0.302632 0.0323113 +0.0568056 -0.290026 0.0325413 +0.0726196 -0.279494 0.0399911 +0.0843075 -0.293947 0.0355701 +0.0802412 -0.296732 0.0208207 +0.0757523 -0.290551 0.00911073 +0.0904109 -0.307387 0.0401159 +0.0937218 -0.321431 0.0333001 +0.0876185 -0.332554 0.0196986 +-0.261918 -0.356193 -0.123562 +-0.274572 -0.363058 -0.128675 +-0.283885 -0.374671 -0.137095 +0.0993425 -0.475253 -0.0345906 +0.105878 -0.470302 -0.022596 +0.161209 0.00758193 -0.157082 +0.162861 -0.00496129 -0.160125 +0.14622 0.0234899 0.00861402 +0.16407 0.00688456 0.00334424 +0.187476 0.0108016 -0.000104135 +0.198618 0.0267239 -0.00776275 +0.213159 0.032032 -0.0211609 +0.229764 0.0271876 -0.0288068 +0.229938 0.0432028 -0.0342052 +0.231973 0.0361819 -0.05417 +0.241585 0.0230077 -0.0674939 +0.235826 0.0200922 -0.0913851 +0.229532 0.00831192 -0.0604593 +0.228417 0.0182383 -0.11087 +0.214387 0.0313739 -0.095916 +0.23826 0.0319925 -0.0407356 +0.240603 0.0153722 -0.0478262 +0.185434 0.0390225 -0.0120783 +0.174046 0.035224 -0.0278333 +0.183039 0.0254835 -0.0435084 +0.185088 0.013208 -0.0664572 +0.184517 -0.00115634 -0.0944301 +0.15883 0.0112792 -0.0789407 +0.166768 0.0454452 -0.0125857 +0.149871 0.0473393 -0.0127261 +0.24097 0.0273212 -0.0523021 +0.244689 0.0183228 -0.0578172 +0.239121 0.00955592 -0.0564169 +0.23067 0.0133196 -0.0511149 +0.217815 0.013095 -0.0555127 +0.202953 0.0215885 -0.0445658 +0.223255 0.0309758 -0.00933388 +0.246338 0.00680161 -0.0920968 +-0.29666 -0.251794 -0.0420083 +-0.282377 -0.246563 -0.0382484 +-0.274248 -0.257163 -0.0411355 +0.121069 0.3764 0.220244 +0.124178 0.361607 0.222425 +0.12316 0.347289 0.21517 +0.120818 0.335014 0.200629 +0.131773 0.318764 0.203442 +0.240354 -0.189104 -0.174254 +0.226426 -0.17846 -0.157236 +0.25469 -0.197929 -0.186668 +0.262527 -0.207499 -0.20859 +0.275709 -0.206748 -0.189755 +0.268196 -0.218714 -0.226562 +0.252109 -0.214264 -0.221034 +0.231966 -0.219863 -0.222417 +0.16439 -0.290409 -0.045741 +0.174232 0.353361 0.161991 +0.167416 0.346038 0.151615 +0.153417 0.351454 0.147309 +0.141711 0.365653 0.160008 +0.174784 0.33351 0.146976 +0.172695 0.32064 0.137876 +0.171538 0.327653 0.122668 +-0.153467 -0.465689 -0.0917447 +-0.142244 -0.458217 -0.0978282 +-0.137315 -0.444624 -0.0945322 +-0.142546 -0.468457 -0.0929801 +-0.130113 -0.470071 -0.0887414 +-0.111868 -0.466578 -0.0912306 +-0.129822 -0.476932 -0.0773011 +-0.116192 -0.47396 -0.0799073 +-0.102072 -0.471199 -0.0816089 +0.0648327 -0.288276 0.006469 +0.290523 -0.14969 0.120852 +0.286341 -0.149084 0.132395 +0.276561 -0.154417 0.131433 +0.266874 -0.144863 0.128327 +0.266123 -0.155511 0.139202 +0.254682 -0.156501 0.14847 +0.243072 -0.144724 0.147014 +0.246658 -0.132891 0.13506 +0.271484 -0.158645 0.148826 +0.262513 -0.161728 0.150556 +0.255383 -0.163883 0.160093 +0.258182 -0.154155 0.170424 +0.247063 -0.165211 0.168804 +0.236375 -0.166699 0.177267 +0.223809 -0.16596 0.182974 +0.219971 -0.167303 0.19665 +0.224247 -0.15536 0.203023 +0.206877 -0.166582 0.198203 +0.201256 -0.167208 0.210293 +0.187949 -0.165778 0.214542 +0.175727 -0.151043 0.207983 +0.205839 -0.156778 0.218275 +0.191606 -0.158183 0.226132 +0.180969 -0.154585 0.235065 +0.170507 -0.150398 0.244702 +0.167678 -0.135398 0.246604 +0.174695 -0.121433 0.234619 +0.192199 -0.123695 0.219574 +0.161002 -0.150315 0.252813 +0.149901 -0.156196 0.25282 +0.145756 -0.15618 0.238445 +0.158231 -0.157867 0.22927 +0.148019 -0.147104 0.261177 +0.14318 -0.132144 0.260892 +0.131504 -0.114456 0.261736 +0.136414 -0.145181 0.266602 +0.124033 -0.152215 0.261533 +0.128756 -0.151616 0.248741 +0.169715 -0.162656 0.235355 +0.125332 -0.145025 0.270918 +0.118124 -0.13431 0.277651 +0.122928 -0.121301 0.271952 +0.113017 -0.148351 0.260498 +0.105868 -0.137752 0.254904 +0.0970603 -0.116879 0.246491 +0.113377 -0.13188 0.244126 +0.102989 -0.14407 0.26402 +0.09993 -0.141861 0.276203 +-0.208269 -0.22401 0.141633 +-0.20692 -0.250284 0.132437 +0.0965268 -0.427234 -0.105996 +0.0991486 -0.439673 -0.0998914 +0.19126 -0.17619 0.0390751 +0.184715 -0.204433 0.0324441 +0.164304 -0.221583 0.0465757 +0.1444 -0.208807 0.0686986 +0.0226172 -0.0147867 0.137076 +-0.142255 -0.49298 -0.0216335 +0.233691 0.0208001 -0.0385404 +-0.192672 -0.315988 0.0839294 +-0.202286 -0.295403 0.104035 +-0.212462 -0.276423 0.111373 +-0.218066 -0.285356 0.0914372 +-0.230517 -0.270625 0.068595 +0.136055 0.0355608 0.0131192 +0.121886 0.0399552 0.0198872 +0.106186 0.0275039 0.0255554 +0.0928691 0.0373146 0.0446539 +0.107832 0.0113031 0.0106037 +0.0853288 0.00897116 0.0135994 +0.0648776 -0.00152148 0.00684991 +0.301901 0.1917 0.196837 +0.304498 0.181718 0.192274 +0.29757 0.171529 0.192207 +0.283611 0.170157 0.190984 +0.17589 0.332048 0.230978 +0.176274 0.318104 0.221305 +0.189786 0.308195 0.22975 +0.199452 0.291101 0.221444 +0.210647 0.278153 0.221165 +0.212403 0.290739 0.232707 +0.229872 0.295702 0.229994 +0.238851 0.283146 0.23072 +0.237981 0.260514 0.227763 +0.248013 0.243086 0.221386 +0.245976 0.271423 0.230129 +0.237201 0.240055 0.208931 +0.239318 0.292509 0.222434 +0.244312 0.28734 0.210021 +0.234086 0.289095 0.199595 +0.221914 0.298769 0.201947 +0.1778 0.322602 0.229777 +0.232474 0.299285 0.221376 +0.223334 0.304746 0.213608 +0.207337 0.311267 0.204764 +0.224642 0.304397 0.226583 +0.214619 0.302742 0.233384 +0.203769 0.313465 0.232857 +0.204968 0.319702 0.218324 +0.201735 0.298965 0.232154 +-0.0492057 -0.0812756 -0.10551 +-0.0710597 -0.075701 -0.12067 +-0.0879497 -0.0905516 -0.13677 +-0.0843511 -0.119489 -0.147588 +-0.0762899 -0.059326 -0.102542 +-0.0985707 -0.0477827 -0.098696 +-0.118275 -0.0536394 -0.113913 +-0.11441 -0.0717159 -0.128365 +0.179503 0.303256 0.0436704 +0.192013 0.290229 0.0290644 +0.17689 0.287515 0.0370015 +0.192038 0.271729 0.0156116 +0.209167 0.267708 0.00969983 +0.200133 0.255704 0.00478026 +-0.247504 -0.392344 -0.224787 +-0.247477 -0.405986 -0.218212 +-0.243099 -0.400741 -0.206484 +-0.246703 -0.405341 -0.193269 +-0.249065 -0.417066 -0.193806 +-0.263856 -0.417281 -0.202583 +-0.253854 -0.410374 -0.185389 +-0.264275 -0.407223 -0.177693 +-0.272044 -0.40206 -0.166216 +-0.284666 -0.409799 -0.163624 +-0.28689 -0.423019 -0.170791 +-0.283285 -0.428723 -0.186577 +-0.301536 -0.424549 -0.197331 +-0.276684 -0.426319 -0.176604 +-0.270204 -0.426002 -0.18843 +-0.267033 -0.421163 -0.178871 +-0.28572 -0.431162 -0.176917 +0.0984334 0.0428629 0.147655 +0.0984512 0.0370662 0.158757 +-0.324734 -0.278381 -0.0492733 +-0.319049 -0.278035 -0.0388895 +-0.314693 -0.271902 -0.0298211 +-0.0814975 -0.486596 -0.0514846 +-0.0716057 -0.47534 -0.0576231 +-0.0807984 -0.475501 -0.0687174 +-0.0782273 -0.46782 -0.0773567 +-0.0794515 -0.454639 -0.076562 +-0.0865219 -0.442019 -0.0638219 +-0.0826697 -0.456554 -0.0896798 +-0.0913604 -0.446861 -0.0969099 +-0.0924184 -0.432044 -0.0753911 +-0.098273 -0.416607 -0.0817744 +-0.111942 -0.395187 -0.0818225 +-0.0923505 -0.401008 -0.0727607 +-0.110463 -0.376831 -0.0757945 +-0.0955645 -0.358515 -0.0727168 +-0.0748788 -0.367775 -0.053732 +-0.099584 -0.336657 -0.0718408 +-0.0617229 -0.346951 -0.0508932 +-0.0372908 -0.340191 -0.0358611 +-0.187209 -0.0514446 0.134371 +-0.172275 -0.062062 0.144345 +-0.181772 -0.0387772 0.12984 +0.27325 0.225257 0.167666 +0.283037 0.221467 0.169903 +0.141164 -0.00931766 -0.150578 +0.223335 -0.262546 -0.149684 +0.199958 -0.258684 -0.141852 +0.218212 -0.249649 -0.131577 +-0.0730224 -0.485274 -0.0383372 +-0.0765985 -0.473674 -0.025717 +-0.0833487 -0.485599 -0.0202509 +-0.0969784 -0.487241 -0.0157338 +-0.106328 -0.475595 -0.0156679 +-0.107519 -0.486132 -0.0147883 +-0.117398 -0.491224 -0.0155421 +-0.11866 -0.497871 -0.0255495 +0.192205 -0.0198585 -0.151725 +0.281772 0.238327 0.210562 +0.269826 0.243309 0.222088 +0.243244 0.207816 -0.00325363 +0.239729 0.221932 -0.000908316 +0.243256 0.225044 0.0142927 +0.235434 0.23543 0.00346349 +0.158954 -0.447934 -0.074517 +0.164 -0.440163 -0.0849532 +0.160645 -0.422992 -0.0839209 +0.160099 -0.41995 -0.0633914 +0.170063 -0.432118 -0.0580684 +0.170775 -0.442201 -0.0470561 +0.167356 -0.452883 -0.036848 +0.157537 -0.464023 -0.0432353 +0.154265 -0.458207 -0.0582632 +0.146921 -0.466798 -0.0291891 +0.17099 -0.445942 -0.0649823 +0.152813 -0.426396 -0.0985179 +0.142833 -0.435406 -0.0989063 +0.126573 -0.436557 -0.100225 +0.120949 -0.42189 -0.103936 +0.130685 -0.411647 -0.0938972 +0.160351 -0.460975 -0.0324222 +0.164884 -0.460693 -0.0398836 +0.167083 -0.430709 -0.0834012 +0.161089 -0.432508 -0.0931652 +0.165433 -0.424956 -0.0749657 +0.155909 -0.417913 -0.0743018 +0.149825 -0.407366 -0.067413 +0.142015 -0.399818 -0.0764637 +0.153043 -0.435416 -0.0966096 +0.148842 -0.431897 -0.101759 +0.145045 -0.424265 -0.10134 +0.147732 -0.418014 -0.0911084 +0.138977 -0.417451 -0.0965307 +0.139635 -0.411036 -0.0878314 +0.14174 -0.430413 -0.104765 +0.134784 -0.434536 -0.101822 +0.135086 -0.440748 -0.0918112 +0.13766 -0.447456 -0.0800542 +0.122938 -0.455334 -0.0698495 +0.127914 -0.428797 -0.106691 +0.135671 -0.430083 -0.106069 +-0.0268041 -0.304928 0.142542 +-0.0182344 -0.281255 0.151927 +0.000262015 -0.258244 0.142866 +0.0151742 -0.229959 0.128466 +-0.00970849 -0.227931 0.154073 +0.0337917 -0.209923 0.115845 +0.0199495 -0.192987 0.125832 +-0.154293 -0.0335699 -0.082135 +-0.129631 -0.0324487 -0.0813475 +-0.120097 -0.027431 -0.0586998 +-0.0956922 -0.0340394 -0.0533561 +-0.0814148 -0.0448428 -0.0722969 +-0.0594432 -0.0515596 -0.0534184 +-0.160793 -0.0482086 -0.0989707 +-0.166155 -0.0307425 -0.0663998 +-0.169924 -0.0270352 -0.0414151 +-0.183311 -0.0375758 -0.0551581 +-0.174206 -0.0274939 -0.0203147 +-0.192353 -0.0397338 -0.00141151 +-0.170447 -0.0249801 0.0063437 +-0.211587 -0.0636911 -0.00501259 +-0.0018753 -0.187141 -0.149775 +0.0183103 -0.182965 -0.142326 +0.0322217 -0.167313 -0.134641 +0.0236675 -0.146992 -0.123167 +-0.00232452 -0.142332 -0.126149 +0.0375806 -0.18533 -0.140019 +0.0530379 -0.201545 -0.137283 +0.0772348 -0.20845 -0.140694 +0.0988175 -0.224384 -0.140468 +0.119251 -0.222512 -0.162731 +0.03788 -0.218276 -0.135529 +0.0772845 -0.19139 -0.155355 +0.080882 -0.225907 -0.127445 +0.0653619 -0.242778 -0.113036 +0.0731805 -0.173068 -0.155239 +0.0897045 -0.191329 -0.166141 +0.102707 -0.199007 -0.171074 +0.119058 -0.208637 -0.176942 +0.127514 -0.196293 -0.185172 +0.13998 -0.205302 -0.190755 +0.149824 -0.215626 -0.194546 +0.161245 -0.221969 -0.199237 +0.175364 -0.230409 -0.20401 +0.173584 -0.215336 -0.204853 +0.178202 -0.198362 -0.197173 +0.188397 -0.22907 -0.211289 +0.202734 -0.22056 -0.215065 +0.199745 -0.239634 -0.214151 +0.0815106 -0.18364 -0.162988 +-0.172104 -0.359269 -0.00938238 +-0.172319 -0.335226 -0.0164663 +-0.16873 -0.368903 -0.0231312 +-0.292266 -0.291505 -0.0889456 +-0.288266 -0.299574 -0.0955502 +-0.280983 -0.308012 -0.105167 +-0.278654 -0.297571 -0.101297 +-0.274336 -0.285615 -0.103446 +-0.260134 -0.28158 -0.0989442 +-0.257005 -0.265144 -0.10215 +-0.26942 -0.305285 -0.10276 +-0.257003 -0.309674 -0.100476 +-0.244993 -0.306014 -0.0938734 +-0.249351 -0.292113 -0.0926885 +-0.25954 -0.322424 -0.104282 +-0.267093 -0.332079 -0.111051 +-0.283312 -0.328944 -0.119574 +-0.249017 -0.331591 -0.10481 +-0.232981 -0.32784 -0.100164 +-0.240291 -0.342062 -0.113719 +-0.229688 -0.345883 -0.126712 +-0.23058 -0.352629 -0.145077 +-0.21352 -0.337371 -0.127344 +-0.269191 -0.344874 -0.117105 +-0.208623 -0.327937 -0.112241 +-0.191793 -0.321843 -0.117022 +-0.180909 -0.311277 -0.104708 +0.11012 0.10505 0.0238496 +0.213679 0.221732 0.163906 +-0.0357839 -0.0025294 0.108473 +-0.0312254 -0.0135193 0.128152 +-0.0238807 -0.033229 0.139313 +-0.00300831 -0.046529 0.144036 +-0.00364169 -0.0760125 0.145155 +-0.0103288 -0.10643 0.141831 +0.015326 -0.129347 0.142131 +-0.041062 -0.0443202 0.130625 +-0.0555252 -0.0465254 0.114753 +-0.0556686 -0.0325657 0.0996413 +-0.0768736 -0.0422105 0.0949058 +-0.0167984 0.000564353 0.123722 +0.00524698 0.0020139 0.129964 +-0.0281137 -0.0861213 0.139333 +-0.0785841 -0.0379469 0.0747431 +-0.0762529 -0.0505618 0.114297 +-0.032521 -0.108383 0.136839 +-0.0633754 -0.0458183 0.101476 +-0.0250298 0.00663901 0.112981 +-0.0219675 0.00393164 0.0935556 +-0.147404 -0.304789 -0.127071 +0.192111 0.473304 0.143665 +0.202701 0.475169 0.131787 +0.206558 0.475874 0.120017 +0.202492 0.480449 0.108775 +0.157654 -0.366957 -0.0205798 +0.26661 -0.307414 -0.281977 +0.270077 -0.295571 -0.288815 +0.283263 -0.291236 -0.297392 +0.290598 -0.279448 -0.297082 +0.304158 -0.276932 -0.29882 +0.315035 -0.2885 -0.301158 +0.307588 -0.298676 -0.297006 +0.297613 -0.307939 -0.283621 +0.293787 -0.301201 -0.295424 +0.318389 -0.297707 -0.296483 +0.328066 -0.301032 -0.289042 +0.324582 -0.309109 -0.276338 +0.33579 -0.291676 -0.2964 +0.346867 -0.288071 -0.287976 +0.353956 -0.299169 -0.28317 +0.345495 -0.307423 -0.274703 +0.352866 -0.288693 -0.277818 +0.351312 -0.284395 -0.265224 +0.355354 -0.294774 -0.257468 +0.360217 -0.304818 -0.260578 +0.35682 -0.308388 -0.269609 +0.359106 -0.312264 -0.252967 +0.356474 -0.316127 -0.245135 +0.351445 -0.319298 -0.237976 +-0.26647 -0.314705 -0.199507 +-0.27426 -0.329739 -0.204261 +-0.290128 -0.337563 -0.206145 +-0.303723 -0.332243 -0.195363 +-0.303858 -0.323407 -0.176279 +-0.302757 -0.349394 -0.210447 +-0.304665 -0.364526 -0.223447 +-0.321319 -0.375627 -0.232938 +-0.285437 -0.371465 -0.224735 +-0.28011 -0.37957 -0.242654 +-0.314609 -0.397575 -0.24523 +-0.31498 -0.344154 -0.199865 +-0.330892 -0.351901 -0.189469 +-0.332902 -0.388937 -0.243068 +-0.348245 -0.402805 -0.233911 +-0.328232 -0.404959 -0.235266 +-0.273541 -0.396265 -0.240028 +-0.293049 -0.39498 -0.245656 +-0.355214 -0.402159 -0.217135 +-0.360108 -0.415844 -0.205721 +-0.346381 -0.42668 -0.201491 +-0.340374 -0.436455 -0.180032 +-0.360217 -0.406031 -0.193698 +-0.356506 -0.391255 -0.182727 +-0.356512 -0.407116 -0.177427 +-0.347384 -0.421732 -0.172779 +-0.348669 -0.37532 -0.17511 +-0.341266 -0.408591 -0.160307 +-0.332592 -0.391247 -0.153464 +-0.323849 -0.407723 -0.153687 +-0.349384 -0.43169 -0.189135 +-0.335815 -0.43119 -0.192046 +-0.324454 -0.435806 -0.181733 +-0.331465 -0.433295 -0.170921 +-0.314528 -0.431132 -0.168412 +-0.260177 -0.397767 -0.235 +-0.252953 -0.401301 -0.227678 +-0.247407 -0.394723 -0.238053 +-0.24372 -0.401046 -0.225417 +-0.243948 -0.396615 -0.216223 +-0.258003 -0.38952 -0.247437 +-0.272162 -0.387844 -0.252537 +-0.287147 -0.384539 -0.255755 +-0.302942 -0.384129 -0.252391 +-0.315505 -0.382766 -0.24459 +-0.323099 -0.390444 -0.249836 +-0.312399 -0.390336 -0.253745 +-0.328503 -0.399215 -0.245058 +-0.340635 -0.398589 -0.24271 +-0.266346 -0.382624 -0.244488 +-0.267321 -0.391914 -0.245578 +-0.0266812 0.0695328 -0.0242573 +-0.00773299 0.0681739 -0.0184911 +0.0122858 0.0669077 -0.0123781 +0.0150035 0.0767227 0.00239352 +0.0141467 0.0954062 -0.00215996 +0.0325338 0.098411 -0.00617133 +0.0450676 0.0983028 0.010086 +0.0314473 0.0730983 0.00401189 +0.0505593 0.0686309 0.00292132 +0.0698817 0.067505 0.00832925 +0.145383 0.180744 0.0984363 +0.132189 0.17376 0.0925198 +0.121241 0.164951 0.0850023 +0.133425 0.169934 0.0774819 +0.11505 0.153676 0.07879 +-0.083942 -0.368893 -0.0674225 +-0.0809876 -0.385027 -0.0581697 +-0.0723248 -0.382058 -0.0416794 +-0.00904893 0.0914446 -0.0120745 +0.00504523 0.0987359 -0.0150796 +0.0060609 0.0932522 -0.034057 +0.0248461 0.0873188 -0.0377031 +0.0363994 0.089055 -0.023789 +0.00213821 0.0914225 -0.00482177 +0.0092558 0.0863088 0.00212053 +0.106375 0.0274106 0.14138 +-0.263884 -0.385451 -0.252252 +0.258755 0.24689 0.225661 +0.259085 0.23306 0.219814 +0.249971 0.25591 0.228242 +-0.322841 -0.345115 -0.164492 +-0.323706 -0.355326 -0.152393 +-0.279169 -0.265328 -0.0439542 +-0.285416 -0.267917 -0.0516616 +-0.294745 -0.263175 -0.0517725 +0.23393 -0.0149701 -0.10397 +0.219738 -0.0165453 -0.112039 +0.204608 -0.00981825 -0.104246 +0.187184 -0.00954937 -0.110855 +0.228145 0.230452 0.102316 +0.214447 0.238029 0.0983297 +0.23229 0.220992 0.0943503 +0.215398 0.247623 0.105271 +0.217938 0.25177 0.117669 +0.210276 0.258003 0.111405 +0.220949 0.241286 0.103103 +0.290344 -0.337843 -0.233955 +0.276226 -0.337233 -0.22831 +0.296573 -0.339782 -0.226215 +0.227663 0.461812 0.0838481 +0.234265 0.455281 0.0718225 +0.229698 0.445794 0.0603386 +0.225781 0.470182 0.0813133 +0.214396 0.4698 0.0788369 +0.208406 0.478123 0.0862021 +0.214031 0.460896 0.0711899 +0.217085 0.451741 0.0628259 +0.219354 0.474333 0.0827819 +0.21619 0.47758 0.0903862 +0.217994 0.472178 0.097233 +0.209525 0.481852 0.0939712 +0.227208 0.456115 0.0633709 +0.234329 0.451682 0.0642008 +0.23166 0.462658 0.0759848 +0.273713 -0.249314 -0.252993 +0.274317 -0.268417 -0.267071 +0.263304 -0.282613 -0.260934 +-0.240326 -0.404033 -0.2139 +-0.241182 -0.408607 -0.207233 +0.243855 0.194683 0.113624 +0.235959 0.206195 0.114609 +-0.329827 -0.30598 -0.098469 +-0.057071 -0.0425853 0.0117122 +-0.0551192 -0.0420888 0.0309046 +-0.0534835 -0.0402863 0.0500454 +-0.0435993 -0.0469165 0.00748095 +-0.0255629 -0.0374196 0.00481763 +-0.00817324 -0.0328811 -0.0061182 +-0.00350439 -0.0437548 -0.0255784 +-0.0349503 -0.0490115 -0.00492533 +-0.0419875 -0.0536475 -0.0293419 +-0.0139014 -0.0607747 -0.0378374 +-0.0105205 -0.0780801 -0.0585195 +-0.0335249 -0.0540562 -0.0180409 +-0.0278411 -0.0595083 -0.0313207 +0.193253 0.49569 0.0858481 +0.189805 0.494474 0.0949255 +0.179559 0.491992 0.0947812 +0.19709 0.487808 0.0978913 +0.174576 0.497081 0.0879734 +0.179584 0.496616 0.0784813 +0.175502 0.48892 0.0725035 +0.169475 0.481635 0.069206 +0.164994 0.474033 0.0669237 +0.155945 0.469227 0.0714265 +0.159639 0.459314 0.0671634 +0.160451 -0.0544036 0.113535 +0.0454737 -0.0938547 0.293886 +0.0481458 -0.104952 0.292926 +0.0550885 -0.114349 0.29062 +0.0654216 -0.120788 0.289843 +0.0691263 -0.126298 0.278339 +0.0372417 -0.0943784 0.286279 +0.0377118 -0.088702 0.274623 +0.179652 -0.262284 0.0054219 +0.186087 -0.244472 0.00347757 +0.246807 -0.00615903 -0.103541 +0.242297 -0.0135206 -0.100916 +0.240802 -0.0172339 -0.108388 +0.232593 -0.0188607 -0.112191 +0.240348 -0.0194541 -0.117278 +0.238974 -0.018297 -0.127651 +-0.164632 -0.397326 -0.024693 +0.0813645 -0.458079 -0.0716845 +0.302397 0.127887 0.0470846 +0.298473 0.138148 0.0455108 +0.292313 0.136477 0.0386335 +0.288054 0.130079 0.0326142 +0.28271 0.137427 0.0379629 +0.271939 0.136706 0.038053 +0.261008 0.14116 0.0404912 +0.28194 0.12422 0.0312108 +0.300876 0.126279 0.0551937 +0.295306 0.129324 0.0632115 +0.286846 0.130603 0.0706512 +0.282604 0.11846 0.0804122 +0.273418 0.134767 0.0747422 +0.296205 0.121995 0.0600976 +0.289869 0.116278 0.0576534 +0.283444 0.108666 0.0679441 +0.208186 0.435058 0.0678801 +0.218992 0.437774 0.0675136 +0.20517 0.444041 0.0615 +0.195457 0.447135 0.0675955 +0.224157 0.438328 0.0597838 +0.221367 0.446069 0.0584788 +0.168291 -0.443724 -0.076199 +-0.239169 -0.248023 -0.0426243 +-0.246509 -0.244281 -0.0523825 +-0.245933 -0.250709 -0.0701381 +-0.252213 -0.23035 -0.0598084 +-0.256922 -0.212794 -0.063622 +-0.26443 -0.20039 -0.048456 +-0.236601 -0.248665 -0.0331221 +-0.248238 -0.244973 -0.04299 +-0.257005 -0.243536 -0.0363368 +-0.264619 -0.253098 -0.0324677 +-0.260909 -0.234911 -0.0387305 +-0.270856 -0.228969 -0.0335016 +-0.268106 -0.214873 -0.0367573 +-0.255525 -0.250409 -0.0291707 +-0.246354 -0.252152 -0.0213798 +-0.25421 -0.258055 -0.0140562 +-0.253371 -0.258976 0.00135493 +-0.263391 -0.256528 0.0180325 +-0.264412 -0.265611 -0.0106557 +-0.268835 -0.263918 0.00476582 +-0.24972 -0.252323 0.0327963 +-0.239732 -0.259608 0.0493553 +-0.242639 -0.251027 0.0706418 +-0.27192 -0.270836 -0.02103 +-0.264888 -0.241199 0.0366373 +-0.279792 -0.22631 0.033251 +-0.274206 -0.207933 0.0474852 +-0.283361 -0.276288 -0.0174295 +-0.267659 -0.226048 0.0482271 +0.202151 0.274483 0.19338 +0.194908 0.283204 0.198963 +-0.157532 -0.273615 -0.179435 +-0.176899 -0.279729 -0.184503 +-0.188947 -0.290942 -0.187096 +-0.192598 -0.3074 -0.18306 +-0.203551 -0.297799 -0.190929 +-0.222085 -0.288246 -0.191352 +-0.217908 -0.303036 -0.194268 +-0.355074 -0.426501 -0.195973 +-0.354866 -0.423993 -0.205337 +-0.355569 -0.419108 -0.214528 +-0.353763 -0.412061 -0.224887 +-0.346029 -0.286085 -0.1062 +-0.341227 -0.288967 -0.0947058 +-0.336277 -0.278132 -0.0971269 +-0.328988 -0.269127 -0.105169 +-0.340297 -0.292656 -0.0831052 +-0.335578 -0.266756 -0.115188 +-0.339311 -0.299368 -0.0917431 +0.212569 0.261061 0.18216 +0.216886 0.255854 0.175009 +0.219484 0.251322 0.162982 +0.212289 0.247584 0.170006 +0.218513 0.26322 0.154269 +0.225667 0.261532 0.178216 +0.218436 0.276817 0.178562 +0.234042 0.273996 0.185236 +0.223426 0.242038 0.154678 +0.21181 0.288948 0.181391 +0.220498 0.257755 0.18435 +0.211254 0.266563 0.187703 +0.211739 0.26954 0.199826 +0.278409 -0.209413 -0.174692 +0.233056 0.457965 0.0658843 +0.227063 0.46182 0.0682472 +0.220168 0.458063 0.0666597 +-0.0481392 -0.0447802 0.0166181 +0.131516 0.0530135 0.000672445 +0.12038 0.0567042 0.000376152 +0.134766 0.046581 0.0097546 +0.0956782 -0.141364 0.26837 +0.0877085 -0.13595 0.269242 +0.0854698 -0.124959 0.261926 +0.0839071 -0.111836 0.253439 +0.0904091 -0.099649 0.239147 +0.0872053 -0.136949 0.279095 +0.085161 -0.130401 0.287023 +0.0763801 -0.13103 0.282851 +-0.00884361 -0.0890856 -0.0728998 +-0.00654069 -0.102279 -0.0895079 +-0.0290648 -0.104665 -0.111248 +-0.0100257 -0.116287 -0.107029 +0.0875054 -0.104584 0.297054 +0.191386 -0.264049 -0.175252 +0.190045 -0.262732 -0.156889 +0.204589 -0.269071 -0.178679 +0.222111 -0.273266 -0.172895 +0.189235 0.0753918 -0.0129238 +0.0782752 -0.467624 -0.0498343 +0.0759673 -0.46177 -0.0555898 +0.0772195 -0.460605 -0.0642783 +0.151932 0.323656 0.079912 +0.153175 0.313215 0.0881136 +0.161272 0.302381 0.0857396 +0.163146 0.324848 0.0718597 +0.151557 0.334415 0.0880604 +0.142886 0.334889 0.0972586 +0.140662 0.34411 0.107021 +0.133598 0.347717 0.117582 +0.131314 0.355467 0.129074 +0.127988 0.361743 0.142546 +0.123763 0.348981 0.138438 +0.119822 0.353337 0.149718 +0.116288 0.351928 0.168204 +0.226419 0.174912 -0.00671405 +0.232006 0.15884 0.00199041 +0.243933 0.169091 0.00253819 +0.237571 0.172786 -0.00612936 +0.183717 0.142245 0.147062 +0.183533 0.157982 0.153224 +0.200684 0.169917 0.154336 +0.175927 0.14817 0.154877 +0.164064 0.143191 0.159694 +0.181391 0.132744 0.149775 +0.177453 0.123521 0.157312 +0.108424 0.0602759 0.0311611 +0.101691 0.0511896 0.042029 +0.297187 0.12858 0.124591 +0.286869 0.125817 0.115842 +0.279264 0.13651 0.11071 +0.277464 0.150893 0.114839 +0.267972 0.163015 0.116989 +0.29066 -0.215317 -0.195858 +-0.0439761 -0.143405 -0.149346 +0.0959309 0.0199379 0.158053 +0.0941358 0.00844127 0.16726 +0.273991 -0.158318 0.138404 +0.280108 -0.155995 0.136908 +0.28311 -0.154668 0.131232 +0.287165 -0.152142 0.126309 +0.291082 -0.145525 0.127381 +0.258354 -0.329753 -0.2515 +0.256649 -0.327468 -0.240856 +0.265642 -0.321399 -0.233195 +0.269005 -0.32965 -0.227653 +0.204877 0.287044 0.0357487 +0.289139 -0.339472 -0.226774 +0.282728 -0.335989 -0.224475 +0.283065 -0.327384 -0.221193 +0.28398 -0.316486 -0.219293 +0.289461 -0.305296 -0.210924 +0.2738 -0.310998 -0.221733 +0.2646 -0.301502 -0.221281 +0.282981 -0.339471 -0.231684 +0.275544 -0.336339 -0.239462 +0.259131 -0.2954 -0.232139 +0.281853 -0.296955 -0.202405 +0.287258 -0.287693 -0.192682 +0.301236 -0.282638 -0.194913 +0.23745 0.0270265 -0.0333549 +0.234865 0.0358956 -0.0292661 +0.240774 0.0243245 -0.0402136 +0.034599 -0.0884904 0.28182 +0.0345637 -0.0787252 0.277243 +0.0422003 -0.0728232 0.283477 +0.048607 -0.0763619 0.292696 +0.0395236 -0.0802562 0.266836 +0.0486856 -0.0788086 0.257578 +0.044992 -0.0647291 0.254151 +0.0587204 -0.0731238 0.296598 +0.068389 -0.0812067 0.300077 +0.0829644 -0.0808872 0.290453 +0.0435251 -0.0559756 0.262078 +0.20354 0.276522 0.016541 +-0.0980428 -0.240155 0.197738 +-0.0924965 -0.26196 0.186819 +-0.109853 -0.270124 0.168775 +-0.253582 -0.386742 -0.238773 +-0.0267016 0.0982672 -0.0374627 +0.214024 0.433945 0.0622105 +0.204736 0.432758 0.058829 +0.201109 0.433103 0.0655996 +0.201809 0.436011 0.073894 +0.193477 0.433855 0.0682907 +0.185218 0.436354 0.0703184 +0.180836 0.436291 0.0819631 +0.191166 0.440882 0.0659291 +0.187348 0.447071 0.070626 +0.179215 0.453739 0.0726364 +0.193028 0.454826 0.0736221 +0.173421 0.440644 0.0776765 +-0.147031 -0.496444 -0.028386 +-0.151597 -0.495421 -0.0374969 +-0.157627 -0.484775 -0.0397619 +-0.140246 -0.499465 -0.0256815 +-0.132401 -0.5 -0.0296698 +-0.132703 -0.497498 -0.0384881 +-0.126331 -0.494492 -0.0452588 +-0.11646 -0.490117 -0.0524448 +-0.101295 -0.487303 -0.0547567 +-0.136101 -0.494007 -0.0471871 +-0.13938 -0.490039 -0.0561432 +-0.133381 -0.483866 -0.0661423 +-0.15577 -0.492035 -0.0446482 +-0.153261 -0.490282 -0.0555144 +0.197755 0.272342 0.0690149 +0.190382 0.263313 0.0560052 +0.0686632 -0.292912 -0.0237205 +0.056243 -0.29127 -0.0303266 +0.0398126 -0.298058 -0.030698 +0.0315681 -0.295788 -0.0489563 +0.043708 -0.285681 -0.061727 +0.0621136 -0.289132 -0.040881 +0.0722108 -0.295077 -0.0484755 +0.0577034 -0.286988 -0.0524253 +0.0569935 -0.281989 -0.0659264 +0.064236 -0.290328 -0.0328163 +-0.0127838 0.0757233 -0.00921143 +0.0935192 0.0772038 0.0642915 +0.169714 0.302879 0.0497006 +0.163659 0.300165 0.0640716 +0.172929 0.295611 0.0434924 +0.049865 0.0913802 0.0221499 +0.0418831 0.0808731 0.013212 +0.0368549 0.0913191 0.0145569 +0.0319565 0.0968433 0.00544037 +0.310435 0.13526 0.142507 +0.026474 0.0305763 -0.129196 +0.017822 0.0292426 -0.122273 +0.0163904 0.0280919 -0.108702 +0.0350495 0.0278097 -0.132911 +0.178361 0.286185 0.0866978 +0.184473 0.288229 0.0959947 +0.0746028 -0.0119842 0.202652 +0.0770488 -0.00198153 0.201878 +0.0861829 0.00359659 0.206228 +0.0964676 0.00912576 0.20305 +0.110414 0.00821695 0.200752 +0.119478 0.0159283 0.18886 +-0.0749585 -0.470198 -0.0703816 +-0.0722579 -0.469101 -0.0627931 +-0.0775597 -0.45771 -0.0519849 +-0.0725204 -0.466379 -0.0530837 +-0.0822617 -0.458336 -0.0360309 +0.11796 -0.00196684 -0.151498 +0.110489 0.008862 -0.155734 +0.119387 0.0273131 -0.141295 +0.100036 0.00317869 -0.149099 +0.0946498 0.00360487 -0.130289 +0.0996271 0.00897841 -0.108462 +0.0876406 0.00969553 -0.149119 +0.0889673 0.0239205 -0.144401 +0.103773 0.0275171 -0.140968 +0.112143 0.0407687 -0.122665 +0.128275 -0.00210722 -0.155193 +0.136944 0.00690927 -0.158099 +0.1315 0.01712 -0.150046 +0.148823 0.0111196 -0.154092 +0.137878 -0.00286061 -0.157253 +0.0812501 0.0180999 -0.148671 +0.0723702 0.0199576 -0.146504 +0.0894465 0.0177562 -0.14994 +-0.244247 -0.411744 -0.197734 +0.0532101 -0.0425986 0.239458 +0.0614299 -0.034607 0.250277 +0.0718515 -0.0264935 0.244569 +0.0612036 -0.0408317 0.227838 +0.211416 0.21985 0.0506815 +0.209629 0.209187 0.0516229 +0.197715 0.200596 0.0531448 +0.210711 0.212673 0.041983 +0.209533 0.205981 0.0261421 +0.207685 0.214484 0.0320655 +0.204793 0.215907 0.019768 +0.207322 0.190012 0.0316877 +0.210424 0.206724 0.0353988 +0.209086 0.197885 0.0355421 +0.19948 0.191764 0.0420701 +0.206287 0.1798 0.0239909 +0.199532 0.162119 0.0159658 +0.0889829 0.0153312 0.187549 +0.0895058 0.0194699 0.175832 +0.0997882 0.0258376 0.180178 +0.0912633 -0.43583 -0.104962 +0.0893849 -0.44209 -0.0966632 +0.0818551 -0.438899 -0.0891003 +0.0775492 -0.435915 -0.0759439 +0.0805228 -0.426773 -0.087989 +0.0848008 -0.421093 -0.0971385 +0.0844397 -0.410175 -0.0930928 +0.0796444 -0.399052 -0.082153 +0.096306 -0.399151 -0.0928503 +0.0992866 -0.434977 -0.10667 +-0.038871 -0.095203 0.134909 +-0.0453136 -0.074362 0.132403 +-0.0642973 -0.0816285 0.135216 +0.128958 0.371237 0.164377 +0.114324 0.368213 0.169385 +0.110394 0.358489 0.182698 +0.119359 0.382173 0.172221 +0.244566 0.0274799 0.091132 +0.236517 0.0321023 0.108593 +0.228129 0.0154777 0.110489 +0.243652 -0.0044318 0.106704 +0.215089 0.0116198 0.126655 +0.193164 -0.00203925 0.149761 +0.295901 -0.145148 0.11649 +0.181002 0.326878 0.162405 +0.192626 0.308402 0.164847 +0.180295 0.335983 0.171005 +0.215019 0.222685 -0.0085752 +0.216226 0.238327 -0.00679645 +0.204842 0.243639 -0.00108745 +0.197086 0.237151 0.00943393 +0.207737 0.21475 -0.00125832 +0.200663 0.225332 0.00994825 +0.227239 0.239308 -0.00361834 +0.210369 0.205349 -0.000451507 +0.212421 0.195338 0.00658041 +0.0965367 0.0723068 0.0490018 +-0.263237 -0.382248 -0.20077 +-0.334935 -0.395374 -0.246716 +0.0666968 0.0983382 0.0352739 +0.0735768 0.104043 0.0256427 +0.0854137 0.105714 0.0280147 +0.0966684 0.103408 0.0197312 +-0.293219 -0.246559 0.00868918 +-0.284829 -0.260543 0.00656712 +0.231694 -0.239358 -0.229883 +0.249173 -0.248287 -0.23972 +-0.313753 -0.278534 -0.156686 +-0.167921 -0.0222432 0.100354 +-0.166557 -0.0217484 0.0804222 +-0.137191 -0.0189498 0.0544508 +-0.183157 -0.0297007 0.0652393 +-0.193717 -0.0386652 0.0428719 +-0.162262 -0.0205653 0.0563587 +-0.148465 -0.0201145 0.071316 +-0.122512 -0.0229086 0.0762312 +-0.112808 -0.0225311 0.0535636 +-0.15755 -0.0225071 0.112728 +-0.13968 -0.0242143 0.109228 +-0.128528 -0.0323847 0.121144 +-0.137944 -0.0426964 0.133983 +0.338353 -0.331842 -0.233 +0.197716 0.0369013 -0.0158252 +0.225598 0.0269623 0.107608 +0.227611 0.0352699 0.116368 +0.216481 0.0416846 0.126455 +0.20366 0.0291575 0.127785 +0.197706 0.0139181 0.138946 +0.177004 0.0154396 0.15063 +0.196436 0.0406475 0.130552 +0.183582 0.0465791 0.137895 +0.171962 0.0340634 0.144092 +0.209838 0.0350513 0.1214 +0.122018 -0.0147207 0.202688 +0.134625 -0.010294 0.190699 +0.150345 -0.0204184 0.190322 +0.171467 -0.0443352 0.191435 +0.124137 -0.0275222 0.21069 +0.115004 -0.0324307 0.220668 +0.103488 -0.0235525 0.230568 +-0.234966 -0.250492 -0.00657503 +0.230136 -0.0629922 0.010065 +0.22781 -0.0439028 0.0052695 +0.226758 -0.0758146 -0.00318988 +0.218119 -0.0755566 -0.0185995 +0.210925 -0.0881128 -0.0299059 +0.195391 -0.0835698 -0.0397083 +0.187049 -0.0970928 -0.0513544 +0.215909 -0.10623 -0.0275177 +0.221663 -0.111792 -0.00835326 +0.21689 -0.135734 -0.006698 +0.187289 -0.0668273 -0.0361071 +0.170089 -0.0549841 -0.0384156 +0.158135 -0.0292105 -0.0224101 +0.144698 -0.0631652 -0.0561794 +0.210349 -0.156804 0.00619425 +0.122465 -0.0210506 -0.020971 +0.25102 0.0827579 -0.00901225 +0.246076 0.0717907 -0.00732438 +0.248146 0.0653429 0.00439784 +0.245544 0.0538898 0.0151974 +0.255748 0.0868229 -0.000826293 +-0.125725 -0.258433 -0.170214 +0.151089 -0.0268375 0.140451 +0.244155 0.0131187 -0.0533056 +0.246127 0.0105937 -0.0612737 +0.239403 0.00492409 -0.0645919 +0.228547 -0.00190445 -0.0800819 +0.236042 0.000460551 -0.073323 +0.244455 -0.00400961 -0.0816292 +0.225173 0.00380285 -0.0703884 +0.247885 -0.00234363 -0.0902777 +0.247838 0.00379159 -0.0839495 +0.243353 0.0148187 -0.0838177 +0.236031 0.0244971 -0.0791546 +0.225616 0.0291453 -0.0875646 +-0.29518 -0.390079 -0.254006 +-0.303646 -0.394416 -0.248506 +-0.302477 -0.403327 -0.233435 +-0.298023 -0.412267 -0.217588 +-0.29425 -0.38151 -0.250683 +-0.302074 -0.390767 -0.254186 +0.191342 0.435898 0.0636941 +-0.0964353 -0.460913 -0.0144457 +0.137532 -0.0116873 0.139128 +0.343547 -0.294973 -0.292923 +0.137424 0.0947211 0.0118894 +0.147115 0.0902563 -0.00271409 +0.147874 0.0802052 -0.0226835 +0.255027 -0.310713 -0.257667 +0.257498 -0.300887 -0.266482 +0.220835 -0.0105204 -0.15317 +0.210403 -0.014095 -0.156518 +0.204562 -0.0228168 -0.148776 +-0.117774 -0.20207 0.202016 +3 575 1215 1225 +3 902 137 1166 +3 2122 17 2125 +3 1333 1332 328 +3 1031 1037 1032 +3 1235 1234 736 +3 986 1231 182 +3 532 534 185 +3 534 448 185 +3 1588 1570 1587 +3 674 675 639 +3 1130 1225 242 +3 279 6 280 +3 6 283 280 +3 621 954 955 +3 235 273 275 +3 2565 1747 2566 +3 2225 2224 2223 +3 11 206 278 +3 922 93 2080 +3 530 2723 2724 +3 2144 2146 2139 +3 1374 1376 766 +3 1361 1374 766 +3 1775 525 1893 +3 2626 1649 2625 +3 2338 2265 2339 +3 992 96 990 +3 103 21 104 +3 1681 1682 31 +3 1686 1682 1681 +3 2064 2065 295 +3 747 748 464 +3 597 1084 1086 +3 1003 2191 2190 +3 2184 1003 2190 +3 214 38 215 +3 2202 2205 473 +3 2725 257 2728 +3 216 554 944 +3 554 553 944 +3 1457 1456 445 +3 986 2154 96 +3 458 1022 1021 +3 961 1949 2534 +3 625 1514 1515 +3 1786 1791 518 +3 1586 2773 2006 +3 52 1485 1486 +3 2101 52 1486 +3 2368 2374 1380 +3 2054 1499 74 +3 329 326 1762 +3 933 934 176 +3 527 569 705 +3 2004 247 2003 +3 414 1966 1967 +3 853 544 184 +3 1136 354 352 +3 1896 1895 134 +3 5 978 1108 +3 1344 1342 726 +3 80 27 1599 +3 1489 1683 175 +3 1952 1953 2619 +3 21 105 104 +3 21 103 29 +3 2180 959 1164 +3 288 2180 1164 +3 294 1940 1941 +3 1263 1865 443 +3 1755 1756 337 +3 696 1187 1185 +3 1186 696 1185 +3 1489 66 1683 +3 68 907 122 +3 260 1748 341 +3 1340 1341 451 +3 806 397 478 +3 1337 750 728 +3 1516 419 1515 +3 279 11 278 +3 277 279 278 +3 226 2120 2119 +3 258 259 76 +3 686 683 719 +3 1232 950 1230 +3 1597 1598 1978 +3 91 2073 977 +3 724 734 1233 +3 724 732 734 +3 47 281 280 +3 85 1982 2246 +3 207 154 64 +3 2000 1998 1999 +3 553 853 184 +3 76 261 1618 +3 259 261 76 +3 682 706 1504 +3 660 706 682 +3 296 17 297 +3 17 2122 297 +3 554 216 916 +3 381 383 382 +3 271 269 296 +3 269 17 296 +3 1082 656 1823 +3 115 199 196 +3 1056 1049 880 +3 1520 2574 2248 +3 212 550 238 +3 1980 1598 27 +3 364 72 365 +3 674 657 673 +3 82 168 158 +3 1133 641 1171 +3 440 1406 1411 +3 804 803 398 +3 178 2662 461 +3 159 2100 157 +3 1657 1659 1658 +3 1659 1280 1658 +3 1499 141 1498 +3 2144 2137 2146 +3 358 2137 2144 +3 567 534 531 +3 64 264 274 +3 137 365 380 +3 379 137 380 +3 117 903 902 +3 377 376 136 +3 88 2566 2567 +3 83 1299 1306 +3 1819 692 1822 +3 1642 584 710 +3 645 602 1808 +3 503 500 502 +3 1855 1263 54 +3 1706 1580 517 +3 1169 1069 1068 +3 42 1825 1828 +3 21 67 106 +3 81 80 84 +3 20 105 118 +3 20 156 105 +3 67 21 256 +3 1015 258 1016 +3 259 258 65 +3 649 890 1665 +3 2021 116 2020 +3 1146 402 1147 +3 126 1615 1618 +3 164 1894 163 +3 120 164 163 +3 2774 378 377 +3 1796 1893 525 +3 510 511 413 +3 1143 754 305 +3 1257 1024 1260 +3 866 1816 1815 +3 2685 1816 866 +3 574 1222 1221 +3 1673 1038 1672 +3 158 168 51 +3 793 1560 1561 +3 750 730 465 +3 729 730 750 +3 996 998 61 +3 280 281 11 +3 919 93 918 +3 590 2300 1322 +3 1305 1478 1482 +3 68 122 118 +3 238 537 555 +3 138 365 903 +3 1536 1562 1535 +3 264 1720 268 +3 2079 2080 93 +3 6 273 283 +3 2554 63 246 +3 236 317 319 +3 40 84 80 +3 84 40 104 +3 778 1357 1356 +3 1359 778 1356 +3 170 263 265 +3 1986 170 265 +3 21 106 105 +3 944 183 1740 +3 944 945 183 +3 1894 164 165 +3 67 249 106 +3 283 235 47 +3 63 2005 246 +3 314 235 275 +3 435 436 188 +3 1746 1747 345 +3 1161 2431 2432 +3 2459 594 1102 +3 1484 1305 1482 +3 2 1136 1137 +3 1062 2510 2511 +3 1811 219 1809 +3 1736 997 1732 +3 264 268 274 +3 439 1427 1247 +3 526 2722 530 +3 2722 2721 530 +3 118 105 106 +3 164 120 121 +3 71 131 165 +3 63 247 2005 +3 1894 165 1895 +3 2054 2052 2053 +3 2285 2432 2286 +3 254 106 249 +3 254 68 106 +3 685 661 670 +3 1498 75 2135 +3 989 180 991 +3 263 24 265 +3 2021 2020 932 +3 1724 170 1487 +3 124 1016 76 +3 277 278 64 +3 431 151 430 +3 2225 2757 2189 +3 818 407 478 +3 1499 237 74 +3 1994 1576 2611 +3 2697 904 897 +3 904 899 897 +3 377 378 135 +3 132 72 364 +3 282 109 293 +3 109 282 319 +3 224 83 1306 +3 74 381 376 +3 2054 2053 141 +3 2226 2678 2224 +3 1134 1438 1437 +3 412 814 813 +3 2624 1641 709 +3 126 1618 261 +3 999 34 991 +3 899 1991 1989 +3 98 1315 275 +3 928 1767 931 +3 144 2131 2136 +3 23 234 78 +3 603 800 707 +3 337 1490 332 +3 1490 1491 332 +3 1348 1341 727 +3 1591 16 1590 +3 547 92 549 +3 2194 2226 2189 +3 2236 2582 2581 +3 378 72 135 +3 1796 1784 1893 +3 278 206 207 +3 170 82 1487 +3 265 24 266 +3 308 153 943 +3 310 308 943 +3 569 565 177 +3 267 1987 1502 +3 236 316 317 +3 1895 165 134 +3 1898 2388 1479 +3 163 159 120 +3 1464 1468 1463 +3 756 903 117 +3 138 903 756 +3 951 1231 986 +3 987 951 986 +3 2670 700 2672 +3 445 187 446 +3 1722 154 910 +3 256 21 29 +3 84 168 81 +3 1283 2386 2684 +3 2736 79 852 +3 146 363 2143 +3 1323 1324 2271 +3 68 118 106 +3 1043 1038 1673 +3 2773 1585 1705 +3 1231 1232 1230 +3 1337 729 750 +3 922 917 93 +3 825 395 824 +3 510 389 511 +3 763 1188 2128 +3 833 831 487 +3 560 1355 179 +3 560 1354 1355 +3 899 904 1991 +3 639 1133 1138 +3 674 639 1138 +3 1250 1243 1254 +3 2715 2714 1433 +3 502 499 503 +3 1690 1213 1212 +3 1342 451 1341 +3 1397 1025 443 +3 929 928 930 +3 1855 1854 1262 +3 1854 1857 1262 +3 2733 2736 241 +3 1001 987 993 +3 2662 2708 191 +3 1470 2764 1459 +3 264 1717 1720 +3 264 1718 1717 +3 346 330 1139 +3 1137 1136 353 +3 1514 557 1515 +3 2045 115 2026 +3 143 1494 1495 +3 1487 1713 1724 +3 211 974 975 +3 319 318 109 +3 319 317 318 +3 2081 2077 209 +3 1015 123 258 +3 207 59 910 +3 1770 241 848 +3 857 222 1810 +3 546 857 1810 +3 87 343 1750 +3 621 915 622 +3 393 803 806 +3 977 976 975 +3 2016 992 934 +3 992 176 934 +3 1794 2744 2745 +3 278 207 64 +3 524 1692 1691 +3 2772 1702 2771 +3 1702 2772 1586 +3 1107 1105 1106 +3 190 2593 2594 +3 802 393 586 +3 1777 1783 1793 +3 476 816 390 +3 2159 1049 1048 +3 516 515 1576 +3 321 2057 2063 +3 476 477 509 +3 1180 773 1181 +3 553 184 945 +3 1227 1228 949 +3 1892 255 101 +3 1919 600 2258 +3 124 1014 1015 +3 273 98 275 +3 225 1612 1613 +3 48 313 314 +3 539 2728 2729 +3 2728 539 538 +3 1897 1896 468 +3 1810 1809 980 +3 794 2238 2237 +3 307 39 311 +3 39 307 320 +3 1531 1533 1538 +3 1583 1702 1582 +3 410 954 621 +3 2519 2333 2332 +3 541 854 855 +3 459 439 1249 +3 529 1511 2740 +3 1259 450 1258 +3 1677 2170 2175 +3 509 389 510 +3 1704 1703 1707 +3 1703 1583 1707 +3 1644 1645 584 +3 463 562 2660 +3 175 929 930 +3 262 1756 1755 +3 1756 262 1757 +3 380 72 378 +3 365 72 380 +3 128 2247 1985 +3 2532 135 2533 +3 128 1985 1987 +3 1121 2187 288 +3 891 1663 1377 +3 135 132 2533 +3 76 1016 258 +3 117 902 901 +3 132 135 72 +3 908 139 909 +3 125 76 1618 +3 76 125 124 +3 737 736 745 +3 30 541 543 +3 30 540 541 +3 395 826 824 +3 260 1751 1749 +3 341 1746 1753 +3 173 553 554 +3 1141 331 1139 +3 1756 1490 337 +3 2668 2667 700 +3 1751 1752 259 +3 230 1380 2377 +3 281 282 12 +3 2137 2138 2146 +3 1689 1852 1850 +3 588 1697 1083 +3 1069 1169 641 +3 1149 424 1088 +3 11 279 280 +3 919 1331 213 +3 1626 715 3 +3 2374 2368 2367 +3 178 2661 2707 +3 2094 2093 2092 +3 320 318 39 +3 318 317 39 +3 754 14 755 +3 6 272 273 +3 2172 1047 1051 +3 1058 2163 2162 +3 237 1499 142 +3 1799 523 1518 +3 591 695 781 +3 696 695 2128 +3 234 23 430 +3 800 720 683 +3 236 282 47 +3 235 236 47 +3 23 1162 2312 +3 2192 2678 2227 +3 2681 2680 832 +3 236 319 282 +3 817 390 808 +3 509 510 476 +3 1661 1474 492 +3 1278 1659 1657 +3 191 2715 2716 +3 1138 1133 1171 +3 835 840 412 +3 840 1184 412 +3 1898 1897 468 +3 138 756 754 +3 22 2069 300 +3 309 755 1018 +3 1651 586 589 +3 1147 1651 589 +3 1771 2733 241 +3 2733 1771 522 +3 379 380 378 +3 1749 1751 65 +3 1729 1728 197 +3 2092 2093 970 +3 300 2069 2068 +3 903 137 902 +3 25 332 1002 +3 236 235 315 +3 1162 78 1027 +3 1163 318 320 +3 147 429 801 +3 360 359 302 +3 2285 1172 3 +3 637 669 677 +3 754 1143 14 +3 2706 2709 418 +3 1213 575 574 +3 1215 575 1213 +3 2186 2223 2192 +3 2364 718 2365 +3 535 184 544 +3 610 1197 394 +3 1401 2331 2444 +3 839 149 837 +3 956 149 839 +3 181 330 347 +3 674 1138 657 +3 340 326 329 +3 1430 1415 1635 +3 2664 1822 692 +3 173 554 924 +3 944 553 945 +3 535 544 533 +3 1740 216 944 +3 334 90 336 +3 2475 783 2480 +3 927 1767 929 +3 1267 310 943 +3 2479 952 783 +3 1144 592 1146 +3 929 175 927 +3 323 1731 1730 +3 2280 2292 2430 +3 1811 1813 1812 +3 1733 1735 2570 +3 222 857 858 +3 346 1139 1760 +3 809 808 390 +3 292 1073 1072 +3 1113 1959 1962 +3 1765 1764 1116 +3 2285 2286 1172 +3 1961 1012 287 +3 1754 77 1752 +3 509 820 844 +3 417 839 2710 +3 1260 1024 1252 +3 1463 1468 483 +3 2734 2732 537 +3 568 742 734 +3 2060 2059 298 +3 187 1137 353 +3 1438 1414 441 +3 469 133 753 +3 901 902 360 +3 902 1166 360 +3 592 1144 811 +3 151 234 430 +3 2321 715 2322 +3 1648 1643 1642 +3 498 786 2606 +3 1501 2696 146 +3 2699 145 898 +3 373 1970 1273 +3 1229 985 182 +3 384 237 142 +3 1025 1263 443 +3 1273 1275 1282 +3 900 1989 1193 +3 381 237 383 +3 839 837 415 +3 755 753 754 +3 138 754 753 +3 2719 437 1701 +3 789 1562 1536 +3 2604 2607 1573 +3 820 509 477 +3 780 2484 2485 +3 1184 840 416 +3 2717 1433 2713 +3 437 2717 2713 +3 1216 1219 1217 +3 394 1195 612 +3 238 550 551 +3 1206 529 1207 +3 1442 1472 2637 +3 1472 190 2637 +3 1778 1794 2745 +3 1082 1078 656 +3 1709 2266 2265 +3 498 497 1 +3 1235 735 1234 +3 526 527 705 +3 624 620 558 +3 393 589 586 +3 2128 1188 696 +3 501 497 498 +3 616 1204 1205 +3 825 514 798 +3 293 2063 294 +3 215 343 87 +3 853 854 544 +3 854 853 542 +3 2769 1060 1129 +3 212 547 548 +3 121 479 119 +3 784 620 411 +3 1320 610 1321 +3 419 618 624 +3 1518 2740 528 +3 410 953 954 +3 957 2709 2705 +3 1662 1470 1661 +3 619 2484 1174 +3 2672 708 2670 +3 893 771 887 +3 1418 2622 1700 +3 2306 2307 428 +3 1348 1342 1341 +3 527 528 1355 +3 455 436 454 +3 1704 1705 1585 +3 1703 1704 1585 +3 1900 848 1901 +3 1259 1257 455 +3 401 1323 1646 +3 422 2250 1553 +3 2250 422 1524 +3 668 666 671 +3 1469 482 481 +3 1449 1662 1661 +3 622 912 410 +3 844 2681 832 +3 454 1630 453 +3 463 748 747 +3 467 1433 2717 +3 735 1021 733 +3 909 2051 140 +3 1216 524 1219 +3 840 956 416 +3 408 811 1144 +3 739 740 738 +3 449 446 447 +3 2731 536 2726 +3 576 1223 1221 +3 461 2716 192 +3 598 2665 2664 +3 1144 1146 589 +3 627 1392 1393 +3 569 177 705 +3 1390 1391 651 +3 1799 1518 240 +3 1089 606 626 +3 1776 1220 523 +3 462 461 192 +3 1505 561 560 +3 192 459 456 +3 701 581 704 +3 673 676 636 +3 1022 1349 480 +3 2722 177 2721 +3 462 178 461 +3 611 1358 1357 +3 625 624 558 +3 2322 1621 2321 +3 1630 1460 386 +3 2727 537 2726 +3 748 178 462 +3 480 733 1021 +3 983 1543 1545 +3 531 534 532 +3 778 611 1357 +3 2607 2604 2605 +3 1463 485 148 +3 567 565 566 +3 748 462 464 +3 412 816 834 +3 743 746 464 +3 566 534 567 +3 606 663 1808 +3 1770 1771 241 +3 834 835 412 +3 420 798 514 +3 1454 1662 1449 +3 2306 428 2309 +3 763 2128 591 +3 625 558 1513 +3 477 476 390 +3 817 477 390 +3 1526 1523 1528 +3 1562 1521 791 +3 551 46 552 +3 700 2670 2669 +3 497 501 518 +3 790 1562 1552 +3 1212 574 1214 +3 1588 1587 1571 +3 2736 849 241 +3 2039 2024 2038 +3 123 128 258 +3 128 123 965 +3 1726 1727 582 +3 550 46 551 +3 274 2742 64 +3 1779 1781 2755 +3 1781 1782 2755 +3 503 506 500 +3 709 1641 581 +3 1563 1589 1587 +3 505 498 515 +3 2238 2239 392 +3 807 2243 2241 +3 818 477 817 +3 1589 1565 507 +3 1736 325 1737 +3 1530 1531 1525 +3 872 1052 1051 +3 1800 2753 2752 +3 534 186 448 +3 603 1069 721 +3 2665 653 687 +3 1513 559 1512 +3 1782 520 571 +3 2473 1727 399 +3 2748 2750 2747 +3 240 1773 1799 +3 1773 1774 1799 +3 753 752 138 +3 1 497 851 +3 1070 627 1393 +3 1071 627 1070 +3 744 743 464 +3 803 397 806 +3 1086 1084 1085 +3 402 1086 1085 +3 1020 458 1021 +3 854 540 544 +3 540 533 544 +3 811 810 174 +3 729 562 563 +3 1351 562 729 +3 731 749 568 +3 749 746 568 +3 1338 564 1350 +3 1337 1338 1350 +3 455 1257 54 +3 1198 2486 426 +3 817 2244 818 +3 239 530 536 +3 242 1225 1216 +3 1582 499 938 +3 50 737 745 +3 735 724 1234 +3 540 539 533 +3 539 540 30 +3 901 1990 900 +3 223 541 855 +3 541 540 854 +3 715 1620 3 +3 212 548 550 +3 545 543 541 +3 223 545 541 +3 2456 2455 1680 +3 545 546 547 +3 223 546 545 +3 1163 110 2066 +3 212 545 547 +3 945 946 183 +3 549 548 547 +3 2748 2747 2749 +3 217 917 920 +3 173 924 925 +3 855 542 856 +3 855 854 542 +3 46 203 552 +3 1081 95 662 +3 173 542 553 +3 149 956 840 +3 1505 560 1507 +3 742 50 745 +3 2749 1710 2751 +3 561 562 452 +3 179 1509 1508 +3 1507 560 179 +3 2574 150 2248 +3 665 638 693 +3 571 1778 2754 +3 727 751 480 +3 705 177 2722 +3 885 882 765 +3 177 565 567 +3 402 1326 587 +3 556 1516 1509 +3 1690 1691 1213 +3 742 745 734 +3 725 1235 736 +3 1374 769 1375 +3 1361 769 1374 +3 1343 566 565 +3 451 1343 565 +3 707 1066 603 +3 707 632 1066 +3 1076 656 1078 +3 584 1643 1644 +3 705 2722 526 +3 1326 402 1085 +3 1148 1086 402 +3 598 652 2665 +3 2636 2635 577 +3 773 611 914 +3 611 773 772 +3 914 622 915 +3 1925 1924 757 +3 680 697 605 +3 663 646 645 +3 732 724 733 +3 833 490 831 +3 677 669 636 +3 618 617 1182 +3 617 618 419 +3 844 490 509 +3 697 680 635 +3 566 713 186 +3 1070 595 1071 +3 1825 107 57 +3 814 409 813 +3 636 672 673 +3 2349 2348 1203 +3 900 117 901 +3 1206 573 1205 +3 658 679 675 +3 2653 1821 596 +3 410 621 622 +3 2738 2737 1207 +3 649 1665 891 +3 620 0 621 +3 680 678 635 +3 674 658 675 +3 598 2664 2666 +3 1807 602 1806 +3 698 710 584 +3 710 698 1096 +3 395 798 828 +3 1365 1372 1364 +3 1371 1372 1365 +3 409 2479 827 +3 1321 610 609 +3 1151 616 1223 +3 2177 2176 1044 +3 0 915 621 +3 2664 2665 687 +3 2672 2671 580 +3 733 724 735 +3 2737 1211 2741 +3 1346 453 1345 +3 2351 1209 1204 +3 845 2676 833 +3 2323 715 1625 +3 1151 1150 616 +3 2352 2344 1201 +3 2273 2274 588 +3 615 1516 556 +3 557 1516 1515 +3 744 50 743 +3 1145 1144 589 +3 1181 1182 619 +3 1182 1181 618 +3 2546 2545 1626 +3 620 621 411 +3 1374 1375 770 +3 405 1356 1320 +3 1359 1356 405 +3 145 2144 2139 +3 1353 452 1352 +3 1469 2141 355 +3 137 379 1165 +3 784 558 620 +3 670 693 638 +3 668 671 672 +3 2753 1779 2754 +3 1069 722 721 +3 654 1187 1188 +3 637 678 680 +3 1687 1688 660 +3 813 390 816 +3 671 667 658 +3 667 679 658 +3 2350 1195 613 +3 607 646 663 +3 665 595 666 +3 638 666 668 +3 711 1096 1095 +3 769 1361 1358 +3 758 1924 1925 +3 597 1086 1087 +3 1989 900 1990 +3 1183 1184 416 +3 708 581 701 +3 1420 1407 2330 +3 637 680 685 +3 672 671 658 +3 669 670 638 +3 636 669 668 +3 669 638 668 +3 637 670 669 +3 1919 1921 600 +3 816 412 813 +3 693 628 665 +3 1082 1077 1078 +3 636 668 672 +3 666 595 667 +3 1641 1642 710 +3 884 648 881 +3 1688 707 660 +3 637 685 670 +3 145 359 2144 +3 1908 1907 895 +3 706 660 707 +3 1861 1247 1860 +3 731 568 734 +3 721 722 642 +3 606 1089 1081 +3 1352 452 1351 +3 2152 682 1504 +3 857 546 223 +3 717 1627 2545 +3 1780 1797 2750 +3 747 746 563 +3 881 694 882 +3 1133 639 1132 +3 489 829 2680 +3 1548 1537 1564 +3 965 964 252 +3 490 844 832 +3 1175 1176 1180 +3 1557 1559 793 +3 2547 2542 1628 +3 1726 1639 2009 +3 992 990 176 +3 859 222 858 +3 1667 222 859 +3 732 465 731 +3 465 730 731 +3 566 186 534 +3 357 2130 2129 +3 465 732 733 +3 1366 768 1368 +3 746 749 563 +3 731 734 732 +3 743 568 746 +3 568 743 742 +3 1579 516 1994 +3 878 2164 2165 +3 773 1176 772 +3 956 839 417 +3 50 742 743 +3 1233 736 1234 +3 751 733 480 +3 903 365 137 +3 465 733 751 +3 751 728 750 +3 465 751 750 +3 752 365 138 +3 1922 1923 758 +3 1389 2666 1392 +3 575 805 94 +3 881 762 694 +3 1442 2492 1134 +3 887 886 765 +3 406 776 1371 +3 954 417 955 +3 590 1322 1323 +3 2661 178 2659 +3 137 1165 1166 +3 773 1180 1176 +3 622 914 911 +3 439 467 1426 +3 782 591 781 +3 765 893 887 +3 413 835 834 +3 809 813 409 +3 805 823 397 +3 1356 777 1320 +3 1020 1236 1237 +3 793 1558 1557 +3 2686 2685 866 +3 965 123 964 +3 703 1096 1097 +3 2317 1019 2316 +3 1557 421 1559 +3 286 2179 232 +3 1676 2176 2177 +3 354 2133 352 +3 393 802 803 +3 407 806 478 +3 954 956 417 +3 777 2488 1320 +3 1212 1211 244 +3 2238 2580 2237 +3 813 809 390 +3 1184 1183 814 +3 835 149 840 +3 478 821 819 +3 392 2579 2580 +3 1127 2481 953 +3 819 821 820 +3 818 819 477 +3 818 478 819 +3 805 396 823 +3 819 820 477 +3 1211 573 2741 +3 397 823 478 +3 395 825 798 +3 2236 829 797 +3 831 392 487 +3 2681 489 2680 +3 798 829 828 +3 956 953 416 +3 953 956 954 +3 2128 695 591 +3 1184 814 412 +3 1943 2576 1122 +3 487 846 845 +3 1904 1903 849 +3 542 853 553 +3 16 2608 1593 +3 1048 2160 2159 +3 1586 2772 2773 +3 856 223 855 +3 978 867 1108 +3 2194 2189 2758 +3 239 536 2731 +3 2295 2296 865 +3 2170 2166 1046 +3 1138 1171 657 +3 873 1055 1035 +3 2046 2045 936 +3 2134 2145 142 +3 1167 44 360 +3 875 2296 2770 +3 2165 2164 2167 +3 1051 1052 1034 +3 914 915 773 +3 306 14 1143 +3 623 913 912 +3 2695 2694 301 +3 2353 2354 614 +3 694 762 1920 +3 1906 1907 1367 +3 1142 304 1143 +3 906 117 900 +3 756 117 906 +3 931 1767 1766 +3 754 756 906 +3 214 910 59 +3 911 912 622 +3 1129 870 1128 +3 77 337 1126 +3 917 217 916 +3 917 916 918 +3 1001 998 951 +3 1392 1818 1393 +3 1739 1740 183 +3 1075 1124 1125 +3 1414 440 1412 +3 964 963 252 +3 1494 1496 1495 +3 2708 2662 2707 +3 1881 1882 2437 +3 396 2766 822 +3 823 396 822 +3 2711 415 2708 +3 417 2710 957 +3 1008 473 1005 +3 289 1073 960 +3 71 130 131 +3 2223 1004 2222 +3 2050 339 2051 +3 1625 715 1626 +3 2520 2333 2519 +3 2407 2197 2408 +3 2197 2407 2198 +3 1226 2334 948 +3 2678 2192 2224 +3 2433 2305 2302 +3 124 1015 1016 +3 248 255 60 +3 473 1003 1005 +3 2191 1003 473 +3 2348 613 1202 +3 2036 993 2035 +3 123 907 964 +3 907 123 1015 +3 1207 2739 2738 +3 1242 1838 1839 +3 926 1681 1680 +3 1109 865 1110 +3 868 1109 1110 +3 2320 1621 2319 +3 1037 1038 1043 +3 2768 2767 1130 +3 1986 265 86 +3 1984 1986 86 +3 2107 1298 2108 +3 2377 2375 1271 +3 1380 2375 2377 +3 2195 2229 2214 +3 1294 1153 1289 +3 995 61 994 +3 1253 1856 1689 +3 2113 1299 229 +3 2423 889 2421 +3 1274 1273 1269 +3 373 1273 1274 +3 1610 1611 1154 +3 1610 471 1611 +3 2120 226 2121 +3 2535 1524 1526 +3 1375 894 770 +3 2072 204 2073 +3 2601 2604 2602 +3 2601 1575 2604 +3 981 980 979 +3 981 979 221 +3 922 425 920 +3 425 922 970 +3 2142 2145 2134 +3 2650 2145 2142 +3 970 922 220 +3 113 2062 2060 +3 2451 921 1996 +3 1996 217 2451 +3 217 920 2451 +3 57 1826 1825 +3 2168 2171 2169 +3 208 2081 214 +3 770 2258 600 +3 2258 770 883 +3 2085 975 974 +3 549 974 211 +3 335 1888 1887 +3 1334 2084 213 +3 976 548 211 +3 2079 2078 210 +3 1755 337 1754 +3 1332 213 1331 +3 869 1672 1669 +3 281 58 11 +3 58 281 1938 +3 1815 1816 219 +3 1816 979 219 +3 1812 1815 219 +3 998 1232 951 +3 1997 1996 1995 +3 2094 2096 2093 +3 2096 2094 221 +3 2098 978 971 +3 978 973 971 +3 2093 2096 971 +3 2096 2098 971 +3 2098 2096 2097 +3 1619 547 546 +3 1996 921 1995 +3 2096 221 2097 +3 1821 601 1820 +3 1769 1577 1768 +3 1581 1769 1768 +3 925 924 1997 +3 984 316 233 +3 303 2692 2068 +3 2692 300 2068 +3 2129 2130 2147 +3 1529 1525 792 +3 1530 1529 1523 +3 729 563 730 +3 2728 257 2729 +3 2673 699 2668 +3 699 2667 2668 +3 1541 1540 55 +3 1536 1540 1541 +3 1533 1531 1530 +3 348 1971 1998 +3 1523 1532 1530 +3 2250 2251 1553 +3 2251 2250 796 +3 676 657 1632 +3 1633 676 1632 +3 1527 422 983 +3 2248 150 2253 +3 2249 2248 2253 +3 2693 2689 2694 +3 2693 2691 2689 +3 22 298 299 +3 2656 697 635 +3 787 2656 635 +3 2599 1972 2597 +3 1972 1973 2597 +3 316 39 317 +3 316 984 39 +3 984 311 39 +3 1393 1818 601 +3 37 195 1729 +3 2052 2054 140 +3 1120 2218 1949 +3 989 990 96 +3 990 989 991 +3 1684 9 1682 +3 998 1001 61 +3 66 1686 1683 +3 990 930 176 +3 930 990 34 +3 930 933 176 +3 298 2059 295 +3 444 1460 1461 +3 444 2743 1460 +3 195 996 995 +3 2158 1049 2159 +3 1677 1676 1045 +3 985 180 989 +3 180 985 423 +3 333 89 1140 +3 333 1492 89 +3 695 1186 2477 +3 1186 174 2477 +3 2062 2061 2060 +3 991 34 990 +3 1699 1063 1669 +3 930 928 933 +3 33 347 346 +3 33 1000 347 +3 1030 1032 860 +3 1030 2515 1032 +3 1886 2640 2649 +3 2640 1885 2649 +3 1161 2432 2285 +3 993 987 988 +3 987 96 988 +3 143 1491 1492 +3 1493 143 1492 +3 1493 334 336 +3 734 745 1233 +3 38 1334 344 +3 927 926 1685 +3 1867 1265 1864 +3 1679 4 202 +3 2050 127 1614 +3 127 1616 1614 +3 922 920 917 +3 195 37 996 +3 1731 1736 1732 +3 1757 329 1760 +3 351 34 999 +3 327 351 999 +3 774 1179 1369 +3 1233 745 736 +3 1491 1002 332 +3 2565 88 2569 +3 323 197 99 +3 996 997 998 +3 999 991 180 +3 1000 999 180 +3 1000 327 999 +3 2140 356 2141 +3 1743 1742 324 +3 1000 180 423 +3 347 1000 423 +3 33 327 1000 +3 987 1001 951 +3 351 99 197 +3 1029 864 1030 +3 2773 1706 2006 +3 2605 2606 1574 +3 960 292 1117 +3 1073 292 960 +3 1959 1958 1114 +3 2272 1326 2274 +3 2002 249 248 +3 249 67 248 +3 2201 1006 2203 +3 2200 2210 2211 +3 1939 1935 1936 +3 1939 112 1935 +3 1533 982 1534 +3 1538 1533 1534 +3 2206 2203 2204 +3 70 124 125 +3 1014 124 70 +3 2028 994 2042 +3 2041 2028 2042 +3 2192 1005 2186 +3 1962 1960 1963 +3 1965 350 1960 +3 2187 961 2188 +3 77 1395 261 +3 41 2000 1999 +3 1014 907 1015 +3 122 907 1014 +3 70 122 1014 +3 350 1114 2213 +3 2209 2200 2204 +3 2209 2204 1006 +3 2668 700 2669 +3 141 2053 2056 +3 2321 2320 1620 +3 2321 1621 2320 +3 1010 2213 2208 +3 2299 1321 1322 +3 405 1321 2299 +3 706 707 683 +3 2301 1157 1602 +3 831 490 2679 +3 490 832 2679 +3 287 1012 1011 +3 1010 2206 2204 +3 1013 2191 473 +3 2205 1013 473 +3 2561 166 2560 +3 2201 2202 1008 +3 2203 2202 2201 +3 2369 2368 2370 +3 1896 1897 1895 +3 102 40 107 +3 2394 1283 53 +3 1283 2394 2390 +3 985 2154 986 +3 2076 2072 2073 +3 2076 208 2072 +3 308 310 1018 +3 755 308 1018 +3 308 755 14 +3 1848 1849 1251 +3 2345 1200 2346 +3 737 740 1238 +3 740 737 738 +3 1020 1021 735 +3 738 737 50 +3 50 744 738 +3 454 1259 455 +3 1337 1350 729 +3 480 1021 1022 +3 738 744 741 +3 457 738 741 +3 1841 1840 193 +3 1840 1841 1242 +3 1693 1691 1519 +3 1025 442 188 +3 1257 1256 1024 +3 453 450 1259 +3 928 931 2022 +3 931 932 2022 +3 2055 2056 2053 +3 2056 2055 1495 +3 336 1497 1496 +3 2701 1678 1673 +3 1672 2701 1673 +3 436 455 1025 +3 188 436 1025 +3 459 467 439 +3 702 1123 1093 +3 1026 842 843 +3 1093 1123 841 +3 1945 2578 1943 +3 2684 2384 371 +3 2384 2684 2386 +3 1526 1524 1527 +3 2537 2538 1173 +3 2252 796 2235 +3 1076 1125 656 +3 691 2316 2315 +3 704 842 1026 +3 342 1747 1748 +3 1747 341 1748 +3 1163 320 110 +3 190 2639 2637 +3 2065 2064 2066 +3 2079 93 919 +3 2078 2077 2082 +3 2077 91 2082 +3 1231 1230 182 +3 1678 2178 1674 +3 1048 2168 2167 +3 1676 2177 2178 +3 2177 1044 2178 +3 2500 2508 1041 +3 190 2594 2595 +3 377 136 2774 +3 874 1033 1032 +3 1710 2265 2337 +3 2336 1710 2337 +3 2158 1057 2157 +3 1057 2163 2157 +3 1236 735 1235 +3 1815 1812 1814 +3 499 1578 503 +3 2315 2316 714 +3 1620 2315 714 +3 382 1165 379 +3 1033 873 1035 +3 1033 1034 873 +3 1238 725 737 +3 861 1030 860 +3 1036 861 860 +3 1035 1036 860 +3 1938 2490 58 +3 861 1029 1030 +3 1285 2720 1488 +3 1801 1286 1274 +3 367 1801 1274 +3 937 2013 2021 +3 1673 1674 1043 +3 1415 1430 2622 +3 1430 1419 2622 +3 2161 1057 2160 +3 1037 871 1038 +3 28 1599 1597 +3 1830 28 1597 +3 2025 2044 2043 +3 2161 2162 2163 +3 2173 2172 1050 +3 2172 2173 879 +3 1095 703 2502 +3 1169 604 1170 +3 1169 1065 604 +3 971 425 970 +3 658 674 673 +3 788 604 1065 +3 631 788 1065 +3 659 2153 1019 +3 2153 2318 1019 +3 425 971 973 +3 1059 2155 2770 +3 868 1105 1107 +3 1109 868 1107 +3 35 2028 2027 +3 2028 198 2027 +3 2132 356 2131 +3 331 1756 1757 +3 2014 2032 2031 +3 2032 2015 2031 +3 1047 2171 2168 +3 1046 2166 2165 +3 1048 1049 872 +3 1834 1759 262 +3 873 1053 1055 +3 1715 155 1714 +3 2509 2508 1040 +3 2731 2726 537 +3 1705 1704 1584 +3 616 2349 1203 +3 238 543 212 +3 1047 872 1051 +3 2171 2172 879 +3 1050 1051 1034 +3 1708 1707 572 +3 2090 2089 967 +3 1681 31 1680 +3 2513 1031 2514 +3 1031 2515 2514 +3 2508 2500 1061 +3 2500 2501 1061 +3 1033 874 1034 +3 1034 1052 873 +3 1052 1053 873 +3 1052 1056 1053 +3 1055 863 1035 +3 1032 1033 860 +3 1033 1035 860 +3 1054 863 1055 +3 1049 2295 880 +3 2295 1049 876 +3 1967 1444 2491 +3 1056 1052 872 +3 1706 508 2268 +3 1580 1706 2268 +3 1814 863 1054 +3 1788 1790 1789 +3 1056 880 1053 +3 2016 2017 2033 +3 1054 1053 880 +3 2194 1011 2193 +3 2095 969 967 +3 2091 2092 970 +3 2091 969 2092 +3 2618 2616 2608 +3 2618 2607 2616 +3 2167 1046 2165 +3 2162 2161 878 +3 2644 2643 9 +3 2025 2038 2037 +3 2008 2257 2258 +3 883 2008 2258 +3 1004 2185 2187 +3 673 672 658 +3 940 1979 1976 +3 199 1886 196 +3 2769 875 2770 +3 1106 864 1029 +3 923 1106 1029 +3 2506 2508 1061 +3 640 1171 1170 +3 1171 641 1170 +3 2224 2192 2223 +3 2770 2155 1060 +3 2155 870 1060 +3 240 528 527 +3 1518 528 240 +3 220 2088 2090 +3 2088 2089 2090 +3 2035 993 988 +3 2099 2085 974 +3 2564 1742 1745 +3 2165 2166 878 +3 2013 2046 936 +3 937 2046 2013 +3 1684 1686 66 +3 631 1065 1066 +3 1067 631 1066 +3 667 1067 632 +3 1067 1066 632 +3 595 1067 667 +3 1091 2468 2466 +3 1170 641 1169 +3 1066 1068 603 +3 1066 1065 1068 +3 1170 635 640 +3 604 635 1170 +3 1934 1932 1912 +3 1928 1927 758 +3 1067 595 1070 +3 1068 1065 1169 +3 471 1612 1611 +3 1612 225 1611 +3 1067 1070 631 +3 2399 271 2400 +3 665 664 1071 +3 664 665 628 +3 2125 2126 224 +3 102 103 40 +3 712 1075 2589 +3 2588 712 2589 +3 612 399 583 +3 399 612 1150 +3 1076 1078 1074 +3 673 657 676 +3 1084 597 1078 +3 1115 1765 1116 +3 291 1115 1116 +3 653 1083 1082 +3 687 653 1082 +3 656 1824 1823 +3 1077 1082 1083 +3 1075 1125 1076 +3 1094 1093 712 +3 711 710 1096 +3 2274 2273 2272 +3 1094 702 1093 +3 584 2011 698 +3 2011 584 1645 +3 1087 1080 597 +3 1080 1087 95 +3 593 1087 1086 +3 593 1088 1087 +3 1078 1077 1084 +3 1179 1174 406 +3 1911 1394 645 +3 1911 1926 1394 +3 690 2463 1102 +3 1076 1074 2589 +3 1822 1823 688 +3 173 1104 542 +3 1091 1090 2468 +3 1099 599 1091 +3 690 1099 1091 +3 1529 1528 1523 +3 594 1098 1099 +3 1077 1085 1084 +3 2570 325 1733 +3 597 1080 1079 +3 1963 1960 1112 +3 424 655 1088 +3 1079 1080 599 +3 1080 1081 599 +3 2423 2422 757 +3 2422 2423 2421 +3 404 2422 2421 +3 760 653 759 +3 760 1083 653 +3 48 314 275 +3 1149 1088 593 +3 2589 1075 1076 +3 2588 2589 1074 +3 1085 1077 1697 +3 1146 1148 402 +3 1146 592 1148 +3 1641 711 581 +3 711 2563 581 +3 591 782 1330 +3 1146 1147 589 +3 1147 402 587 +3 1087 1088 95 +3 1088 655 95 +3 655 662 95 +3 1820 601 1819 +3 2291 2281 2365 +3 2286 2291 2365 +3 1527 982 1594 +3 962 1124 1101 +3 1203 1204 616 +3 1093 841 1075 +3 1091 599 1090 +3 599 1089 1090 +3 2469 1090 2470 +3 1103 2461 1122 +3 2458 2461 1103 +3 399 2472 2473 +3 2472 399 1151 +3 2060 2061 26 +3 794 2237 2232 +3 599 1081 1089 +3 603 721 800 +3 721 720 800 +3 2117 2114 2115 +3 2466 2468 2467 +3 689 2466 2467 +3 2468 1090 2469 +3 2467 2468 2469 +3 626 2470 1089 +3 688 1092 689 +3 1820 689 1821 +3 1099 1079 599 +3 1126 332 338 +3 332 25 338 +3 706 686 1504 +3 683 686 706 +3 702 1094 1095 +3 962 1100 1092 +3 1078 1079 1098 +3 1079 1078 597 +3 2566 1747 342 +3 1074 1098 594 +3 1074 1078 1098 +3 594 1099 1102 +3 2562 2563 711 +3 841 1124 1075 +3 1098 1079 1099 +3 1460 1630 1461 +3 1760 329 1761 +3 249 2002 2763 +3 254 249 2763 +3 1628 1629 642 +3 1628 720 1629 +3 925 1104 173 +3 1823 1824 688 +3 1125 1124 962 +3 677 1633 1634 +3 1183 815 814 +3 1503 2282 2287 +3 2288 1503 2287 +3 2717 2718 1432 +3 856 542 1104 +3 858 856 1104 +3 858 857 856 +3 858 1104 925 +3 858 925 859 +3 594 2459 2460 +3 1102 1099 690 +3 2578 1026 2576 +3 1671 1039 870 +3 1107 1106 5 +3 1108 1107 5 +3 2277 2505 2501 +3 2277 2504 2505 +3 2505 1061 2501 +3 1672 1038 1699 +3 2367 370 1475 +3 2014 936 2032 +3 521 1791 1785 +3 1814 1054 866 +3 1815 1814 866 +3 1608 1607 470 +3 1607 1608 2687 +3 1154 2687 1608 +3 1108 867 1109 +3 1107 1108 1109 +3 1030 2514 2515 +3 1281 2262 1696 +3 2262 1281 2263 +3 1825 8 107 +3 1956 1955 1117 +3 2185 2184 288 +3 1003 2184 2185 +3 2224 2225 2189 +3 2226 2224 2189 +3 88 2565 2566 +3 185 448 1887 +3 1174 780 406 +3 286 232 285 +3 1834 1753 1746 +3 116 2021 2023 +3 2021 2013 2023 +3 1954 1963 1112 +3 1833 1832 1830 +3 620 624 618 +3 2760 1004 2188 +3 799 1524 2535 +3 2210 2200 2209 +3 1116 1119 291 +3 2416 1190 1189 +3 1521 2230 1525 +3 8 102 107 +3 1118 1953 1955 +3 1954 1953 1118 +3 1007 2196 2195 +3 1116 475 1613 +3 1113 1956 1957 +3 1952 1951 1120 +3 1950 290 1111 +3 882 2007 765 +3 1955 1964 1118 +3 1445 1444 1966 +3 1008 2202 473 +3 896 2699 2700 +3 683 707 800 +3 2242 2241 2243 +3 675 1687 681 +3 639 675 681 +3 1525 1529 1530 +3 2546 1626 3 +3 2461 841 1122 +3 912 913 1127 +3 912 1127 410 +3 953 410 1127 +3 810 827 174 +3 827 2476 174 +3 2481 2480 783 +3 2481 1127 2480 +3 845 846 2482 +3 2352 2353 2357 +3 1229 182 1228 +3 182 1230 1228 +3 1069 641 722 +3 641 1133 722 +3 2320 2319 691 +3 722 1132 1131 +3 1132 722 1133 +3 361 383 1167 +3 1902 391 1901 +3 431 147 432 +3 1229 181 423 +3 2316 2318 714 +3 2318 2316 1019 +3 1131 659 1019 +3 1131 1132 659 +3 2716 459 192 +3 1136 2 354 +3 461 2662 191 +3 536 2725 2726 +3 484 485 1462 +3 484 389 485 +3 973 2452 2450 +3 2452 921 2450 +3 2141 1891 355 +3 1440 1701 437 +3 1936 1935 13 +3 1409 2520 2519 +3 355 494 1453 +3 346 1760 1761 +3 329 1758 340 +3 1847 193 1845 +3 1846 1847 1845 +3 1856 1853 1689 +3 1247 1266 1860 +3 1395 1126 338 +3 153 366 943 +3 366 1267 943 +3 1798 525 1774 +3 2696 2690 2695 +3 363 2696 2695 +3 898 2695 301 +3 94 805 804 +3 1194 111 1142 +3 633 1805 1804 +3 1737 997 1736 +3 1517 1208 1518 +3 523 1517 1518 +3 715 2321 1620 +3 582 2474 2471 +3 582 2473 2474 +3 111 304 1142 +3 303 304 2692 +3 111 1194 905 +3 1498 2135 142 +3 2136 357 2137 +3 304 306 1143 +3 152 306 304 +3 408 810 811 +3 2476 2478 2475 +3 913 2476 2475 +3 593 1148 1149 +3 592 1149 1148 +3 808 408 2241 +3 1148 593 1086 +3 594 2460 1074 +3 2459 1103 2460 +3 1558 2231 1521 +3 810 408 809 +3 809 408 808 +3 2275 2270 2272 +3 886 885 765 +3 1149 592 812 +3 592 811 812 +3 2145 385 384 +3 142 2145 384 +3 1197 610 1198 +3 2517 1776 523 +3 2724 2723 257 +3 56 2267 1709 +3 471 2183 1612 +3 227 2112 2111 +3 1608 1609 1610 +3 470 1609 1608 +3 314 313 233 +3 313 312 233 +3 1310 1309 231 +3 276 1310 1297 +3 1292 2413 2415 +3 48 372 313 +3 471 1610 1609 +3 2387 2388 161 +3 2391 2387 161 +3 225 1603 1155 +3 321 2066 2064 +3 1163 2066 321 +3 2261 472 2260 +3 1606 1154 1155 +3 1603 1602 1155 +3 1083 1697 1077 +3 2263 1281 1287 +3 1281 228 1287 +3 1611 225 1155 +3 1310 231 1297 +3 1306 1299 2112 +3 1277 1288 1289 +3 1288 1294 1289 +3 1694 1695 1279 +3 1695 1694 1281 +3 643 661 1804 +3 1382 661 643 +3 1279 1275 1656 +3 1278 1654 1655 +3 1156 1660 1292 +3 1291 1652 1653 +3 1291 1277 1289 +3 228 1288 1287 +3 228 1293 1288 +3 1970 1275 1273 +3 2347 2348 2346 +3 2291 2432 2431 +3 2432 2291 2286 +3 2013 2366 2023 +3 366 153 312 +3 2372 366 312 +3 370 2368 2369 +3 472 2261 1119 +3 1951 2297 2218 +3 2217 2297 1950 +3 2297 2217 2218 +3 1365 1366 775 +3 1166 1167 360 +3 361 1167 1166 +3 2206 2207 1009 +3 277 6 279 +3 277 1168 6 +3 444 1459 2743 +3 268 97 274 +3 821 823 822 +3 1458 1460 2743 +3 1460 1458 1457 +3 1005 2227 2193 +3 2159 1057 2158 +3 1919 2258 2257 +3 2169 1046 2765 +3 720 721 1629 +3 657 1171 1632 +3 1627 2547 1628 +3 2466 2465 1091 +3 2466 1092 2465 +3 1523 1594 1532 +3 426 2485 1182 +3 617 426 1182 +3 1196 2356 1199 +3 2356 1196 1197 +3 1181 0 618 +3 0 620 618 +3 1180 619 1175 +3 741 192 457 +3 1250 1254 1244 +3 1176 774 1177 +3 773 915 1181 +3 1636 1405 1635 +3 619 1180 1181 +3 462 192 741 +3 646 1911 645 +3 1911 646 1912 +3 771 1367 888 +3 629 1387 1910 +3 1926 629 1910 +3 1371 775 406 +3 1179 406 775 +3 1369 1179 775 +3 1440 2592 1701 +3 2590 1437 1436 +3 712 1093 1075 +3 1176 1175 774 +3 2484 619 1182 +3 2485 2484 1182 +3 2486 2487 780 +3 779 780 2487 +3 780 779 406 +3 98 272 284 +3 272 2399 284 +3 424 1187 655 +3 38 2084 1334 +3 494 493 1450 +3 1192 654 1191 +3 799 2535 1522 +3 812 1185 424 +3 1149 812 424 +3 1808 663 645 +3 812 1186 1185 +3 812 174 1186 +3 811 174 812 +3 1404 1428 2521 +3 1666 1668 861 +3 1189 654 1188 +3 2417 1189 2419 +3 884 2423 648 +3 647 1913 2397 +3 655 1187 1192 +3 2426 890 2416 +3 654 1189 1190 +3 270 2402 2401 +3 1193 906 900 +3 271 2398 97 +3 2417 2416 1189 +3 2426 2416 2417 +3 1191 2397 607 +3 654 1190 1191 +3 305 906 1193 +3 906 305 754 +3 654 1192 1187 +3 1936 108 1939 +3 1192 662 655 +3 607 662 1192 +3 662 607 663 +3 2446 1027 2448 +3 1570 2587 1587 +3 2587 1563 1587 +3 647 1914 1913 +3 1142 1143 305 +3 1193 1142 305 +3 2595 2639 190 +3 1473 2639 2595 +3 322 905 1194 +3 1194 1142 1193 +3 1196 394 1197 +3 915 0 1181 +3 2676 486 2575 +3 615 556 400 +3 1206 1205 556 +3 529 1206 556 +3 1205 400 556 +3 2211 350 2213 +3 2211 1961 350 +3 577 2471 2472 +3 576 577 2472 +3 805 397 804 +3 1195 394 1196 +3 2486 2485 426 +3 913 623 2477 +3 2636 577 94 +3 1631 719 720 +3 719 1631 2539 +3 1195 1196 613 +3 1196 1199 613 +3 616 2350 2349 +3 616 1150 2350 +3 528 2740 1511 +3 1209 1224 1210 +3 1224 2358 1210 +3 2242 407 2244 +3 83 1711 1302 +3 1300 83 1302 +3 1727 1726 579 +3 1645 579 2011 +3 1516 557 1509 +3 1221 1222 576 +3 1222 94 576 +3 613 1199 1202 +3 170 1716 263 +3 1355 528 1511 +3 1210 400 1209 +3 2767 2768 824 +3 2221 2196 2756 +3 2196 2221 2220 +3 570 1217 1219 +3 1217 570 520 +3 2739 1207 529 +3 1219 1693 1220 +3 1219 524 1693 +3 207 910 154 +3 1212 1213 574 +3 2358 1224 2357 +3 1204 400 1205 +3 1204 1209 400 +3 613 2349 2350 +3 2351 1203 2347 +3 1203 2348 2347 +3 399 1727 583 +3 501 1788 1787 +3 1971 1973 1972 +3 396 575 1130 +3 575 1225 1130 +3 2352 2357 1224 +3 1639 1726 582 +3 520 1218 1217 +3 497 518 1792 +3 2348 1202 2346 +3 242 1217 1218 +3 1208 2739 2740 +3 2739 529 2740 +3 277 2742 1168 +3 519 1785 1786 +3 1772 522 1771 +3 1218 825 242 +3 825 1218 500 +3 2023 2366 935 +3 242 1216 1217 +3 782 1327 1330 +3 56 1788 1789 +3 2631 2633 2628 +3 2631 2634 2633 +3 233 312 984 +3 1786 1785 1791 +3 1793 1784 1794 +3 570 1220 1776 +3 1223 616 573 +3 616 1205 573 +3 1776 2517 1783 +3 574 1221 1214 +3 1199 2356 2354 +3 1214 1223 573 +3 1223 1214 1221 +3 1211 1214 573 +3 419 624 625 +3 1515 419 625 +3 1150 1195 2350 +3 2455 1685 1680 +3 2286 2362 1172 +3 1695 1696 375 +3 1219 1220 570 +3 2359 615 1210 +3 2358 2359 1210 +3 1509 557 1512 +3 1236 725 1237 +3 949 946 1226 +3 183 946 949 +3 36 1232 998 +3 997 36 998 +3 874 1037 1043 +3 1226 1227 949 +3 1226 181 1227 +3 1123 702 1943 +3 740 739 1240 +3 1836 740 1240 +3 354 2 1891 +3 1229 1227 181 +3 1229 1228 1227 +3 1909 769 1358 +3 772 1909 1358 +3 923 1029 1028 +3 2178 1044 1674 +3 1232 36 950 +3 859 925 218 +3 925 1997 218 +3 924 217 1996 +3 1817 949 1230 +3 945 184 947 +3 2044 2048 2049 +3 2048 2044 2026 +3 2734 537 238 +3 1836 2496 2497 +3 1236 1020 735 +3 18 2642 2644 +3 1844 1839 1843 +3 1839 1844 1840 +3 1235 725 1236 +3 1243 1846 739 +3 1251 193 1847 +3 1366 1365 888 +3 1846 1250 1847 +3 1022 1842 1023 +3 458 1838 1242 +3 1842 1242 1841 +3 739 457 1243 +3 737 725 736 +3 2383 2386 2385 +3 2382 2383 2385 +3 1845 193 1840 +3 1255 193 1251 +3 184 535 947 +3 947 535 49 +3 535 1888 49 +3 1237 1239 1020 +3 1839 1838 1837 +3 1243 1250 1846 +3 192 456 457 +3 458 1242 1842 +3 1251 1252 1024 +3 339 2052 2051 +3 110 2065 2066 +3 1616 1617 130 +3 69 1616 130 +3 448 90 335 +3 1842 1841 1023 +3 2622 1418 2621 +3 1268 1270 367 +3 909 2050 2051 +3 2050 909 127 +3 1255 1841 193 +3 1247 1869 1868 +3 456 1254 457 +3 2552 60 2551 +3 1253 1254 456 +3 456 459 1249 +3 1249 439 1247 +3 1835 2496 1239 +3 2496 1835 2497 +3 1243 457 1254 +3 1496 1494 336 +3 2418 2419 763 +3 1277 1291 1653 +3 1909 1908 895 +3 1497 187 353 +3 2574 2230 2231 +3 1864 1865 1264 +3 1864 1265 1865 +3 440 2524 1412 +3 1254 1851 1244 +3 2308 2307 430 +3 1691 1692 1213 +3 1692 1215 1213 +3 1691 1690 1519 +3 450 1022 1258 +3 1909 1178 1908 +3 1263 1855 1262 +3 1024 1255 1251 +3 454 453 1259 +3 90 448 447 +3 448 186 447 +3 1256 1255 1024 +3 1255 1256 1023 +3 186 449 447 +3 1257 1260 54 +3 1023 1258 1022 +3 1023 1256 1258 +3 1256 1257 1258 +3 1258 1257 1259 +3 1245 1260 1252 +3 1488 2383 1285 +3 2383 1488 369 +3 1253 456 1862 +3 1861 1246 1862 +3 1367 768 1366 +3 1907 768 1367 +3 2764 1458 2743 +3 1459 2764 2743 +3 25 2052 339 +3 1263 1262 1866 +3 1519 1690 244 +3 1690 1212 244 +3 1457 386 1460 +3 1298 2110 2111 +3 1403 2327 2332 +3 2333 1403 2332 +3 2214 2219 2534 +3 2229 2219 2214 +3 2375 2380 2376 +3 140 74 908 +3 74 140 2054 +3 338 25 339 +3 520 570 571 +3 2598 250 2600 +3 1699 1038 1600 +3 1481 1479 369 +3 56 1789 2267 +3 1267 1270 1268 +3 1270 1267 366 +3 374 1267 1268 +3 433 1905 431 +3 1004 2186 2185 +3 351 1489 34 +3 1272 1801 1802 +3 2379 230 2378 +3 230 2377 2378 +3 1282 2394 53 +3 371 2683 2684 +3 1296 2107 2108 +3 1658 1293 228 +3 1314 98 285 +3 375 1282 1275 +3 1279 375 1275 +3 469 468 133 +3 1017 469 309 +3 1018 1017 309 +3 2393 1017 1018 +3 2684 2683 53 +3 2733 2732 2734 +3 551 2734 238 +3 555 537 2727 +3 2107 1296 1295 +3 1158 2107 1295 +3 1159 1291 1290 +3 1291 1289 1290 +3 1273 1282 53 +3 1269 1273 53 +3 1292 1159 2413 +3 312 153 311 +3 2125 17 1715 +3 2119 2120 1304 +3 2401 271 296 +3 1288 1277 1287 +3 2122 2125 2124 +3 375 1279 1695 +3 1656 1657 1279 +3 1656 1278 1657 +3 373 1969 1970 +3 424 1185 1187 +3 716 1623 642 +3 1131 716 642 +3 288 2184 2181 +3 2184 2182 2181 +3 1360 778 1359 +3 369 2384 2383 +3 2028 35 994 +3 370 1300 1319 +3 158 2100 2101 +3 227 2118 1306 +3 828 489 2682 +3 52 160 1478 +3 1305 52 1478 +3 1036 2429 1666 +3 1270 2378 367 +3 2378 1270 2379 +3 2730 2735 533 +3 1271 2375 2376 +3 1802 1271 1803 +3 1271 2376 1803 +3 1152 1307 1309 +3 1307 231 1309 +3 315 314 233 +3 231 1307 1295 +3 2111 2114 227 +3 1802 1803 1272 +3 2560 166 2549 +3 1158 2104 2106 +3 1158 2103 2104 +3 1153 1290 1289 +3 984 312 311 +3 1710 1709 2265 +3 1309 1311 470 +3 1153 1294 1295 +3 289 1336 2121 +3 2384 2386 2383 +3 1336 297 2121 +3 1300 229 1299 +3 83 1300 1299 +3 1607 1309 470 +3 48 1297 1313 +3 2272 1325 2275 +3 1325 2272 2273 +3 1422 1423 1399 +3 1114 1115 291 +3 1603 2301 1602 +3 1605 1308 1152 +3 1012 2211 2210 +3 371 2384 2391 +3 1116 1764 475 +3 1306 2112 227 +3 1280 1293 1658 +3 1603 225 1317 +3 1156 1603 1317 +3 475 1764 1763 +3 162 1476 1475 +3 2685 972 1816 +3 978 972 2685 +3 2114 2111 1301 +3 1315 1314 276 +3 1315 1297 275 +3 275 1297 48 +3 1315 276 1297 +3 2076 91 2077 +3 91 2076 2073 +3 2221 2760 2188 +3 1319 1302 1483 +3 369 1479 2387 +3 2384 369 2387 +3 160 52 159 +3 469 753 309 +3 1989 1991 322 +3 543 555 30 +3 555 2727 30 +3 189 1881 2437 +3 2396 1191 1190 +3 1009 2203 2206 +3 2106 2107 1158 +3 2107 2106 1298 +3 1290 2410 2413 +3 367 1802 1801 +3 1153 1295 1308 +3 1308 1295 1307 +3 1308 1307 1152 +3 47 280 283 +3 372 48 1313 +3 230 2370 1380 +3 1610 1154 1608 +3 1311 1309 1310 +3 235 314 315 +3 283 273 235 +3 2110 1301 2111 +3 98 1314 1315 +3 1311 276 1312 +3 276 1311 1310 +3 1660 1280 1659 +3 1312 1314 285 +3 1314 1312 276 +3 1301 2116 2115 +3 2115 2123 1303 +3 2123 1763 1303 +3 1010 2208 2206 +3 2410 2415 2413 +3 2651 2650 2142 +3 2412 2411 1153 +3 966 1155 1602 +3 1304 2120 2122 +3 1602 1157 1601 +3 2301 1292 2415 +3 1316 2409 2411 +3 2756 2196 2757 +3 647 2397 2396 +3 1357 777 1356 +3 1357 767 777 +3 911 778 623 +3 912 911 623 +3 611 911 914 +3 587 1650 1651 +3 805 575 396 +3 2478 783 2475 +3 952 2479 815 +3 405 1320 1321 +3 782 781 405 +3 2261 1013 1119 +3 1360 623 778 +3 1116 472 1119 +3 1322 1321 609 +3 1042 1129 2498 +3 1042 2769 1129 +3 2372 2379 366 +3 2379 1270 366 +3 2084 919 213 +3 2012 2673 1725 +3 1323 1322 609 +3 782 2299 2300 +3 1064 1600 871 +3 2274 1697 588 +3 2505 2506 1061 +3 1324 587 2270 +3 2400 284 2399 +3 2402 284 2400 +3 2074 977 2073 +3 977 2074 203 +3 2270 2269 1324 +3 404 2417 2418 +3 2417 2419 2418 +3 2563 2562 842 +3 2396 2397 1191 +3 1819 1822 688 +3 1330 1327 1328 +3 761 1330 1328 +3 1801 2264 1286 +3 2373 1475 1476 +3 918 1331 919 +3 1331 918 216 +3 1732 1730 1731 +3 2215 1950 1111 +3 77 1126 1395 +3 1757 1760 331 +3 1760 1139 331 +3 324 323 1744 +3 296 1336 270 +3 297 1336 296 +3 1038 871 1600 +3 1538 1534 1539 +3 728 1338 1337 +3 1340 1338 728 +3 1338 1340 1339 +3 1339 564 1338 +3 1339 569 564 +3 569 1339 565 +3 1346 1344 726 +3 564 1351 1350 +3 1351 564 1352 +3 451 1339 1340 +3 1339 451 565 +3 2168 2169 2765 +3 1349 1348 727 +3 450 1346 726 +3 955 957 411 +3 508 2267 2268 +3 453 1346 450 +3 1341 1347 727 +3 449 186 713 +3 1345 449 713 +3 1347 751 727 +3 451 1342 1343 +3 1349 727 480 +3 1343 713 566 +3 1344 713 1343 +3 713 1344 1345 +3 746 747 464 +3 463 2660 748 +3 2717 1432 467 +3 1344 1343 1342 +3 1347 728 751 +3 2660 178 748 +3 2659 178 2660 +3 1340 728 1347 +3 1340 1347 1341 +3 386 1345 453 +3 1345 1344 1346 +3 726 1342 1348 +3 726 1348 1349 +3 726 1349 450 +3 741 464 462 +3 741 744 464 +3 450 1349 1022 +3 1350 1351 729 +3 452 1353 1354 +3 1353 527 1354 +3 781 1360 1359 +3 411 2705 784 +3 569 1352 564 +3 1006 2201 2198 +3 497 1792 850 +3 887 888 403 +3 419 1516 615 +3 522 1772 526 +3 569 1353 1352 +3 452 1354 560 +3 561 452 560 +3 463 747 563 +3 776 406 779 +3 2443 1423 1422 +3 1379 885 886 +3 1362 1363 767 +3 1394 1910 644 +3 1910 1387 644 +3 1361 766 1362 +3 1576 1994 516 +3 590 1323 2271 +3 1357 1358 767 +3 1358 1361 767 +3 1407 1420 1400 +3 911 611 778 +3 611 772 1358 +3 1927 1922 758 +3 2331 1406 1402 +3 767 1361 1362 +3 888 1365 1364 +3 892 1363 1362 +3 1363 892 403 +3 1364 1363 403 +3 888 1364 403 +3 1177 772 1176 +3 766 892 1362 +3 774 1369 1370 +3 1177 774 1370 +3 1370 1368 768 +3 1178 1370 768 +3 1178 1177 1370 +3 1366 1368 775 +3 772 1177 1178 +3 2174 879 2173 +3 2174 2175 879 +3 2282 1161 2283 +3 2279 2282 1503 +3 1369 775 1368 +3 1370 1369 1368 +3 781 1359 405 +3 767 1363 1373 +3 709 708 2629 +3 1650 587 1324 +3 1646 608 1643 +3 1733 323 324 +3 1363 1364 1372 +3 2299 1322 2300 +3 767 1373 777 +3 1373 776 777 +3 1326 1697 2274 +3 1373 1363 1372 +3 1371 776 1372 +3 776 1373 1372 +3 1360 2477 623 +3 770 600 1376 +3 1374 770 1376 +3 1378 764 1379 +3 764 885 1379 +3 600 1377 1376 +3 1376 1377 766 +3 1234 724 1233 +3 1377 1378 766 +3 696 1186 695 +3 600 891 1377 +3 1028 1668 218 +3 554 217 924 +3 1378 1379 892 +3 766 1378 892 +3 1993 886 887 +3 1381 628 693 +3 670 1381 693 +3 1381 670 661 +3 1914 630 1915 +3 630 1916 1915 +3 1428 1417 1429 +3 1941 293 294 +3 1382 628 1381 +3 661 1382 1381 +3 2508 2509 1041 +3 2509 2512 1041 +3 980 219 979 +3 1809 219 980 +3 664 1388 1071 +3 651 1387 1390 +3 645 1384 602 +3 1072 1765 1115 +3 629 1390 1387 +3 629 1933 1390 +3 1870 1871 1265 +3 1874 1871 1870 +3 643 1804 1805 +3 2524 1410 2525 +3 644 1386 1385 +3 644 1387 1386 +3 628 1385 664 +3 644 1385 1383 +3 1383 1385 1382 +3 1385 628 1382 +3 1383 1382 643 +3 2523 1411 2333 +3 651 1388 1386 +3 1387 651 1386 +3 1934 1931 1932 +3 1931 650 1932 +3 2654 2653 596 +3 2654 2656 2653 +3 1615 1616 69 +3 1761 33 346 +3 644 1383 1384 +3 1929 1928 1925 +3 1391 1929 652 +3 598 1391 652 +3 598 1389 1391 +3 1388 1389 627 +3 1071 1388 627 +3 601 1818 1819 +3 1393 788 631 +3 1393 601 788 +3 290 1950 2298 +3 1388 664 1386 +3 1910 1394 1926 +3 1388 651 1389 +3 1407 2329 2330 +3 629 1926 1912 +3 1926 1911 1912 +3 638 665 666 +3 1389 651 1391 +3 440 1402 1406 +3 1666 862 1667 +3 862 1666 2429 +3 2672 700 2671 +3 92 1619 981 +3 1392 627 1389 +3 1394 644 1384 +3 1923 762 881 +3 1669 1672 1699 +3 200 2641 199 +3 126 261 1395 +3 260 1754 1752 +3 2123 475 1763 +3 475 2123 2116 +3 1263 1866 1865 +3 1496 353 75 +3 1497 353 1496 +3 1916 1922 1927 +3 1432 1431 1426 +3 1476 2720 1285 +3 2720 1476 1477 +3 2141 356 1891 +3 1441 1442 1134 +3 909 139 127 +3 838 837 1473 +3 306 152 307 +3 25 1002 2053 +3 189 1878 1881 +3 2328 2329 1407 +3 1436 441 2623 +3 2130 2131 356 +3 1411 1403 2333 +3 383 384 44 +3 1040 2513 1105 +3 1617 1616 127 +3 2449 1421 2528 +3 1410 2521 1428 +3 2521 1410 2520 +3 1811 862 1813 +3 1411 1406 1403 +3 1918 2259 1920 +3 630 1918 1920 +3 920 425 2450 +3 1439 2331 1402 +3 2331 1439 2444 +3 10 1413 2525 +3 1413 1412 2525 +3 1425 1424 460 +3 381 74 237 +3 1868 1869 1248 +3 2327 1408 2522 +3 1414 1413 441 +3 1418 1436 2623 +3 2701 1672 869 +3 1635 1415 1636 +3 2399 2398 271 +3 1409 2521 2520 +3 1416 1417 1404 +3 2314 2308 2311 +3 2330 1401 1420 +3 147 430 2307 +3 147 431 430 +3 1404 1417 1428 +3 353 1136 352 +3 1165 361 1166 +3 2332 2327 1409 +3 237 384 383 +3 2331 1401 2330 +3 188 442 1414 +3 349 74 376 +3 753 133 752 +3 133 1883 752 +3 1424 438 1405 +3 438 1424 1425 +3 2055 1002 143 +3 2053 1002 2055 +3 1879 2441 442 +3 579 583 1727 +3 2131 2130 2136 +3 1636 1415 1429 +3 1437 1441 1134 +3 1401 2443 1422 +3 439 1426 1427 +3 1426 1425 1427 +3 2260 2191 1013 +3 2443 2444 2442 +3 1807 1808 602 +3 1431 438 1426 +3 1431 1430 438 +3 2717 437 2718 +3 2714 2713 1433 +3 364 365 1883 +3 2525 2529 10 +3 2525 1410 2529 +3 1878 1880 1396 +3 838 2595 1435 +3 1879 189 2439 +3 460 1424 1421 +3 1881 1877 1398 +3 1877 1881 1878 +3 1434 2713 2714 +3 356 2140 2130 +3 1880 443 1396 +3 1397 443 1880 +3 442 1025 1397 +3 467 1432 1426 +3 1399 1423 1875 +3 1867 1870 1265 +3 1870 1867 1868 +3 1427 1425 460 +3 1248 1876 1875 +3 444 1461 436 +3 1426 438 1425 +3 2524 2525 1412 +3 2530 1947 1946 +3 1947 2530 703 +3 1807 633 626 +3 2133 2132 144 +3 2404 286 2403 +3 108 1936 1937 +3 1419 1701 1700 +3 600 1921 891 +3 1700 1701 1135 +3 1417 1636 1429 +3 1406 2331 2330 +3 2620 2623 1413 +3 1913 1914 1915 +3 714 2290 2284 +3 2290 714 2318 +3 1703 2771 1702 +3 1405 1636 1417 +3 1416 1405 1417 +3 1919 1918 649 +3 2259 1918 1919 +3 2716 467 459 +3 66 351 197 +3 351 66 1489 +3 132 73 2533 +3 1438 435 188 +3 1459 435 1471 +3 441 1437 1438 +3 2652 44 385 +3 2444 1439 2442 +3 265 266 1502 +3 266 267 1502 +3 1500 2302 2305 +3 2440 2439 1402 +3 1437 441 1436 +3 1447 491 1451 +3 188 1414 1438 +3 1134 435 1438 +3 2593 1440 2594 +3 2201 1008 2198 +3 2651 2136 358 +3 2652 2651 358 +3 2492 2491 434 +3 1977 1596 1597 +3 2637 2638 1442 +3 434 1474 1470 +3 1450 493 1448 +3 2 493 494 +3 1445 491 1447 +3 492 1445 1447 +3 2595 838 1473 +3 2639 2638 2637 +3 2639 1443 2638 +3 413 491 1446 +3 413 511 491 +3 1446 836 413 +3 413 836 835 +3 414 836 1446 +3 491 1445 1446 +3 1447 1448 492 +3 1448 1449 492 +3 445 1455 1137 +3 485 389 486 +3 926 1680 1685 +3 388 1447 1451 +3 2598 2600 253 +3 1472 2592 2593 +3 190 1472 2593 +3 493 1449 1448 +3 485 486 1902 +3 1448 388 1450 +3 1454 1455 1456 +3 1134 2492 1471 +3 1451 511 484 +3 511 1451 491 +3 511 389 484 +3 1447 388 1448 +3 482 1467 481 +3 1966 1444 1967 +3 1451 484 1452 +3 1454 1449 493 +3 388 1453 1450 +3 388 1452 1453 +3 2485 2486 780 +3 1456 387 1454 +3 1455 2 1137 +3 551 79 2734 +3 552 79 551 +3 1906 1367 771 +3 1456 1455 445 +3 1902 486 2483 +3 780 1174 2484 +3 1458 387 1456 +3 1457 1458 1456 +3 1459 444 435 +3 1452 1462 483 +3 1452 484 1462 +3 1457 445 446 +3 521 1785 1773 +3 1324 2269 2271 +3 2269 590 2271 +3 1471 1470 1459 +3 1134 1471 435 +3 1470 1471 434 +3 2766 826 822 +3 2744 1784 1795 +3 939 2746 2748 +3 1794 1784 2744 +3 1452 483 1453 +3 1462 1463 483 +3 1469 355 1468 +3 482 1469 1468 +3 485 1463 1462 +3 619 2583 1175 +3 1174 2583 619 +3 830 829 2236 +3 2680 829 830 +3 392 2580 2238 +3 1466 1467 482 +3 942 1984 2245 +3 2255 1445 492 +3 1561 2238 794 +3 1465 431 432 +3 433 431 1465 +3 1466 432 1467 +3 60 2552 2005 +3 2552 246 2005 +3 1465 1464 148 +3 1455 493 2 +3 255 1892 60 +3 415 837 838 +3 355 1453 483 +3 1468 355 483 +3 482 1468 1464 +3 2133 2142 2134 +3 476 834 816 +3 476 413 834 +3 476 510 413 +3 1284 2374 2367 +3 2168 2765 2167 +3 2765 1046 2167 +3 2141 481 2140 +3 1469 481 2141 +3 1664 889 764 +3 2689 301 2694 +3 493 1455 1454 +3 2638 2492 1442 +3 2492 2638 2491 +3 2491 2638 1443 +3 836 149 835 +3 414 837 836 +3 414 1473 837 +3 837 149 836 +3 1712 171 1713 +3 2398 1168 97 +3 1168 2398 272 +3 1305 1485 52 +3 2265 2266 2339 +3 1476 162 1477 +3 66 197 1684 +3 2368 1380 2370 +3 370 2367 2368 +3 1302 1484 1483 +3 1319 162 1475 +3 1475 370 1319 +3 1902 2483 391 +3 2395 1017 2393 +3 19 1898 1479 +3 2389 161 2388 +3 1478 1479 1481 +3 1478 160 1479 +3 2723 531 257 +3 2750 1797 56 +3 930 34 175 +3 34 1489 175 +3 2369 2370 372 +3 1482 1483 1484 +3 1482 162 1483 +3 1716 1714 155 +3 1717 1716 155 +3 1305 1484 1485 +3 1484 172 1485 +3 2730 2729 532 +3 2303 1501 146 +3 2303 2302 1501 +3 147 2307 2306 +3 1566 1544 512 +3 1501 1500 113 +3 220 2080 2088 +3 2726 2725 538 +3 2392 2395 2393 +3 1477 1480 1488 +3 172 1486 1485 +3 1486 172 1487 +3 1017 2389 469 +3 161 2389 1017 +3 1712 1487 172 +3 1487 1712 1713 +3 1480 1481 1488 +3 2727 538 30 +3 538 539 30 +3 2727 2726 538 +3 536 2724 2725 +3 2724 257 2725 +3 1493 1492 334 +3 1858 1246 1859 +3 1025 54 1263 +3 1493 336 1494 +3 143 1493 1494 +3 2306 2309 2305 +3 2309 1500 2305 +3 26 2058 2059 +3 140 908 909 +3 1879 1878 189 +3 430 23 2308 +3 1498 1495 75 +3 90 1497 336 +3 234 151 852 +3 447 187 1497 +3 90 447 1497 +3 1025 455 54 +3 1495 1498 2056 +3 1498 141 2056 +3 2136 2130 357 +3 2308 2314 428 +3 2138 114 362 +3 771 888 887 +3 2294 2295 865 +3 2294 880 2295 +3 2322 2323 1622 +3 2686 865 1109 +3 463 563 562 +3 1506 1513 558 +3 1513 1506 559 +3 466 561 1505 +3 559 1505 1507 +3 1355 1511 179 +3 523 1220 1517 +3 2129 2148 114 +3 2704 2703 2658 +3 2705 2704 784 +3 2657 1506 2658 +3 1506 784 2658 +3 1440 2713 1434 +3 2594 1440 1434 +3 2660 466 2659 +3 556 1510 529 +3 1509 1510 556 +3 1509 179 1510 +3 1508 1512 559 +3 1509 1512 1508 +3 2703 466 2658 +3 2703 2659 466 +3 1726 2009 579 +3 579 2009 2010 +3 1222 574 575 +3 2707 418 2708 +3 2705 785 2704 +3 557 1514 1512 +3 2435 2434 847 +3 1786 501 1787 +3 1510 1511 529 +3 179 1511 1510 +3 530 2721 2723 +3 2721 531 2723 +3 536 530 2724 +3 730 749 731 +3 730 563 749 +3 625 1513 1514 +3 1514 1513 1512 +3 2129 2147 2148 +3 452 562 1351 +3 1207 2741 1206 +3 2251 420 1553 +3 295 2058 2057 +3 806 2243 807 +3 393 806 807 +3 269 268 2149 +3 486 389 2575 +3 389 509 2575 +3 1561 488 2238 +3 408 1145 2240 +3 408 1144 1145 +3 144 2132 2131 +3 787 1821 2653 +3 1445 2255 1444 +3 1554 1559 421 +3 792 1520 1522 +3 2708 1435 191 +3 1545 1542 55 +3 1542 1541 55 +3 2222 2756 2761 +3 1546 1541 1542 +3 1536 1541 1546 +3 2231 2230 1521 +3 2691 905 2689 +3 2515 1031 1032 +3 2325 1627 723 +3 1528 792 1522 +3 583 1645 1644 +3 1527 1524 422 +3 303 152 304 +3 2690 2694 2695 +3 2697 301 2688 +3 1164 1121 288 +3 2677 1121 1164 +3 1532 982 1533 +3 1530 1532 1533 +3 434 2491 1474 +3 2057 2058 294 +3 299 298 295 +3 791 1525 1531 +3 2541 1631 2542 +3 1555 1570 1588 +3 1572 1555 1588 +3 1999 253 2600 +3 421 1551 1550 +3 2585 2584 1568 +3 2584 2585 1567 +3 789 1536 1569 +3 704 1026 1945 +3 982 983 1534 +3 2059 2058 295 +3 2541 2540 1631 +3 2064 2057 321 +3 1531 1539 1535 +3 1539 1531 1538 +3 2057 2064 295 +3 1937 1942 108 +3 1406 2329 1403 +3 2329 2328 1403 +3 282 281 47 +3 1723 215 87 +3 1546 1548 1569 +3 1551 789 1549 +3 2670 1948 2669 +3 1562 791 1535 +3 1587 1589 1571 +3 1543 1544 513 +3 1552 1557 790 +3 1097 578 1947 +3 578 1097 1725 +3 1547 1548 1564 +3 1548 1547 1549 +3 1560 793 1559 +3 1622 2324 1623 +3 2324 723 1623 +3 498 1 1556 +3 1546 1537 1548 +3 677 678 637 +3 677 1634 678 +3 513 1537 1543 +3 1942 12 293 +3 293 12 282 +3 1540 1539 55 +3 1543 1542 1545 +3 1543 1537 1542 +3 1545 55 1534 +3 1539 1534 55 +3 798 420 797 +3 422 1544 983 +3 512 1553 420 +3 1557 1558 790 +3 1937 1938 12 +3 421 1552 1551 +3 131 132 134 +3 1544 1543 983 +3 1054 880 2294 +3 1534 983 1545 +3 1540 1535 1539 +3 1536 1535 1540 +3 843 842 2588 +3 1565 1564 513 +3 1537 1546 1542 +3 512 420 514 +3 1567 1565 1563 +3 1565 1567 1564 +3 1591 2610 16 +3 1556 1 1560 +3 498 1556 786 +3 1946 1948 701 +3 2323 2324 1622 +3 321 2063 109 +3 1552 421 1557 +3 1579 1580 516 +3 1569 1536 1546 +3 1162 23 78 +3 2587 2584 1563 +3 2587 1568 2584 +3 1551 1552 789 +3 1171 640 1632 +3 422 1553 1544 +3 1558 1521 790 +3 2254 795 2234 +3 1120 1951 2218 +3 512 1544 1553 +3 1549 789 1569 +3 2609 16 2610 +3 2281 2364 2365 +3 234 552 78 +3 1121 961 2187 +3 1554 1550 1555 +3 2460 2577 843 +3 499 2614 1578 +3 2614 499 1768 +3 494 1450 1453 +3 482 1464 1466 +3 794 2232 1558 +3 796 2252 2251 +3 793 794 1558 +3 504 2601 2602 +3 2613 504 2602 +3 488 2239 2238 +3 1905 151 431 +3 1 1561 1560 +3 1 851 1561 +3 1561 851 488 +3 2063 2057 294 +3 1552 1562 789 +3 790 1521 1562 +3 506 1591 1592 +3 1550 1551 2586 +3 2586 2585 1568 +3 1570 1568 2587 +3 1550 1568 1555 +3 1555 1574 786 +3 1569 1548 1549 +3 2603 2613 2602 +3 1574 2606 786 +3 787 788 1821 +3 1554 421 1550 +3 1565 1566 507 +3 1566 1565 513 +3 1544 1566 513 +3 843 2588 1074 +3 2586 1568 1550 +3 982 1532 1594 +3 281 12 1938 +3 1567 1563 2584 +3 1570 1555 1568 +3 2491 1444 1474 +3 1555 1572 1574 +3 976 211 975 +3 2604 1575 2605 +3 507 1591 1590 +3 46 976 203 +3 516 505 515 +3 1573 2618 2608 +3 1582 1581 499 +3 684 2289 2288 +3 951 1232 1231 +3 1575 515 2605 +3 1790 505 1789 +3 2319 2317 691 +3 2287 2282 2283 +3 1779 2753 1800 +3 572 1779 1800 +3 206 205 59 +3 1577 2612 2614 +3 1768 1577 2614 +3 2611 2601 504 +3 69 129 125 +3 1583 1582 938 +3 2742 277 64 +3 1580 505 516 +3 218 1995 923 +3 1581 1768 499 +3 1708 2341 1707 +3 2659 785 2661 +3 1772 240 526 +3 240 527 526 +3 2170 1045 2166 +3 1064 871 2505 +3 238 555 543 +3 1230 949 1228 +3 876 2158 2157 +3 1809 1810 222 +3 862 1809 222 +3 979 972 2097 +3 972 2098 2097 +3 972 978 2098 +3 1817 1739 183 +3 2287 2283 2284 +3 1050 2172 1051 +3 2164 2160 2167 +3 2160 1048 2167 +3 848 1900 1899 +3 2357 2353 614 +3 2342 2102 51 +3 2342 156 2102 +3 183 949 1817 +3 578 1948 1947 +3 1620 714 3 +3 446 2326 1457 +3 2671 2674 580 +3 1709 2747 56 +3 1121 2677 1120 +3 517 1580 1579 +3 1585 2772 2771 +3 1300 1302 1319 +3 1707 1583 572 +3 1789 505 2268 +3 1781 1583 938 +3 543 545 212 +3 1200 1224 1209 +3 1563 1565 1589 +3 507 1566 1592 +3 1590 1589 507 +3 1571 1589 1590 +3 786 1554 1555 +3 507 1592 1591 +3 1554 786 1556 +3 604 788 787 +3 1554 1556 1559 +3 1556 1560 1559 +3 1588 1571 1593 +3 1590 1593 1571 +3 1590 16 1593 +3 2217 2216 1949 +3 1527 1594 1526 +3 1594 1523 1526 +3 2400 2401 2402 +3 2324 2323 2325 +3 1132 639 2150 +3 1978 1598 940 +3 1598 1979 940 +3 1980 1979 1598 +3 926 1683 1681 +3 1838 458 1020 +3 1156 1292 2301 +3 940 1976 1975 +3 1598 1599 27 +3 869 1669 1670 +3 2597 1595 2599 +3 2643 31 1682 +3 1828 1825 1826 +3 1829 28 1830 +3 1113 1957 1958 +3 1963 1954 1118 +3 2559 42 1831 +3 1599 1598 1597 +3 101 2550 2549 +3 2264 1287 1286 +3 1801 1272 2264 +3 1277 1286 1287 +3 1294 1158 1295 +3 1611 1155 1154 +3 2194 2227 2226 +3 206 58 205 +3 58 2490 205 +3 966 1605 1606 +3 966 1606 1155 +3 2087 2086 968 +3 2086 974 968 +3 2084 2083 919 +3 311 153 307 +3 958 471 1609 +3 232 958 1609 +3 1013 2207 1119 +3 1604 966 1601 +3 966 1602 1601 +3 2227 1005 2192 +3 1607 1152 1309 +3 1152 1607 1605 +3 1606 1605 1607 +3 143 1002 1491 +3 1609 1312 232 +3 470 1312 1609 +3 1311 1312 470 +3 1013 2261 2260 +3 1617 127 139 +3 2008 883 2007 +3 503 2610 506 +3 1614 1616 1615 +3 125 1615 69 +3 1615 125 1618 +3 1764 1072 1763 +3 2774 136 379 +3 694 2008 882 +3 2257 2008 694 +3 2015 2033 2031 +3 73 1617 139 +3 73 132 131 +3 2214 2534 2216 +3 2534 1949 2216 +3 130 73 131 +3 130 1617 73 +3 129 69 130 +3 71 129 130 +3 2002 248 2003 +3 2669 1948 578 +3 2668 2669 578 +3 126 1614 1615 +3 217 554 916 +3 318 321 109 +3 141 1499 2054 +3 2534 2219 2228 +3 961 2534 2228 +3 2284 2283 3 +3 689 1092 2466 +3 2465 690 1091 +3 1634 1633 640 +3 677 676 1633 +3 676 677 636 +3 1632 640 1633 +3 472 1612 2260 +3 2544 2545 2546 +3 2363 2544 2546 +3 723 1628 642 +3 721 642 1629 +3 1630 386 453 +3 1624 1623 716 +3 1102 2463 2462 +3 2458 1102 2462 +3 1173 2543 2363 +3 962 1101 1100 +3 1101 2462 1100 +3 963 68 254 +3 722 1131 642 +3 1623 723 642 +3 1103 2459 2458 +3 2459 1102 2458 +3 1461 1630 454 +3 2579 830 2236 +3 2067 299 2065 +3 2070 2068 110 +3 2068 2070 303 +3 2067 2065 110 +3 2691 300 2692 +3 2446 45 2445 +3 152 2070 320 +3 320 2070 110 +3 111 2691 2692 +3 2362 2363 1172 +3 678 1634 640 +3 1621 1622 1623 +3 2183 2260 1612 +3 2257 2259 1919 +3 2257 694 2259 +3 438 1635 1405 +3 2667 2671 700 +3 1920 2259 694 +3 1413 1414 1412 +3 1635 438 1430 +3 1435 1434 2714 +3 1324 1323 401 +3 1650 1324 401 +3 1145 393 807 +3 711 1641 710 +3 1291 1159 1652 +3 502 938 499 +3 401 1646 1648 +3 1649 401 1648 +3 1647 608 1646 +3 2559 62 167 +3 2634 802 2626 +3 1647 1646 1323 +3 1648 1646 1643 +3 608 612 583 +3 1644 608 583 +3 1642 1643 584 +3 585 2634 2626 +3 2627 2629 2632 +3 585 2627 2632 +3 586 1649 2626 +3 802 586 2626 +3 1647 394 612 +3 612 608 1647 +3 394 1647 609 +3 2489 1036 1035 +3 613 2348 2349 +3 609 1647 1323 +3 401 1649 1650 +3 1654 1656 1276 +3 1649 586 1651 +3 1649 1651 1650 +3 2564 1735 1742 +3 2408 1011 2407 +3 1277 1653 1286 +3 1275 1276 1656 +3 1159 1654 1652 +3 1652 1654 1276 +3 157 479 120 +3 159 157 120 +3 479 121 120 +3 2101 82 158 +3 1293 1294 1288 +3 1660 1659 1278 +3 1899 496 1770 +3 1654 1278 1656 +3 1655 1660 1278 +3 1970 1969 1275 +3 1329 588 760 +3 2100 159 2101 +3 159 52 2101 +3 1486 82 2101 +3 2117 227 2114 +3 1294 2103 1158 +3 1662 1454 387 +3 1474 1661 1470 +3 2124 1304 2122 +3 1660 1655 1292 +3 1470 1662 387 +3 1663 1378 1377 +3 1378 1663 764 +3 2425 2422 759 +3 2425 757 2422 +3 1664 891 1665 +3 891 1664 1663 +3 1664 764 1663 +3 2421 2417 404 +3 889 884 764 +3 2417 2421 2426 +3 1667 1668 1666 +3 1668 1667 859 +3 1814 1812 863 +3 1666 861 1036 +3 2686 1109 867 +3 1029 861 1028 +3 1668 859 218 +3 1371 1365 775 +3 861 1668 1028 +3 1677 2175 2174 +3 2176 1677 2174 +3 1670 1669 1039 +3 1044 1675 1674 +3 1675 1043 1674 +3 958 232 2179 +3 46 550 976 +3 1675 1050 1034 +3 1845 1241 1846 +3 2162 1671 870 +3 872 1049 1056 +3 1671 1670 1039 +3 2295 1059 2296 +3 1059 2295 876 +3 1095 2502 702 +3 1722 1721 154 +3 874 1675 1034 +3 2174 2173 1044 +3 2176 2174 1044 +3 1122 1123 1943 +3 1037 874 1032 +3 1045 1670 1671 +3 874 1043 1675 +3 1834 262 1753 +3 1670 1676 869 +3 1670 1045 1676 +3 2335 946 947 +3 946 945 947 +3 201 4 1679 +3 1673 1678 1674 +3 2018 116 2023 +3 519 1774 2702 +3 662 663 606 +3 2664 692 2666 +3 1890 90 334 +3 1687 660 681 +3 1729 197 323 +3 2568 2567 343 +3 387 1458 2764 +3 2643 1682 9 +3 200 199 201 +3 2343 200 201 +3 119 118 122 +3 250 941 85 +3 250 1976 941 +3 1999 1998 253 +3 681 660 682 +3 2647 195 2648 +3 2008 2007 882 +3 175 1683 926 +3 927 175 926 +3 1686 1684 1682 +3 32 2035 2034 +3 32 2036 2035 +3 1614 1698 2050 +3 1595 2598 2599 +3 1683 1686 1681 +3 1866 1262 1873 +3 1262 1858 1873 +3 2017 2023 935 +3 1848 1250 1244 +3 1400 2527 1408 +3 1923 881 648 +3 679 632 1688 +3 679 667 632 +3 679 1688 1687 +3 675 679 1687 +3 603 1068 1069 +3 1688 632 707 +3 1852 1252 1850 +3 1882 2442 2437 +3 1861 1860 1246 +3 1693 1519 1517 +3 1519 1208 1517 +3 1220 1693 1517 +3 524 1691 1693 +3 1772 1771 521 +3 938 1782 1781 +3 1696 1318 375 +3 1657 1694 1279 +3 1657 228 1694 +3 1658 228 1657 +3 1281 1694 228 +3 1696 1695 1281 +3 1059 876 2156 +3 1326 1085 1697 +3 1096 703 1095 +3 1698 338 339 +3 1698 1395 338 +3 126 1395 1698 +3 126 1698 1614 +3 1706 1705 508 +3 1300 370 2369 +3 1436 1700 1135 +3 1700 1436 1418 +3 1582 1702 1586 +3 1581 1582 1586 +3 2007 893 765 +3 883 893 2007 +3 1418 2623 2620 +3 952 815 1183 +3 1817 950 1739 +3 2269 2275 1325 +3 2275 2269 2270 +3 1679 202 2455 +3 1790 1788 501 +3 1583 1703 1702 +3 379 378 2774 +3 2738 244 2737 +3 1711 172 1484 +3 1302 1711 1484 +3 826 2127 822 +3 2490 7 205 +3 2733 2734 79 +3 2474 2473 2472 +3 2471 2474 2472 +3 833 2575 490 +3 833 2676 2575 +3 1214 1211 1212 +3 849 2736 852 +3 2729 531 532 +3 2341 1584 1704 +3 1707 2341 1704 +3 2266 1584 2339 +3 2341 2340 1584 +3 2280 2430 2293 +3 156 2100 2102 +3 2100 158 2102 +3 171 83 224 +3 171 1711 83 +3 243 822 2127 +3 821 822 243 +3 172 1711 1712 +3 82 1486 1487 +3 1732 997 996 +3 1721 1719 154 +3 1713 171 1714 +3 1719 64 154 +3 171 1712 1711 +3 1476 1285 2381 +3 701 2670 708 +3 82 170 169 +3 272 98 273 +3 17 269 1715 +3 823 821 478 +3 155 1720 1717 +3 2448 1027 2075 +3 2447 2446 2448 +3 1717 263 1716 +3 263 1717 1718 +3 1719 1718 264 +3 1719 24 1718 +3 64 1719 264 +3 24 263 1718 +3 2075 7 2448 +3 2447 2448 7 +3 209 2083 2084 +3 38 209 2084 +3 266 1721 1723 +3 1721 266 24 +3 266 1723 87 +3 2645 2644 9 +3 1722 214 215 +3 1721 1722 1723 +3 1758 1759 340 +3 1714 1724 1713 +3 1724 1714 1716 +3 1716 170 1724 +3 1097 698 1725 +3 2675 1637 1638 +3 1637 1639 582 +3 576 1151 1223 +3 576 2472 1151 +3 994 2036 2042 +3 2010 1639 699 +3 2010 2009 1639 +3 1639 1640 699 +3 1578 2603 503 +3 2170 1677 1045 +3 2172 2171 1047 +3 2038 2024 2037 +3 261 259 1752 +3 820 243 844 +3 1729 1730 37 +3 323 1730 1729 +3 325 1333 328 +3 1333 325 1734 +3 1736 1731 325 +3 1733 1731 323 +3 1744 323 99 +3 2230 2574 1520 +3 792 2230 1520 +3 2564 2565 2573 +3 2565 2564 345 +3 325 1738 1737 +3 1743 326 340 +3 93 917 918 +3 260 341 1754 +3 1743 324 1744 +3 36 1738 1739 +3 1730 1732 37 +3 37 1732 996 +3 38 344 215 +3 325 328 1738 +3 1733 324 1735 +3 1126 337 332 +3 2573 2565 2569 +3 1741 1331 216 +3 1041 2512 875 +3 213 1333 1334 +3 36 997 1737 +3 340 1745 1742 +3 345 1745 1746 +3 1741 1332 1331 +3 2746 2750 2748 +3 2750 2746 1780 +3 1737 1738 36 +3 1070 1393 631 +3 1392 692 1818 +3 1891 2 494 +3 1889 335 1890 +3 355 1891 494 +3 36 1739 950 +3 1741 328 1332 +3 1072 226 1763 +3 1739 1738 328 +3 1740 1739 328 +3 1741 1740 328 +3 916 216 918 +3 216 1740 1741 +3 2142 144 2651 +3 1742 1743 340 +3 326 1743 1744 +3 99 326 1744 +3 327 326 99 +3 1754 337 77 +3 1734 325 2570 +3 2569 88 2571 +3 2570 2569 2571 +3 1750 343 2567 +3 342 1750 2567 +3 460 1421 1399 +3 1751 259 65 +3 260 1749 1748 +3 342 1748 1749 +3 1749 65 1750 +3 1750 342 1749 +3 2431 2430 2291 +3 327 99 351 +3 77 261 1752 +3 260 1752 1751 +3 341 1753 1754 +3 1753 1755 1754 +3 347 330 346 +3 1758 329 1757 +3 331 1141 1490 +3 1756 331 1490 +3 1141 89 1490 +3 1491 1490 89 +3 1492 1491 89 +3 1141 1140 89 +3 1753 262 1755 +3 948 330 181 +3 948 1140 330 +3 1850 1849 1244 +3 1850 1252 1849 +3 2020 2030 2029 +3 2030 2019 2029 +3 2018 2023 2017 +3 262 1759 1758 +3 262 1758 1757 +3 948 333 1140 +3 33 1762 327 +3 1762 326 327 +3 1762 33 1761 +3 329 1762 1761 +3 1613 475 2116 +3 1072 1073 226 +3 472 1116 1613 +3 40 103 104 +3 1115 292 1072 +3 4 931 1766 +3 1765 1072 1764 +3 1612 472 1613 +3 4 1766 202 +3 927 1685 202 +3 1766 927 202 +3 129 70 125 +3 931 4 932 +3 929 1767 928 +3 121 70 129 +3 1777 571 570 +3 549 92 967 +3 517 1769 1581 +3 1586 517 1581 +3 1769 517 1579 +3 1776 1777 570 +3 2658 784 2704 +3 2662 178 2707 +3 242 2768 1130 +3 496 521 1770 +3 1327 590 2269 +3 1353 569 527 +3 1773 1772 521 +3 1772 1773 240 +3 163 1894 19 +3 1774 525 1775 +3 1710 2747 1709 +3 530 239 526 +3 1786 518 501 +3 1208 1519 2738 +3 571 1777 1778 +3 2751 1710 2336 +3 1787 1788 1798 +3 2752 2749 2751 +3 1800 2752 2751 +3 571 2754 2755 +3 610 394 609 +3 502 500 1218 +3 938 502 1782 +3 1327 2269 1325 +3 2657 2658 466 +3 1776 1783 1777 +3 1505 2657 466 +3 1518 1208 2740 +3 1775 2517 523 +3 523 1799 1775 +3 382 383 361 +3 1211 2737 244 +3 1774 1775 1799 +3 1786 1787 519 +3 1789 2268 2267 +3 2336 2337 1708 +3 505 1790 498 +3 1580 2268 505 +3 501 498 1790 +3 502 520 1782 +3 521 496 1791 +3 1705 1706 2773 +3 1791 1792 518 +3 1791 496 1792 +3 2333 2520 2523 +3 2517 1775 2516 +3 2517 2516 1783 +3 2519 2332 1409 +3 2738 1519 244 +3 313 2371 2372 +3 2266 1709 2267 +3 1780 1795 1796 +3 2523 1410 2524 +3 1793 1794 1778 +3 1777 1793 1778 +3 1798 1774 519 +3 1787 1798 519 +3 1795 1784 1796 +3 56 1797 1788 +3 526 239 522 +3 525 1797 1796 +3 1796 1797 1780 +3 2752 2753 939 +3 1788 1797 1798 +3 525 1798 1797 +3 313 372 2371 +3 2262 2263 1272 +3 1272 1803 2262 +3 1274 1269 367 +3 372 2370 2371 +3 661 605 1804 +3 661 685 605 +3 2419 1188 763 +3 2611 1576 2601 +3 1804 605 633 +3 605 634 633 +3 633 1806 1805 +3 643 1805 1806 +3 643 1806 602 +3 1384 643 602 +3 688 962 1092 +3 1824 962 688 +3 1383 643 1384 +3 606 1808 1807 +3 1125 1824 656 +3 1809 862 1811 +3 708 2672 2630 +3 652 759 2665 +3 652 1925 757 +3 699 1640 2667 +3 980 1619 1810 +3 1810 1619 546 +3 104 2342 51 +3 218 923 1028 +3 219 1811 1812 +3 1816 972 979 +3 1054 1055 1053 +3 2327 2328 1407 +3 474 2182 2190 +3 1230 950 1817 +3 2289 1503 2288 +3 1508 559 1507 +3 1082 1823 687 +3 42 8 1825 +3 1080 95 1081 +3 689 1820 688 +3 1819 688 1820 +3 94 577 576 +3 634 605 697 +3 2656 634 697 +3 634 2656 2654 +3 664 1385 1386 +3 601 1821 788 +3 962 1824 1125 +3 1955 1952 1117 +3 1827 80 1599 +3 1979 941 1976 +3 80 57 40 +3 1827 57 80 +3 1831 1829 1832 +3 1831 62 2559 +3 1745 1834 1746 +3 1826 1827 28 +3 1827 1599 28 +3 292 1115 1957 +3 1827 1826 57 +3 1832 62 1831 +3 42 1828 1829 +3 1828 28 1829 +3 1828 1826 28 +3 1415 2621 1429 +3 2622 2621 1415 +3 1759 1745 340 +3 1745 1759 1834 +3 1888 1889 49 +3 1595 1975 1976 +3 57 107 40 +3 42 1829 1831 +3 100 2561 2560 +3 8 2561 100 +3 2550 100 2560 +3 102 29 103 +3 1832 1833 43 +3 78 203 1027 +3 2335 49 948 +3 2334 2335 948 +3 946 2335 2334 +3 1838 1020 1239 +3 1837 1838 1239 +3 535 1887 1888 +3 738 457 739 +3 1839 1840 1242 +3 458 1842 1022 +3 1844 1241 1845 +3 1844 1843 1241 +3 1841 1255 1023 +3 1229 423 985 +3 2494 1240 2493 +3 1240 1843 2493 +3 1836 1240 2494 +3 2494 2493 1837 +3 1849 1848 1244 +3 1847 1848 1251 +3 1245 1855 1260 +3 1247 1427 1869 +3 1844 1845 1840 +3 1843 1240 739 +3 1241 1843 739 +3 739 1846 1241 +3 1245 1252 1852 +3 78 552 203 +3 2020 2022 932 +3 347 423 181 +3 2139 2146 362 +3 2146 2138 362 +3 1849 1252 1251 +3 1851 1850 1244 +3 1851 1689 1850 +3 1254 1253 1851 +3 1253 1689 1851 +3 1847 1250 1848 +3 1260 1855 54 +3 1245 1853 1854 +3 1853 1245 1852 +3 1855 1245 1854 +3 1869 1876 1248 +3 333 334 1492 +3 1139 1140 1141 +3 330 1140 1139 +3 1253 1862 1261 +3 1862 1246 1261 +3 1857 1854 1853 +3 1856 1857 1853 +3 1852 1689 1853 +3 1261 1857 1856 +3 1246 1858 1261 +3 1858 1857 1261 +3 1266 1247 1868 +3 1253 1261 1856 +3 1864 1264 1863 +3 769 1909 895 +3 1858 1859 1873 +3 25 2053 2052 +3 1859 1246 1860 +3 1249 1862 456 +3 1249 1861 1862 +3 895 1907 1906 +3 436 1461 454 +3 1266 1868 1867 +3 1863 1859 1860 +3 1266 1863 1860 +3 1864 1863 1867 +3 1266 1867 1863 +3 1866 1264 1865 +3 1859 1863 1264 +3 349 139 908 +3 1868 1248 1870 +3 2051 2052 140 +3 1872 1396 443 +3 1872 1865 1265 +3 1865 1872 443 +3 1872 1265 1871 +3 1871 1396 1872 +3 1264 1866 1873 +3 1873 1859 1264 +3 1858 1262 1857 +3 1875 1876 1399 +3 1248 1874 1870 +3 1876 460 1399 +3 460 1876 1869 +3 2440 2441 1879 +3 1874 1877 1871 +3 1398 1877 1874 +3 1877 1396 1871 +3 318 1163 321 +3 1495 2055 143 +3 1398 1874 1875 +3 1874 1248 1875 +3 1879 2439 2440 +3 1875 1423 1882 +3 1398 1875 1882 +3 1879 1397 1880 +3 1878 1879 1880 +3 1869 1427 460 +3 442 1397 1879 +3 1878 1396 1877 +3 45 2447 1935 +3 2438 189 2437 +3 1881 1398 1882 +3 1883 365 752 +3 133 1884 1883 +3 1884 364 1883 +3 134 364 1884 +3 198 2043 2049 +3 1698 339 2050 +3 2498 2499 1042 +3 1128 877 2498 +3 877 2499 2498 +3 960 2677 1164 +3 2641 2640 1886 +3 1885 194 35 +3 2027 198 2048 +3 2040 2024 2039 +3 214 1722 910 +3 539 2730 533 +3 857 223 856 +3 1887 448 335 +3 948 49 1889 +3 333 948 1889 +3 335 1889 1888 +3 1890 333 1889 +3 334 333 1890 +3 335 90 1890 +3 1895 1897 19 +3 101 2549 2548 +3 532 2735 2730 +3 1006 2204 2203 +3 164 71 165 +3 121 71 164 +3 119 70 121 +3 121 129 71 +3 479 20 119 +3 134 1884 1896 +3 1884 468 1896 +3 468 1884 133 +3 19 1894 1895 +3 1423 2442 1882 +3 1423 2443 2442 +3 177 531 2721 +3 531 177 567 +3 160 19 1479 +3 134 132 364 +3 1488 1481 369 +3 1770 848 1899 +3 850 495 851 +3 1903 241 849 +3 241 1903 848 +3 1901 848 1903 +3 1900 1901 391 +3 1902 1904 433 +3 1902 1901 1904 +3 86 1985 2245 +3 86 1987 1985 +3 148 485 1902 +3 497 850 851 +3 495 488 851 +3 2648 2646 2647 +3 1903 1904 1901 +3 1904 1905 433 +3 793 1561 794 +3 849 1905 1904 +3 849 151 1905 +3 849 852 151 +3 1137 187 445 +3 883 894 893 +3 893 894 771 +3 894 1906 771 +3 769 895 1375 +3 894 895 1906 +3 1375 895 894 +3 1178 768 1908 +3 1908 768 1907 +3 1249 1247 1861 +3 1909 772 1178 +3 1488 2720 1477 +3 191 2716 461 +3 1929 650 1928 +3 1933 650 1929 +3 1394 1384 645 +3 2424 763 591 +3 2341 1708 2340 +3 649 630 1914 +3 630 649 1918 +3 758 1925 1928 +3 671 666 667 +3 2260 474 2191 +3 649 891 1921 +3 1924 1923 648 +3 630 1920 1917 +3 1921 1919 649 +3 474 2190 2191 +3 2262 1318 1696 +3 764 884 885 +3 884 881 882 +3 885 884 882 +3 762 1917 1920 +3 934 2018 2017 +3 1026 2577 2576 +3 1916 1917 1922 +3 1917 762 1922 +3 630 1917 1916 +3 814 815 409 +3 1188 1187 696 +3 1923 1922 762 +3 2019 116 2018 +3 1700 2622 1419 +3 1923 1924 758 +3 1913 1934 1912 +3 1916 1927 1930 +3 1927 1928 1930 +3 1931 1930 650 +3 1930 1928 650 +3 1390 1933 1391 +3 1916 1930 1931 +3 1915 1916 1931 +3 1407 1400 1408 +3 2528 2527 1400 +3 1933 1929 1391 +3 595 665 1071 +3 1931 1934 1915 +3 1932 1933 629 +3 1932 629 1912 +3 1913 1912 646 +3 112 45 1935 +3 1932 650 1933 +3 2621 1418 2620 +3 1913 1915 1934 +3 1936 13 1937 +3 1937 13 1938 +3 1967 2491 1443 +3 1473 1967 1443 +3 108 1941 1940 +3 1942 293 1941 +3 108 1942 1941 +3 1940 1939 108 +3 2247 2246 1985 +3 2278 1064 2503 +3 1527 983 982 +3 1944 1943 702 +3 1944 1945 1943 +3 2670 701 1948 +3 2503 2276 2278 +3 1335 289 959 +3 959 289 960 +3 2533 139 2532 +3 2222 2761 2225 +3 1625 2325 2323 +3 703 1097 1947 +3 1946 1947 1948 +3 2576 2577 1122 +3 1062 2511 1128 +3 1944 1946 1945 +3 1946 704 1945 +3 1172 2363 2546 +3 635 678 640 +3 701 704 1946 +3 449 2326 446 +3 1955 1953 1952 +3 1164 959 960 +3 1120 1949 1121 +3 1949 961 1121 +3 1117 1952 1120 +3 1115 1114 1958 +3 292 1956 1117 +3 2186 1004 2223 +3 2197 1005 2193 +3 1012 2199 1011 +3 1113 1964 1956 +3 2221 2188 2220 +3 1111 290 1954 +3 1953 1954 290 +3 2144 359 358 +3 359 2652 358 +3 1114 350 1959 +3 1111 1954 1112 +3 1962 1965 1960 +3 1965 1962 1959 +3 1956 292 1957 +3 2226 2227 2678 +3 1964 1113 1962 +3 1964 1962 1963 +3 1956 1964 1955 +3 1965 1959 350 +3 42 15 8 +3 1959 1113 1958 +3 1112 1960 1961 +3 2561 15 2558 +3 1960 350 1961 +3 166 2558 2557 +3 2561 2558 166 +3 8 15 2561 +3 1963 1118 1964 +3 388 1451 1452 +3 414 1446 1966 +3 1445 1966 1446 +3 1652 1276 1968 +3 1653 1652 1968 +3 1201 1199 2353 +3 1201 1202 1199 +3 1969 1276 1275 +3 373 1653 1969 +3 1653 373 1286 +3 1653 1968 1969 +3 1968 1276 1969 +3 2557 2554 2553 +3 1286 373 1274 +3 348 63 2556 +3 1971 348 2556 +3 31 200 2343 +3 2457 31 2343 +3 2596 1595 2597 +3 62 1832 43 +3 681 2150 639 +3 1977 940 1975 +3 1977 1974 1596 +3 1977 1975 1974 +3 1596 43 1833 +3 2640 2641 18 +3 1596 1974 1973 +3 1975 1595 1974 +3 1596 1973 43 +3 1980 941 1979 +3 1982 1981 942 +3 1981 1982 1980 +3 1978 940 1977 +3 1597 1978 1977 +3 1833 1597 1596 +3 1830 1597 1833 +3 2247 85 2246 +3 942 2246 1982 +3 2245 2246 942 +3 2648 195 995 +3 18 1885 2640 +3 1885 18 2645 +3 169 1986 1984 +3 1983 169 1984 +3 420 2251 2252 +3 685 680 605 +3 1991 904 322 +3 1194 1193 322 +3 1193 1989 322 +3 80 81 1981 +3 80 1981 27 +3 1981 1980 27 +3 1982 941 1980 +3 2247 128 965 +3 85 941 1982 +3 1988 65 258 +3 2697 2698 301 +3 897 2698 2697 +3 1988 258 128 +3 1981 1983 942 +3 1981 81 1983 +3 965 85 2247 +3 1984 942 1983 +3 2233 795 2254 +3 169 81 168 +3 81 169 1983 +3 265 1502 86 +3 1502 1987 86 +3 169 170 1986 +3 1988 128 1987 +3 197 1728 1684 +3 1750 65 1988 +3 267 1750 1988 +3 87 1750 267 +3 267 1988 1987 +3 796 2250 2249 +3 799 2249 2250 +3 1992 1379 886 +3 588 1329 2273 +3 2270 587 1326 +3 1573 2608 2609 +3 1328 1327 1325 +3 1992 892 1379 +3 2611 2615 1994 +3 887 403 1993 +3 892 1992 403 +3 1992 1993 403 +3 2298 2619 290 +3 2619 2298 1951 +3 218 1997 1995 +3 1106 2453 5 +3 1996 1997 924 +3 1766 1767 927 +3 2454 1215 1692 +3 2454 1216 1225 +3 1215 2454 1225 +3 524 2454 1692 +3 2454 524 1216 +3 963 251 252 +3 964 907 963 +3 348 1998 2000 +3 247 348 2001 +3 63 348 247 +3 348 2000 2001 +3 2001 2000 41 +3 2001 2003 247 +3 1619 92 547 +3 2006 517 1586 +3 2005 2004 60 +3 247 2004 2005 +3 2004 248 60 +3 122 70 119 +3 248 2004 2003 +3 517 2006 1706 +3 2772 1585 2773 +3 2033 2017 935 +3 1367 1366 888 +3 2528 1416 2527 +3 2019 2018 934 +3 243 820 821 +3 1807 1806 633 +3 2345 2346 1202 +3 2631 2628 1638 +3 2016 2033 2034 +3 877 2500 2499 +3 923 2453 1106 +3 1040 2508 2506 +3 196 2027 2048 +3 1885 2027 196 +3 2048 198 2049 +3 2026 115 196 +3 35 2027 1885 +3 2044 2045 2026 +3 2045 2044 2025 +3 199 2047 201 +3 2016 934 2017 +3 2034 2033 2015 +3 2043 2038 2025 +3 2043 2039 2038 +3 96 987 986 +3 96 992 988 +3 1081 662 606 +3 933 2019 934 +3 2021 932 937 +3 2020 116 2030 +3 116 2019 2030 +3 2041 198 2028 +3 1679 2343 201 +3 1679 2457 2343 +3 2040 2039 2041 +3 61 993 994 +3 2042 2036 32 +3 202 1685 2455 +3 1699 2278 1063 +3 1998 1971 1972 +3 2044 2049 2043 +3 2041 2039 198 +3 1042 2500 1041 +3 2048 2026 196 +3 2029 2022 2020 +3 2022 2029 933 +3 2029 2019 933 +3 1503 1504 686 +3 2279 1503 686 +3 933 928 2022 +3 2014 2031 935 +3 2031 2033 935 +3 2035 2016 2034 +3 2035 988 2016 +3 2513 2507 1031 +3 2161 2160 2164 +3 2013 936 2014 +3 988 992 2016 +3 2511 877 1128 +3 1110 2296 875 +3 2512 1110 875 +3 2040 2042 32 +3 2015 2032 2024 +3 2032 2037 2024 +3 2032 936 2037 +3 2502 1944 702 +3 1946 1944 2530 +3 2451 920 2450 +3 994 993 2036 +3 2015 2040 32 +3 32 2034 2015 +3 2040 2015 2024 +3 993 61 1001 +3 2037 936 2025 +3 2046 115 2045 +3 198 2039 2043 +3 868 1110 2512 +3 2042 2040 2041 +3 936 2045 2025 +3 1039 1063 1062 +3 1039 1062 870 +3 1669 1063 1039 +3 1601 1157 2409 +3 1045 1671 2166 +3 4 201 2047 +3 937 2047 2046 +3 2046 2047 115 +3 287 2758 2759 +3 878 2161 2164 +3 199 115 2047 +3 932 2047 937 +3 4 2047 932 +3 2309 2313 1500 +3 428 2313 2309 +3 2310 1500 2313 +3 26 1940 2058 +3 1940 294 2058 +3 2308 23 2311 +3 791 1531 1535 +3 113 2060 298 +3 2060 26 2059 +3 26 2061 1940 +3 1940 2061 1939 +3 2061 112 1939 +3 2062 112 2061 +3 427 112 2062 +3 112 427 45 +3 113 1500 2310 +3 2310 2062 113 +3 307 152 320 +3 2069 22 299 +3 299 295 2065 +3 2068 2069 2067 +3 2069 299 2067 +3 2068 2067 110 +3 343 215 344 +3 975 91 977 +3 2085 91 975 +3 205 204 2071 +3 479 157 20 +3 59 208 214 +3 208 59 2071 +3 22 1501 298 +3 1501 113 298 +3 152 303 2070 +3 2082 210 2078 +3 210 2082 2086 +3 2083 2079 919 +3 203 2074 1027 +3 204 2074 2073 +3 2075 2074 204 +3 1027 2074 2075 +3 2446 2445 1162 +3 2071 59 205 +3 2075 204 205 +3 7 2075 205 +3 24 1719 1721 +3 1422 1421 2449 +3 1421 1422 1399 +3 2080 2079 210 +3 214 2081 38 +3 549 211 548 +3 2081 209 38 +3 220 922 2080 +3 2078 2079 2083 +3 208 2077 2081 +3 2076 2077 208 +3 220 2091 970 +3 2078 2083 209 +3 2077 2078 209 +3 203 976 977 +3 157 156 20 +3 156 157 2100 +3 204 2072 2071 +3 2085 2082 91 +3 1317 1280 1156 +3 210 2086 2087 +3 2087 2088 2080 +3 2088 2087 968 +3 2087 2080 210 +3 549 967 2089 +3 968 549 2089 +3 968 2089 2088 +3 969 2090 967 +3 969 2091 2090 +3 2091 220 2090 +3 970 2093 971 +3 2072 208 2071 +3 206 59 207 +3 2095 92 981 +3 2097 221 979 +3 967 92 2095 +3 969 2094 2092 +3 11 58 206 +3 2095 981 221 +3 980 981 1619 +3 221 2094 2095 +3 969 2095 2094 +3 2686 2294 865 +3 2085 2099 2082 +3 2086 2099 974 +3 2082 2099 2086 +3 1317 225 2105 +3 1293 2103 1294 +3 2102 158 51 +3 2103 1293 1280 +3 2104 2103 1280 +3 1280 1317 2104 +3 1317 2105 2104 +3 1296 231 1295 +3 1297 2109 1313 +3 2108 229 2109 +3 1296 2108 2109 +3 2113 2112 1299 +3 2124 2125 224 +3 2110 1298 2106 +3 2105 2110 2106 +3 2108 2113 229 +3 1298 2112 2113 +3 2111 2112 1298 +3 1297 1296 2109 +3 231 1296 1297 +3 2106 2104 2105 +3 2105 1301 2110 +3 2123 2115 2116 +3 232 1312 285 +3 1298 2113 2108 +3 2124 2118 1304 +3 2118 2124 1306 +3 84 51 168 +3 227 2117 2118 +3 1301 2115 2114 +3 226 1073 2121 +3 1303 2119 2117 +3 2119 2118 2117 +3 2119 1304 2118 +3 1156 1280 1660 +3 1303 226 2119 +3 1303 1763 226 +3 2105 225 2116 +3 2105 2116 1301 +3 225 1613 2116 +3 1073 289 2121 +3 1336 289 1335 +3 2117 2115 1303 +3 297 2120 2121 +3 297 2122 2120 +3 2126 1715 171 +3 224 1306 2124 +3 82 169 168 +3 2125 1715 2126 +3 1714 171 1715 +3 171 224 2126 +3 2682 489 2681 +3 828 2682 826 +3 395 828 826 +3 826 2682 2127 +3 487 845 833 +3 1467 2148 481 +3 2148 2147 481 +3 2143 2139 362 +3 2135 2134 142 +3 787 2653 2656 +3 2502 2530 1944 +3 2502 703 2530 +3 302 359 896 +3 2700 302 896 +3 2537 1173 2362 +3 1891 2132 354 +3 1891 356 2132 +3 352 2134 2135 +3 354 2132 2133 +3 1508 1507 179 +3 2650 2651 385 +3 2133 2134 352 +3 2524 1411 2523 +3 2320 691 2315 +3 357 2129 2138 +3 1499 1498 142 +3 147 2306 429 +3 353 352 2135 +3 357 2138 2137 +3 2129 114 2138 +3 898 145 363 +3 2147 2130 2140 +3 155 2149 1720 +3 2149 268 1720 +3 300 2691 2693 +3 2149 155 1715 +3 2142 2133 144 +3 385 44 384 +3 2688 904 2697 +3 411 621 955 +3 2143 363 2139 +3 363 145 2139 +3 114 801 362 +3 242 825 2768 +3 2143 2304 146 +3 626 606 1807 +3 2689 905 2688 +3 301 2689 2688 +3 1528 1529 792 +3 2140 481 2147 +3 1715 269 2149 +3 268 269 97 +3 1132 2150 2151 +3 2150 681 2151 +3 659 1132 2151 +3 2152 1504 684 +3 2153 2152 684 +3 691 2317 2316 +3 2151 681 682 +3 2152 2151 682 +3 2283 2285 3 +3 1161 2285 2283 +3 714 2284 3 +3 659 2152 2153 +3 659 2151 2152 +3 1621 1623 1624 +3 1019 716 1131 +3 985 989 2154 +3 96 2154 989 +3 182 985 986 +3 2157 2156 876 +3 1060 870 1129 +3 293 109 2063 +3 1058 870 2155 +3 867 2685 2686 +3 2215 2216 2217 +3 287 1011 2194 +3 1059 2156 2155 +3 878 1671 2162 +3 2158 876 1049 +3 2166 1671 878 +3 872 1047 1048 +3 2160 1057 2159 +3 1110 865 2296 +3 2162 870 1058 +3 2169 2171 879 +3 2168 1048 1047 +3 2175 2169 879 +3 2175 2170 2169 +3 2176 1676 1677 +3 2170 1046 2169 +3 2279 2293 2282 +3 2293 1161 2282 +3 1044 2173 1675 +3 2173 1050 1675 +3 1201 2345 1202 +3 1204 1203 2351 +3 1201 2344 2345 +3 1318 2262 1803 +3 1678 1676 2178 +3 1676 1678 869 +3 2179 286 959 +3 286 1335 959 +3 2181 958 2180 +3 2180 958 2179 +3 959 2180 2179 +3 2222 1004 2760 +3 1898 19 1897 +3 2220 2188 2228 +3 2759 1961 287 +3 2266 2267 508 +3 2181 2182 958 +3 958 2183 471 +3 958 2182 2183 +3 2182 474 2183 +3 2698 898 301 +3 1420 2449 1400 +3 2449 2528 1400 +3 894 883 770 +3 2186 1005 1003 +3 2185 2186 1003 +3 2202 1009 2205 +3 966 1604 1605 +3 1008 1005 2197 +3 2188 1004 2187 +3 2184 2190 2182 +3 711 1094 2562 +3 711 1095 1094 +3 2181 2180 288 +3 2187 2185 288 +3 2195 2220 2229 +3 2198 1008 2197 +3 2230 792 1525 +3 2407 2406 2198 +3 1112 2759 1007 +3 2579 831 2679 +3 830 2579 2679 +3 1009 1013 2205 +3 2208 2207 2206 +3 2211 2213 2212 +3 2213 1114 2208 +3 2550 2560 2549 +3 2200 2212 2204 +3 2200 2211 2212 +3 2548 2549 245 +3 1316 2414 1604 +3 2412 1153 1308 +3 2549 166 245 +3 291 1119 2207 +3 2416 2427 1190 +3 1013 1009 2207 +3 291 2208 1114 +3 2208 291 2207 +3 1655 1159 1292 +3 2002 2003 2001 +3 1654 1159 1655 +3 2210 2209 2199 +3 1012 2210 2199 +3 1010 2204 2212 +3 2213 1010 2212 +3 8 100 102 +3 1012 1961 2211 +3 2298 2297 1951 +3 2298 1950 2297 +3 2215 2217 1950 +3 843 2577 1026 +3 296 270 2401 +3 1111 2195 2214 +3 2194 2193 2227 +3 1111 2214 2215 +3 2183 474 2260 +3 353 2135 75 +3 2757 2758 2189 +3 1111 1112 1007 +3 2195 1111 1007 +3 2214 2216 2215 +3 1336 1335 270 +3 2218 2217 1949 +3 1830 1832 1829 +3 2641 1886 199 +3 2232 2231 1558 +3 2222 2225 2223 +3 97 269 271 +3 18 2641 2642 +3 1335 286 2404 +3 961 2228 2188 +3 1520 799 1522 +3 2583 1179 774 +3 2232 2233 150 +3 795 2582 2234 +3 2581 2582 795 +3 2253 2254 2234 +3 1465 432 1466 +3 1465 1466 1464 +3 2243 806 407 +3 2583 1174 1179 +3 2679 2680 830 +3 148 1902 433 +3 2237 795 2233 +3 2233 2254 150 +3 2234 2235 796 +3 2249 2234 796 +3 1175 2583 774 +3 393 1145 589 +3 2467 2469 596 +3 2579 2581 2580 +3 2579 2236 2581 +3 1473 414 1967 +3 148 433 1465 +3 2581 795 2580 +3 392 2239 487 +3 828 829 489 +3 2239 488 495 +3 487 2239 495 +3 846 487 495 +3 2241 2242 808 +3 817 808 2242 +3 2243 407 2242 +3 2240 807 2241 +3 2241 408 2240 +3 2242 2244 817 +3 807 2240 1145 +3 797 2252 2235 +3 266 87 267 +3 2245 1984 86 +3 1524 799 2250 +3 2648 995 35 +3 194 2648 35 +3 2245 1985 2246 +3 1520 2248 799 +3 118 119 20 +3 2254 2253 150 +3 150 2231 2232 +3 1821 2467 596 +3 2579 392 831 +3 2576 1943 2578 +3 2237 2233 2232 +3 797 420 2252 +3 2249 2253 2234 +3 2255 1474 1444 +3 492 1474 2255 +3 2220 2228 2256 +3 2229 2220 2256 +3 2219 2256 2228 +3 2229 2256 2219 +3 2155 2156 1058 +3 2157 1058 2156 +3 272 6 1168 +3 285 98 2403 +3 2402 2404 2403 +3 2404 2402 270 +3 2198 2406 2405 +3 1006 2198 2405 +3 2535 1526 1522 +3 284 2402 2403 +3 2163 1058 2157 +3 1272 2263 2264 +3 2263 1287 2264 +3 572 1583 1781 +3 2340 2339 1584 +3 2340 2338 2339 +3 1708 2338 2340 +3 1584 2266 1705 +3 2266 508 1705 +3 533 2735 535 +3 2735 1887 535 +3 1993 1992 886 +3 2270 1326 2272 +3 405 2299 782 +3 704 2563 842 +3 2273 1328 1325 +3 1329 1328 2273 +3 761 1328 1329 +3 1063 2276 1062 +3 2507 1040 2506 +3 2507 2513 1040 +3 2500 877 2501 +3 2277 877 2511 +3 2510 2277 2511 +3 2503 1064 2504 +3 2365 718 2286 +3 2278 1600 1064 +3 2278 1699 1600 +3 718 2362 2286 +3 2366 2014 935 +3 2322 715 2323 +3 2284 2288 2287 +3 684 2290 2153 +3 1403 2328 2327 +3 2290 2288 2284 +3 382 361 1165 +3 1504 2289 684 +3 719 1160 686 +3 684 2288 2290 +3 1504 1503 2289 +3 1154 1606 2687 +3 1606 1607 2687 +3 2319 1621 1624 +3 2315 1620 2320 +3 2280 1160 2292 +3 2279 1160 2280 +3 686 1160 2279 +3 2279 2280 2293 +3 2011 579 2010 +3 2012 2011 2010 +3 2671 1640 2674 +3 1725 698 2012 +3 698 2011 2012 +3 698 1097 1096 +3 500 514 825 +3 2291 2292 2281 +3 2292 1160 2281 +3 2430 2431 2293 +3 2431 1161 2293 +3 2300 1327 782 +3 2300 590 1327 +3 2411 2410 1290 +3 2411 2409 2410 +3 1290 2413 1159 +3 1603 1156 2301 +3 1521 1525 791 +3 801 2303 2304 +3 801 429 2303 +3 146 2304 2303 +3 2304 2143 362 +3 801 2304 362 +3 2434 496 2436 +3 2062 2310 427 +3 2314 2310 2313 +3 2314 427 2310 +3 1500 1501 2302 +3 2311 23 2312 +3 427 2311 2312 +3 429 2306 2305 +3 428 2307 2308 +3 428 2314 2313 +3 2311 427 2314 +3 1496 75 1495 +3 45 427 2312 +3 2446 2447 45 +3 1027 2446 1162 +3 2449 1420 1422 +3 1420 1401 1422 +3 2529 1410 1428 +3 870 1062 1128 +3 2317 716 1019 +3 1624 716 2317 +3 2322 1622 1621 +3 2318 2153 2290 +3 2319 1624 2317 +3 1410 2523 2520 +3 1578 2613 2603 +3 513 1564 1537 +3 1173 2363 2362 +3 386 1457 2326 +3 2002 2001 41 +3 2763 2002 41 +3 2366 2013 2014 +3 2541 2542 717 +3 2544 2541 717 +3 2434 1792 496 +3 850 1792 2434 +3 2303 429 2433 +3 626 633 2655 +3 2324 2325 723 +3 1625 1627 2325 +3 2327 1407 1408 +3 386 449 1345 +3 386 2326 449 +3 2329 1406 2330 +3 2445 2312 1162 +3 2312 2445 45 +3 136 382 379 +3 136 381 382 +3 1836 2494 2495 +3 2496 1836 2495 +3 1226 946 2334 +3 2496 2495 1239 +3 136 376 381 +3 572 2336 1708 +3 2335 947 49 +3 506 1592 514 +3 514 500 506 +3 2195 2196 2220 +3 2344 1200 2345 +3 572 1800 2336 +3 287 2194 2758 +3 531 2729 257 +3 2750 56 2747 +3 2337 2338 1708 +3 2337 2265 2338 +3 2725 2728 538 +3 447 446 187 +3 1667 862 222 +3 156 2342 105 +3 51 84 104 +3 2607 2605 1572 +3 2342 104 105 +3 2462 2463 1100 +3 1971 43 1973 +3 2641 200 2642 +3 2752 939 2749 +3 1795 2746 2745 +3 2745 2744 1795 +3 2344 1224 1200 +3 2344 2352 1224 +3 1209 2347 1200 +3 2347 2346 1200 +3 615 400 1210 +3 2347 1209 2351 +3 2745 2746 939 +3 1778 2745 939 +3 2545 1625 1626 +3 2352 1201 2353 +3 617 615 2359 +3 617 419 615 +3 2356 2355 2354 +3 426 2355 2356 +3 2354 2353 1199 +3 777 779 2488 +3 779 777 776 +3 426 617 2355 +3 1197 426 2356 +3 426 1197 1198 +3 2355 617 2359 +3 2359 2358 614 +3 2357 614 2358 +3 2355 2359 614 +3 2354 2355 614 +3 718 2364 2536 +3 2537 718 2536 +3 2360 2539 2538 +3 2360 719 2539 +3 2360 2538 2537 +3 2536 2360 2537 +3 718 2537 2362 +3 717 2545 2544 +3 719 2360 2361 +3 719 2361 1160 +3 2364 2281 1160 +3 2361 2364 1160 +3 1313 2369 372 +3 2109 229 1313 +3 229 2369 1313 +3 1300 2369 229 +3 315 316 236 +3 2370 230 2371 +3 2367 1475 2373 +3 312 313 2372 +3 1284 2367 2373 +3 315 233 316 +3 2381 2373 1476 +3 2382 1285 2383 +3 2374 2375 1380 +3 1284 2375 2374 +3 2378 1802 367 +3 2378 1271 1802 +3 2381 2380 1284 +3 1284 2373 2381 +3 1803 2376 1318 +3 2379 2372 230 +3 2371 230 2372 +3 2375 1284 2380 +3 310 1267 374 +3 2392 310 374 +3 2389 468 469 +3 468 2389 1898 +3 2378 2377 1271 +3 2380 368 2376 +3 1479 2388 2387 +3 2380 2382 368 +3 2381 2382 2380 +3 1283 2385 2386 +3 162 1480 1477 +3 2388 1898 2389 +3 2381 1285 2382 +3 2382 2385 368 +3 2384 2387 2391 +3 19 160 163 +3 163 160 159 +3 1478 1481 1480 +3 2392 2391 2395 +3 310 2392 2393 +3 368 2390 1318 +3 2376 368 1318 +3 2390 368 2385 +3 2385 1283 2390 +3 1480 162 1482 +3 1478 1480 1482 +3 1483 162 1319 +3 1283 2684 53 +3 2397 646 607 +3 646 2397 1913 +3 375 2390 2394 +3 375 1318 2390 +3 371 2391 2392 +3 310 2393 1018 +3 375 2394 1282 +3 2391 161 2395 +3 79 2736 2733 +3 1925 652 1929 +3 1665 890 2426 +3 2399 272 2398 +3 98 284 2403 +3 271 2401 2400 +3 2405 2199 2209 +3 1006 2405 2209 +3 2403 286 285 +3 1011 2406 2407 +3 2406 1011 2199 +3 2406 2199 2405 +3 2193 1011 2408 +3 2408 2197 2193 +3 1153 2411 1290 +3 1308 1605 2414 +3 1308 2414 2412 +3 2412 2414 1316 +3 1605 1604 2414 +3 1009 2202 2203 +3 1316 1601 2409 +3 1604 1601 1316 +3 1157 2410 2409 +3 2411 2412 1316 +3 1157 2415 2410 +3 2415 1157 2301 +3 2427 2396 1190 +3 2426 2421 1665 +3 2421 889 1665 +3 2422 404 759 +3 2424 591 1330 +3 1665 889 1664 +3 761 2420 2424 +3 2420 2418 2424 +3 761 1329 2420 +3 652 2425 759 +3 652 757 2425 +3 1189 1188 2419 +3 2418 2420 404 +3 760 759 2420 +3 759 404 2420 +3 760 588 1083 +3 1329 760 2420 +3 2424 1330 761 +3 1914 2428 649 +3 2423 884 889 +3 2418 763 2424 +3 890 2427 2416 +3 2427 2428 2396 +3 2427 890 2428 +3 2428 647 2396 +3 1914 647 2428 +3 1924 2423 757 +3 890 649 2428 +3 648 2423 1924 +3 862 2429 1813 +3 2291 2430 2292 +3 429 2305 2433 +3 2433 2302 2303 +3 2439 1439 1402 +3 2435 847 495 +3 847 846 495 +3 850 2435 495 +3 2482 2483 845 +3 486 845 2483 +3 2436 1900 847 +3 2434 2436 847 +3 1130 2767 396 +3 2767 2766 396 +3 850 2434 2435 +3 1899 1900 2436 +3 496 1899 2436 +3 391 2483 2482 +3 440 2440 1402 +3 440 2441 2440 +3 440 1414 2441 +3 189 2438 2439 +3 2438 1439 2439 +3 1414 442 2441 +3 1401 2444 2443 +3 1439 2438 2442 +3 2438 2437 2442 +3 2447 7 13 +3 1935 2447 13 +3 2566 342 2567 +3 425 973 2450 +3 996 61 995 +3 921 2451 2450 +3 2453 923 1995 +3 2453 1995 921 +3 2452 2453 921 +3 2452 5 2453 +3 973 5 2452 +3 978 5 973 +3 1103 1122 2577 +3 1972 253 1998 +3 2456 2457 1679 +3 2456 31 2457 +3 2455 2456 1679 +3 250 85 252 +3 907 68 963 +3 1026 2578 1945 +3 843 1074 2460 +3 2542 720 1628 +3 2461 1101 841 +3 1101 1124 841 +3 1100 2463 2464 +3 690 2464 2463 +3 2458 1101 2461 +3 2458 2462 1101 +3 2464 1092 1100 +3 2470 2654 596 +3 2469 2470 596 +3 626 2655 2470 +3 690 2465 2464 +3 2465 1092 2464 +3 1821 689 2467 +3 1222 575 94 +3 2470 1090 1089 +3 799 2248 2249 +3 2361 2536 2364 +3 2471 1637 582 +3 1127 913 2475 +3 952 1183 416 +3 2476 913 2477 +3 1057 2161 2163 +3 952 416 953 +3 2481 952 953 +3 520 502 1218 +3 1637 1640 1639 +3 577 1637 2471 +3 1638 1637 577 +3 1727 2473 582 +3 2477 174 2476 +3 810 409 827 +3 2540 2762 1173 +3 2538 2540 1173 +3 1173 2762 2543 +3 2762 2541 2543 +3 1781 1779 572 +3 952 2481 783 +3 809 409 810 +3 815 2479 409 +3 1360 695 2477 +3 695 1360 781 +3 2478 2476 827 +3 2479 2478 827 +3 2478 2479 783 +3 2767 824 2766 +3 2480 1127 2475 +3 847 391 2482 +3 1900 391 847 +3 2482 846 847 +3 1320 2488 610 +3 2710 418 2709 +3 957 2710 2709 +3 785 2712 2706 +3 2712 2709 2706 +3 2709 2712 2705 +3 610 2488 1198 +3 1813 2429 2489 +3 1035 863 2489 +3 1198 2487 2486 +3 863 1813 2489 +3 1813 863 1812 +3 2488 2487 1198 +3 2488 779 2487 +3 2429 1036 2489 +3 2609 2608 16 +3 7 2490 13 +3 13 2490 1938 +3 2493 1839 1837 +3 1974 1595 2596 +3 252 85 965 +3 2596 1973 1974 +3 2493 1843 1839 +3 2495 2494 1837 +3 1237 1835 1239 +3 948 181 1226 +3 2495 1837 1239 +3 2497 1238 740 +3 2646 2645 9 +3 2497 740 1836 +3 1128 2498 1129 +3 2770 2296 1059 +3 2769 2770 1060 +3 877 2277 2501 +3 2504 1064 2505 +3 868 2512 2509 +3 2499 2500 1042 +3 1105 864 1106 +3 2506 2505 871 +3 2507 871 1037 +3 2506 871 2507 +3 1031 2507 1037 +3 1105 2509 1040 +3 2509 1105 868 +3 2276 1063 2278 +3 2510 2276 2503 +3 2504 2510 2503 +3 2504 2277 2510 +3 875 1042 1041 +3 2276 2510 1062 +3 864 2513 2514 +3 2513 864 1105 +3 864 2514 1030 +3 1775 1893 2516 +3 2738 2739 1208 +3 1778 2753 2754 +3 2518 1893 1784 +3 2518 2516 1893 +3 1793 2518 1784 +3 1793 1783 2518 +3 1783 2516 2518 +3 1167 383 44 +3 1990 302 899 +3 901 302 1990 +3 360 302 901 +3 1409 2522 2521 +3 2521 2522 1404 +3 1989 1990 899 +3 2327 2522 1409 +3 440 1411 2524 +3 1424 1405 2528 +3 2528 1405 1416 +3 1421 1424 2528 +3 2522 1408 2526 +3 2522 2526 1404 +3 2526 1416 1404 +3 2526 2527 1416 +3 2526 1408 2527 +3 1678 2701 869 +3 376 377 349 +3 377 2531 349 +3 165 131 134 +3 377 135 2531 +3 135 2532 2531 +3 2532 349 2531 +3 139 349 2532 +3 73 139 2533 +3 74 349 908 +3 270 1335 2404 +3 2552 2551 245 +3 2360 2536 2361 +3 720 2542 1631 +3 251 254 2763 +3 841 1123 1122 +3 251 2763 41 +3 41 1999 251 +3 1631 2540 2539 +3 2540 2538 2539 +3 963 254 251 +3 2541 2544 2543 +3 2543 2544 2363 +3 2547 1627 717 +3 723 1627 1628 +3 1627 1625 2545 +3 1172 2546 3 +3 719 683 720 +3 2542 2547 717 +3 1892 101 2548 +3 29 100 2550 +3 100 29 102 +3 345 2564 1745 +3 256 2550 101 +3 256 29 2550 +3 60 1892 2551 +3 245 2553 2552 +3 2553 246 2552 +3 245 2551 2548 +3 2551 1892 2548 +3 167 2557 2558 +3 167 2554 2557 +3 67 255 248 +3 2556 63 2555 +3 2554 246 2553 +3 167 62 2555 +3 167 2555 2554 +3 2555 63 2554 +3 255 256 101 +3 67 256 255 +3 2557 2553 245 +3 166 2557 245 +3 2556 62 43 +3 1971 2556 43 +3 1680 31 2456 +3 62 2556 2555 +3 2558 2559 167 +3 2559 2558 15 +3 15 42 2559 +3 2562 1094 712 +3 842 2562 712 +3 2574 2231 150 +3 587 1651 1147 +3 2563 704 581 +3 2565 345 1747 +3 1735 324 1742 +3 2570 2571 1734 +3 2568 2571 88 +3 2571 2568 2572 +3 1735 2564 2573 +3 341 1747 1746 +3 88 2567 2568 +3 343 344 2568 +3 2569 1735 2573 +3 2569 2570 1735 +3 1734 2571 2572 +3 1333 213 1332 +3 432 147 801 +3 1731 1733 325 +3 1333 1734 2572 +3 2572 1334 1333 +3 1334 2572 344 +3 344 2572 2568 +3 432 801 114 +3 432 114 1467 +3 1467 114 2148 +3 2575 509 490 +3 1464 1463 148 +3 2235 2582 2236 +3 1103 2577 2460 +3 243 2682 2681 +3 844 243 2681 +3 2582 2235 2234 +3 2236 797 2235 +3 2237 2580 795 +3 2244 407 818 +3 1942 1937 12 +3 1549 1547 2586 +3 2586 1547 2585 +3 2585 1547 1567 +3 1547 1564 1567 +3 2586 1551 1549 +3 2588 842 712 +3 2590 1436 1135 +3 2590 2591 1441 +3 1472 1441 2591 +3 1472 1442 1441 +3 2593 2592 1440 +3 2590 1135 2591 +3 1701 2592 1135 +3 2591 1135 2592 +3 1437 2590 1441 +3 1472 2591 2592 +3 308 306 307 +3 2595 1434 1435 +3 2492 434 1471 +3 2595 2594 1434 +3 2600 251 1999 +3 2597 1973 2596 +3 2598 1595 1976 +3 251 250 252 +3 2600 250 251 +3 2598 1976 250 +3 1972 2599 253 +3 2599 2598 253 +3 550 548 976 +3 2617 1588 1593 +3 1591 506 2610 +3 2602 2604 1573 +3 974 549 968 +3 1572 2605 1574 +3 2602 1573 2603 +3 2612 2613 2614 +3 2613 1578 2614 +3 79 552 234 +3 852 79 234 +3 2605 515 2606 +3 2609 2603 1573 +3 2609 2610 2603 +3 515 498 2606 +3 2603 2610 503 +3 2616 1593 2608 +3 2612 2611 504 +3 2612 2615 2611 +3 1952 2619 1951 +3 2607 1572 2616 +3 1576 515 1575 +3 1576 1575 2601 +3 2613 2612 504 +3 2612 1577 2615 +3 1577 1994 2615 +3 1577 1579 1994 +3 1769 1579 1577 +3 1573 2607 2618 +3 2619 1953 290 +3 2616 2617 1593 +3 1572 2617 2616 +3 2617 1572 1588 +3 2620 1413 10 +3 2621 2620 10 +3 1429 2621 10 +3 10 2529 1429 +3 2529 1428 1429 +3 441 1413 2623 +3 585 2626 2625 +3 1642 1641 2624 +3 1648 1642 2624 +3 585 2625 2627 +3 608 1644 1643 +3 2625 1649 1648 +3 708 709 581 +3 398 2634 2631 +3 2635 2631 1638 +3 2629 2627 709 +3 2630 2628 2629 +3 2627 2624 709 +3 2627 2625 2624 +3 1648 2624 2625 +3 2629 708 2630 +3 2635 1638 577 +3 2628 2630 580 +3 398 803 802 +3 2633 2634 585 +3 2633 585 2632 +3 398 2631 2635 +3 2632 2629 2628 +3 2633 2632 2628 +3 398 802 2634 +3 1151 399 1150 +3 1195 1150 612 +3 2636 94 804 +3 845 486 2676 +3 2639 1473 1443 +3 215 1723 1722 +3 2643 2644 2642 +3 2145 2650 385 +3 200 31 2643 +3 200 2643 2642 +3 2645 18 2644 +3 1886 2649 196 +3 2647 2646 9 +3 1684 1728 2647 +3 1728 195 2647 +3 2645 194 1885 +3 1684 2647 9 +3 995 994 35 +3 2646 2648 194 +3 2645 2646 194 +3 1728 1729 195 +3 2649 1885 196 +3 2136 2137 358 +3 2651 2652 385 +3 144 2136 2651 +3 359 44 2652 +3 360 44 359 +3 604 787 635 +3 2655 2654 2470 +3 2655 634 2654 +3 2655 633 634 +3 1526 1528 1522 +3 785 2703 2704 +3 785 2659 2703 +3 559 2657 1505 +3 1506 2657 559 +3 2707 2706 418 +3 1433 467 2715 +3 2706 2661 785 +3 466 2660 561 +3 561 2660 562 +3 558 784 1506 +3 1835 1237 2663 +3 2663 1237 725 +3 725 1238 2663 +3 1835 1238 2497 +3 1835 2663 1238 +3 2664 687 1822 +3 687 1823 1822 +3 692 1819 1818 +3 692 1392 2666 +3 1389 598 2666 +3 2630 2672 580 +3 1191 607 1192 +3 653 2665 759 +3 512 1592 1566 +3 797 829 798 +3 1592 512 514 +3 397 803 804 +3 2012 2010 699 +3 2668 578 2673 +3 1640 2671 2667 +3 2012 699 2673 +3 578 1725 2673 +3 2760 2756 2222 +3 1638 2628 2675 +3 2675 2628 580 +3 580 2674 2675 +3 398 2636 804 +3 398 2635 2636 +3 1637 2675 2674 +3 2674 1640 1637 +3 1645 583 579 +3 1120 2677 1117 +3 2756 2760 2221 +3 1957 1115 1958 +3 1117 2677 960 +3 2682 243 2127 +3 832 2680 2679 +3 2392 374 2683 +3 371 2392 2683 +3 53 2683 1269 +3 367 1269 1268 +3 1269 374 1268 +3 374 1269 2683 +3 867 978 2685 +3 1054 2686 866 +3 1054 2294 2686 +3 905 904 2688 +3 905 322 904 +3 146 2696 363 +3 2691 111 905 +3 2690 2693 2694 +3 896 145 2699 +3 2690 300 2693 +3 2690 22 300 +3 363 2695 898 +3 2690 2696 22 +3 2692 304 111 +3 2699 898 2698 +3 2698 897 2699 +3 1501 22 2696 +3 359 145 896 +3 2700 2699 897 +3 899 2700 897 +3 302 2700 899 +3 2702 1774 1773 +3 1785 2702 1773 +3 2702 1785 519 +3 435 444 436 +3 2713 1440 437 +3 521 1771 1770 +3 527 1355 1354 +3 2715 467 2716 +3 2710 839 2711 +3 1800 2751 2336 +3 957 2705 411 +3 2707 2661 2706 +3 417 957 955 +3 2705 2712 785 +3 2708 415 1435 +3 415 838 1435 +3 1795 1780 2746 +3 2711 2708 418 +3 2710 2711 418 +3 492 1449 1661 +3 839 415 2711 +3 191 1435 2715 +3 2715 1435 2714 +3 1431 2719 1430 +3 1430 2719 1419 +3 1431 2718 2719 +3 2718 1431 1432 +3 2718 437 2719 +3 1701 1419 2719 +3 753 755 309 +3 14 306 308 +3 1017 2395 161 +3 308 307 153 +3 539 2729 2730 +3 2732 2731 537 +3 239 2731 2732 +3 2735 185 1887 +3 532 185 2735 +3 2733 522 239 +3 2733 239 2732 +3 97 2742 274 +3 2742 97 1168 +3 2741 573 1206 +3 1207 2737 2741 +3 939 2748 2749 +3 2753 1778 939 +3 2749 2747 1710 +3 1782 571 2755 +3 1779 2755 2754 +3 2541 2762 2540 +3 2196 2758 2757 +3 1007 2758 2196 +3 2758 1007 2759 +3 2759 1112 1961 +3 2225 2761 2757 +3 2756 2757 2761 +3 387 2764 1470 +3 2766 824 826 +3 825 824 2768 +3 1703 1585 2771 +3 1042 875 2769 + diff --git a/Heat_method_3/examples/Heat_method_3/data/sphere.off b/Heat_method_3/examples/Heat_method_3/data/sphere.off new file mode 100644 index 00000000000..944e391d679 --- /dev/null +++ b/Heat_method_3/examples/Heat_method_3/data/sphere.off @@ -0,0 +1,2434 @@ +OFF +812 1620 0 +-0.52573111211913348 0.85065080835203999 -2.5720446970240305e-18 +0.52573111211913359 0.85065080835203999 5.144089394048061e-18 +-0.52573111211913359 -0.85065080835203999 0 +0.52573111211913348 -0.85065080835203999 -2.5720446970240305e-18 +-2.5720446970240309e-18 -0.52573111211913359 0.85065080835203999 +-6.4301117425600766e-18 0.52573111211913359 0.85065080835203999 +0 -0.52573111211913359 -0.85065080835203999 +0 0.52573111211913359 -0.85065080835203999 +0.85065080835203999 6.4301117425600766e-18 -0.52573111211913359 +0.85065080835203999 -5.1440893940480617e-18 0.52573111211913359 +-0.85065080835203999 2.5720446970240305e-18 -0.52573111211913348 +-0.85065080835203999 0 0.52573111211913348 +-0.57735026918962573 0.57735026918962584 0.57735026918962573 +0 0.93417235896271567 0.35682208977308993 +0 0.93417235896271567 -0.35682208977308988 +-0.57735026918962573 0.57735026918962584 -0.57735026918962573 +-0.93417235896271567 0.35682208977309005 0 +0.57735026918962573 0.57735026918962573 0.57735026918962584 +-0.35682208977308999 0 0.93417235896271567 +-0.93417235896271567 -0.35682208977308993 0 +-0.3568220897730901 0 -0.93417235896271567 +0.57735026918962573 0.57735026918962584 -0.57735026918962573 +0.57735026918962573 -0.57735026918962584 0.57735026918962573 +0 -0.93417235896271567 0.35682208977308993 +0 -0.93417235896271567 -0.35682208977308988 +0.57735026918962573 -0.57735026918962584 -0.57735026918962573 +0.93417235896271567 -0.35682208977309005 0 +0.35682208977308988 0 0.93417235896271567 +-0.57735026918962584 -0.57735026918962573 0.57735026918962573 +-0.57735026918962584 -0.57735026918962573 -0.57735026918962573 +0.35682208977308999 0 -0.93417235896271567 +0.93417235896271567 0.35682208977308999 0 +-0.33172364231109935 0.40102855960931139 0.85389432572745139 +0.40102855960931139 0.85389432572745139 0.3317236423110993 +0.2050164858201721 0.7327522019204108 -0.64887783990727932 +-0.64887783990727921 0.2050164858201721 -0.73275220192041068 +-0.98060148221837851 0 0.19601207378913935 +0.64887783990727921 0.2050164858201721 0.73275220192041068 +-0.3317236423110993 -0.40102855960931139 0.85389432572745139 +-0.73275220192041068 -0.64887783990727921 -0.20501648582017207 +0 -0.1960120737891394 -0.98060148221837851 +0.85389432572745139 0.33172364231109935 -0.40102855960931139 +0.33172364231109935 -0.40102855960931139 0.85389432572745139 +-0.40102855960931139 -0.85389432572745139 0.3317236423110993 +-0.2050164858201721 -0.7327522019204108 -0.64887783990727932 +0.64887783990727921 -0.2050164858201721 -0.73275220192041068 +0.98060148221837851 0 0.1960120737891394 +0.3317236423110993 0.40102855960931139 0.85389432572745139 +-0.64887783990727921 -0.2050164858201721 0.73275220192041068 +-0.85389432572745139 -0.33172364231109935 -0.40102855960931139 +0 0.1960120737891394 -0.98060148221837851 +0.73275220192041068 0.64887783990727921 -0.20501648582017207 +-0.40102855960931139 0.85389432572745139 0.33172364231109935 +-0.85389432572745139 0.33172364231109935 0.40102855960931139 +-0.19601207378913935 0.98060148221837851 0 +-0.2050164858201721 0.7327522019204108 0.64887783990727932 +-0.40102855960931139 0.85389432572745139 -0.3317236423110993 +0.19601207378913935 0.98060148221837851 0 +-0.73275220192041068 0.64887783990727921 -0.2050164858201721 +-0.20501648582017215 0.7327522019204108 -0.64887783990727932 +-0.73275220192041068 0.64887783990727921 0.20501648582017207 +-0.85389432572745139 0.3317236423110993 -0.40102855960931139 +0.73275220192041068 0.64887783990727921 0.2050164858201721 +0.20501648582017215 0.7327522019204108 0.64887783990727932 +0 0.1960120737891394 0.98060148221837851 +-0.64887783990727921 0.20501648582017207 0.73275220192041068 +-0.85389432572745139 -0.3317236423110993 0.40102855960931139 +-0.98060148221837851 0 -0.19601207378913935 +-0.64887783990727921 -0.20501648582017207 -0.73275220192041068 +-0.3317236423110993 0.40102855960931139 -0.85389432572745139 +0.33172364231109935 0.40102855960931139 -0.85389432572745139 +0.40102855960931139 0.85389432572745139 -0.33172364231109935 +0.40102855960931139 -0.85389432572745139 0.33172364231109935 +0.85389432572745139 -0.33172364231109935 0.40102855960931139 +0.19601207378913935 -0.98060148221837851 0 +0.2050164858201721 -0.7327522019204108 0.64887783990727932 +0.40102855960931139 -0.85389432572745139 -0.3317236423110993 +-0.19601207378913935 -0.98060148221837851 2.5799973709348731e-18 +0.73275220192041068 -0.64887783990727921 -0.2050164858201721 +0.20501648582017215 -0.7327522019204108 -0.64887783990727932 +0.73275220192041068 -0.64887783990727921 0.20501648582017207 +0.85389432572745139 -0.3317236423110993 -0.40102855960931139 +-2.5799973709348731e-18 -0.19601207378913935 0.98060148221837851 +0.64887783990727921 -0.20501648582017207 0.73275220192041068 +-0.73275220192041068 -0.64887783990727921 0.2050164858201721 +-0.20501648582017215 -0.7327522019204108 0.64887783990727932 +-0.33172364231109935 -0.40102855960931139 -0.85389432572745139 +-0.40102855960931139 -0.85389432572745139 -0.33172364231109935 +0.64887783990727921 0.20501648582017207 -0.73275220192041068 +0.3317236423110993 -0.40102855960931139 -0.85389432572745139 +0.85389432572745139 0.3317236423110993 0.40102855960931139 +0.98060148221837851 0 -0.1960120737891394 +-0.45851595921206995 0.2078965360508854 0.86402670412775906 +0.40551074491568917 0.74189440638938953 0.53399787033850432 +0.40551074491568917 0.74189440638938953 -0.53399787033850421 +-0.45851595921206995 0.20789653605088543 -0.86402670412775917 +-0.99251382955057421 -0.12213229773836956 0 +0.45851595921206995 0.20789653605088543 0.86402670412775917 +-0.53399787033850432 -0.40551074491568917 0.74189440638938953 +-0.74189440638938953 -0.53399787033850421 -0.40551074491568917 +0.12213229773836956 0 -0.99251382955057421 +0.86402670412775906 0.45851595921206995 -0.2078965360508854 +0.45851595921206995 -0.2078965360508854 0.86402670412775906 +-0.40551074491568917 -0.74189440638938953 0.53399787033850432 +-0.40551074491568917 -0.74189440638938953 -0.53399787033850421 +0.45851595921206995 -0.20789653605088543 -0.86402670412775917 +0.99251382955057421 0.12213229773836956 0 +0.53399787033850432 0.40551074491568917 0.74189440638938953 +-0.45851595921206995 -0.20789653605088543 0.86402670412775917 +-0.86402670412775906 -0.45851595921206995 -0.2078965360508854 +-0.12213229773836956 0 -0.99251382955057421 +0.74189440638938953 0.53399787033850421 -0.40551074491568917 +-0.2078965360508854 0.86402670412775906 0.45851595921206995 +-0.86402670412775906 0.45851595921206995 0.2078965360508854 +0 0.99251382955057421 -0.12213229773836955 +-0.40551074491568917 0.74189440638938953 0.53399787033850421 +-0.40551074491568917 0.74189440638938953 -0.53399787033850432 +0 0.99251382955057421 0.12213229773836955 +-0.86402670412775917 0.45851595921206995 -0.20789653605088543 +-0.20789653605088543 0.86402670412775917 -0.45851595921206995 +-0.74189440638938953 0.53399787033850421 0.40551074491568917 +-0.74189440638938953 0.53399787033850432 -0.40551074491568917 +0.86402670412775917 0.45851595921206995 0.20789653605088543 +0.20789653605088543 0.86402670412775917 0.45851595921206995 +0.12213229773836955 0 0.99251382955057421 +-0.53399787033850432 0.40551074491568928 0.74189440638938964 +-0.74189440638938953 -0.53399787033850432 0.40551074491568917 +-0.99251382955057421 0.12213229773836956 0 +-0.53399787033850432 -0.40551074491568928 -0.74189440638938964 +-0.53399787033850432 0.40551074491568917 -0.74189440638938953 +0.45851595921206995 0.2078965360508854 -0.86402670412775906 +0.2078965360508854 0.86402670412775906 -0.45851595921206995 +0.2078965360508854 -0.86402670412775906 0.45851595921206995 +0.86402670412775906 -0.45851595921206995 0.2078965360508854 +0 -0.99251382955057421 -0.12213229773836955 +0.40551074491568917 -0.74189440638938953 0.53399787033850421 +0.40551074491568917 -0.74189440638938953 -0.53399787033850432 +0 -0.99251382955057421 0.12213229773836956 +0.86402670412775917 -0.45851595921206995 -0.20789653605088543 +0.20789653605088543 -0.86402670412775917 -0.45851595921206995 +0.74189440638938953 -0.53399787033850421 0.40551074491568917 +0.74189440638938953 -0.53399787033850432 -0.40551074491568917 +-0.12213229773836956 0 0.99251382955057421 +0.53399787033850432 -0.40551074491568928 0.74189440638938964 +-0.86402670412775917 -0.45851595921206995 0.20789653605088543 +-0.20789653605088543 -0.86402670412775917 0.45851595921206995 +-0.45851595921206995 -0.2078965360508854 -0.86402670412775906 +-0.2078965360508854 -0.86402670412775906 -0.45851595921206995 +0.53399787033850432 0.40551074491568928 -0.74189440638938964 +0.53399787033850432 -0.40551074491568917 -0.74189440638938953 +0.74189440638938953 0.53399787033850432 0.40551074491568917 +0.99251382955057421 -0.12213229773836956 0 +-0.1135754234044079 0.38284690135627281 0.91680361764142804 +-0.38518927822713656 0.58714563680322251 0.71196153064740486 +0.56661579671126516 0.80322819423702019 0.18376889535499233 +0.20195635857608604 0.95002159669381536 0.23806006604641028 +0.1837688953549923 0.56661579671126516 -0.80322819423702008 +-2.5833166429798901e-18 0.82520570284963268 -0.56483231846667881 +-0.73303472228643585 2.5747846671290184e-18 -0.68019122011567301 +-0.71196153064740497 0.38518927822713656 -0.58714563680322251 +-0.91680361764142804 -0.11357542340440793 0.38284690135627286 +-0.95002159669381536 0.23806006604641028 0.20195635857608607 +0.73303472228643585 2.5747846671290184e-18 0.68019122011567301 +0.71196153064740497 0.38518927822713656 0.58714563680322251 +-0.18376889535499233 -0.56661579671126516 0.80322819423702019 +-0.23806006604641028 -0.20195635857608604 0.95002159669381536 +-0.56661579671126516 -0.80322819423702008 -0.1837688953549923 +-0.82520570284963268 -0.56483231846667881 2.5833166429798901e-18 +0.11357542340440793 -0.38284690135627286 -0.91680361764142804 +-0.23806006604641028 -0.20195635857608607 -0.95002159669381536 +0.91680361764142804 0.1135754234044079 -0.38284690135627281 +0.71196153064740497 0.38518927822713661 -0.58714563680322263 +0.1135754234044079 -0.38284690135627281 0.91680361764142804 +0.38518927822713656 -0.58714563680322251 0.71196153064740486 +-0.56661579671126516 -0.80322819423702019 0.18376889535499233 +-0.20195635857608604 -0.95002159669381536 0.23806006604641028 +-0.1837688953549923 -0.56661579671126516 -0.80322819423702008 +2.5833166429798901e-18 -0.82520570284963268 -0.56483231846667881 +0.73303472228643585 -2.5747846671290184e-18 -0.68019122011567301 +0.71196153064740497 -0.38518927822713656 -0.58714563680322251 +0.91680361764142804 0.11357542340440793 0.38284690135627286 +0.95002159669381536 -0.23806006604641028 0.20195635857608607 +0.18376889535499233 0.56661579671126516 0.80322819423702019 +0.23806006604641028 0.20195635857608604 0.95002159669381536 +-0.73303472228643585 -2.5747846671290184e-18 0.68019122011567301 +-0.71196153064740497 -0.38518927822713656 0.58714563680322251 +-0.91680361764142804 -0.1135754234044079 -0.38284690135627281 +-0.71196153064740497 -0.38518927822713661 -0.58714563680322263 +-0.11357542340440793 0.38284690135627286 -0.91680361764142804 +0.23806006604641028 0.20195635857608607 -0.95002159669381536 +0.56661579671126516 0.80322819423702008 -0.1837688953549923 +0.82520570284963268 0.56483231846667881 2.5833166429798901e-18 +-0.38284690135627281 0.91680361764142804 0.1135754234044079 +-0.58714563680322263 0.71196153064740497 0.38518927822713661 +-0.91680361764142804 0.1135754234044079 0.38284690135627281 +-0.71196153064740497 0.38518927822713661 0.58714563680322263 +-0.38284690135627286 0.91680361764142804 -0.11357542340440793 +-0.20195635857608607 0.95002159669381536 0.23806006604641028 +-0.1837688953549923 0.56661579671126516 0.80322819423702008 +2.5833166429798901e-18 0.82520570284963268 0.56483231846667881 +-0.56661579671126516 0.80322819423702019 -0.18376889535499233 +-0.20195635857608604 0.95002159669381536 -0.23806006604641028 +0.38284690135627286 0.91680361764142804 0.11357542340440793 +0.20195635857608607 0.95002159669381536 -0.23806006604641028 +-0.68019122011567301 0.73303472228643585 -2.5747846671290184e-18 +-0.58714563680322263 0.71196153064740508 -0.38518927822713661 +-2.5747846671290184e-18 0.68019122011567301 -0.73303472228643585 +-0.38518927822713656 0.58714563680322251 -0.71196153064740497 +-0.56661579671126516 0.80322819423702008 0.1837688953549923 +-0.82520570284963279 0.56483231846667892 -2.5833166429798908e-18 +-0.80322819423702019 0.18376889535499233 -0.56661579671126516 +-0.95002159669381536 0.23806006604641028 -0.20195635857608604 +0.68019122011567301 0.73303472228643585 2.5747846671290184e-18 +0.58714563680322263 0.71196153064740508 0.38518927822713661 +2.5747846671290184e-18 0.68019122011567301 0.73303472228643585 +0.38518927822713656 0.58714563680322251 0.71196153064740497 +0.11357542340440793 0.38284690135627286 0.91680361764142804 +-0.23806006604641028 0.20195635857608607 0.95002159669381536 +-0.80322819423702008 0.1837688953549923 0.56661579671126516 +-0.56483231846667881 -2.5833166429798901e-18 0.82520570284963268 +-0.80322819423702019 -0.18376889535499233 0.56661579671126516 +-0.95002159669381536 -0.23806006604641028 0.20195635857608604 +-0.91680361764142804 0.11357542340440793 -0.38284690135627286 +-0.95002159669381536 -0.23806006604641028 -0.20195635857608607 +-0.80322819423702008 -0.1837688953549923 -0.56661579671126516 +-0.56483231846667892 2.5833166429798908e-18 -0.82520570284963279 +-0.18376889535499233 0.56661579671126516 -0.80322819423702019 +-0.23806006604641028 0.20195635857608604 -0.95002159669381536 +0.1135754234044079 0.38284690135627281 -0.91680361764142804 +0.38518927822713656 0.58714563680322251 -0.71196153064740486 +0.38284690135627281 0.91680361764142804 -0.1135754234044079 +0.58714563680322263 0.71196153064740497 -0.38518927822713661 +0.38284690135627281 -0.91680361764142804 0.1135754234044079 +0.58714563680322263 -0.71196153064740497 0.38518927822713661 +0.91680361764142804 -0.1135754234044079 0.38284690135627281 +0.71196153064740497 -0.38518927822713661 0.58714563680322263 +0.38284690135627286 -0.91680361764142804 -0.11357542340440793 +0.20195635857608607 -0.95002159669381536 0.23806006604641028 +0.1837688953549923 -0.56661579671126516 0.80322819423702008 +-2.5833166429798901e-18 -0.82520570284963268 0.56483231846667881 +0.56661579671126516 -0.80322819423702019 -0.18376889535499233 +0.20195635857608604 -0.95002159669381536 -0.23806006604641028 +-0.38284690135627286 -0.91680361764142804 0.11357542340440793 +-0.20195635857608607 -0.95002159669381536 -0.23806006604641028 +0.68019122011567301 -0.73303472228643585 -2.5747846671290184e-18 +0.58714563680322263 -0.71196153064740508 -0.38518927822713661 +2.5747846671290184e-18 -0.68019122011567301 -0.73303472228643585 +0.38518927822713656 -0.58714563680322251 -0.71196153064740497 +0.56661579671126516 -0.80322819423702008 0.1837688953549923 +0.82520570284963279 -0.56483231846667892 -2.5833166429798908e-18 +0.80322819423702019 -0.18376889535499233 -0.56661579671126516 +0.95002159669381536 -0.23806006604641028 -0.20195635857608604 +-0.11357542340440793 -0.38284690135627286 0.91680361764142804 +0.23806006604641028 -0.20195635857608607 0.95002159669381536 +0.80322819423702008 -0.1837688953549923 0.56661579671126516 +0.56483231846667881 2.5833166429798901e-18 0.82520570284963268 +-0.68019122011567301 -0.73303472228643585 2.5747846671290184e-18 +-0.58714563680322263 -0.71196153064740508 0.38518927822713661 +-2.5747846671290184e-18 -0.68019122011567301 0.73303472228643585 +-0.38518927822713656 -0.58714563680322251 0.71196153064740497 +-0.1135754234044079 -0.38284690135627281 -0.91680361764142804 +-0.38518927822713656 -0.58714563680322251 -0.71196153064740486 +-0.38284690135627281 -0.91680361764142804 -0.1135754234044079 +-0.58714563680322263 -0.71196153064740497 -0.38518927822713661 +0.80322819423702008 0.1837688953549923 -0.56661579671126516 +0.56483231846667892 -2.5833166429798908e-18 -0.82520570284963279 +0.18376889535499233 -0.56661579671126516 -0.80322819423702019 +0.23806006604641028 -0.20195635857608604 -0.95002159669381536 +0.80322819423702019 0.18376889535499233 0.56661579671126516 +0.95002159669381536 0.23806006604641028 0.20195635857608604 +0.91680361764142804 -0.11357542340440793 -0.38284690135627286 +0.95002159669381536 0.23806006604641028 -0.20195635857608607 +-0.55182462374514241 0.27566524843940665 0.78708211479576407 +0.27566524843940665 0.78708211479576407 0.55182462374514241 +0.3410463733036202 0.82748987218454895 -0.44603574149214392 +-0.44603574149214392 0.3410463733036202 -0.82748987218454895 +-0.99786036523728616 0 -0.065381124864213602 +0.44603574149214392 0.3410463733036202 0.82748987218454895 +-0.55182462374514241 -0.27566524843940665 0.78708211479576407 +-0.82748987218454895 -0.44603574149214392 -0.3410463733036202 +0 0.06538112486421363 -0.99786036523728616 +0.78708211479576407 0.55182462374514241 -0.27566524843940665 +0.55182462374514241 -0.27566524843940665 0.78708211479576407 +-0.27566524843940665 -0.78708211479576407 0.55182462374514241 +-0.3410463733036202 -0.82748987218454895 -0.44603574149214392 +0.44603574149214392 -0.3410463733036202 -0.82748987218454895 +0.99786036523728616 0 -0.06538112486421363 +0.55182462374514241 0.27566524843940665 0.78708211479576407 +-0.44603574149214392 -0.3410463733036202 0.82748987218454895 +-0.78708211479576407 -0.55182462374514241 -0.27566524843940665 +0 -0.06538112486421363 -0.99786036523728616 +0.82748987218454895 0.44603574149214392 -0.3410463733036202 +-0.27566524843940665 0.78708211479576407 0.55182462374514241 +-0.78708211479576407 0.55182462374514241 0.27566524843940665 +0.065381124864213602 0.99786036523728616 0 +-0.3410463733036202 0.82748987218454895 0.44603574149214392 +-0.27566524843940665 0.78708211479576407 -0.55182462374514241 +-0.065381124864213602 0.99786036523728616 0 +-0.82748987218454895 0.44603574149214392 -0.3410463733036202 +-0.3410463733036202 0.82748987218454895 -0.44603574149214392 +-0.82748987218454895 0.44603574149214392 0.3410463733036202 +-0.78708211479576407 0.55182462374514241 -0.27566524843940665 +0.82748987218454895 0.44603574149214392 0.3410463733036202 +0.3410463733036202 0.82748987218454895 0.44603574149214392 +-6.881302299434426e-18 -0.065381124864213602 0.99786036523728616 +-0.44603574149214392 0.3410463733036202 0.82748987218454895 +-0.78708211479576407 -0.55182462374514241 0.27566524843940665 +-0.99786036523728616 0 0.065381124864213602 +-0.44603574149214392 -0.3410463733036202 -0.82748987218454895 +-0.55182462374514241 0.27566524843940665 -0.78708211479576407 +0.55182462374514241 0.27566524843940665 -0.78708211479576407 +0.27566524843940665 0.78708211479576407 -0.55182462374514241 +0.27566524843940665 -0.78708211479576407 0.55182462374514241 +0.78708211479576407 -0.55182462374514241 0.27566524843940665 +-0.065381124864213602 -0.99786036523728616 6.881302299434426e-18 +0.3410463733036202 -0.82748987218454895 0.44603574149214392 +0.27566524843940665 -0.78708211479576407 -0.55182462374514241 +0.065381124864213602 -0.99786036523728616 6.881302299434426e-18 +0.82748987218454895 -0.44603574149214392 -0.3410463733036202 +0.3410463733036202 -0.82748987218454895 -0.44603574149214392 +0.82748987218454895 -0.44603574149214392 0.3410463733036202 +0.78708211479576407 -0.55182462374514241 -0.27566524843940665 +-6.8813022994344276e-18 0.06538112486421363 0.99786036523728616 +0.44603574149214392 -0.3410463733036202 0.82748987218454895 +-0.82748987218454895 -0.44603574149214392 0.3410463733036202 +-0.3410463733036202 -0.82748987218454895 0.44603574149214392 +-0.55182462374514241 -0.27566524843940665 -0.78708211479576407 +-0.27566524843940665 -0.78708211479576407 -0.55182462374514241 +0.44603574149214392 0.3410463733036202 -0.82748987218454895 +0.55182462374514241 -0.27566524843940665 -0.78708211479576407 +0.78708211479576407 0.55182462374514241 0.27566524843940665 +0.99786036523728616 0 0.06538112486421363 +-0.11888789759516753 0.26114525299171243 0.9579503247273814 +-0.261632633191903 0.6348558224990829 0.72698449081674643 +0.6348558224990829 0.72698449081674643 0.26163263319190305 +0.26114525299171243 0.9579503247273814 0.11888789759516753 +0.30444259547546554 0.52277788618361543 -0.79625246484865153 +-0.0692679740319051 0.75374372009425039 -0.65350772925191603 +-0.65350772925191603 -0.069267974031905072 -0.75374372009425039 +-0.79625246484865153 0.30444259547546554 -0.52277788618361543 +-0.91514036244381902 -0.23096583391063502 0.33041322702361747 +-0.91514036244381902 0.23096583391063499 0.33041322702361747 +0.65350772925191603 -0.069267974031905072 0.75374372009425039 +0.79625246484865153 0.30444259547546554 0.52277788618361543 +-0.26163263319190305 -0.6348558224990829 0.72698449081674643 +-0.11888789759516753 -0.26114525299171243 0.9579503247273814 +-0.52277788618361543 -0.79625246484865153 -0.30444259547546554 +-0.75374372009425039 -0.65350772925191603 0.0692679740319051 +0.23096583391063502 -0.33041322702361747 -0.91514036244381902 +-0.23096583391063499 -0.33041322702361747 -0.91514036244381902 +0.9579503247273814 0.11888789759516753 -0.26114525299171243 +0.72698449081674643 0.261632633191903 -0.6348558224990829 +0.11888789759516753 -0.26114525299171243 0.9579503247273814 +0.261632633191903 -0.6348558224990829 0.72698449081674643 +-0.6348558224990829 -0.72698449081674643 0.26163263319190305 +-0.26114525299171243 -0.9579503247273814 0.11888789759516753 +-0.30444259547546554 -0.52277788618361543 -0.79625246484865153 +0.0692679740319051 -0.75374372009425039 -0.65350772925191603 +0.65350772925191603 0.069267974031905072 -0.75374372009425039 +0.79625246484865153 -0.30444259547546554 -0.52277788618361543 +0.91514036244381902 0.23096583391063502 0.33041322702361747 +0.91514036244381902 -0.23096583391063499 0.33041322702361747 +0.26163263319190305 0.6348558224990829 0.72698449081674643 +0.11888789759516753 0.26114525299171243 0.9579503247273814 +-0.65350772925191603 0.069267974031905072 0.75374372009425039 +-0.79625246484865153 -0.30444259547546554 0.52277788618361543 +-0.9579503247273814 -0.11888789759516753 -0.26114525299171243 +-0.72698449081674643 -0.261632633191903 -0.6348558224990829 +-0.23096583391063502 0.33041322702361747 -0.91514036244381902 +0.23096583391063499 0.33041322702361747 -0.91514036244381902 +0.52277788618361543 0.79625246484865153 -0.30444259547546554 +0.75374372009425039 0.65350772925191603 0.0692679740319051 +-0.26114525299171243 0.9579503247273814 0.11888789759516753 +-0.6348558224990829 0.72698449081674643 0.261632633191903 +-0.9579503247273814 0.11888789759516753 0.26114525299171243 +-0.72698449081674643 0.261632633191903 0.6348558224990829 +-0.33041322702361747 0.91514036244381902 -0.23096583391063502 +-0.33041322702361747 0.91514036244381902 0.23096583391063499 +-0.30444259547546554 0.52277788618361543 0.79625246484865153 +0.0692679740319051 0.75374372009425039 0.65350772925191603 +-0.6348558224990829 0.72698449081674643 -0.26163263319190305 +-0.26114525299171243 0.9579503247273814 -0.11888789759516753 +0.33041322702361747 0.91514036244381902 0.23096583391063502 +0.33041322702361747 0.91514036244381902 -0.23096583391063499 +-0.75374372009425039 0.65350772925191603 0.069267974031905072 +-0.52277788618361543 0.79625246484865153 -0.30444259547546554 +0.069267974031905072 0.75374372009425039 -0.65350772925191603 +-0.30444259547546554 0.52277788618361543 -0.79625246484865153 +-0.52277788618361543 0.79625246484865153 0.30444259547546554 +-0.75374372009425039 0.65350772925191603 -0.0692679740319051 +-0.72698449081674643 0.26163263319190305 -0.6348558224990829 +-0.9579503247273814 0.11888789759516753 -0.26114525299171243 +0.75374372009425039 0.65350772925191603 -0.069267974031905072 +0.52277788618361543 0.79625246484865153 0.30444259547546554 +-0.069267974031905072 0.75374372009425039 0.65350772925191603 +0.30444259547546554 0.52277788618361543 0.79625246484865153 +0.23096583391063502 0.33041322702361747 0.91514036244381902 +-0.23096583391063499 0.33041322702361747 0.91514036244381902 +-0.79625246484865153 0.30444259547546554 0.52277788618361543 +-0.65350772925191603 -0.0692679740319051 0.75374372009425039 +-0.72698449081674643 -0.26163263319190305 0.6348558224990829 +-0.9579503247273814 -0.11888789759516753 0.26114525299171243 +-0.91514036244381902 0.23096583391063502 -0.33041322702361747 +-0.91514036244381902 -0.23096583391063499 -0.33041322702361747 +-0.79625246484865153 -0.30444259547546554 -0.52277788618361543 +-0.65350772925191603 0.0692679740319051 -0.75374372009425039 +-0.26163263319190305 0.6348558224990829 -0.72698449081674643 +-0.11888789759516753 0.26114525299171243 -0.9579503247273814 +0.11888789759516753 0.26114525299171243 -0.9579503247273814 +0.261632633191903 0.6348558224990829 -0.72698449081674643 +0.26114525299171243 0.9579503247273814 -0.11888789759516753 +0.6348558224990829 0.72698449081674643 -0.261632633191903 +0.26114525299171243 -0.9579503247273814 0.11888789759516753 +0.6348558224990829 -0.72698449081674643 0.261632633191903 +0.9579503247273814 -0.11888789759516753 0.26114525299171243 +0.72698449081674643 -0.261632633191903 0.6348558224990829 +0.33041322702361747 -0.91514036244381902 -0.23096583391063502 +0.33041322702361747 -0.91514036244381902 0.23096583391063499 +0.30444259547546554 -0.52277788618361543 0.79625246484865153 +-0.0692679740319051 -0.75374372009425039 0.65350772925191603 +0.6348558224990829 -0.72698449081674643 -0.26163263319190305 +0.26114525299171243 -0.9579503247273814 -0.11888789759516753 +-0.33041322702361747 -0.91514036244381902 0.23096583391063502 +-0.33041322702361747 -0.91514036244381902 -0.23096583391063499 +0.75374372009425039 -0.65350772925191603 0.069267974031905072 +0.52277788618361543 -0.79625246484865153 -0.30444259547546554 +-0.069267974031905072 -0.75374372009425039 -0.65350772925191603 +0.30444259547546554 -0.52277788618361543 -0.79625246484865153 +0.52277788618361543 -0.79625246484865153 0.30444259547546554 +0.75374372009425039 -0.65350772925191603 -0.0692679740319051 +0.72698449081674643 -0.26163263319190305 -0.6348558224990829 +0.9579503247273814 -0.11888789759516753 -0.26114525299171243 +-0.23096583391063502 -0.33041322702361747 0.91514036244381902 +0.23096583391063499 -0.33041322702361747 0.91514036244381902 +0.79625246484865153 -0.30444259547546554 0.52277788618361543 +0.65350772925191603 0.0692679740319051 0.75374372009425039 +-0.75374372009425039 -0.65350772925191603 -0.069267974031905072 +-0.52277788618361543 -0.79625246484865153 0.30444259547546554 +0.069267974031905072 -0.75374372009425039 0.65350772925191603 +-0.30444259547546554 -0.52277788618361543 0.79625246484865153 +-0.11888789759516753 -0.26114525299171243 -0.9579503247273814 +-0.261632633191903 -0.6348558224990829 -0.72698449081674643 +-0.26114525299171243 -0.9579503247273814 -0.11888789759516753 +-0.6348558224990829 -0.72698449081674643 -0.261632633191903 +0.79625246484865153 0.30444259547546554 -0.52277788618361543 +0.65350772925191603 -0.0692679740319051 -0.75374372009425039 +0.26163263319190305 -0.6348558224990829 -0.72698449081674643 +0.11888789759516753 -0.26114525299171243 -0.9579503247273814 +0.72698449081674643 0.26163263319190305 0.6348558224990829 +0.9579503247273814 0.11888789759516753 0.26114525299171243 +0.91514036244381902 -0.23096583391063502 -0.33041322702361747 +0.91514036244381902 0.23096583391063499 -0.33041322702361747 +-0.46425215557034577 0.069975445501151617 0.88293452366254366 +-0.34662828228540943 0.2724487347064285 0.89756365839796159 +0.46055935492936023 0.64154039217710024 0.61344193351311094 +0.4686388229143581 0.77631151562962109 0.42156622772499869 +0.5283177429783209 0.68341737901426258 -0.50380655862698787 +0.33548020268271661 0.69401496243142713 -0.63702140115483408 +-0.35461678068422275 0.13773383355011229 -0.924811510499706 +-0.56208345571524498 0.13929011447478698 -0.81526710519976753 +-0.96805871419733358 -0.24139413148544345 -0.067758388048960672 +-0.98364968344024362 -0.12125214276834048 0.13315862023164154 +0.3546167806842227 0.13773383355011226 0.924811510499706 +0.56208345571524498 0.13929011447478698 0.81526710519976753 +-0.61344193351311094 -0.46055935492936023 0.64154039217710024 +-0.42156622772499869 -0.4686388229143581 0.77631151562962109 +-0.68341737901426258 -0.50380655862698787 -0.5283177429783209 +-0.69401496243142724 -0.63702140115483419 -0.33548020268271667 +0.24139413148544353 0.067758388048960672 -0.96805871419733358 +0.12125214276834048 -0.13315862023164154 -0.98364968344024362 +0.88293452366254366 0.46425215557034577 -0.069975445501151617 +0.89756365839796159 0.34662828228540943 -0.2724487347064285 +0.46425215557034577 -0.069975445501151617 0.88293452366254366 +0.34662828228540943 -0.2724487347064285 0.89756365839796159 +-0.46055935492936023 -0.64154039217710024 0.61344193351311094 +-0.4686388229143581 -0.77631151562962109 0.42156622772499869 +-0.5283177429783209 -0.68341737901426258 -0.50380655862698787 +-0.33548020268271661 -0.69401496243142713 -0.63702140115483408 +0.35461678068422275 -0.13773383355011229 -0.924811510499706 +0.56208345571524498 -0.13929011447478698 -0.81526710519976753 +0.96805871419733358 0.24139413148544345 -0.067758388048960672 +0.98364968344024362 0.12125214276834048 0.13315862023164154 +0.61344193351311094 0.46055935492936023 0.64154039217710024 +0.42156622772499869 0.4686388229143581 0.77631151562962109 +-0.3546167806842227 -0.13773383355011226 0.924811510499706 +-0.56208345571524498 -0.13929011447478698 0.81526710519976753 +-0.88293452366254366 -0.46425215557034577 -0.069975445501151617 +-0.89756365839796159 -0.34662828228540943 -0.2724487347064285 +-0.24139413148544353 -0.067758388048960672 -0.96805871419733358 +-0.12125214276834048 0.13315862023164154 -0.98364968344024362 +0.68341737901426258 0.50380655862698787 -0.5283177429783209 +0.69401496243142724 0.63702140115483419 -0.33548020268271667 +-0.069975445501151617 0.88293452366254366 0.46425215557034577 +-0.2724487347064285 0.89756365839796159 0.34662828228540943 +-0.88293452366254355 0.46425215557034583 0.069975445501151617 +-0.89756365839796159 0.34662828228540954 0.2724487347064285 +0.067758388048960672 0.96805871419733358 -0.24139413148544345 +-0.13315862023164154 0.98364968344024362 -0.12125214276834048 +-0.5283177429783209 0.68341737901426258 0.50380655862698787 +-0.33548020268271661 0.69401496243142713 0.63702140115483408 +-0.46055935492936023 0.64154039217710024 -0.61344193351311094 +-0.4686388229143581 0.77631151562962109 -0.42156622772499869 +-0.067758388048960672 0.96805871419733358 0.24139413148544345 +0.13315862023164154 0.98364968344024362 0.12125214276834048 +-0.924811510499706 0.35461678068422275 -0.13773383355011229 +-0.81526710519976753 0.56208345571524498 -0.13929011447478698 +-0.13773383355011226 0.924811510499706 -0.3546167806842227 +-0.13929011447478698 0.81526710519976753 -0.56208345571524498 +-0.68341737901426258 0.50380655862698787 0.5283177429783209 +-0.69401496243142724 0.63702140115483419 0.33548020268271667 +-0.64154039217710024 0.61344193351311094 -0.46055935492936023 +-0.77631151562962109 0.42156622772499869 -0.4686388229143581 +0.924811510499706 0.3546167806842227 0.13773383355011226 +0.81526710519976753 0.56208345571524498 0.13929011447478698 +0.13773383355011226 0.924811510499706 0.3546167806842227 +0.13929011447478698 0.81526710519976753 0.56208345571524498 +0.24139413148544345 -0.067758388048960672 0.96805871419733358 +0.12125214276834048 0.13315862023164154 0.98364968344024362 +-0.50380655862698787 0.5283177429783209 0.68341737901426258 +-0.63702140115483408 0.33548020268271661 0.69401496243142713 +-0.64154039217710024 -0.61344193351311094 0.46055935492936023 +-0.77631151562962109 -0.42156622772499869 0.4686388229143581 +-0.96805871419733358 0.24139413148544353 0.067758388048960672 +-0.98364968344024362 0.12125214276834048 -0.13315862023164154 +-0.50380655862698787 -0.5283177429783209 -0.68341737901426258 +-0.63702140115483408 -0.33548020268271661 -0.69401496243142713 +-0.61344193351311094 0.46055935492936023 -0.64154039217710024 +-0.42156622772499869 0.4686388229143581 -0.77631151562962109 +0.46425215557034583 0.069975445501151617 -0.88293452366254355 +0.34662828228540954 0.2724487347064285 -0.89756365839796159 +0.069975445501151617 0.88293452366254366 -0.46425215557034577 +0.2724487347064285 0.89756365839796159 -0.34662828228540943 +0.069975445501151617 -0.88293452366254366 0.46425215557034577 +0.2724487347064285 -0.89756365839796159 0.34662828228540943 +0.88293452366254355 -0.46425215557034583 0.069975445501151617 +0.89756365839796159 -0.34662828228540954 0.2724487347064285 +-0.067758388048960672 -0.96805871419733358 -0.24139413148544345 +0.13315862023164154 -0.98364968344024362 -0.12125214276834048 +0.5283177429783209 -0.68341737901426258 0.50380655862698787 +0.33548020268271661 -0.69401496243142713 0.63702140115483408 +0.46055935492936023 -0.64154039217710024 -0.61344193351311094 +0.4686388229143581 -0.77631151562962109 -0.42156622772499869 +0.067758388048960672 -0.96805871419733358 0.24139413148544345 +-0.13315862023164154 -0.98364968344024362 0.12125214276834048 +0.924811510499706 -0.35461678068422275 -0.13773383355011229 +0.81526710519976753 -0.56208345571524498 -0.13929011447478698 +0.13773383355011226 -0.924811510499706 -0.3546167806842227 +0.13929011447478698 -0.81526710519976753 -0.56208345571524498 +0.68341737901426258 -0.50380655862698787 0.5283177429783209 +0.69401496243142724 -0.63702140115483419 0.33548020268271667 +0.64154039217710024 -0.61344193351311094 -0.46055935492936023 +0.77631151562962109 -0.42156622772499869 -0.4686388229143581 +-0.24139413148544345 0.067758388048960672 0.96805871419733358 +-0.12125214276834048 -0.13315862023164154 0.98364968344024362 +0.50380655862698787 -0.5283177429783209 0.68341737901426258 +0.63702140115483408 -0.33548020268271661 0.69401496243142713 +-0.924811510499706 -0.3546167806842227 0.13773383355011226 +-0.81526710519976753 -0.56208345571524498 0.13929011447478698 +-0.13773383355011226 -0.924811510499706 0.3546167806842227 +-0.13929011447478698 -0.81526710519976753 0.56208345571524498 +-0.46425215557034583 -0.069975445501151617 -0.88293452366254355 +-0.34662828228540954 -0.2724487347064285 -0.89756365839796159 +-0.069975445501151617 -0.88293452366254366 -0.46425215557034577 +-0.2724487347064285 -0.89756365839796159 -0.34662828228540943 +0.50380655862698787 0.5283177429783209 -0.68341737901426258 +0.63702140115483408 0.33548020268271661 -0.69401496243142713 +0.61344193351311094 -0.46055935492936023 -0.64154039217710024 +0.42156622772499869 -0.4686388229143581 -0.77631151562962109 +0.64154039217710024 0.61344193351311094 0.46055935492936023 +0.77631151562962109 0.42156622772499869 0.4686388229143581 +0.96805871419733358 -0.24139413148544353 0.067758388048960672 +0.98364968344024362 -0.12125214276834048 -0.13315862023164154 +0 0.43195547637044063 0.90189493092798001 +-0.21362338119554267 0.45325313160797581 0.86540548281955476 +-0.46055935492936023 0.64154039217710024 0.61344193351311094 +-0.42156622772499869 0.4686388229143581 0.77631151562962109 +0.59616674324956287 0.80040678666100251 0.06272312261214491 +0.45325313160797587 0.86540548281955487 0.21362338119554269 +0.067758388048960672 0.96805871419733358 0.24139413148544347 +0.27244873470642855 0.89756365839796148 0.34662828228540948 +0.10148814426697755 0.49467859898258537 -0.86312990927314737 +0.13202651037052049 0.66687651280351856 -0.73337897244903427 +-0.069975445501151617 0.88293452366254355 -0.46425215557034577 +0.13929011447478695 0.81526710519976753 -0.56208345571524498 +-0.80040678666100251 -0.06272312261214491 -0.59616674324956287 +-0.73337897244903427 0.13202651037052052 -0.66687651280351845 +-0.68341737901426258 0.50380655862698787 -0.5283177429783209 +-0.63702140115483408 0.33548020268271661 -0.69401496243142713 +-0.86312990927314737 -0.10148814426697755 0.49467859898258537 +-0.94700235364457697 0 0.32122662123745532 +-0.924811510499706 0.35461678068422275 0.13773383355011229 +-0.98364968344024362 0.12125214276834048 0.13315862023164154 +0.80040678666100251 -0.06272312261214491 0.59616674324956287 +0.73337897244903427 0.13202651037052052 0.66687651280351845 +0.68341737901426258 0.50380655862698787 0.5283177429783209 +0.63702140115483408 0.33548020268271661 0.69401496243142713 +-0.06272312261214491 -0.59616674324956287 0.80040678666100251 +-0.21362338119554267 -0.45325313160797581 0.86540548281955476 +-0.24139413148544347 -0.067758388048960672 0.96805871419733358 +-0.34662828228540948 -0.27244873470642855 0.89756365839796148 +-0.49467859898258548 -0.86312990927314737 -0.10148814426697755 +-0.66687651280351856 -0.73337897244903427 -0.13202651037052049 +-0.88293452366254355 -0.46425215557034577 0.069975445501151617 +-0.81526710519976753 -0.56208345571524498 -0.13929011447478695 +0.10148814426697755 -0.49467859898258537 -0.86312990927314737 +0 -0.32122662123745532 -0.94700235364457697 +-0.35461678068422275 -0.13773383355011229 -0.924811510499706 +-0.12125214276834048 -0.13315862023164154 -0.98364968344024362 +0.90189493092798001 0 -0.43195547637044063 +0.86540548281955487 0.21362338119554269 -0.45325313160797587 +0.61344193351311094 0.46055935492936023 -0.64154039217710024 +0.77631151562962109 0.42156622772499869 -0.4686388229143581 +0 -0.43195547637044052 0.90189493092798001 +0.21362338119554267 -0.45325313160797581 0.86540548281955476 +0.46055935492936023 -0.64154039217710024 0.61344193351311094 +0.42156622772499869 -0.4686388229143581 0.77631151562962109 +-0.59616674324956287 -0.80040678666100251 0.06272312261214491 +-0.45325313160797587 -0.86540548281955487 0.21362338119554269 +-0.067758388048960672 -0.96805871419733358 0.24139413148544347 +-0.27244873470642855 -0.89756365839796148 0.34662828228540948 +-0.10148814426697755 -0.49467859898258548 -0.86312990927314737 +-0.13202651037052049 -0.66687651280351856 -0.73337897244903427 +0.069975445501151617 -0.88293452366254355 -0.46425215557034577 +-0.13929011447478695 -0.81526710519976753 -0.56208345571524498 +0.80040678666100251 0.06272312261214491 -0.59616674324956287 +0.73337897244903427 -0.13202651037052052 -0.66687651280351845 +0.68341737901426258 -0.50380655862698787 -0.5283177429783209 +0.63702140115483408 -0.33548020268271661 -0.69401496243142713 +0.86312990927314737 0.10148814426697755 0.49467859898258537 +0.94700235364457697 0 0.32122662123745532 +0.924811510499706 -0.35461678068422275 0.13773383355011229 +0.98364968344024362 -0.12125214276834048 0.13315862023164154 +0.06272312261214491 0.59616674324956287 0.80040678666100251 +0.21362338119554267 0.45325313160797581 0.86540548281955476 +0.24139413148544347 0.067758388048960672 0.96805871419733358 +0.34662828228540948 0.27244873470642855 0.89756365839796148 +-0.80040678666100251 0.06272312261214491 0.59616674324956287 +-0.73337897244903427 -0.13202651037052052 0.66687651280351845 +-0.68341737901426258 -0.50380655862698787 0.5283177429783209 +-0.63702140115483408 -0.33548020268271661 0.69401496243142713 +-0.90189493092798001 0 -0.43195547637044052 +-0.86540548281955487 -0.21362338119554269 -0.45325313160797587 +-0.61344193351311094 -0.46055935492936023 -0.64154039217710024 +-0.77631151562962109 -0.42156622772499869 -0.4686388229143581 +-0.10148814426697755 0.49467859898258537 -0.86312990927314737 +0 0.32122662123745532 -0.94700235364457697 +0.35461678068422275 0.13773383355011229 -0.924811510499706 +0.12125214276834048 0.13315862023164154 -0.98364968344024362 +0.49467859898258548 0.86312990927314737 -0.10148814426697755 +0.66687651280351856 0.73337897244903427 -0.13202651037052049 +0.88293452366254355 0.46425215557034577 0.069975445501151617 +0.81526710519976753 0.56208345571524498 -0.13929011447478695 +-0.43195547637044052 0.90189493092798001 0 +-0.45325313160797587 0.86540548281955487 0.21362338119554269 +-0.64154039217710024 0.61344193351311094 0.46055935492936023 +-0.4686388229143581 0.77631151562962109 0.42156622772499869 +-0.90189493092798001 0 0.43195547637044052 +-0.86540548281955487 0.21362338119554269 0.45325313160797587 +-0.61344193351311094 0.46055935492936023 0.64154039217710024 +-0.77631151562962109 0.42156622772499869 0.4686388229143581 +-0.49467859898258537 0.86312990927314737 -0.10148814426697755 +-0.32122662123745532 0.94700235364457697 0 +-0.13773383355011229 0.924811510499706 0.3546167806842227 +-0.13315862023164154 0.98364968344024362 0.12125214276834048 +-0.10148814426697755 0.49467859898258548 0.86312990927314737 +-0.13202651037052049 0.66687651280351856 0.73337897244903427 +0.069975445501151617 0.88293452366254355 0.46425215557034577 +-0.13929011447478695 0.81526710519976753 0.56208345571524498 +-0.59616674324956287 0.80040678666100251 -0.06272312261214491 +-0.45325313160797587 0.86540548281955487 -0.21362338119554269 +-0.067758388048960672 0.96805871419733358 -0.24139413148544347 +-0.27244873470642855 0.89756365839796148 -0.34662828228540948 +0.49467859898258537 0.86312990927314737 0.10148814426697755 +0.32122662123745532 0.94700235364457697 0 +0.13773383355011229 0.924811510499706 -0.3546167806842227 +0.13315862023164154 0.98364968344024362 -0.12125214276834048 +-0.59616674324956287 0.80040678666100251 0.06272312261214491 +-0.66687651280351845 0.73337897244903427 -0.13202651037052052 +-0.5283177429783209 0.68341737901426258 -0.50380655862698787 +-0.69401496243142724 0.63702140115483419 -0.33548020268271667 +0.06272312261214491 0.59616674324956287 -0.80040678666100251 +-0.13202651037052052 0.66687651280351845 -0.73337897244903427 +-0.50380655862698787 0.5283177429783209 -0.68341737901426258 +-0.33548020268271661 0.69401496243142713 -0.63702140115483408 +-0.49467859898258548 0.86312990927314737 0.10148814426697755 +-0.66687651280351856 0.73337897244903427 0.13202651037052049 +-0.88293452366254355 0.46425215557034583 -0.069975445501151617 +-0.81526710519976753 0.56208345571524498 0.13929011447478695 +-0.80040678666100251 0.06272312261214491 -0.59616674324956287 +-0.86540548281955487 0.21362338119554269 -0.45325313160797587 +-0.96805871419733358 0.24139413148544347 -0.067758388048960672 +-0.89756365839796148 0.34662828228540948 -0.27244873470642855 +0.59616674324956287 0.80040678666100251 -0.06272312261214491 +0.66687651280351845 0.73337897244903427 0.13202651037052052 +0.5283177429783209 0.68341737901426258 0.50380655862698787 +0.69401496243142724 0.63702140115483419 0.33548020268271667 +-0.06272312261214491 0.59616674324956287 0.80040678666100251 +0.13202651037052052 0.66687651280351845 0.73337897244903427 +0.50380655862698787 0.5283177429783209 0.68341737901426258 +0.33548020268271661 0.69401496243142713 0.63702140115483408 +0.10148814426697755 0.49467859898258537 0.86312990927314737 +0 0.32122662123745532 0.94700235364457697 +-0.3546167806842227 0.13773383355011229 0.924811510499706 +-0.12125214276834048 0.13315862023164154 0.98364968344024362 +-0.86312990927314737 0.10148814426697755 0.49467859898258548 +-0.73337897244903427 0.13202651037052049 0.66687651280351856 +-0.46425215557034583 -0.069975445501151631 0.88293452366254366 +-0.56208345571524498 0.13929011447478695 0.81526710519976753 +-0.80040678666100251 -0.06272312261214491 0.59616674324956287 +-0.86540548281955487 -0.21362338119554269 0.45325313160797587 +-0.96805871419733358 -0.24139413148544347 0.067758388048960672 +-0.89756365839796148 -0.34662828228540948 0.27244873470642855 +-0.86312990927314737 0.10148814426697755 -0.49467859898258537 +-0.94700235364457697 0 -0.32122662123745532 +-0.924811510499706 -0.3546167806842227 -0.13773383355011229 +-0.98364968344024362 -0.12125214276834048 -0.13315862023164154 +-0.86312990927314737 -0.10148814426697755 -0.49467859898258548 +-0.73337897244903427 -0.13202651037052049 -0.66687651280351856 +-0.46425215557034583 0.069975445501151617 -0.88293452366254355 +-0.56208345571524498 -0.13929011447478695 -0.81526710519976753 +-0.06272312261214491 0.59616674324956287 -0.80040678666100251 +-0.21362338119554267 0.45325313160797581 -0.86540548281955476 +-0.24139413148544347 0.067758388048960672 -0.96805871419733358 +-0.34662828228540948 0.27244873470642855 -0.89756365839796148 +0 0.43195547637044063 -0.90189493092798001 +0.21362338119554267 0.45325313160797581 -0.86540548281955476 +0.46055935492936023 0.64154039217710024 -0.61344193351311094 +0.42156622772499869 0.4686388229143581 -0.77631151562962109 +0.43195547637044052 0.90189493092798001 0 +0.45325313160797587 0.86540548281955487 -0.21362338119554269 +0.64154039217710024 0.61344193351311094 -0.46055935492936023 +0.4686388229143581 0.77631151562962109 -0.42156622772499869 +0.43195547637044052 -0.90189493092798001 0 +0.45325313160797587 -0.86540548281955487 0.21362338119554269 +0.64154039217710024 -0.61344193351311094 0.46055935492936023 +0.4686388229143581 -0.77631151562962109 0.42156622772499869 +0.90189493092798001 0 0.43195547637044063 +0.86540548281955487 -0.21362338119554269 0.45325313160797587 +0.61344193351311094 -0.46055935492936023 0.64154039217710024 +0.77631151562962109 -0.42156622772499869 0.4686388229143581 +0.49467859898258537 -0.86312990927314737 -0.10148814426697755 +0.32122662123745532 -0.94700235364457697 0 +0.13773383355011229 -0.924811510499706 0.3546167806842227 +0.13315862023164154 -0.98364968344024362 0.12125214276834048 +0.10148814426697755 -0.49467859898258548 0.86312990927314737 +0.13202651037052049 -0.66687651280351856 0.73337897244903427 +-0.069975445501151617 -0.88293452366254355 0.46425215557034577 +0.13929011447478695 -0.81526710519976753 0.56208345571524498 +0.59616674324956287 -0.80040678666100251 -0.06272312261214491 +0.45325313160797587 -0.86540548281955487 -0.21362338119554269 +0.067758388048960672 -0.96805871419733358 -0.24139413148544347 +0.27244873470642855 -0.89756365839796148 -0.34662828228540948 +-0.49467859898258537 -0.86312990927314737 0.10148814426697755 +-0.32122662123745532 -0.94700235364457697 0 +-0.13773383355011229 -0.924811510499706 -0.3546167806842227 +-0.13315862023164154 -0.98364968344024362 -0.12125214276834048 +0.59616674324956287 -0.80040678666100251 0.06272312261214491 +0.66687651280351845 -0.73337897244903427 -0.13202651037052052 +0.5283177429783209 -0.68341737901426258 -0.50380655862698787 +0.69401496243142724 -0.63702140115483419 -0.33548020268271667 +-0.06272312261214491 -0.59616674324956287 -0.80040678666100251 +0.13202651037052052 -0.66687651280351845 -0.73337897244903427 +0.50380655862698787 -0.5283177429783209 -0.68341737901426258 +0.33548020268271661 -0.69401496243142713 -0.63702140115483408 +0.49467859898258548 -0.86312990927314737 0.10148814426697755 +0.66687651280351856 -0.73337897244903427 0.13202651037052049 +0.88293452366254355 -0.46425215557034583 -0.069975445501151617 +0.81526710519976753 -0.56208345571524498 0.13929011447478695 +0.80040678666100251 -0.06272312261214491 -0.59616674324956287 +0.86540548281955487 -0.21362338119554269 -0.45325313160797587 +0.96805871419733358 -0.24139413148544347 -0.067758388048960672 +0.89756365839796148 -0.34662828228540948 -0.27244873470642855 +-0.10148814426697755 -0.49467859898258537 0.86312990927314737 +0 -0.32122662123745532 0.94700235364457697 +0.3546167806842227 -0.13773383355011229 0.924811510499706 +0.12125214276834048 -0.13315862023164154 0.98364968344024362 +0.86312990927314737 -0.10148814426697755 0.49467859898258548 +0.73337897244903427 -0.13202651037052049 0.66687651280351856 +0.46425215557034583 0.069975445501151631 0.88293452366254366 +0.56208345571524498 -0.13929011447478695 0.81526710519976753 +-0.59616674324956287 -0.80040678666100251 -0.06272312261214491 +-0.66687651280351845 -0.73337897244903427 0.13202651037052052 +-0.5283177429783209 -0.68341737901426258 0.50380655862698787 +-0.69401496243142724 -0.63702140115483419 0.33548020268271667 +0.06272312261214491 -0.59616674324956287 0.80040678666100251 +-0.13202651037052052 -0.66687651280351845 0.73337897244903427 +-0.50380655862698787 -0.5283177429783209 0.68341737901426258 +-0.33548020268271661 -0.69401496243142713 0.63702140115483408 +0 -0.43195547637044063 -0.90189493092798001 +-0.21362338119554267 -0.45325313160797581 -0.86540548281955476 +-0.46055935492936023 -0.64154039217710024 -0.61344193351311094 +-0.42156622772499869 -0.4686388229143581 -0.77631151562962109 +-0.43195547637044052 -0.90189493092798001 0 +-0.45325313160797587 -0.86540548281955487 -0.21362338119554269 +-0.64154039217710024 -0.61344193351311094 -0.46055935492936023 +-0.4686388229143581 -0.77631151562962109 -0.42156622772499869 +0.86312990927314737 0.10148814426697755 -0.49467859898258537 +0.73337897244903427 0.13202651037052049 -0.66687651280351856 +0.46425215557034583 -0.069975445501151617 -0.88293452366254355 +0.56208345571524498 0.13929011447478695 -0.81526710519976753 +0.06272312261214491 -0.59616674324956287 -0.80040678666100251 +0.21362338119554267 -0.45325313160797581 -0.86540548281955476 +0.24139413148544347 -0.067758388048960672 -0.96805871419733358 +0.34662828228540948 -0.27244873470642855 -0.89756365839796148 +0.80040678666100251 0.06272312261214491 0.59616674324956287 +0.86540548281955487 0.21362338119554269 0.45325313160797587 +0.96805871419733358 0.24139413148544347 0.067758388048960672 +0.89756365839796148 0.34662828228540948 0.27244873470642855 +0.86312990927314737 -0.10148814426697755 -0.49467859898258537 +0.94700235364457697 0 -0.32122662123745532 +0.924811510499706 0.3546167806842227 -0.13773383355011229 +0.98364968344024362 0.12125214276834048 -0.13315862023164154 +3 305 125 272 +3 303 123 273 +3 311 131 274 +3 309 129 275 +3 307 127 276 +3 287 107 277 +3 288 108 278 +3 289 109 279 +3 290 110 280 +3 291 111 281 +3 323 143 282 +3 325 145 283 +3 327 147 284 +3 329 149 285 +3 331 151 286 +3 277 97 287 +3 278 98 288 +3 279 99 289 +3 280 100 290 +3 281 101 291 +3 295 115 292 +3 300 120 293 +3 297 117 294 +3 292 112 295 +3 299 119 296 +3 294 114 297 +3 301 121 298 +3 296 116 299 +3 293 113 300 +3 298 118 301 +3 330 150 302 +3 273 93 303 +3 322 142 304 +3 272 92 305 +3 324 144 306 +3 276 96 307 +3 326 146 308 +3 275 95 309 +3 328 148 310 +3 274 94 311 +3 315 135 312 +3 320 140 313 +3 317 137 314 +3 312 132 315 +3 319 139 316 +3 314 134 317 +3 321 141 318 +3 316 136 319 +3 313 133 320 +3 318 138 321 +3 304 124 322 +3 282 102 323 +3 306 126 324 +3 283 103 325 +3 308 128 326 +3 284 104 327 +3 310 130 328 +3 285 105 329 +3 302 122 330 +3 286 106 331 +3 397 217 332 +3 378 198 333 +3 393 213 334 +3 382 202 335 +3 409 229 336 +3 386 206 337 +3 405 225 338 +3 390 210 339 +3 401 221 340 +3 374 194 341 +3 435 255 342 +3 448 268 343 +3 439 259 344 +3 432 252 345 +3 443 263 346 +3 436 256 347 +3 447 267 348 +3 440 260 349 +3 451 271 350 +3 444 264 351 +3 433 253 352 +3 418 238 353 +3 437 257 354 +3 422 242 355 +3 441 261 356 +3 426 246 357 +3 445 265 358 +3 430 250 359 +3 449 269 360 +3 414 234 361 +3 395 215 362 +3 396 216 363 +3 399 219 364 +3 400 220 365 +3 403 223 366 +3 404 224 367 +3 407 227 368 +3 408 228 369 +3 411 231 370 +3 392 212 371 +3 377 197 372 +3 388 208 373 +3 341 161 374 +3 398 218 375 +3 381 201 376 +3 372 192 377 +3 333 153 378 +3 394 214 379 +3 385 205 380 +3 376 196 381 +3 335 155 382 +3 410 230 383 +3 389 209 384 +3 380 200 385 +3 337 157 386 +3 406 226 387 +3 373 193 388 +3 384 204 389 +3 339 159 390 +3 402 222 391 +3 371 191 392 +3 334 154 393 +3 379 199 394 +3 362 182 395 +3 363 183 396 +3 332 152 397 +3 375 195 398 +3 364 184 399 +3 365 185 400 +3 340 160 401 +3 391 211 402 +3 366 186 403 +3 367 187 404 +3 338 158 405 +3 387 207 406 +3 368 188 407 +3 369 189 408 +3 336 156 409 +3 383 203 410 +3 370 190 411 +3 417 237 412 +3 428 248 413 +3 361 181 414 +3 434 254 415 +3 421 241 416 +3 412 232 417 +3 353 173 418 +3 438 258 419 +3 425 245 420 +3 416 236 421 +3 355 175 422 +3 442 262 423 +3 429 249 424 +3 420 240 425 +3 357 177 426 +3 446 266 427 +3 413 233 428 +3 424 244 429 +3 359 179 430 +3 450 270 431 +3 345 165 432 +3 352 172 433 +3 415 235 434 +3 342 162 435 +3 347 167 436 +3 354 174 437 +3 419 239 438 +3 344 164 439 +3 349 169 440 +3 356 176 441 +3 423 243 442 +3 346 166 443 +3 351 171 444 +3 358 178 445 +3 427 247 446 +3 348 168 447 +3 343 163 448 +3 360 180 449 +3 431 251 450 +3 350 170 451 +3 707 219 452 +3 702 217 453 +3 699 215 454 +3 694 213 455 +3 731 231 456 +3 726 229 457 +3 723 227 458 +3 718 225 459 +3 715 223 460 +3 710 221 461 +3 635 183 462 +3 778 255 463 +3 639 185 464 +3 786 259 465 +3 643 187 466 +3 794 263 467 +3 647 189 468 +3 802 267 469 +3 651 191 470 +3 810 271 471 +3 779 255 472 +3 774 253 473 +3 787 259 474 +3 782 257 475 +3 795 263 476 +3 790 261 477 +3 803 267 478 +3 798 265 479 +3 811 271 480 +3 806 269 481 +3 595 163 482 +3 698 215 483 +3 599 165 484 +3 706 219 485 +3 603 167 486 +3 714 223 487 +3 607 169 488 +3 722 227 489 +3 611 171 490 +3 730 231 491 +3 667 199 492 +3 662 197 493 +3 687 209 494 +3 590 161 495 +3 675 203 496 +3 670 201 497 +3 655 193 498 +3 574 153 499 +3 683 207 500 +3 678 205 501 +3 663 197 502 +3 578 155 503 +3 691 211 504 +3 686 209 505 +3 671 201 506 +3 582 157 507 +3 659 195 508 +3 654 193 509 +3 679 205 510 +3 586 159 511 +3 807 269 512 +3 650 191 513 +3 579 155 514 +3 666 199 515 +3 775 253 516 +3 634 183 517 +3 575 153 518 +3 658 195 519 +3 783 257 520 +3 638 185 521 +3 591 161 522 +3 690 211 523 +3 791 261 524 +3 642 187 525 +3 587 159 526 +3 682 207 527 +3 799 265 528 +3 646 189 529 +3 583 157 530 +3 674 203 531 +3 747 239 532 +3 742 237 533 +3 767 249 534 +3 630 181 535 +3 755 243 536 +3 750 241 537 +3 735 233 538 +3 614 173 539 +3 763 247 540 +3 758 245 541 +3 743 237 542 +3 618 175 543 +3 771 251 544 +3 766 249 545 +3 751 241 546 +3 622 177 547 +3 739 235 548 +3 734 233 549 +3 759 245 550 +3 626 179 551 +3 703 217 552 +3 598 165 553 +3 615 173 554 +3 738 235 555 +3 711 221 556 +3 602 167 557 +3 619 175 558 +3 746 239 559 +3 719 225 560 +3 606 169 561 +3 623 177 562 +3 754 243 563 +3 727 229 564 +3 610 171 565 +3 627 179 566 +3 762 247 567 +3 695 213 568 +3 594 163 569 +3 631 181 570 +3 770 251 571 +3 701 216 572 +3 664 198 573 +3 499 115 574 +3 518 125 575 +3 693 212 576 +3 672 202 577 +3 503 117 578 +3 514 123 579 +3 725 228 580 +3 680 206 581 +3 507 119 582 +3 530 131 583 +3 717 224 584 +3 688 210 585 +3 511 121 586 +3 526 129 587 +3 709 220 588 +3 656 194 589 +3 495 113 590 +3 522 127 591 +3 777 254 592 +3 804 268 593 +3 569 150 594 +3 482 107 595 +3 785 258 596 +3 772 252 597 +3 553 142 598 +3 484 108 599 +3 793 262 600 +3 780 256 601 +3 557 144 602 +3 486 109 603 +3 801 266 604 +3 788 260 605 +3 561 146 606 +3 488 110 607 +3 809 270 608 +3 796 264 609 +3 565 148 610 +3 490 111 611 +3 773 252 612 +3 744 238 613 +3 539 135 614 +3 554 143 615 +3 781 256 616 +3 752 242 617 +3 543 137 618 +3 558 145 619 +3 789 260 620 +3 760 246 621 +3 547 139 622 +3 562 147 623 +3 797 264 624 +3 768 250 625 +3 551 141 626 +3 566 149 627 +3 805 268 628 +3 736 234 629 +3 535 133 630 +3 570 151 631 +3 697 214 632 +3 700 216 633 +3 517 124 634 +3 462 97 635 +3 705 218 636 +3 708 220 637 +3 521 126 638 +3 464 98 639 +3 713 222 640 +3 716 224 641 +3 525 128 642 +3 466 99 643 +3 721 226 644 +3 724 228 645 +3 529 130 646 +3 468 100 647 +3 729 230 648 +3 692 212 649 +3 513 122 650 +3 470 101 651 +3 661 196 652 +3 684 208 653 +3 509 120 654 +3 498 115 655 +3 589 160 656 +3 704 218 657 +3 519 125 658 +3 508 120 659 +3 669 200 660 +3 652 192 661 +3 493 112 662 +3 502 117 663 +3 573 152 664 +3 696 214 665 +3 515 123 666 +3 492 112 667 +3 677 204 668 +3 660 196 669 +3 497 114 670 +3 506 119 671 +3 577 154 672 +3 728 230 673 +3 531 131 674 +3 496 114 675 +3 685 208 676 +3 668 200 677 +3 501 116 678 +3 510 121 679 +3 581 156 680 +3 720 226 681 +3 527 129 682 +3 500 116 683 +3 653 192 684 +3 676 204 685 +3 505 118 686 +3 494 113 687 +3 585 158 688 +3 712 222 689 +3 523 127 690 +3 504 118 691 +3 649 190 692 +3 576 154 693 +3 455 93 694 +3 568 150 695 +3 665 198 696 +3 632 182 697 +3 483 107 698 +3 454 93 699 +3 633 182 700 +3 572 152 701 +3 453 92 702 +3 552 142 703 +3 657 194 704 +3 636 184 705 +3 485 108 706 +3 452 92 707 +3 637 184 708 +3 588 160 709 +3 461 96 710 +3 556 144 711 +3 689 210 712 +3 640 186 713 +3 487 109 714 +3 460 96 715 +3 641 186 716 +3 584 158 717 +3 459 95 718 +3 560 146 719 +3 681 206 720 +3 644 188 721 +3 489 110 722 +3 458 95 723 +3 645 188 724 +3 580 156 725 +3 457 94 726 +3 564 148 727 +3 673 202 728 +3 648 190 729 +3 491 111 730 +3 456 94 731 +3 741 236 732 +3 764 248 733 +3 549 140 734 +3 538 135 735 +3 629 180 736 +3 776 254 737 +3 555 143 738 +3 548 140 739 +3 749 240 740 +3 732 232 741 +3 533 132 742 +3 542 137 743 +3 613 172 744 +3 784 258 745 +3 559 145 746 +3 532 132 747 +3 757 244 748 +3 740 236 749 +3 537 134 750 +3 546 139 751 +3 617 174 752 +3 792 262 753 +3 563 147 754 +3 536 134 755 +3 765 248 756 +3 748 240 757 +3 541 136 758 +3 550 141 759 +3 621 176 760 +3 800 266 761 +3 567 149 762 +3 540 136 763 +3 733 232 764 +3 756 244 765 +3 545 138 766 +3 534 133 767 +3 625 178 768 +3 808 270 769 +3 571 151 770 +3 544 138 771 +3 597 164 772 +3 612 172 773 +3 473 102 774 +3 516 124 775 +3 737 234 776 +3 592 162 777 +3 463 97 778 +3 472 102 779 +3 601 166 780 +3 616 174 781 +3 475 103 782 +3 520 126 783 +3 745 238 784 +3 596 164 785 +3 465 98 786 +3 474 103 787 +3 605 168 788 +3 620 176 789 +3 477 104 790 +3 524 128 791 +3 753 242 792 +3 600 166 793 +3 467 99 794 +3 476 104 795 +3 609 170 796 +3 624 178 797 +3 479 105 798 +3 528 130 799 +3 761 246 800 +3 604 168 801 +3 469 100 802 +3 478 105 803 +3 593 162 804 +3 628 180 805 +3 481 106 806 +3 512 122 807 +3 769 250 808 +3 608 170 809 +3 471 101 810 +3 480 106 811 +3 519 65 272 +3 707 92 272 +3 515 63 273 +3 699 93 273 +3 531 71 274 +3 731 94 274 +3 527 69 275 +3 723 95 275 +3 523 67 276 +3 715 96 276 +3 483 47 277 +3 635 97 277 +3 485 48 278 +3 639 98 278 +3 487 49 279 +3 643 99 279 +3 489 50 280 +3 647 100 280 +3 491 51 281 +3 651 101 281 +3 555 83 282 +3 779 102 282 +3 559 85 283 +3 787 103 283 +3 563 87 284 +3 795 104 284 +3 567 89 285 +3 803 105 285 +3 571 91 286 +3 811 106 286 +3 463 37 287 +3 595 107 287 +3 465 38 288 +3 599 108 288 +3 467 39 289 +3 603 109 289 +3 469 40 290 +3 607 110 290 +3 471 41 291 +3 611 111 291 +3 499 55 292 +3 667 112 292 +3 509 60 293 +3 687 113 293 +3 503 57 294 +3 675 114 294 +3 493 52 295 +3 655 115 295 +3 507 59 296 +3 683 116 296 +3 497 54 297 +3 663 117 297 +3 511 61 298 +3 691 118 298 +3 501 56 299 +3 671 119 299 +3 495 53 300 +3 659 120 300 +3 505 58 301 +3 679 121 301 +3 569 90 302 +3 807 122 302 +3 455 33 303 +3 579 123 303 +3 553 82 304 +3 775 124 304 +3 453 32 305 +3 575 125 305 +3 557 84 306 +3 783 126 306 +3 461 36 307 +3 591 127 307 +3 561 86 308 +3 791 128 308 +3 459 35 309 +3 587 129 309 +3 565 88 310 +3 799 130 310 +3 457 34 311 +3 583 131 311 +3 539 75 312 +3 747 132 312 +3 549 80 313 +3 767 133 313 +3 543 77 314 +3 755 134 314 +3 533 72 315 +3 735 135 315 +3 547 79 316 +3 763 136 316 +3 537 74 317 +3 743 137 317 +3 551 81 318 +3 771 138 318 +3 541 76 319 +3 751 139 319 +3 535 73 320 +3 739 140 320 +3 545 78 321 +3 759 141 321 +3 517 64 322 +3 703 142 322 +3 473 42 323 +3 615 143 323 +3 521 66 324 +3 711 144 324 +3 475 43 325 +3 619 145 325 +3 525 68 326 +3 719 146 326 +3 477 44 327 +3 623 147 327 +3 529 70 328 +3 727 148 328 +3 479 45 329 +3 627 149 329 +3 513 62 330 +3 695 150 330 +3 481 46 331 +3 631 151 331 +3 703 64 332 +3 701 152 332 +3 665 55 333 +3 499 153 333 +3 695 62 334 +3 693 154 334 +3 673 57 335 +3 503 155 335 +3 727 70 336 +3 725 156 336 +3 681 59 337 +3 507 157 337 +3 719 68 338 +3 717 158 338 +3 689 61 339 +3 511 159 339 +3 711 66 340 +3 709 160 340 +3 657 53 341 +3 495 161 341 +3 779 83 342 +3 777 162 342 +3 805 90 343 +3 569 163 343 +3 787 85 344 +3 785 164 344 +3 773 82 345 +3 553 165 345 +3 795 87 346 +3 793 166 346 +3 781 84 347 +3 557 167 347 +3 803 89 348 +3 801 168 348 +3 789 86 349 +3 561 169 349 +3 811 91 350 +3 809 170 350 +3 797 88 351 +3 565 171 351 +3 775 82 352 +3 773 172 352 +3 745 75 353 +3 539 173 353 +3 783 84 354 +3 781 174 354 +3 753 77 355 +3 543 175 355 +3 791 86 356 +3 789 176 356 +3 761 79 357 +3 547 177 357 +3 799 88 358 +3 797 178 358 +3 769 81 359 +3 551 179 359 +3 807 90 360 +3 805 180 360 +3 737 73 361 +3 535 181 361 +3 699 63 362 +3 697 182 362 +3 701 64 363 +3 517 183 363 +3 707 65 364 +3 705 184 364 +3 709 66 365 +3 521 185 365 +3 715 67 366 +3 713 186 366 +3 717 68 367 +3 525 187 367 +3 723 69 368 +3 721 188 368 +3 725 70 369 +3 529 189 369 +3 731 71 370 +3 729 190 370 +3 693 62 371 +3 513 191 371 +3 663 54 372 +3 661 192 372 +3 685 60 373 +3 509 193 373 +3 591 36 374 +3 589 194 374 +3 705 65 375 +3 519 195 375 +3 671 56 376 +3 669 196 376 +3 653 52 377 +3 493 197 377 +3 575 32 378 +3 573 198 378 +3 697 63 379 +3 515 199 379 +3 679 58 380 +3 677 200 380 +3 661 54 381 +3 497 201 381 +3 579 33 382 +3 577 202 382 +3 729 71 383 +3 531 203 383 +3 687 60 384 +3 685 204 384 +3 669 56 385 +3 501 205 385 +3 583 34 386 +3 581 206 386 +3 721 69 387 +3 527 207 387 +3 655 52 388 +3 653 208 388 +3 677 58 389 +3 505 209 389 +3 587 35 390 +3 585 210 390 +3 713 67 391 +3 523 211 391 +3 651 51 392 +3 649 212 392 +3 577 33 393 +3 455 213 393 +3 667 55 394 +3 665 214 394 +3 633 47 395 +3 483 215 395 +3 635 47 396 +3 633 216 396 +3 573 32 397 +3 453 217 397 +3 659 53 398 +3 657 218 398 +3 637 48 399 +3 485 219 399 +3 639 48 400 +3 637 220 400 +3 589 36 401 +3 461 221 401 +3 691 61 402 +3 689 222 402 +3 641 49 403 +3 487 223 403 +3 643 49 404 +3 641 224 404 +3 585 35 405 +3 459 225 405 +3 683 59 406 +3 681 226 406 +3 645 50 407 +3 489 227 407 +3 647 50 408 +3 645 228 408 +3 581 34 409 +3 457 229 409 +3 675 57 410 +3 673 230 410 +3 649 51 411 +3 491 231 411 +3 743 74 412 +3 741 232 412 +3 765 80 413 +3 549 233 413 +3 631 46 414 +3 629 234 414 +3 777 83 415 +3 555 235 415 +3 751 76 416 +3 749 236 416 +3 733 72 417 +3 533 237 417 +3 615 42 418 +3 613 238 418 +3 785 85 419 +3 559 239 419 +3 759 78 420 +3 757 240 420 +3 741 74 421 +3 537 241 421 +3 619 43 422 +3 617 242 422 +3 793 87 423 +3 563 243 423 +3 767 80 424 +3 765 244 424 +3 749 76 425 +3 541 245 425 +3 623 44 426 +3 621 246 426 +3 801 89 427 +3 567 247 427 +3 735 72 428 +3 733 248 428 +3 757 78 429 +3 545 249 429 +3 627 45 430 +3 625 250 430 +3 809 91 431 +3 571 251 431 +3 599 38 432 +3 597 252 432 +3 613 42 433 +3 473 253 433 +3 739 73 434 +3 737 254 434 +3 593 37 435 +3 463 255 435 +3 603 39 436 +3 601 256 436 +3 617 43 437 +3 475 257 437 +3 747 75 438 +3 745 258 438 +3 597 38 439 +3 465 259 439 +3 607 40 440 +3 605 260 440 +3 621 44 441 +3 477 261 441 +3 755 77 442 +3 753 262 442 +3 601 39 443 +3 467 263 443 +3 611 41 444 +3 609 264 444 +3 625 45 445 +3 479 265 445 +3 763 79 446 +3 761 266 446 +3 605 40 447 +3 469 267 447 +3 595 37 448 +3 593 268 448 +3 629 46 449 +3 481 269 449 +3 771 81 450 +3 769 270 450 +3 609 41 451 +3 471 271 451 +3 706 18 452 +3 702 92 452 +3 397 32 453 +3 305 92 453 +3 698 17 454 +3 694 93 454 +3 393 33 455 +3 303 93 455 +3 730 21 456 +3 726 94 456 +3 409 34 457 +3 311 94 457 +3 722 20 458 +3 718 95 458 +3 405 35 459 +3 309 95 459 +3 714 19 460 +3 710 96 460 +3 401 36 461 +3 307 96 461 +3 634 27 462 +3 778 97 462 +3 435 37 463 +3 287 97 463 +3 638 28 464 +3 786 98 464 +3 439 38 465 +3 288 98 465 +3 642 29 466 +3 794 99 466 +3 443 39 467 +3 289 99 467 +3 646 30 468 +3 802 100 468 +3 447 40 469 +3 290 100 469 +3 650 31 470 +3 810 101 470 +3 451 41 471 +3 291 101 471 +3 778 27 472 +3 774 102 472 +3 433 42 473 +3 323 102 473 +3 786 28 474 +3 782 103 474 +3 437 43 475 +3 325 103 475 +3 794 29 476 +3 790 104 476 +3 441 44 477 +3 327 104 477 +3 802 30 478 +3 798 105 478 +3 445 45 479 +3 329 105 479 +3 810 31 480 +3 806 106 480 +3 449 46 481 +3 331 106 481 +3 594 17 482 +3 698 107 482 +3 395 47 483 +3 277 107 483 +3 598 18 484 +3 706 108 484 +3 399 48 485 +3 278 108 485 +3 602 19 486 +3 714 109 486 +3 403 49 487 +3 279 109 487 +3 606 20 488 +3 722 110 488 +3 407 50 489 +3 280 110 489 +3 610 21 490 +3 730 111 490 +3 411 51 491 +3 281 111 491 +3 666 13 492 +3 662 112 492 +3 377 52 493 +3 295 112 493 +3 686 16 494 +3 590 113 494 +3 341 53 495 +3 300 113 495 +3 674 14 496 +3 670 114 496 +3 381 54 497 +3 297 114 497 +3 654 12 498 +3 574 115 498 +3 333 55 499 +3 292 115 499 +3 682 15 500 +3 678 116 500 +3 385 56 501 +3 299 116 501 +3 662 13 502 +3 578 117 502 +3 335 57 503 +3 294 117 503 +3 690 16 504 +3 686 118 504 +3 389 58 505 +3 301 118 505 +3 670 14 506 +3 582 119 506 +3 337 59 507 +3 296 119 507 +3 658 12 508 +3 654 120 508 +3 373 60 509 +3 293 120 509 +3 678 15 510 +3 586 121 510 +3 339 61 511 +3 298 121 511 +3 806 31 512 +3 650 122 512 +3 371 62 513 +3 330 122 513 +3 578 13 514 +3 666 123 514 +3 379 63 515 +3 273 123 515 +3 774 27 516 +3 634 124 516 +3 363 64 517 +3 322 124 517 +3 574 12 518 +3 658 125 518 +3 375 65 519 +3 272 125 519 +3 782 28 520 +3 638 126 520 +3 365 66 521 +3 324 126 521 +3 590 16 522 +3 690 127 522 +3 391 67 523 +3 276 127 523 +3 790 29 524 +3 642 128 524 +3 367 68 525 +3 326 128 525 +3 586 15 526 +3 682 129 526 +3 387 69 527 +3 275 129 527 +3 798 30 528 +3 646 130 528 +3 369 70 529 +3 328 130 529 +3 582 14 530 +3 674 131 530 +3 383 71 531 +3 274 131 531 +3 746 23 532 +3 742 132 532 +3 417 72 533 +3 315 132 533 +3 766 26 534 +3 630 133 534 +3 361 73 535 +3 320 133 535 +3 754 24 536 +3 750 134 536 +3 421 74 537 +3 317 134 537 +3 734 22 538 +3 614 135 538 +3 353 75 539 +3 312 135 539 +3 762 25 540 +3 758 136 540 +3 425 76 541 +3 319 136 541 +3 742 23 542 +3 618 137 542 +3 355 77 543 +3 314 137 543 +3 770 26 544 +3 766 138 544 +3 429 78 545 +3 321 138 545 +3 750 24 546 +3 622 139 546 +3 357 79 547 +3 316 139 547 +3 738 22 548 +3 734 140 548 +3 413 80 549 +3 313 140 549 +3 758 25 550 +3 626 141 550 +3 359 81 551 +3 318 141 551 +3 702 18 552 +3 598 142 552 +3 345 82 553 +3 304 142 553 +3 614 22 554 +3 738 143 554 +3 415 83 555 +3 282 143 555 +3 710 19 556 +3 602 144 556 +3 347 84 557 +3 306 144 557 +3 618 23 558 +3 746 145 558 +3 419 85 559 +3 283 145 559 +3 718 20 560 +3 606 146 560 +3 349 86 561 +3 308 146 561 +3 622 24 562 +3 754 147 562 +3 423 87 563 +3 284 147 563 +3 726 21 564 +3 610 148 564 +3 351 88 565 +3 310 148 565 +3 626 25 566 +3 762 149 566 +3 427 89 567 +3 285 149 567 +3 694 17 568 +3 594 150 568 +3 343 90 569 +3 302 150 569 +3 630 26 570 +3 770 151 570 +3 431 91 571 +3 286 151 571 +3 700 5 572 +3 664 152 572 +3 378 32 573 +3 397 152 573 +3 498 12 574 +3 518 153 574 +3 305 32 575 +3 378 153 575 +3 692 1 576 +3 672 154 576 +3 382 33 577 +3 393 154 577 +3 502 13 578 +3 514 155 578 +3 303 33 579 +3 382 155 579 +3 724 7 580 +3 680 156 580 +3 386 34 581 +3 409 156 581 +3 506 14 582 +3 530 157 582 +3 311 34 583 +3 386 157 583 +3 716 10 584 +3 688 158 584 +3 390 35 585 +3 405 158 585 +3 510 15 586 +3 526 159 586 +3 309 35 587 +3 390 159 587 +3 708 11 588 +3 656 160 588 +3 374 36 589 +3 401 160 589 +3 494 16 590 +3 522 161 590 +3 307 36 591 +3 374 161 591 +3 776 9 592 +3 804 162 592 +3 448 37 593 +3 435 162 593 +3 568 17 594 +3 482 163 594 +3 287 37 595 +3 448 163 595 +3 784 4 596 +3 772 164 596 +3 432 38 597 +3 439 164 597 +3 552 18 598 +3 484 165 598 +3 288 38 599 +3 432 165 599 +3 792 2 600 +3 780 166 600 +3 436 39 601 +3 443 166 601 +3 556 19 602 +3 486 167 602 +3 289 39 603 +3 436 167 603 +3 800 6 604 +3 788 168 604 +3 440 40 605 +3 447 168 605 +3 560 20 606 +3 488 169 606 +3 290 40 607 +3 440 169 607 +3 808 8 608 +3 796 170 608 +3 444 41 609 +3 451 170 609 +3 564 21 610 +3 490 171 610 +3 291 41 611 +3 444 171 611 +3 772 4 612 +3 744 172 612 +3 418 42 613 +3 433 172 613 +3 538 22 614 +3 554 173 614 +3 323 42 615 +3 418 173 615 +3 780 2 616 +3 752 174 616 +3 422 43 617 +3 437 174 617 +3 542 23 618 +3 558 175 618 +3 325 43 619 +3 422 175 619 +3 788 6 620 +3 760 176 620 +3 426 44 621 +3 441 176 621 +3 546 24 622 +3 562 177 622 +3 327 44 623 +3 426 177 623 +3 796 8 624 +3 768 178 624 +3 430 45 625 +3 445 178 625 +3 550 25 626 +3 566 179 626 +3 329 45 627 +3 430 179 627 +3 804 9 628 +3 736 180 628 +3 414 46 629 +3 449 180 629 +3 534 26 630 +3 570 181 630 +3 331 46 631 +3 414 181 631 +3 696 5 632 +3 700 182 632 +3 396 47 633 +3 395 182 633 +3 516 27 634 +3 462 183 634 +3 277 47 635 +3 396 183 635 +3 704 11 636 +3 708 184 636 +3 400 48 637 +3 399 184 637 +3 520 28 638 +3 464 185 638 +3 278 48 639 +3 400 185 639 +3 712 10 640 +3 716 186 640 +3 404 49 641 +3 403 186 641 +3 524 29 642 +3 466 187 642 +3 279 49 643 +3 404 187 643 +3 720 7 644 +3 724 188 644 +3 408 50 645 +3 407 188 645 +3 528 30 646 +3 468 189 646 +3 280 50 647 +3 408 189 647 +3 728 1 648 +3 692 190 648 +3 392 51 649 +3 411 190 649 +3 512 31 650 +3 470 191 650 +3 281 51 651 +3 392 191 651 +3 660 0 652 +3 684 192 652 +3 388 52 653 +3 377 192 653 +3 508 12 654 +3 498 193 654 +3 295 52 655 +3 388 193 655 +3 588 11 656 +3 704 194 656 +3 398 53 657 +3 341 194 657 +3 518 12 658 +3 508 195 658 +3 300 53 659 +3 398 195 659 +3 668 0 660 +3 652 196 660 +3 372 54 661 +3 381 196 661 +3 492 13 662 +3 502 197 662 +3 297 54 663 +3 372 197 663 +3 572 5 664 +3 696 198 664 +3 394 55 665 +3 333 198 665 +3 514 13 666 +3 492 199 666 +3 292 55 667 +3 394 199 667 +3 676 0 668 +3 660 200 668 +3 376 56 669 +3 385 200 669 +3 496 14 670 +3 506 201 670 +3 299 56 671 +3 376 201 671 +3 576 1 672 +3 728 202 672 +3 410 57 673 +3 335 202 673 +3 530 14 674 +3 496 203 674 +3 294 57 675 +3 410 203 675 +3 684 0 676 +3 668 204 676 +3 380 58 677 +3 389 204 677 +3 500 15 678 +3 510 205 678 +3 301 58 679 +3 380 205 679 +3 580 7 680 +3 720 206 680 +3 406 59 681 +3 337 206 681 +3 526 15 682 +3 500 207 682 +3 296 59 683 +3 406 207 683 +3 652 0 684 +3 676 208 684 +3 384 60 685 +3 373 208 685 +3 504 16 686 +3 494 209 686 +3 293 60 687 +3 384 209 687 +3 584 10 688 +3 712 210 688 +3 402 61 689 +3 339 210 689 +3 522 16 690 +3 504 211 690 +3 298 61 691 +3 402 211 691 +3 648 1 692 +3 576 212 692 +3 334 62 693 +3 371 212 693 +3 454 17 694 +3 568 213 694 +3 330 62 695 +3 334 213 695 +3 664 5 696 +3 632 214 696 +3 362 63 697 +3 379 214 697 +3 482 17 698 +3 454 215 698 +3 273 63 699 +3 362 215 699 +3 632 5 700 +3 572 216 700 +3 332 64 701 +3 363 216 701 +3 452 18 702 +3 552 217 702 +3 322 64 703 +3 332 217 703 +3 656 11 704 +3 636 218 704 +3 364 65 705 +3 375 218 705 +3 484 18 706 +3 452 219 706 +3 272 65 707 +3 364 219 707 +3 636 11 708 +3 588 220 708 +3 340 66 709 +3 365 220 709 +3 460 19 710 +3 556 221 710 +3 324 66 711 +3 340 221 711 +3 688 10 712 +3 640 222 712 +3 366 67 713 +3 391 222 713 +3 486 19 714 +3 460 223 714 +3 276 67 715 +3 366 223 715 +3 640 10 716 +3 584 224 716 +3 338 68 717 +3 367 224 717 +3 458 20 718 +3 560 225 718 +3 326 68 719 +3 338 225 719 +3 680 7 720 +3 644 226 720 +3 368 69 721 +3 387 226 721 +3 488 20 722 +3 458 227 722 +3 275 69 723 +3 368 227 723 +3 644 7 724 +3 580 228 724 +3 336 70 725 +3 369 228 725 +3 456 21 726 +3 564 229 726 +3 328 70 727 +3 336 229 727 +3 672 1 728 +3 648 230 728 +3 370 71 729 +3 383 230 729 +3 490 21 730 +3 456 231 730 +3 274 71 731 +3 370 231 731 +3 740 3 732 +3 764 232 732 +3 428 72 733 +3 417 232 733 +3 548 22 734 +3 538 233 734 +3 315 72 735 +3 428 233 735 +3 628 9 736 +3 776 234 736 +3 434 73 737 +3 361 234 737 +3 554 22 738 +3 548 235 738 +3 320 73 739 +3 434 235 739 +3 748 3 740 +3 732 236 740 +3 412 74 741 +3 421 236 741 +3 532 23 742 +3 542 237 742 +3 317 74 743 +3 412 237 743 +3 612 4 744 +3 784 238 744 +3 438 75 745 +3 353 238 745 +3 558 23 746 +3 532 239 746 +3 312 75 747 +3 438 239 747 +3 756 3 748 +3 740 240 748 +3 416 76 749 +3 425 240 749 +3 536 24 750 +3 546 241 750 +3 319 76 751 +3 416 241 751 +3 616 2 752 +3 792 242 752 +3 442 77 753 +3 355 242 753 +3 562 24 754 +3 536 243 754 +3 314 77 755 +3 442 243 755 +3 764 3 756 +3 748 244 756 +3 420 78 757 +3 429 244 757 +3 540 25 758 +3 550 245 758 +3 321 78 759 +3 420 245 759 +3 620 6 760 +3 800 246 760 +3 446 79 761 +3 357 246 761 +3 566 25 762 +3 540 247 762 +3 316 79 763 +3 446 247 763 +3 732 3 764 +3 756 248 764 +3 424 80 765 +3 413 248 765 +3 544 26 766 +3 534 249 766 +3 313 80 767 +3 424 249 767 +3 624 8 768 +3 808 250 768 +3 450 81 769 +3 359 250 769 +3 570 26 770 +3 544 251 770 +3 318 81 771 +3 450 251 771 +3 596 4 772 +3 612 252 772 +3 352 82 773 +3 345 252 773 +3 472 27 774 +3 516 253 774 +3 304 82 775 +3 352 253 775 +3 736 9 776 +3 592 254 776 +3 342 83 777 +3 415 254 777 +3 462 27 778 +3 472 255 778 +3 282 83 779 +3 342 255 779 +3 600 2 780 +3 616 256 780 +3 354 84 781 +3 347 256 781 +3 474 28 782 +3 520 257 782 +3 306 84 783 +3 354 257 783 +3 744 4 784 +3 596 258 784 +3 344 85 785 +3 419 258 785 +3 464 28 786 +3 474 259 786 +3 283 85 787 +3 344 259 787 +3 604 6 788 +3 620 260 788 +3 356 86 789 +3 349 260 789 +3 476 29 790 +3 524 261 790 +3 308 86 791 +3 356 261 791 +3 752 2 792 +3 600 262 792 +3 346 87 793 +3 423 262 793 +3 466 29 794 +3 476 263 794 +3 284 87 795 +3 346 263 795 +3 608 8 796 +3 624 264 796 +3 358 88 797 +3 351 264 797 +3 478 30 798 +3 528 265 798 +3 310 88 799 +3 358 265 799 +3 760 6 800 +3 604 266 800 +3 348 89 801 +3 427 266 801 +3 468 30 802 +3 478 267 802 +3 285 89 803 +3 348 267 803 +3 592 9 804 +3 628 268 804 +3 360 90 805 +3 343 268 805 +3 480 31 806 +3 512 269 806 +3 302 90 807 +3 360 269 807 +3 768 8 808 +3 608 270 808 +3 350 91 809 +3 431 270 809 +3 470 31 810 +3 480 271 810 +3 286 91 811 +3 350 271 811 diff --git a/Heat_method_3/examples/Heat_method_3/heat_method.cpp b/Heat_method_3/examples/Heat_method_3/heat_method.cpp new file mode 100644 index 00000000000..492a5a16665 --- /dev/null +++ b/Heat_method_3/examples/Heat_method_3/heat_method.cpp @@ -0,0 +1,41 @@ +#include +#include +#include + +#include +#include + +#include + +typedef CGAL::Simple_cartesian Kernel; +typedef Kernel::Point_3 Point_3; +typedef CGAL::Surface_mesh Triangle_mesh; + +typedef boost::graph_traits::vertex_descriptor vertex_descriptor; +typedef Triangle_mesh::Property_map Vertex_distance_map; + +int main(int argc, char* argv[]) +{ + Triangle_mesh tm; + const char* filename = (argc > 1) ? argv[1] : "./data/elephant.off"; + std::ifstream input(filename); + if (!input || !(input >> tm) || tm.is_empty()) { + std::cerr << "Not a valid off file." << std::endl; + return 1; + } + + //property map for the distance values to the source set + Vertex_distance_map vertex_distance = tm.add_property_map("v:distance", 0).first; + + vertex_descriptor source = *(vertices(tm).first); + + CGAL::Heat_method_3::estimate_geodesic_distances(tm, vertex_distance, source) ; + + std::cout << "Source vertex " << source << " at: " << tm.point(source) << std::endl; + BOOST_FOREACH(vertex_descriptor vd , vertices(tm)){ + std::cout << vd << " ("<< tm.point(vd) << ")" + << " is at distance " << get(vertex_distance, vd) << std::endl; + } + + return 0; +} diff --git a/Heat_method_3/examples/Heat_method_3/heat_method_polyhedron.cpp b/Heat_method_3/examples/Heat_method_3/heat_method_polyhedron.cpp new file mode 100644 index 00000000000..60704b7e6be --- /dev/null +++ b/Heat_method_3/examples/Heat_method_3/heat_method_polyhedron.cpp @@ -0,0 +1,41 @@ +#include +#include +#include + +#include +#include + +#include +#include + +typedef CGAL::Simple_cartesian Kernel; +typedef Kernel::Point_3 Point_3; +typedef CGAL::Polyhedron_3 Triangle_mesh; + +typedef boost::graph_traits::vertex_descriptor vertex_descriptor; + +int main(int argc, char* argv[]) +{ + Triangle_mesh tm; + const char* filename = (argc > 1) ? argv[1] : "./data/elephant.off"; + std::ifstream input(filename); + if (!input || !(input >> tm) || tm.is_empty()) { + std::cerr << "Not a valid off file." << std::endl; + return 1; + } + // map for the distance values to the source set + boost::unordered_map vertex_distance; + + vertex_descriptor source = *(vertices(tm).first); + + CGAL::Heat_method_3::estimate_geodesic_distances(tm, + boost::make_assoc_property_map(vertex_distance), + source) ; + + std::cout << "Source vertex at: " << source->point() << std::endl; + BOOST_FOREACH(vertex_descriptor vd , vertices(tm)){ + std::cout << vd->point() << " is at distance " << vertex_distance[vd] << std::endl; + } + + return 0; +} diff --git a/Heat_method_3/examples/Heat_method_3/heat_method_surface_mesh.cpp b/Heat_method_3/examples/Heat_method_3/heat_method_surface_mesh.cpp new file mode 100644 index 00000000000..f2ae2b6caba --- /dev/null +++ b/Heat_method_3/examples/Heat_method_3/heat_method_surface_mesh.cpp @@ -0,0 +1,64 @@ +#include +#include +#include +#include +#include + +#include + +typedef CGAL::Simple_cartesian Kernel; +typedef Kernel::Point_3 Point_3; +typedef CGAL::Surface_mesh Triangle_mesh; + +typedef boost::graph_traits::vertex_descriptor vertex_descriptor; +typedef Triangle_mesh::Property_map Vertex_distance_map; +typedef CGAL::Heat_method_3::Surface_mesh_geodesic_distances_3 Heat_method; + + + +int main(int argc, char* argv[]) +{ + Triangle_mesh tm; + const char* filename = (argc > 1) ? argv[1] : "./data/sphere.off"; + std::ifstream input(filename); + if (!input || !(input >> tm) || tm.is_empty()) { + std::cerr << "Not a valid off file." << std::endl; + return 1; + } + + //property map for the distance values to the source set + Vertex_distance_map vertex_distance = tm.add_property_map("v:distance", 0).first; + + Heat_method hm(tm); + + //add the first vertex as the source set + vertex_descriptor source = *(vertices(tm).first); + hm.add_source(source); + hm.estimate_geodesic_distances(vertex_distance); + + Point_3 sp = tm.point(source); + + std::cout << "source: " << sp << " " << source << std::endl; + vertex_descriptor far; + double sdistance = 0; + + BOOST_FOREACH(vertex_descriptor vd , vertices(tm)){ + std::cout << vd << " is at distance " << get(vertex_distance, vd) << " to " << source << std::endl; + if(get(vertex_distance, vd) > sdistance){ + far = vd; + sdistance = get(vertex_distance, vd); + } + } + + std::cout << "far: " << tm.point(far) << " " << far << std::endl; + + hm.add_source(far); + hm.estimate_geodesic_distances(vertex_distance); + + BOOST_FOREACH(vertex_descriptor vd , vertices(tm)){ + std::cout << vd << " is at distance " << get(vertex_distance, vd) << "to the set of two sources" << std::endl; + } + + std::cout << "done" << std::endl; + return 0; +} diff --git a/Heat_method_3/examples/Heat_method_3/heat_method_surface_mesh_direct.cpp b/Heat_method_3/examples/Heat_method_3/heat_method_surface_mesh_direct.cpp new file mode 100644 index 00000000000..5724140fdf2 --- /dev/null +++ b/Heat_method_3/examples/Heat_method_3/heat_method_surface_mesh_direct.cpp @@ -0,0 +1,46 @@ +#include +#include +#include + +#include +#include + +#include + +typedef CGAL::Simple_cartesian Kernel; +typedef Kernel::Point_3 Point_3; +typedef CGAL::Surface_mesh Triangle_mesh; + +typedef boost::graph_traits::vertex_descriptor vertex_descriptor; +typedef Triangle_mesh::Property_map Vertex_distance_map; + +typedef CGAL::Heat_method_3::Surface_mesh_geodesic_distances_3 Heat_method_idt; + + +int main(int argc, char* argv[]) +{ + Triangle_mesh tm; + const char* filename = (argc > 1) ? argv[1] : "./data/elephant.off"; + std::ifstream input(filename); + if (!input || !(input >> tm) || tm.is_empty()) { + std::cerr << "Not a valid off file." << std::endl; + return 1; + } + + //property map for the distance values to the source set + Vertex_distance_map vertex_distance = tm.add_property_map("v:distance",0).first; + + //pass in the idt object and its vertex_distance_map + Heat_method_idt hm_idt(tm); + + //add the first vertex as the source set + vertex_descriptor source = *(vertices(tm).first); + hm_idt.add_source(source); + hm_idt.estimate_geodesic_distances(vertex_distance); + + BOOST_FOREACH(vertex_descriptor vd , vertices(tm)){ + std::cout << vd << " is at distance " << get(vertex_distance, vd) << " from " << source << std::endl; + } + + return 0; +} diff --git a/Heat_method_3/include/CGAL/Heat_method_3/Surface_mesh_geodesic_distances_3.h b/Heat_method_3/include/CGAL/Heat_method_3/Surface_mesh_geodesic_distances_3.h new file mode 100644 index 00000000000..1906e00fe02 --- /dev/null +++ b/Heat_method_3/include/CGAL/Heat_method_3/Surface_mesh_geodesic_distances_3.h @@ -0,0 +1,1028 @@ +// Copyright (c) 2018 Carnegie Mellon University (USA), GeometryFactory (France) +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org). +// You can redistribute it and/or modify it under the terms of the GNU +// General Public License as published by the Free Software Foundation, +// either version 3 of the License, or (at your option) any later version. +// +// 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$ +// SPDX-License-Identifier: GPL-3.0+ +// +// +// Author(s) : Christina Vaz, Keenan Crane, Andreas Fabri + +#ifndef CGAL_HEAT_METHOD_3_SURFACE_MESH_GEODESIC_DISTANCES_3_H +#define CGAL_HEAT_METHOD_3_SURFACE_MESH_GEODESIC_DISTANCES_3_H + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#ifdef CGAL_EIGEN3_ENABLED +#include +#endif + +#include +#include + +#include +#include + +namespace CGAL { +namespace Heat_method_3 { + +/** + * A tag class used to specify that the heat method is applied to the input mesh. + */ +struct Direct +{}; + +/** + * A tag class used to specify that the heat method applies the intrinsic Delaunay triangulation to the input mesh. + */ +struct Intrinsic_Delaunay +{}; + +namespace internal { +template +class Surface_mesh_geodesic_distances_3 +{ +protected: + /// Polygon_mesh typedefs + typedef typename boost::graph_traits graph_traits; + typedef typename graph_traits::vertex_descriptor vertex_descriptor; + typedef typename graph_traits::edge_descriptor edge_descriptor; + typedef typename graph_traits::halfedge_descriptor halfedge_descriptor; + typedef typename graph_traits::face_descriptor face_descriptor; + typedef typename std::set Vertex_const_range; + /// Geometric typedefs + typedef typename Traits::Point_3 Point_3; + typedef typename Traits::FT FT; + typedef typename Traits::Vector_3 Vector_3; + + // Property map typedefs + typedef typename boost::property_traits::reference VertexPointMap_reference; + + typedef typename LA::Matrix Matrix; + typedef typename LA::Vector Vector; + typedef typename LA::Index Index; + + // The Vertex_id_map is a property map where you can associate an index to a vertex_descriptor + typedef typename boost::graph_traits::vertices_size_type vertices_size_type; + + typedef CGAL::dynamic_vertex_property_t Vertex_property_tag; + typedef typename boost::property_map::const_type Vertex_id_map; + Vertex_id_map vertex_id_map; + + typedef CGAL::dynamic_face_property_t Face_property_tag; + typedef typename boost::property_map::const_type Face_id_map; + Face_id_map face_id_map; + +public: + + /*! + \brief Constructor + */ + Surface_mesh_geodesic_distances_3(const TriangleMesh& tm) + : vertex_id_map(get(Vertex_property_tag(),tm)), face_id_map(get(Face_property_tag(),tm)), v2v(tm), tm(tm), vpm(get(vertex_point,tm)) + { + build(); + } + + + /*! + \brief Constructor + */ + Surface_mesh_geodesic_distances_3(const TriangleMesh& tm, VertexPointMap vpm) + : v2v(tm), tm(tm), vpm(vpm) + { + build(); + } + + + /** + * returns the triangle mesh the algorithm is running on. + */ + const TriangleMesh& triangle_mesh() const{ + return tm; + } + + +private: + + const Matrix& + mass_matrix() const + { + return m_mass_matrix; + } + + + const Matrix& + cotan_matrix() const + { + return m_cotan_matrix; + } + + + const VertexPointMap& + vertex_point_map() const + { + return vpm; + } + + + const Vertex_id_map& + get_vertex_id_map() const + { + return vertex_id_map; + } + +public: + + /** + * adds `vd` to the source set, returning `false` iff `vd` is already in the set. + */ + template + bool + add_source(VD vd) + { + m_source_change_flag = true; + return m_sources.insert(v2v(vd)).second; + } + + /** + * adds vertices in the `vrange` to the source set'. + * \tparam VertexConstRange a model of the concept `ConstRange` with value type `boost::graph_traits::%vertex_descriptor` + */ + template + void + add_sources(const VertexConstRange& vrange) + { + typedef typename std::iterator_traits::value_type value_type; + m_source_change_flag = true; + BOOST_FOREACH(value_type vd, vrange){ + m_sources.insert(v2v(vd)); + } + } + + + /** + * removes `vd` from the source set, returning `true` iff `vd` was in the set. + */ + template + bool + remove_source(VD vd) + { + m_source_change_flag = true; + return (m_sources.erase(v2v(vd)) == 1); + } + + + /** + * clears the current source set. + */ + void + clear_sources() + { + m_source_change_flag = true; + m_sources.clear(); + return; + } + + /** + * returns the set of source vertices. + */ + + const Vertex_const_range& + sources() const + { + return m_sources; + } + +private: + + double + summation_of_edges() const + { + typename Traits::Compute_squared_distance_3 squared_distance = Traits().compute_squared_distance_3_object(); + double edge_sum = 0; + CGAL::Vertex_around_face_iterator vbegin, vend, vmiddle; + BOOST_FOREACH(face_descriptor f, faces(tm)) { + halfedge_descriptor hd = halfedge(f,tm); + + vertex_descriptor neighbor_one = target(hd,tm); + halfedge_descriptor hd2 = next(hd,tm); + vertex_descriptor neighbor_two = target(hd2,tm); + halfedge_descriptor hd3 = next(hd2,tm); + vertex_descriptor current = target(hd3,tm); + + VertexPointMap_reference pi = get(vpm,current); + VertexPointMap_reference pj = get(vpm, neighbor_one); + VertexPointMap_reference pk = get(vpm, neighbor_two); + edge_sum += (CGAL::is_border(opposite(hd,tm),tm)?1.0:0.5) * std::sqrt(to_double(squared_distance(pi,pj))); + edge_sum += (CGAL::is_border(opposite(hd2,tm),tm)?1.0:0.5) * std::sqrt(to_double(squared_distance(pj,pk))) ; + edge_sum += (CGAL::is_border(opposite(hd3,tm),tm)?1.0:0.5) * std::sqrt(to_double(squared_distance(pk,pi))) ; + } + return edge_sum; + } + + + double + time_step() const + { + return m_time_step; + } + + + void + update_kronecker_delta() + { + //currently just working with a single vertex in source set, add the first one for now + Index i; + Matrix K(static_cast(num_vertices(tm)), 1); + if(sources().empty()) { + i = 0; + K.set_coef(i,0, 1, true); + } else { + BOOST_FOREACH(vertex_descriptor vd, sources()){ + i = get(vertex_id_map, vd); + K.set_coef(i,0, 1, true); + } + } + m_kronecker.swap(K); + } + + + const Matrix& + kronecker_delta() const + { + return m_kronecker; + } + + + void factor_cotan_laplace() + { + Matrix A, A0; + A0 = m_time_step * m_cotan_matrix; + A = m_mass_matrix + A0; + + double d=0; + + if(! la.factor(A,d)) { + // decomposition failed + CGAL_error_msg("Eigen Decomposition in cotan failed"); + } + } + + void solve_cotan_laplace() + { + if(! la.linear_solver(m_kronecker, m_solved_u)) { + // solving failed + CGAL_error_msg("Eigen Solving in cotan failed"); + } + } + + + void + compute_unit_gradient() + { + typename Traits::Construct_vector_3 construct_vector = Traits().construct_vector_3_object(); + typename Traits::Construct_sum_of_vectors_3 sum = Traits().construct_sum_of_vectors_3_object(); + typename Traits::Compute_scalar_product_3 scalar_product = Traits().compute_scalar_product_3_object(); + typename Traits::Construct_cross_product_vector_3 cross_product = Traits().construct_cross_product_vector_3_object(); + typename Traits::Construct_scaled_vector_3 scale = Traits().construct_scaled_vector_3_object(); + if(m_X.empty()){ + m_X.resize(num_faces(tm)); + } + CGAL::Vertex_around_face_iterator vbegin, vend, vmiddle; + BOOST_FOREACH(face_descriptor f, faces(tm)) { + boost::tie(vbegin, vend) = vertices_around_face(halfedge(f,tm),tm); + vertex_descriptor current = *(vbegin); + vertex_descriptor neighbor_one = *(++vbegin); + vertex_descriptor neighbor_two = *(++vbegin); + VertexPointMap_reference p_i = get(vpm,current); + VertexPointMap_reference p_j = get(vpm, neighbor_one); + VertexPointMap_reference p_k = get(vpm, neighbor_two); + Index face_i = get(face_id_map, f); + + Index i = get(vertex_id_map, current); + Index j = get(vertex_id_map, neighbor_one); + Index k = get(vertex_id_map, neighbor_two); + + //get area of face_i + //get outward unit normal + //cross that with eij, ejk, eki + //so (Ncross eij) *uk and so on + //sum all of those then multiply by 1./(2a) + + Vector_3 v_ij = construct_vector(p_i,p_j); + Vector_3 v_ik = construct_vector(p_i,p_k); + + Vector_3 cross = cross_product(v_ij, v_ik); + double N_cross = (CGAL::sqrt(to_double(scalar_product(cross,cross)))); + Vector_3 unit_cross = scale(cross, 1./N_cross); + double area_face = N_cross * (1./2); + double u_i = CGAL::abs(m_solved_u(i)); + double u_j = CGAL::abs(m_solved_u(j)); + double u_k = CGAL::abs(m_solved_u(k)); + double r_Mag = 1./(std::max)((std::max)(u_i, u_j),u_k); + /* normalize heat values so that they have roughly unit magnitude */ + if(!std::isinf(r_Mag)) { + u_i = u_i * r_Mag; + u_j = u_j * r_Mag; + u_k = u_k * r_Mag; + } + Vector_3 edge_sums = scale(cross_product(unit_cross,v_ij), u_k); + edge_sums = sum(edge_sums, scale(cross_product(unit_cross, construct_vector(p_j,p_k)), u_i)); + edge_sums = sum(edge_sums, scale(cross_product(unit_cross, construct_vector(p_k,p_i)), u_j)); + edge_sums = scale(edge_sums, (1./area_face)); + double e_magnitude = CGAL::sqrt(to_double(scalar_product(edge_sums,edge_sums))); + m_X[face_i] = scale(edge_sums,(1./e_magnitude)); + } + } + + + void + compute_divergence() + { + typename Traits::Construct_cross_product_vector_3 cross_product = Traits().construct_cross_product_vector_3_object(); + typename Traits::Compute_scalar_product_3 scalar_product = Traits().compute_scalar_product_3_object(); + typename Traits::Construct_vector_3 construct_vector = Traits().construct_vector_3_object(); + Matrix indexD(dimension,1); + CGAL::Vertex_around_face_iterator vbegin, vend, vmiddle; + BOOST_FOREACH(face_descriptor f, faces(tm)) { + boost::tie(vbegin, vend) = vertices_around_face(halfedge(f,tm),tm); + vertex_descriptor current = *(vbegin); + vertex_descriptor neighbor_one = *(++vbegin); + vertex_descriptor neighbor_two = *(++vbegin); + Index i = get(vertex_id_map, current); + Index j = get(vertex_id_map, neighbor_one); + Index k = get(vertex_id_map, neighbor_two); + VertexPointMap_reference p_i = get(vpm,current); + VertexPointMap_reference p_j = get(vpm, neighbor_one); + VertexPointMap_reference p_k = get(vpm, neighbor_two); + Index face_i = get(face_id_map, f); + + Vector_3 v_ij = construct_vector(p_i,p_j); + Vector_3 v_ik = construct_vector(p_i,p_k); + Vector_3 cross = cross_product(v_ij, v_ik); + double norm_cross = CGAL::sqrt(to_double(scalar_product(cross,cross))); + double dot = to_double(scalar_product(v_ij, v_ik)); + double cotan_i = dot/norm_cross; + + Vector_3 v_ji = construct_vector(p_j, p_i); + Vector_3 v_jk = construct_vector(p_j, p_k); + + cross = cross_product(v_ji, v_jk); + dot = to_double(scalar_product(v_ji, v_jk)); + double cotan_j = dot/norm_cross; + + Vector_3 v_ki = construct_vector(p_k,p_i); + Vector_3 v_kj = construct_vector(p_k,p_j); + + cross = cross_product(v_ki, v_kj); + dot = to_double(scalar_product(v_ki,v_kj)); + double cotan_k = dot/norm_cross; + + const Vector_3& a = m_X[face_i]; + double i_entry = (to_double(scalar_product(a,v_ij)) * cotan_k) + (to_double(scalar_product(a,v_ik)) * cotan_j); + double j_entry = (to_double(scalar_product(a,v_jk)) * cotan_i) + (to_double(scalar_product(a,v_ji)) * cotan_k); + double k_entry = (to_double(scalar_product(a,v_ki)) * cotan_j) + (to_double(scalar_product(a,v_kj)) * cotan_i); + + indexD.add_coef(i, 0, (1./2)*i_entry); + indexD.add_coef(j, 0, (1./2)*j_entry); + indexD.add_coef(k, 0, (1./2)*k_entry); + } + indexD.swap(m_index_divergence); + } + + + // modifies m_solved_phi + void + value_at_source_set(const Vector& phi) + { + Vector source_set_val(dimension); + if(sources().empty()) { + for(int k = 0; k::max)(); + Index vd_index; + //go through the distances to the sources and leave the minimum distance; + BOOST_FOREACH(vertex_descriptor vd, sources()){ + vd_index = get(vertex_id_map, vd); + double new_d = CGAL::abs(-phi.coeff(vd_index,0)+phi.coeff(i,0)); + if(phi.coeff(vd_index,0)==phi.coeff(i,0)) { + min_val = 0.; + } + if(new_d < min_val) { + min_val = new_d; + } + } + source_set_val(i,0) = min_val; + } + } + m_solved_phi.swap(source_set_val); + } + + + void + factor_phi() + { + double d = 1; + if(! la_cotan.factor(m_cotan_matrix, d)) { + // decomposition failed + CGAL_error_msg("Eigen Decomposition in solve_phi() failed"); + } + } + + + void + solve_phi() + { + Vector phi; + + if(! la_cotan.linear_solver(m_index_divergence, phi)) { + // solving failed + CGAL_error_msg("Eigen Solving in solve_phi() failed"); + } + value_at_source_set(phi); + } + + + // this function returns a (number of vertices)x1 vector where + // the ith index has the distance from the first vertex to the ith vertex + const Vector& + distances() const + { + return m_solved_phi; + } + +public: + + /** + * Updates the distance property map after changes in the source set. + **/ + template + void estimate_geodesic_distances(VertexDistanceMap vdm) + { + if(is_empty(tm)){ + return; + } + double d=0; + if(m_source_change_flag) { + //don't need to recompute Mass matrix, cotan matrix or timestep reflect that in this function + update_kronecker_delta(); // changes m_kronecker + solve_cotan_laplace(); // depends on m_kronecker changes m_solved_u + compute_unit_gradient(); // depends on m_solved_u changes m_X + compute_divergence(); // depends on m_X changes m_index_divergence + solve_phi(); // depends on m_index_divergence + m_source_change_flag = false; + } + BOOST_FOREACH(vertex_descriptor vd, vertices(tm)){ + Index i_d = get(vertex_id_map, vd); + d = m_solved_phi(i_d,0); + put(vdm,vd,d); + } + } + +private: + + void + build() + { + typename Traits::Construct_cross_product_vector_3 cross_product = Traits().construct_cross_product_vector_3_object(); + typename Traits::Compute_scalar_product_3 scalar_product = Traits().compute_scalar_product_3_object(); + typename Traits::Construct_vector_3 construct_vector = Traits().construct_vector_3_object(); + + if(is_empty(tm)){ + return; + } + m_source_change_flag = false; + + CGAL_precondition(is_triangle_mesh(tm)); + Index i = 0; + BOOST_FOREACH(vertex_descriptor vd, vertices(tm)){ + put(vertex_id_map, vd, i++); + } + Index face_i = 0; + BOOST_FOREACH(face_descriptor fd, faces(tm)){ + put(face_id_map, fd, face_i++); + } + dimension = static_cast(num_vertices(tm)); + { + Matrix M(dimension,dimension); + m_mass_matrix.swap(M); + } + { + Matrix M(dimension,dimension); + m_cotan_matrix.swap(M); + } + CGAL::Vertex_around_face_iterator vbegin, vend, vmiddle; + + BOOST_FOREACH(face_descriptor f, faces(tm)) { + boost::tie(vbegin, vend) = vertices_around_face(halfedge(f,tm),tm); + vertex_descriptor current = *(vbegin); + vertex_descriptor neighbor_one = *(++vbegin); + vertex_descriptor neighbor_two = *(++vbegin); + Index i = get(vertex_id_map, current); + Index j = get(vertex_id_map, neighbor_one); + Index k = get(vertex_id_map, neighbor_two); + Point_3 pi, pj, pk; + + VertexPointMap_reference p_i = get(vpm,current); + VertexPointMap_reference p_j = get(vpm, neighbor_one); + VertexPointMap_reference p_k = get(vpm, neighbor_two); + pi = p_i; + pj = p_j; + pk = p_k; + + Vector_3 v_ij = construct_vector(p_i,p_j); + Vector_3 v_ik = construct_vector(p_i,p_k); + + Vector_3 cross = cross_product(v_ij, v_ik); + double dot = to_double(scalar_product(v_ij,v_ik)); + + double norm_cross = (CGAL::sqrt(to_double(scalar_product(cross,cross)))); + + double cotan_i = dot/norm_cross; + m_cotan_matrix.add_coef(j,k ,-(1./2)*cotan_i); + m_cotan_matrix.add_coef(k,j,-(1./2)* cotan_i); + m_cotan_matrix.add_coef(j,j,(1./2)*cotan_i); + m_cotan_matrix.add_coef(k,k,(1./2)* cotan_i); + + Vector_3 v_ji = construct_vector(p_j,p_i); + Vector_3 v_jk = construct_vector(p_j,p_k); + + cross = cross_product(v_ji, v_jk); + dot = to_double(scalar_product(v_ji, v_jk)); + double cotan_j = dot/norm_cross; + m_cotan_matrix.add_coef(i,k ,-(1./2)*cotan_j); + m_cotan_matrix.add_coef(k,i,-(1./2)* cotan_j); + m_cotan_matrix.add_coef(i,i,(1./2)* cotan_j); + m_cotan_matrix.add_coef(k,k,(1./2)* cotan_j); + + Vector_3 v_ki = construct_vector(p_k,p_i); + Vector_3 v_kj = construct_vector(p_k,p_j); + cross = cross_product(v_ki, v_kj); + dot = to_double(scalar_product(v_ki,v_kj)); + double cotan_k = dot/norm_cross; + m_cotan_matrix.add_coef(i,j,-(1./2)*cotan_k); + m_cotan_matrix.add_coef(j,i,-(1./2)* cotan_k); + m_cotan_matrix.add_coef(i,i,(1./2)* cotan_k); + m_cotan_matrix.add_coef(j,j,(1./2)* cotan_k); + + //double area_face = CGAL::Polygon_mesh_processing::face_area(f,tm); + //cross is 2*area + m_mass_matrix.add_coef(i,i, (1./6.)*norm_cross); + m_mass_matrix.add_coef(j,j, (1./6.)*norm_cross); + m_mass_matrix.add_coef(k,k, (1./6.)*norm_cross); + m_cotan_matrix.add_coef(i,i, 1e-8); + m_cotan_matrix.add_coef(j,j, 1e-8); + m_cotan_matrix.add_coef(k,k, 1e-8); + } + m_cotan_matrix.assemble_matrix(); + m_mass_matrix.assemble_matrix(); + + m_time_step = 1./(num_edges(tm)); + m_time_step = m_time_step*summation_of_edges(); + m_time_step = m_time_step*m_time_step; + update_kronecker_delta(); + factor_cotan_laplace(); + solve_cotan_laplace(); + compute_unit_gradient(); + compute_divergence(); + factor_phi(); + } + + LA la; + LA la_cotan; + int dimension; + V2V v2v; + const TriangleMesh& tm; + VertexPointMap vpm; + std::set m_sources; + double m_time_step; + Matrix m_kronecker; + Matrix m_mass_matrix, m_cotan_matrix; + Vector m_solved_u; + std::vector m_X; + Matrix m_index_divergence; + Vector m_solved_phi; + bool m_source_change_flag; + +}; + +template +struct Base_helper + : public Surface_mesh_geodesic_distances_3 +{ + typedef Surface_mesh_geodesic_distances_3 type; + + Base_helper(const TriangleMesh& tm, VertexPointMap vpm) + : type(tm, vpm) + {} + + Base_helper(const TriangleMesh& tm) + : type(tm) + {} + + type& base() + { + return static_cast(*this); + } + + const type& base() const + { + return static_cast(*this); + } + + template + void estimate_geodesic_distances(VertexDistanceMap vdm) + { + base().estimate_geodesic_distances(vdm); + } +}; + +template +struct Idt_storage +{ + Intrinsic_Delaunay_triangulation_3 m_idt; + + Idt_storage(const TriangleMesh& tm, VertexPointMap vpm) + : m_idt(tm, vpm) + {} + + Idt_storage(const TriangleMesh& tm) + : m_idt(tm) + {} +}; + +template +struct Base_helper + : public Idt_storage + , public Surface_mesh_geodesic_distances_3, + Traits, + LA, + typename Intrinsic_Delaunay_triangulation_3::Vertex_point_map> +{ + typedef CGAL::Heat_method_3::Intrinsic_Delaunay_triangulation_3 Idt; + typedef Idt_storage Idt_wrapper; + + typedef Surface_mesh_geodesic_distances_3 type; + + Base_helper(const TriangleMesh& tm, VertexPointMap vpm) + : Idt_wrapper(tm, vpm) + , type(this->m_idt) + {} + + Base_helper(const TriangleMesh& tm) + : Idt_wrapper(tm) + , type(this->m_idt) + {} + + type& base() + { + return static_cast(*this); + } + + const type& base() const + { + return static_cast(*this); + } + + template + void estimate_geodesic_distances(VertexDistanceMap vdm) + { + base().estimate_geodesic_distances(this->m_idt.vertex_distance_map(vdm)); + } +}; + +} // namespace internal + + +/** + * \ingroup PkgHeatMethod + * + * Class `Surface_mesh_geodesic_distances_3` computes estimated geodesic distances for a set of source vertices where sources can be added and removed. + * The class performs a preprocessing step that only depends on the mesh, so that the distance computation takes less + * time after changes to the set of sources. + * + * \tparam TriangleMesh a triangulated surface mesh, model of `FaceListGraph` and `HalfedgeListGraph` + * \tparam Mode must be `Intrinsic_Delaunay` to indicate that an intrinsic Delaunay triangulation is internally constructed + * or `Direct` to indicate that the input mesh should be used as is. + * If `Intrinsic_Delaunay`, then the type `TriangleMesh` must have an internal property for `vertex_point` + * and its value type must be the same as the value type of `VertexPointMap`. + * \tparam VertexPointMap a model of `ReadablePropertyMap` with + * `boost::graph_traits::%vertex_descriptor` as key and + * `Traits::Point_3` as value type. + * The default is `typename boost::property_map< TriangleMesh, vertex_point_t>::%const_type`. + * \tparam LA a model of `SparseLinearAlgebraWithFactorTraits_d`. If `CGAL_EIGEN3_ENABLED` is defined, + * then `Eigen_solver_traits::%EigenType > >` + * is used as default + * \tparam Traits a model of `HeatMethodTraits_3`. The default is the Kernel of the value type + * of the vertex point map (extracted using `Kernel_traits`). + * + */ +template +class Surface_mesh_geodesic_distances_3 +#ifndef DOXYGEN_RUNNING + : public + internal::Base_helper< + TriangleMesh, + typename Default::Get::const_type + >::type + >::value_type + >::Kernel + >::type, + Mode, + #ifdef CGAL_EIGEN3_ENABLED + typename Default::Get< + LA, + Eigen_solver_traits::EigenType > > + >::type, + #else + LA, + #endif + typename Default::Get< + VertexPointMap, + typename boost::property_map< TriangleMesh, vertex_point_t>::const_type + >::type + > +#endif +{ + // extract real types from Default + #ifdef CGAL_EIGEN3_ENABLED + typedef typename Default::Get< + LA, + Eigen_solver_traits::EigenType > > + >::type LA_type; + #else + typedef LA LA_type; + #endif + + typedef typename Default::Get< + VertexPointMap, + typename boost::property_map< TriangleMesh, vertex_point_t>::const_type>::type Vertex_point_map; + typedef + typename Default::Get::value_type + >::Kernel + >::type Traits_type; + + typedef internal::Base_helper Base_helper; + + const typename Base_helper::type& base() const + { + return Base_helper::base(); + } + + typename Base_helper::type& base() + { + return Base_helper::base(); + } + +public: + + /// Vertex descriptor type + typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; + #ifndef DOXYGEN_RUNNING + /// Source vertex iterator type + typedef typename Base_helper::type::Vertex_const_range Vertex_const_range; + #else + /// a model of `ConstRange` with an iterator that is model of `ForwardIterator` with `vertex_descriptor` as value type. + typedef unspecified_type Vertex_const_range; + /// Vertex point map type derived from `VertexPointMap`. + typedef unspecified_type Vertex_point_map; + #endif + + /*! + \brief Constructor + */ + Surface_mesh_geodesic_distances_3(const TriangleMesh& tm) + : Base_helper(tm) + {} + + /*! + \brief Constructor + */ + Surface_mesh_geodesic_distances_3(const TriangleMesh& tm, Vertex_point_map vpm) + : Base_helper(tm, vpm) + {} + + /** + * returns the triangle mesh the algorithm is running on. + */ + const TriangleMesh& triangle_mesh() const + { + return base().triangle_mesh(); + } + + /** + * adds `vd` to the source set, returning `false` if `vd` is already in the set. + */ + bool + add_source(vertex_descriptor vd) + { + return base().add_source(vd); + } + + /** + * adds the range of vertices to the source set. + * \tparam VertexConstRange a model of the concept `ConstRange` with value type `boost::graph_traits::%vertex_descriptor` + */ + template + void + add_sources(const VertexConstRange& vrange) + { + base().add_sources(vrange); + } + + /** + * removes `vd` from the source set, returning `true` if `vd` was in the set. + */ + bool + remove_source(vertex_descriptor vd) + { + return base().remove_source(vd); + } + + /** + * clears the current source set. + */ + void + clear_sources() + { + base().clear_sources(); + } + + /** + * get estimated distance from the current source set to a vertex `vd`. + * \warning The return type is `double` even when used with an exact kernel. + */ + double + estimate_geodesic_distance(vertex_descriptor vd) const + { + return base().estimate_geodesic_distance(vd); + } + + /** + * returns the source set. + */ + const Vertex_const_range& + sources() const + { + return base().sources(); + } + + + /** + * fills the distance property map with the estimated geodesic distance of each vertex to the closest source vertex. + * \tparam VertexDistanceMap a property map model of `WritablePropertyMap` + * with `vertex_descriptor` as key type and `double` as value type. + * \param vdm the vertex distance map to be filled + * \warning The key type is `double` even when used with an exact kernel. + **/ + template + void estimate_geodesic_distances(VertexDistanceMap vdm) + { + Base_helper::estimate_geodesic_distances(vdm); + } +}; + +#if defined(DOXYGEN_RUNNING) || defined(CGAL_EIGEN3_ENABLED) +/// \ingroup PkgHeatMethod +/// computes for each vertex of the triangle mesh `tm` the estimated geodesic distance to a given source vertex. +/// This function is provided only if \ref thirdpartyEigen "Eigen" 3.3 (or greater) is available and `CGAL_EIGEN3_ENABLED` is defined. +/// \tparam TriangleMesh a triangulated surface mesh, model of `FaceListGraph` and `HalfedgeListGraph`. +/// It must have an internal vertex point property map with the value type being a 3D point from a cgal Kernel model +/// \tparam VertexDistanceMap a property map model of `WritablePropertyMap` +/// with `boost::graph_traits::%vertex_descriptor` as key type and `double` as value type. +/// \tparam Mode either the tag `Direct` or `Intrinsic_Delaunay`, which determines if the geodesic distance +/// is computed directly on the mesh or if the intrinsic Delaunay triangulation is applied first. +/// The default is `Intrinsic_Delaunay`. +/// \warning The return type is `double` even when used with an exact kernel. +/// +/// \sa `CGAL::Heat_method_3::Surface_mesh_geodesic_distances_3` +template +void +estimate_geodesic_distances(const TriangleMesh& tm, + VertexDistanceMap vdm, + typename boost::graph_traits::vertex_descriptor source, + Mode) +{ + CGAL::Heat_method_3::Surface_mesh_geodesic_distances_3 hm(tm); + hm.add_source(source); + hm.estimate_geodesic_distances(vdm); +} + + +#ifndef DOXYGEN_RUNNING +template +void +estimate_geodesic_distances(const TriangleMesh& tm, + VertexDistanceMap vdm, + typename boost::graph_traits::vertex_descriptor source) +{ + CGAL::Heat_method_3::Surface_mesh_geodesic_distances_3 hm(tm); + hm.add_source(source); + hm.estimate_geodesic_distances(vdm); +} +#endif + + +/// \ingroup PkgHeatMethod +/// computes for each vertex of the triangle mesh `tm` the estimated geodesic distance to a given set of source vertices. +/// This function is provided only if \ref thirdpartyEigen "Eigen" 3.3 (or greater) is available and `CGAL_EIGEN3_ENABLED` is defined. +/// \tparam TriangleMesh a triangulated surface mesh, model of `FaceListGraph` and `HalfedgeListGraph` +/// It must have an internal vertex point property map with the value type being a 3D point from a cgal Kernel model +/// \tparam VertexDistanceMap a property map model of `WritablePropertyMap` +/// with `boost::graph_traits::%vertex_descriptor` as key type and `double` as value type. +/// \tparam VertexConstRange a model of the concept `ConstRange` with value type `boost::graph_traits::%vertex_descriptor` +/// \tparam Mode either the tag `Direct` or `Intrinsic_Delaunay`, which determines if the geodesic distance +/// is computed directly on the mesh or if the intrinsic Delaunay triangulation is applied first. +/// The default is `Intrinsic_Delaunay`. +/// \warning The return type is `double` even when used with an exact kernel. +/// \sa `CGAL::Heat_method_3::Surface_mesh_geodesic_distances_3` +template +void +estimate_geodesic_distances(const TriangleMesh& tm, + VertexDistanceMap vdm, + const VertexConstRange& sources, + Mode +#ifndef DOXYGEN_RUNNING + , typename boost::enable_if< + typename boost::has_range_const_iterator + >::type* = 0 +#endif +) +{ + CGAL::Heat_method_3::Surface_mesh_geodesic_distances_3 hm(tm); + hm.add_sources(sources); + hm.estimate_geodesic_distances(vdm); +} + +#ifndef DOXYGEN_RUNNING +template +void +estimate_geodesic_distances(const TriangleMesh& tm, + VertexDistanceMap vdm, + const VertexConstRange& sources, + typename boost::enable_if< + typename boost::has_range_const_iterator + >::type* = 0) +{ + CGAL::Heat_method_3::Surface_mesh_geodesic_distances_3 hm(tm); + hm.add_sources(sources); + hm.estimate_geodesic_distances(vdm); +} +#endif + +#endif + +} // namespace Heat_method_3 +} // namespace CGAL + +#include +#endif // CGAL_HEAT_METHOD_3_SURFACE_MESH_GEODESIC_DISTANCES_3_H diff --git a/Heat_method_3/include/CGAL/Heat_method_3/internal/Intrinsic_Delaunay_triangulation_3.h b/Heat_method_3/include/CGAL/Heat_method_3/internal/Intrinsic_Delaunay_triangulation_3.h new file mode 100644 index 00000000000..25e410932f9 --- /dev/null +++ b/Heat_method_3/include/CGAL/Heat_method_3/internal/Intrinsic_Delaunay_triangulation_3.h @@ -0,0 +1,876 @@ +// Copyright (c) 2018 Carnegie Mellon University (USA), GeometryFactory (France) +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org). +// You can redistribute it and/or modify it under the terms of the GNU +// General Public License as published by the Free Software Foundation, +// either version 3 of the License, or (at your option) any later version. +// +// 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$ +// SPDX-License-Identifier: GPL-3.0+ +// +// +// Author(s) : Christina Vaz, Keenan Crane, Andreas Fabri + + +#ifndef CGAL_INTRINSIC_DELAUNAY_TRIANGULATION_3_H +#define CGAL_INTRINSIC_DELAUNAY_TRIANGULATION_3_H + +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include + +#ifndef DOXYGEN_RUNNING + +namespace CGAL { +namespace Heat_method_3 { + + + +// forward declaration +template +struct IDT_vertex_point_property_map; + +// forward declaration +template +struct IDT_vertex_distance_property_map; + +template +struct Intrinsic_Delaunay_triangulation_3_vertex_descriptor { + typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; + typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; + halfedge_descriptor hd; + + bool operator<(const Intrinsic_Delaunay_triangulation_3_vertex_descriptor& other) const + { + return hd < other.hd; + } + + Intrinsic_Delaunay_triangulation_3_vertex_descriptor(const halfedge_descriptor& hd) + : hd(hd) + {} + + explicit Intrinsic_Delaunay_triangulation_3_vertex_descriptor(const vertex_descriptor vd, const TriangleMesh& tm) + : hd(halfedge(vd,tm)) + {} +}; + +template +struct Intrinsic_Delaunay_triangulation_3_vertex_iterator_functor +{ + typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; + typedef vertex_descriptor argument_type; + typedef Intrinsic_Delaunay_triangulation_3_vertex_descriptor result_type; + const TriangleMesh& tm; + + Intrinsic_Delaunay_triangulation_3_vertex_iterator_functor(const TriangleMesh& tm) + :tm(tm) + {} + + result_type + operator()(vertex_descriptor vd) const + { + return result_type(halfedge(vd, tm)); + } +}; + +/** + * \ingroup PkgHeatMethod + * + * Class `Intrinsic_Delaunay_triangulation_3` is a remeshing algorithm to improve the approximation of the `Surface_mesh_geodesic_distances_3`. + * It internally makes a copy of the triangle mesh, performs edge flips, and computes 2D vertex coordinates per face + * which are stored in the halfedge with the vertex as target. + * + * The BGL API of this class ..... + * + * + * \tparam TriangleMesh a triangulated surface mesh, model of `FaceListGraph` and `HalfedgeListGraph` + * \tparam Traits a model of `HeatMethodTraits_3` + * + * \cgalModels `FaceListGraph` + */ + +template ::const_type + >::value_type + >::Kernel > +class Intrinsic_Delaunay_triangulation_3 +{ + typedef Intrinsic_Delaunay_triangulation_3 Self; + + typedef boost::graph_traits graph_traits; + typedef typename graph_traits::vertex_descriptor vertex_descriptor; + typedef typename graph_traits::edge_descriptor edge_descriptor; + typedef typename graph_traits::halfedge_descriptor halfedge_descriptor; + typedef typename graph_traits::face_descriptor face_descriptor; + typedef typename std::set::iterator vertex_iterator; + typedef typename std::set::iterator edge_iterator; + /// Geometric typedefs + typedef typename Traits::Point_3 Point_3; + typedef typename Traits::FT FT; + typedef typename Traits::Vector_3 Vector_3; + + typedef std::pair Point_2; + + typedef int Index; + + typedef CGAL::dynamic_halfedge_property_t Halfedge_coordinate_tag; + typedef typename boost::property_map::type HalfedgeCoordinateMap; + + typedef typename boost::graph_traits::vertices_size_type vertices_size_type; + typedef typename boost::graph_traits::edges_size_type edges_size_type; + typedef typename boost::graph_traits::faces_size_type faces_size_type; + + typedef CGAL::dynamic_edge_property_t Edge_property_tag; + typedef typename boost::property_map::type Edge_id_map; + typedef typename std::stack > edge_stack; + + +private: + friend struct IDT_vertex_point_property_map; + template friend struct IDT_vertex_distance_property_map; + +public: // for the BGL functions below. They should maybe become friend? + typedef CGAL::Heat_method_3::IDT_vertex_point_property_map Vertex_point_map; + + + typedef Intrinsic_Delaunay_triangulation_3_vertex_descriptor Vertex_descriptor; + typedef Intrinsic_Delaunay_triangulation_3_vertex_iterator_functor Vertex_iterator_functor; + +public: + /// Constructor + /// \param input_tm the triangle mesh + Intrinsic_Delaunay_triangulation_3(const TriangleMesh& input_tm) + : m_intrinsic_tm(), m_input_tm(input_tm), m_vpm(*this), hcm(get(Halfedge_coordinate_tag(), m_intrinsic_tm)) + { + build(); + } + + template + Intrinsic_Delaunay_triangulation_3(const TriangleMesh& input_tm, VertexPointMap vpm) + : m_intrinsic_tm(), m_input_tm(input_tm), m_vpm(*this), hcm(get(Halfedge_coordinate_tag(), m_intrinsic_tm)) + { + build(vpm); + } + + typedef TriangleMesh Triangle_mesh; + + const Triangle_mesh& + triangle_mesh() const + { + return m_intrinsic_tm; + } + + + Triangle_mesh& + triangle_mesh() + { + return m_intrinsic_tm; + } + + const HalfedgeCoordinateMap& + hcmap() const + { + return hcm; + } + + template + IDT_vertex_distance_property_map + vertex_distance_map(VertexDistanceMap vdm) const + { + return IDT_vertex_distance_property_map(*this, vdm); + } + + Vertex_point_map + vertex_point_map() const + { + return m_vpm; + } + +private: + + double + get_cotan_weight(edge_descriptor ed) + { + double cotan_weight = 0; + halfedge_descriptor hd = halfedge(ed, m_intrinsic_tm); + halfedge_descriptor hd2 = next(hd,m_intrinsic_tm); + halfedge_descriptor hd3 = next(hd2,m_intrinsic_tm); + Index a_i = get(edge_id_map, ed); + Index b_i = get(edge_id_map, edge(hd2,m_intrinsic_tm)); + Index c_i = get(edge_id_map, edge(hd3,m_intrinsic_tm)); + double a = edge_lengths[a_i] + 0.0; + double b = edge_lengths[b_i] + 0.0; + double c = edge_lengths[c_i] + 0.0; + + double tan2 = CGAL::sqrt(CGAL::abs(((a-b+c)*(a+b-c))/((a+b+c)*(-a+b+c)))); + cotan_weight+=(1-(tan2*tan2))/(2*tan2); + + hd = opposite(hd,m_intrinsic_tm); + hd2 =next(hd,m_intrinsic_tm); + hd3 = next(hd2,m_intrinsic_tm); + b_i = get(edge_id_map, edge(hd2,m_intrinsic_tm)); + c_i = get(edge_id_map, edge(hd3,m_intrinsic_tm)); + b = edge_lengths[b_i] + 0.0; + c = edge_lengths[c_i] + 0.0; + tan2 = CGAL::sqrt(CGAL::abs(((a-b+c)*(a+b-c))/((a+b+c)*(-a+b+c)))); + cotan_weight+=(1-(tan2*tan2))/(2*tan2); + return cotan_weight; + } + + + //returns true if edge is locally Delaunay (opposing angles are less than pi): + //Two ways of doing this: taking angles directly (not good with virtual edges) + //OR: taking edge length and using law of cosines, + //The second way checks cotan weights + bool + is_edge_locally_delaunay(edge_descriptor ed) + { + return (get_cotan_weight(ed)>=0); + } + + + void + change_edge_length(Index i, edge_descriptor ed) + { + halfedge_descriptor hd = halfedge(ed,m_intrinsic_tm); + halfedge_descriptor hd2 = next(hd,m_intrinsic_tm); + halfedge_descriptor hd3 = next(hd2,m_intrinsic_tm); + Index b_i = get(edge_id_map, edge(hd2,m_intrinsic_tm)); + Index c_i = get(edge_id_map, edge(hd3,m_intrinsic_tm)); + double a = edge_lengths[i]; + double b1 = edge_lengths[b_i]; + double c1 = edge_lengths[c_i]; + double tan2a = CGAL::sqrt(CGAL::abs(((c1-a+b1)*(-b1+a+c1))/((a+b1+c1)*(b1+a-c1)))); + hd = opposite(hd,m_intrinsic_tm); + hd2 =next(hd,m_intrinsic_tm); + hd3 = next(hd2,m_intrinsic_tm); + b_i = get(edge_id_map, edge(hd2,m_intrinsic_tm)); + c_i = get(edge_id_map, edge(hd3,m_intrinsic_tm)); + double b2 = edge_lengths[b_i]; + double c2 = edge_lengths[c_i]; + double tan2d = CGAL::sqrt(CGAL::abs(((-a+b2+c2)*(a+b2-c2))/((a+b2+c2)*(a-b2+c2)))); + double tan2ad = (tan2a + tan2d)/(1-tan2a*tan2d); + double cosad = (1-tan2ad*tan2ad)/(1+tan2ad*tan2ad); + double new_length = CGAL::sqrt( CGAL::abs(b1*b1 + c2*c2 - 2*b1*c2*cosad)); + edge_lengths[i] = new_length; + } + + + //Heron's formula + double + face_area(double a, double b, double c) + { + double S = (a+b+c)/2; + return CGAL::sqrt(S*(S-a)*(S-b)*(S-c)); + } + + + void + loop_over_edges(edge_stack stack, std::vector& marked_edges) + { + int a = 0; + while(!stack.empty()) { + edge_descriptor ed = stack.top(); + stack.pop(); + + Index edge_i = get(edge_id_map,ed); + + marked_edges[edge_i]=0; + //if the edge itself is not locally delaunay, go back + if(!(is_edge_locally_delaunay(ed))) { + if(!(is_border(ed,m_intrinsic_tm))) { + a++; + change_edge_length(edge_i,ed); + halfedge_descriptor hd = (halfedge(ed, m_intrinsic_tm)); + CGAL::Euler::flip_edge(hd, m_intrinsic_tm); + edge_descriptor next_edge= edge(next(hd,m_intrinsic_tm),m_intrinsic_tm); + Index next_edge_i = get(edge_id_map, next_edge); + + //if edge was already checked, go back and check again + //for the 4 surrounding edges, since local 'geometry' changed, + if(!(marked_edges[next_edge_i])) { + stack.push(next_edge); + marked_edges[next_edge_i] = 1; + } + next_edge = edge(prev(hd,m_intrinsic_tm),m_intrinsic_tm); + next_edge_i = get(edge_id_map,next_edge); + if(!(marked_edges[next_edge_i])) { + stack.push(next_edge); + marked_edges[next_edge_i] = 1; + } + next_edge = edge(next(opposite(hd,m_intrinsic_tm),m_intrinsic_tm),m_intrinsic_tm); + next_edge_i = get(edge_id_map,next_edge); + if(!(marked_edges[next_edge_i])) { + stack.push(next_edge); + marked_edges[next_edge_i] = 1; + } + next_edge = edge(prev(opposite(hd,m_intrinsic_tm),m_intrinsic_tm),m_intrinsic_tm); + next_edge_i = get(edge_id_map,next_edge); + if(!(marked_edges[next_edge_i])) { + stack.push(next_edge); + marked_edges[next_edge_i] = 1; + } + } + //then go back to top of the stack + } + } + std::cout<< a << " edges were flipped: " << std::endl; + } + + + template + void + build(VertexPointMap vpm) + { + CGAL_precondition(is_triangle_mesh(m_intrinsic_tm)); + + typename Traits::Compute_squared_distance_3 squared_distance = Traits().compute_squared_distance_3_object(); + + std::vector > pairs; + copy_face_graph(m_input_tm, m_intrinsic_tm, + parameters::vertex_to_vertex_output_iterator(std::back_inserter(pairs)). + vertex_point_map(vpm)); + + for(std::size_t i=0; i < pairs.size(); i++) { + v2v[pairs[i].second] = pairs[i].first; + vtov[pairs[i].first] = pairs[i].second; + } + + edge_stack stack; + std::size_t number_of_edges = num_edges(m_intrinsic_tm); + edge_lengths.resize(number_of_edges); + mark_edges.resize(number_of_edges, 1); + edge_id_map = get(Edge_property_tag(), m_intrinsic_tm); + Index edge_i = 0; + VertexPointMap vpm_intrinsic_tm = get(boost::vertex_point,m_intrinsic_tm); + + BOOST_FOREACH(edge_descriptor ed, edges(m_intrinsic_tm)) { + edge_lengths[edge_i] = CGAL::sqrt(to_double(squared_distance(get(vpm_intrinsic_tm, source(ed,m_intrinsic_tm)), + get(vpm_intrinsic_tm, target(ed,m_intrinsic_tm))))); + // Polygon_mesh_processing::edge_length(halfedge(ed,m_intrinsic_tm),m_intrinsic_tm); + put(edge_id_map, ed, edge_i++); + stack.push(ed); + } + loop_over_edges(stack, mark_edges); + //now that edges are calculated, go through and for each face, calculate the vertex positions around it + + BOOST_FOREACH(face_descriptor f, faces(m_intrinsic_tm)) { + CGAL::Vertex_around_face_iterator vbegin, vend, vmiddle; + + boost::tie(vbegin, vend) = vertices_around_face(halfedge(f,m_intrinsic_tm),m_intrinsic_tm); + halfedge_descriptor hd = halfedge(f,m_intrinsic_tm); + if(face(hd,m_intrinsic_tm) != f) { + hd = opposite(hd,m_intrinsic_tm); + } + hd = next(hd,m_intrinsic_tm); + //each 'local' set of coordinates will have 0,0 at the first vertex/halfedge + Point_2 p11(0,0); + put(hcm, prev(hd,m_intrinsic_tm),p11); + edge_descriptor ed1 = edge(hd, m_intrinsic_tm); + hd = next(hd,m_intrinsic_tm); + //the second local coordinate will be edge_length(first edge),0 + Point_2 p21(edge_lengths[get(edge_id_map,ed1)], 0); + put(hcm,prev(hd,m_intrinsic_tm),p21); + + //use basic trigonometry to compute third coordinate + edge_descriptor ed2 = edge(hd, m_intrinsic_tm); + hd = next(hd,m_intrinsic_tm); + edge_descriptor ed3 = edge(hd, m_intrinsic_tm); + Index e1 = get(edge_id_map, ed1); + Index e2 = get(edge_id_map, ed2); + Index e3 = get(edge_id_map, ed3); + double e1_len = edge_lengths[e1]; + double e2_len = edge_lengths[e2]; + double e3_len = edge_lengths[e3]; + double angle_a = -(e2_len*e2_len) + e3_len*e3_len + e1_len*e1_len; + angle_a = acos(angle_a/(2*e3_len*e1_len)); + Point_2 p31(e3_len*std::cos(angle_a), e3_len*std::sin(angle_a)); + put(hcm,prev(hd,m_intrinsic_tm),p31); + + } + } + + void + build() + { + build( get(boost::vertex_point, m_input_tm) ); + } + + + //todo:: determine which can be const + TriangleMesh m_intrinsic_tm; // this is the copy where edges get flipped + const TriangleMesh& m_input_tm; // this is the reference to the original + Vertex_point_map m_vpm; + HalfedgeCoordinateMap hcm; + Edge_id_map edge_id_map; + + std::vector edge_lengths; + std::vector mark_edges; +public: + + boost::unordered_map v2v, vtov; +}; + +} // namespace Heat_method_3 + +namespace Heat_method_3 { + +template +struct V2V > +{ + typedef CGAL::Heat_method_3::Intrinsic_Delaunay_triangulation_3 Idt; + const Idt& idt; + /** + * Vertex descriptor for iDT + */ + typedef typename boost::graph_traits::vertex_descriptor Idt_vertex_descriptor; + /** + * Vertex descriptor for TriangleMesh + */ + typedef typename boost::graph_traits::vertex_descriptor TM_vertex_descriptor; + + + /** + * Default constructor + */ + V2V(const Idt& idt) + : idt(idt) + {} + + /** + * Create iDT vertex descriptor map for vertex bijection between original mesh and iDT mesh for Heat method + */ + Idt_vertex_descriptor operator()(const TM_vertex_descriptor& vd) const + { + return Idt_vertex_descriptor(idt.vtov.at(vd),idt.triangle_mesh()); + } +}; + +} // namespace Heat_method_3 +} // namespace CGAL + + +namespace boost { + +template +struct graph_traits > { + + typedef CGAL::Heat_method_3::Intrinsic_Delaunay_triangulation_3_vertex_descriptor vertex_descriptor; + typedef boost::transform_iterator< + CGAL::Heat_method_3::Intrinsic_Delaunay_triangulation_3_vertex_iterator_functor, + typename boost::graph_traits::vertex_iterator> vertex_iterator; + + typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; + typedef typename boost::graph_traits::halfedge_iterator halfedge_iterator; + typedef typename boost::graph_traits::edge_descriptor edge_descriptor; + typedef typename boost::graph_traits::edge_iterator edge_iterator; + typedef typename boost::graph_traits::face_descriptor face_descriptor; + typedef typename boost::graph_traits::face_iterator face_iterator; + + typedef typename boost::graph_traits::vertices_size_type vertices_size_type; + + static face_descriptor null_face() { return boost::graph_traits::null_face(); } +}; + +} // namespace boost + + +namespace CGAL { +namespace Heat_method_3 { + +template +typename boost::graph_traits::vertices_size_type +num_vertices(const Intrinsic_Delaunay_triangulation_3& idt) +{ + return num_vertices(idt.triangle_mesh()); +} + + +template +typename boost::graph_traits::edges_size_type +num_edges(const Intrinsic_Delaunay_triangulation_3& idt) +{ + return num_edges(idt.triangle_mesh()); +} + + +template +typename boost::graph_traits::faces_size_type +num_faces(const Intrinsic_Delaunay_triangulation_3& idt) +{ + return num_faces(idt.triangle_mesh()); +} + + +template +typename std::pair >::vertex_iterator, + typename boost::graph_traits >::vertex_iterator> +vertices(const Intrinsic_Delaunay_triangulation_3& idt) + { + std::pair::vertex_iterator, + typename boost::graph_traits::vertex_iterator> p = vertices(idt.triangle_mesh()); + + typedef typename Intrinsic_Delaunay_triangulation_3::Vertex_iterator_functor Fct; + Fct fct(idt.triangle_mesh()); + return std::make_pair(boost::make_transform_iterator(p.first, fct), + boost::make_transform_iterator(p.second,fct)); + } + + +template +typename std::pair::halfedge_iterator, + typename boost::graph_traits::halfedge_iterator> +halfedges(const Intrinsic_Delaunay_triangulation_3& idt) + { + return halfedges(idt.triangle_mesh()); + } + + +template +typename std::pair::edge_iterator, + typename boost::graph_traits::edge_iterator> +edges(const Intrinsic_Delaunay_triangulation_3& idt) + { + return edges(idt.triangle_mesh()); + } + + +template +typename std::pair::face_iterator, + typename boost::graph_traits::face_iterator> +faces(const Intrinsic_Delaunay_triangulation_3& idt) + { + return faces(idt.triangle_mesh()); + } + +template +typename boost::graph_traits >::vertex_descriptor +vertex(typename boost::graph_traits >::halfedge_descriptor hd, + const Intrinsic_Delaunay_triangulation_3& ) +{ + return typename boost::graph_traits >::vertex_descriptor(hd); +} + + +template +typename boost::graph_traits >::halfedge_descriptor +halfedge(typename boost::graph_traits >::face_descriptor fd, + const Intrinsic_Delaunay_triangulation_3& idt) +{ + return halfedge(fd, idt.triangle_mesh()); +} + + +template +typename boost::graph_traits >::halfedge_descriptor +halfedge(typename boost::graph_traits >::edge_descriptor ed, + const Intrinsic_Delaunay_triangulation_3& idt) +{ + return halfedge(ed, idt.triangle_mesh()); +} + + +template +typename boost::graph_traits >::halfedge_descriptor +opposite(typename boost::graph_traits >::halfedge_descriptor hd, + const Intrinsic_Delaunay_triangulation_3& idt) +{ + return opposite(hd, idt.triangle_mesh()); +} + + +template +typename boost::graph_traits >::halfedge_descriptor +next(typename boost::graph_traits >::halfedge_descriptor hd, + const Intrinsic_Delaunay_triangulation_3& idt) +{ + return next(hd, idt.triangle_mesh()); +} + + +template +typename boost::graph_traits >::face_descriptor +face(typename boost::graph_traits >::halfedge_descriptor hd, + const Intrinsic_Delaunay_triangulation_3& idt) +{ + return face(hd, idt.triangle_mesh()); +} + + +template +typename boost::graph_traits >::vertex_descriptor +source(typename boost::graph_traits >::halfedge_descriptor hd, + const Intrinsic_Delaunay_triangulation_3& idt) +{ + typedef typename boost::graph_traits >::vertex_descriptor vertex_descriptor; + + return vertex_descriptor(opposite(hd, idt.triangle_mesh())); +} + + +template +typename boost::graph_traits >::vertex_descriptor +target(typename boost::graph_traits >::halfedge_descriptor hd, + const Intrinsic_Delaunay_triangulation_3&) +{ + typedef typename boost::graph_traits >::vertex_descriptor vertex_descriptor; + + return vertex_descriptor(hd); +} + +template +struct IDT_vertex_point_property_map { + const IDT& idt; + typedef typename IDT::Triangle_mesh TM; + typedef typename boost::graph_traits::vertex_descriptor key_type; + typedef typename IDT::Point_3 value_type; + typedef typename IDT::Point_2 Point_2; + typedef value_type reference; + typedef boost::readable_property_map_tag category; + /** + * Default constructor for vertex/point property map + */ + IDT_vertex_point_property_map(const IDT& idt) + : idt(idt) + {} + + + /** + * friend function for Heat method to get vertex descriptor's coordinates in iDT's local coordinate system + */ + friend value_type get(const IDT_vertex_point_property_map& pm, + key_type vd) + { + const Point_2& p = get(pm.idt.hcmap(), vd.hd); + return value_type(p.first, p.second, 0); + } +}; + +template +struct IDT_vertex_distance_property_map { + const IDT& idt; + PM pm; + + typedef typename IDT::Triangle_mesh TM; + typedef typename IDT::Vertex_descriptor key_type; + typedef double value_type; + typedef value_type reference; + + IDT_vertex_distance_property_map(const IDT& idt, + PM pm) + : idt(idt), pm(pm) + {} + + + // no need for a get() + + friend void put(IDT_vertex_distance_property_map idtpm, + key_type vd, + value_type v) + { + typename boost::graph_traits::vertex_descriptor tm_vd = target(vd.hd, idtpm.idt.triangle_mesh()); + + put(idtpm.pm, idtpm.idt.v2v.at(tm_vd), v); + } +}; + +} // namespace Heat_method_3 +} // namespace CGAL + + +namespace boost { + +template +struct property_map, + CGAL::vertex_point_t > { + typedef CGAL::Heat_method_3::Intrinsic_Delaunay_triangulation_3 IDT; + typedef CGAL::Heat_method_3::IDT_vertex_point_property_map type; + typedef type const_type; +}; + +template +struct property_map, + CGAL::face_index_t > { + typedef CGAL::Heat_method_3::Intrinsic_Delaunay_triangulation_3 IDT; + typedef typename property_map::type type; + typedef typename property_map::const_type const_type; +}; + +} // boost + + +namespace CGAL { +namespace Heat_method_3 { + +template +typename boost::property_map::type +get(CGAL::face_index_t fi, + const CGAL::Heat_method_3::Intrinsic_Delaunay_triangulation_3& idt) +{ + return get(fi, idt.triangle_mesh()); +} + +template +CGAL::Heat_method_3::IDT_vertex_point_property_map > +get(CGAL::vertex_point_t, + const CGAL::Heat_method_3::Intrinsic_Delaunay_triangulation_3& idt) +{ + return CGAL::Heat_method_3::IDT_vertex_point_property_map >(idt); +} + +template +class IDT_dynamic_vertex_property_map { + const IDT& idt; + PM pm; + +public: + typedef IDT_dynamic_vertex_property_map Self; + typedef typename IDT::Triangle_mesh TM; + typedef typename boost::graph_traits::vertex_descriptor TM_vertex_descriptor; + + + IDT_dynamic_vertex_property_map(const IDT& idt, PM pm) + : idt(idt), pm(pm) + {} + + + friend V get(const Self& idpm, const K& k) + { + return get(idpm.pm, target(k.hd, idpm.idt.triangle_mesh())); + } + + + friend void put(const Self& idpm, const K& k, const V& v) + { + put(idpm.pm, target(k.hd, idpm.idt.triangle_mesh()), v); + } + + + friend V get(const Self& idpm, const TM_vertex_descriptor& k) + { + return get(idpm.pm, k); + } + + + friend void put(const Self& idpm, const TM_vertex_descriptor& k, const V& v) + { + put(idpm.pm, k, v); + } + +}; + +} } // CGAL::Heat_method_3 + +namespace boost { + +template +struct property_map, + CGAL::dynamic_vertex_property_t
> { + typedef CGAL::Heat_method_3::Intrinsic_Delaunay_triangulation_3 IDT; + typedef CGAL::Heat_method_3::IDT_dynamic_vertex_property_map >::type, + typename graph_traits::vertex_descriptor, + dT> type; + typedef CGAL::Heat_method_3::IDT_dynamic_vertex_property_map >::const_type, + typename graph_traits::vertex_descriptor, + dT> const_type; +}; + +} // namespace boost + + +namespace CGAL { +namespace Heat_method_3 { + +template +typename boost::property_map, CGAL::dynamic_vertex_property_t
>::const_type +get(CGAL::dynamic_vertex_property_t
dvp, + const Intrinsic_Delaunay_triangulation_3& idt) +{ + typedef Intrinsic_Delaunay_triangulation_3 IDT; + typedef IDT_dynamic_vertex_property_map >::const_type, + typename boost::graph_traits::vertex_descriptor, + dT> PM; + return PM(idt,get(dvp,idt.triangle_mesh())); +} + + +template +typename boost::property_map, CGAL::dynamic_vertex_property_t
>::type +get(CGAL::dynamic_vertex_property_t
dvp, + Intrinsic_Delaunay_triangulation_3& idt) +{ + typedef Intrinsic_Delaunay_triangulation_3 IDT; + typedef IDT_dynamic_vertex_property_map >::type, + typename boost::graph_traits::vertex_descriptor, + dT> PM; + + return PM(idt, get(dvp,idt.triangle_mesh())); +} + +} // namespace Heat_method_3 +} // namespace CGAL + +#endif // DOXYGEN_RUNNING + +#include +#endif // CGAL_INTRINSIC_DELAUNAY_TRIANGULATION_3_H diff --git a/Heat_method_3/include/CGAL/Heat_method_3/internal/V2V.h b/Heat_method_3/include/CGAL/Heat_method_3/internal/V2V.h new file mode 100644 index 00000000000..ddc9d22bc70 --- /dev/null +++ b/Heat_method_3/include/CGAL/Heat_method_3/internal/V2V.h @@ -0,0 +1,47 @@ +// Copyright (c) 2018 Carnegie Mellon University (USA), GeometryFactory (France) +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org). +// You can redistribute it and/or modify it under the terms of the GNU +// General Public License as published by the Free Software Foundation, +// either version 3 of the License, or (at your option) any later version. +// +// 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$ +// SPDX-License-Identifier: GPL-3.0+ +// +// +// Author(s) : Christina Vaz, Keenan Crane, Andreas Fabri + +#ifndef CGAL_HEAT_METHOD_3_INTERNAL_V2V_H +#define CGAL_HEAT_METHOD_3_INTERNAL_V2V_H + +#include + +#ifndef DOXYGEN_RUNNING + +namespace CGAL { +namespace Heat_method_3 { + + template + struct V2V { + + V2V(const TM&) + {} + + template + const T& operator()(const T& t) const + { + return t; + } + }; +#endif +} // namespace Heat_method_3 +} // namespace CGAL +#endif //CGAL_HEAT_METHOD_3_INTERNAL_V2V_H diff --git a/Heat_method_3/package_info/Heat_method_3/copyright.txt b/Heat_method_3/package_info/Heat_method_3/copyright.txt new file mode 100644 index 00000000000..be1f85a6426 --- /dev/null +++ b/Heat_method_3/package_info/Heat_method_3/copyright.txt @@ -0,0 +1 @@ +Carnegie Mellon University, GeometryFactory 2018 diff --git a/Heat_method_3/package_info/Heat_method_3/dependencies b/Heat_method_3/package_info/Heat_method_3/dependencies new file mode 100644 index 00000000000..31c24f8489e --- /dev/null +++ b/Heat_method_3/package_info/Heat_method_3/dependencies @@ -0,0 +1,19 @@ +Algebraic_foundations +BGL +Cartesian_kernel +Circulator +Distance_2 +Distance_3 +Filtered_kernel +Heat_method_3 +Installation +Interval_support +Kernel_23 +Modular_arithmetic +Number_types +Polygon_mesh_processing +Profiling_tools +Property_map +STL_Extension +Solver_interface +Stream_support diff --git a/Heat_method_3/package_info/Heat_method_3/description.txt b/Heat_method_3/package_info/Heat_method_3/description.txt new file mode 100644 index 00000000000..1ec3c720fbe --- /dev/null +++ b/Heat_method_3/package_info/Heat_method_3/description.txt @@ -0,0 +1 @@ +See https://www.cs.cmu.edu/~kmcrane/Projects/HeatMethod/index.html diff --git a/Heat_method_3/package_info/Heat_method_3/license.txt b/Heat_method_3/package_info/Heat_method_3/license.txt new file mode 100644 index 00000000000..8bb8efcb72b --- /dev/null +++ b/Heat_method_3/package_info/Heat_method_3/license.txt @@ -0,0 +1 @@ +GPL (v3 or later) diff --git a/Heat_method_3/package_info/Heat_method_3/long_description.txt b/Heat_method_3/package_info/Heat_method_3/long_description.txt new file mode 100644 index 00000000000..1ec3c720fbe --- /dev/null +++ b/Heat_method_3/package_info/Heat_method_3/long_description.txt @@ -0,0 +1 @@ +See https://www.cs.cmu.edu/~kmcrane/Projects/HeatMethod/index.html diff --git a/Heat_method_3/package_info/Heat_method_3/maintainer b/Heat_method_3/package_info/Heat_method_3/maintainer new file mode 100644 index 00000000000..2671843d605 --- /dev/null +++ b/Heat_method_3/package_info/Heat_method_3/maintainer @@ -0,0 +1 @@ +Keenan Crane, Andreas Fabri diff --git a/Heat_method_3/test/Heat_method_3/CMakeLists.txt b/Heat_method_3/test/Heat_method_3/CMakeLists.txt new file mode 100644 index 00000000000..d498076d5b6 --- /dev/null +++ b/Heat_method_3/test/Heat_method_3/CMakeLists.txt @@ -0,0 +1,56 @@ +# Created by the script cgal_create_CMakeLists +# This is the CMake script for compiling a set of CGAL applications. + +project( Heat_method_3_Tests ) + + +cmake_minimum_required(VERSION 2.8.11) + +# CGAL and its components +find_package( CGAL QUIET COMPONENTS ) + +if ( NOT CGAL_FOUND ) + + message(STATUS "This project requires the CGAL library, and will not be compiled.") + return() + +endif() + +# include helper file +include( ${CGAL_USE_FILE} ) + + +# Boost and its components +find_package( Boost REQUIRED ) + +if ( NOT Boost_FOUND ) + + message(STATUS "This project requires the Boost library, and will not be compiled.") + + return() + +endif() + + +find_package(Eigen3 3.3.0) + +if (EIGEN3_FOUND) + include( ${EIGEN3_USE_FILE} ) +else() + message(STATUS "This project requires the Eigen library (3.3 or greater), and will not be compiled.") + + return() +endif() + +# include for local directory +include_directories( BEFORE include ) + + +# Creating entries for all C++ files with "main" routine +# ########################################################## + +include( CGAL_CreateSingleSourceCGALProgram ) + +create_single_source_cgal_program( "heat_method_concept.cpp" ) +create_single_source_cgal_program( "heat_method_surface_mesh_test.cpp" ) +create_single_source_cgal_program( "heat_method_surface_mesh_direct_test.cpp" ) diff --git a/Heat_method_3/test/Heat_method_3/Heat_method_traits_3.h b/Heat_method_3/test/Heat_method_3/Heat_method_traits_3.h new file mode 100644 index 00000000000..b914f4971e5 --- /dev/null +++ b/Heat_method_3/test/Heat_method_3/Heat_method_traits_3.h @@ -0,0 +1,91 @@ + +struct Heat_method_traits_3 +{ + typedef double FT; + + struct Point_3 { + Point_3() + {} + + Point_3(double, double,double) + {} + + }; + + + struct Vector_3 { + Vector_3() + {} + + Vector_3(double, double, double) + {} + + + + }; + + + + struct Construct_vector_3{ + Vector_3 operator()(const Point_3&, const Point_3&) const + { return Vector_3();} + }; + + struct Construct_scaled_vector_3{ + Vector_3 operator()(const Vector_3&, double) const + { return Vector_3();} + }; + + struct Construct_cross_product_vector_3 { + + Vector_3 operator()(const Vector_3&, const Vector_3&) const + { return Vector_3();} + }; + + struct Construct_sum_of_vectors_3 { + + Vector_3 operator()(const Vector_3&, const Vector_3&) const + { return Vector_3();} + }; + struct Compute_scalar_product_3 { + + double operator()(const Vector_3&, const Vector_3&) const + { return 0;} + }; + + struct Compute_squared_distance_3 { + + double operator()(const Point_3&, const Point_3&) const + { return 0;} + }; + + + Construct_vector_3 construct_vector_3_object() const + { + return Construct_vector_3(); + } + Construct_scaled_vector_3 construct_scaled_vector_3_object() const + { + return Construct_scaled_vector_3(); + } + + Construct_cross_product_vector_3 construct_cross_product_vector_3_object() const + { + return Construct_cross_product_vector_3(); + } + + Compute_squared_distance_3 compute_squared_distance_3_object() const + { + return Compute_squared_distance_3(); + } + + Compute_scalar_product_3 compute_scalar_product_3_object() const + { + return Compute_scalar_product_3(); + } + + Construct_sum_of_vectors_3 construct_sum_of_vectors_3_object() const + { + return Construct_sum_of_vectors_3(); + } +}; diff --git a/Heat_method_3/test/Heat_method_3/data/sphere.off b/Heat_method_3/test/Heat_method_3/data/sphere.off new file mode 100644 index 00000000000..944e391d679 --- /dev/null +++ b/Heat_method_3/test/Heat_method_3/data/sphere.off @@ -0,0 +1,2434 @@ +OFF +812 1620 0 +-0.52573111211913348 0.85065080835203999 -2.5720446970240305e-18 +0.52573111211913359 0.85065080835203999 5.144089394048061e-18 +-0.52573111211913359 -0.85065080835203999 0 +0.52573111211913348 -0.85065080835203999 -2.5720446970240305e-18 +-2.5720446970240309e-18 -0.52573111211913359 0.85065080835203999 +-6.4301117425600766e-18 0.52573111211913359 0.85065080835203999 +0 -0.52573111211913359 -0.85065080835203999 +0 0.52573111211913359 -0.85065080835203999 +0.85065080835203999 6.4301117425600766e-18 -0.52573111211913359 +0.85065080835203999 -5.1440893940480617e-18 0.52573111211913359 +-0.85065080835203999 2.5720446970240305e-18 -0.52573111211913348 +-0.85065080835203999 0 0.52573111211913348 +-0.57735026918962573 0.57735026918962584 0.57735026918962573 +0 0.93417235896271567 0.35682208977308993 +0 0.93417235896271567 -0.35682208977308988 +-0.57735026918962573 0.57735026918962584 -0.57735026918962573 +-0.93417235896271567 0.35682208977309005 0 +0.57735026918962573 0.57735026918962573 0.57735026918962584 +-0.35682208977308999 0 0.93417235896271567 +-0.93417235896271567 -0.35682208977308993 0 +-0.3568220897730901 0 -0.93417235896271567 +0.57735026918962573 0.57735026918962584 -0.57735026918962573 +0.57735026918962573 -0.57735026918962584 0.57735026918962573 +0 -0.93417235896271567 0.35682208977308993 +0 -0.93417235896271567 -0.35682208977308988 +0.57735026918962573 -0.57735026918962584 -0.57735026918962573 +0.93417235896271567 -0.35682208977309005 0 +0.35682208977308988 0 0.93417235896271567 +-0.57735026918962584 -0.57735026918962573 0.57735026918962573 +-0.57735026918962584 -0.57735026918962573 -0.57735026918962573 +0.35682208977308999 0 -0.93417235896271567 +0.93417235896271567 0.35682208977308999 0 +-0.33172364231109935 0.40102855960931139 0.85389432572745139 +0.40102855960931139 0.85389432572745139 0.3317236423110993 +0.2050164858201721 0.7327522019204108 -0.64887783990727932 +-0.64887783990727921 0.2050164858201721 -0.73275220192041068 +-0.98060148221837851 0 0.19601207378913935 +0.64887783990727921 0.2050164858201721 0.73275220192041068 +-0.3317236423110993 -0.40102855960931139 0.85389432572745139 +-0.73275220192041068 -0.64887783990727921 -0.20501648582017207 +0 -0.1960120737891394 -0.98060148221837851 +0.85389432572745139 0.33172364231109935 -0.40102855960931139 +0.33172364231109935 -0.40102855960931139 0.85389432572745139 +-0.40102855960931139 -0.85389432572745139 0.3317236423110993 +-0.2050164858201721 -0.7327522019204108 -0.64887783990727932 +0.64887783990727921 -0.2050164858201721 -0.73275220192041068 +0.98060148221837851 0 0.1960120737891394 +0.3317236423110993 0.40102855960931139 0.85389432572745139 +-0.64887783990727921 -0.2050164858201721 0.73275220192041068 +-0.85389432572745139 -0.33172364231109935 -0.40102855960931139 +0 0.1960120737891394 -0.98060148221837851 +0.73275220192041068 0.64887783990727921 -0.20501648582017207 +-0.40102855960931139 0.85389432572745139 0.33172364231109935 +-0.85389432572745139 0.33172364231109935 0.40102855960931139 +-0.19601207378913935 0.98060148221837851 0 +-0.2050164858201721 0.7327522019204108 0.64887783990727932 +-0.40102855960931139 0.85389432572745139 -0.3317236423110993 +0.19601207378913935 0.98060148221837851 0 +-0.73275220192041068 0.64887783990727921 -0.2050164858201721 +-0.20501648582017215 0.7327522019204108 -0.64887783990727932 +-0.73275220192041068 0.64887783990727921 0.20501648582017207 +-0.85389432572745139 0.3317236423110993 -0.40102855960931139 +0.73275220192041068 0.64887783990727921 0.2050164858201721 +0.20501648582017215 0.7327522019204108 0.64887783990727932 +0 0.1960120737891394 0.98060148221837851 +-0.64887783990727921 0.20501648582017207 0.73275220192041068 +-0.85389432572745139 -0.3317236423110993 0.40102855960931139 +-0.98060148221837851 0 -0.19601207378913935 +-0.64887783990727921 -0.20501648582017207 -0.73275220192041068 +-0.3317236423110993 0.40102855960931139 -0.85389432572745139 +0.33172364231109935 0.40102855960931139 -0.85389432572745139 +0.40102855960931139 0.85389432572745139 -0.33172364231109935 +0.40102855960931139 -0.85389432572745139 0.33172364231109935 +0.85389432572745139 -0.33172364231109935 0.40102855960931139 +0.19601207378913935 -0.98060148221837851 0 +0.2050164858201721 -0.7327522019204108 0.64887783990727932 +0.40102855960931139 -0.85389432572745139 -0.3317236423110993 +-0.19601207378913935 -0.98060148221837851 2.5799973709348731e-18 +0.73275220192041068 -0.64887783990727921 -0.2050164858201721 +0.20501648582017215 -0.7327522019204108 -0.64887783990727932 +0.73275220192041068 -0.64887783990727921 0.20501648582017207 +0.85389432572745139 -0.3317236423110993 -0.40102855960931139 +-2.5799973709348731e-18 -0.19601207378913935 0.98060148221837851 +0.64887783990727921 -0.20501648582017207 0.73275220192041068 +-0.73275220192041068 -0.64887783990727921 0.2050164858201721 +-0.20501648582017215 -0.7327522019204108 0.64887783990727932 +-0.33172364231109935 -0.40102855960931139 -0.85389432572745139 +-0.40102855960931139 -0.85389432572745139 -0.33172364231109935 +0.64887783990727921 0.20501648582017207 -0.73275220192041068 +0.3317236423110993 -0.40102855960931139 -0.85389432572745139 +0.85389432572745139 0.3317236423110993 0.40102855960931139 +0.98060148221837851 0 -0.1960120737891394 +-0.45851595921206995 0.2078965360508854 0.86402670412775906 +0.40551074491568917 0.74189440638938953 0.53399787033850432 +0.40551074491568917 0.74189440638938953 -0.53399787033850421 +-0.45851595921206995 0.20789653605088543 -0.86402670412775917 +-0.99251382955057421 -0.12213229773836956 0 +0.45851595921206995 0.20789653605088543 0.86402670412775917 +-0.53399787033850432 -0.40551074491568917 0.74189440638938953 +-0.74189440638938953 -0.53399787033850421 -0.40551074491568917 +0.12213229773836956 0 -0.99251382955057421 +0.86402670412775906 0.45851595921206995 -0.2078965360508854 +0.45851595921206995 -0.2078965360508854 0.86402670412775906 +-0.40551074491568917 -0.74189440638938953 0.53399787033850432 +-0.40551074491568917 -0.74189440638938953 -0.53399787033850421 +0.45851595921206995 -0.20789653605088543 -0.86402670412775917 +0.99251382955057421 0.12213229773836956 0 +0.53399787033850432 0.40551074491568917 0.74189440638938953 +-0.45851595921206995 -0.20789653605088543 0.86402670412775917 +-0.86402670412775906 -0.45851595921206995 -0.2078965360508854 +-0.12213229773836956 0 -0.99251382955057421 +0.74189440638938953 0.53399787033850421 -0.40551074491568917 +-0.2078965360508854 0.86402670412775906 0.45851595921206995 +-0.86402670412775906 0.45851595921206995 0.2078965360508854 +0 0.99251382955057421 -0.12213229773836955 +-0.40551074491568917 0.74189440638938953 0.53399787033850421 +-0.40551074491568917 0.74189440638938953 -0.53399787033850432 +0 0.99251382955057421 0.12213229773836955 +-0.86402670412775917 0.45851595921206995 -0.20789653605088543 +-0.20789653605088543 0.86402670412775917 -0.45851595921206995 +-0.74189440638938953 0.53399787033850421 0.40551074491568917 +-0.74189440638938953 0.53399787033850432 -0.40551074491568917 +0.86402670412775917 0.45851595921206995 0.20789653605088543 +0.20789653605088543 0.86402670412775917 0.45851595921206995 +0.12213229773836955 0 0.99251382955057421 +-0.53399787033850432 0.40551074491568928 0.74189440638938964 +-0.74189440638938953 -0.53399787033850432 0.40551074491568917 +-0.99251382955057421 0.12213229773836956 0 +-0.53399787033850432 -0.40551074491568928 -0.74189440638938964 +-0.53399787033850432 0.40551074491568917 -0.74189440638938953 +0.45851595921206995 0.2078965360508854 -0.86402670412775906 +0.2078965360508854 0.86402670412775906 -0.45851595921206995 +0.2078965360508854 -0.86402670412775906 0.45851595921206995 +0.86402670412775906 -0.45851595921206995 0.2078965360508854 +0 -0.99251382955057421 -0.12213229773836955 +0.40551074491568917 -0.74189440638938953 0.53399787033850421 +0.40551074491568917 -0.74189440638938953 -0.53399787033850432 +0 -0.99251382955057421 0.12213229773836956 +0.86402670412775917 -0.45851595921206995 -0.20789653605088543 +0.20789653605088543 -0.86402670412775917 -0.45851595921206995 +0.74189440638938953 -0.53399787033850421 0.40551074491568917 +0.74189440638938953 -0.53399787033850432 -0.40551074491568917 +-0.12213229773836956 0 0.99251382955057421 +0.53399787033850432 -0.40551074491568928 0.74189440638938964 +-0.86402670412775917 -0.45851595921206995 0.20789653605088543 +-0.20789653605088543 -0.86402670412775917 0.45851595921206995 +-0.45851595921206995 -0.2078965360508854 -0.86402670412775906 +-0.2078965360508854 -0.86402670412775906 -0.45851595921206995 +0.53399787033850432 0.40551074491568928 -0.74189440638938964 +0.53399787033850432 -0.40551074491568917 -0.74189440638938953 +0.74189440638938953 0.53399787033850432 0.40551074491568917 +0.99251382955057421 -0.12213229773836956 0 +-0.1135754234044079 0.38284690135627281 0.91680361764142804 +-0.38518927822713656 0.58714563680322251 0.71196153064740486 +0.56661579671126516 0.80322819423702019 0.18376889535499233 +0.20195635857608604 0.95002159669381536 0.23806006604641028 +0.1837688953549923 0.56661579671126516 -0.80322819423702008 +-2.5833166429798901e-18 0.82520570284963268 -0.56483231846667881 +-0.73303472228643585 2.5747846671290184e-18 -0.68019122011567301 +-0.71196153064740497 0.38518927822713656 -0.58714563680322251 +-0.91680361764142804 -0.11357542340440793 0.38284690135627286 +-0.95002159669381536 0.23806006604641028 0.20195635857608607 +0.73303472228643585 2.5747846671290184e-18 0.68019122011567301 +0.71196153064740497 0.38518927822713656 0.58714563680322251 +-0.18376889535499233 -0.56661579671126516 0.80322819423702019 +-0.23806006604641028 -0.20195635857608604 0.95002159669381536 +-0.56661579671126516 -0.80322819423702008 -0.1837688953549923 +-0.82520570284963268 -0.56483231846667881 2.5833166429798901e-18 +0.11357542340440793 -0.38284690135627286 -0.91680361764142804 +-0.23806006604641028 -0.20195635857608607 -0.95002159669381536 +0.91680361764142804 0.1135754234044079 -0.38284690135627281 +0.71196153064740497 0.38518927822713661 -0.58714563680322263 +0.1135754234044079 -0.38284690135627281 0.91680361764142804 +0.38518927822713656 -0.58714563680322251 0.71196153064740486 +-0.56661579671126516 -0.80322819423702019 0.18376889535499233 +-0.20195635857608604 -0.95002159669381536 0.23806006604641028 +-0.1837688953549923 -0.56661579671126516 -0.80322819423702008 +2.5833166429798901e-18 -0.82520570284963268 -0.56483231846667881 +0.73303472228643585 -2.5747846671290184e-18 -0.68019122011567301 +0.71196153064740497 -0.38518927822713656 -0.58714563680322251 +0.91680361764142804 0.11357542340440793 0.38284690135627286 +0.95002159669381536 -0.23806006604641028 0.20195635857608607 +0.18376889535499233 0.56661579671126516 0.80322819423702019 +0.23806006604641028 0.20195635857608604 0.95002159669381536 +-0.73303472228643585 -2.5747846671290184e-18 0.68019122011567301 +-0.71196153064740497 -0.38518927822713656 0.58714563680322251 +-0.91680361764142804 -0.1135754234044079 -0.38284690135627281 +-0.71196153064740497 -0.38518927822713661 -0.58714563680322263 +-0.11357542340440793 0.38284690135627286 -0.91680361764142804 +0.23806006604641028 0.20195635857608607 -0.95002159669381536 +0.56661579671126516 0.80322819423702008 -0.1837688953549923 +0.82520570284963268 0.56483231846667881 2.5833166429798901e-18 +-0.38284690135627281 0.91680361764142804 0.1135754234044079 +-0.58714563680322263 0.71196153064740497 0.38518927822713661 +-0.91680361764142804 0.1135754234044079 0.38284690135627281 +-0.71196153064740497 0.38518927822713661 0.58714563680322263 +-0.38284690135627286 0.91680361764142804 -0.11357542340440793 +-0.20195635857608607 0.95002159669381536 0.23806006604641028 +-0.1837688953549923 0.56661579671126516 0.80322819423702008 +2.5833166429798901e-18 0.82520570284963268 0.56483231846667881 +-0.56661579671126516 0.80322819423702019 -0.18376889535499233 +-0.20195635857608604 0.95002159669381536 -0.23806006604641028 +0.38284690135627286 0.91680361764142804 0.11357542340440793 +0.20195635857608607 0.95002159669381536 -0.23806006604641028 +-0.68019122011567301 0.73303472228643585 -2.5747846671290184e-18 +-0.58714563680322263 0.71196153064740508 -0.38518927822713661 +-2.5747846671290184e-18 0.68019122011567301 -0.73303472228643585 +-0.38518927822713656 0.58714563680322251 -0.71196153064740497 +-0.56661579671126516 0.80322819423702008 0.1837688953549923 +-0.82520570284963279 0.56483231846667892 -2.5833166429798908e-18 +-0.80322819423702019 0.18376889535499233 -0.56661579671126516 +-0.95002159669381536 0.23806006604641028 -0.20195635857608604 +0.68019122011567301 0.73303472228643585 2.5747846671290184e-18 +0.58714563680322263 0.71196153064740508 0.38518927822713661 +2.5747846671290184e-18 0.68019122011567301 0.73303472228643585 +0.38518927822713656 0.58714563680322251 0.71196153064740497 +0.11357542340440793 0.38284690135627286 0.91680361764142804 +-0.23806006604641028 0.20195635857608607 0.95002159669381536 +-0.80322819423702008 0.1837688953549923 0.56661579671126516 +-0.56483231846667881 -2.5833166429798901e-18 0.82520570284963268 +-0.80322819423702019 -0.18376889535499233 0.56661579671126516 +-0.95002159669381536 -0.23806006604641028 0.20195635857608604 +-0.91680361764142804 0.11357542340440793 -0.38284690135627286 +-0.95002159669381536 -0.23806006604641028 -0.20195635857608607 +-0.80322819423702008 -0.1837688953549923 -0.56661579671126516 +-0.56483231846667892 2.5833166429798908e-18 -0.82520570284963279 +-0.18376889535499233 0.56661579671126516 -0.80322819423702019 +-0.23806006604641028 0.20195635857608604 -0.95002159669381536 +0.1135754234044079 0.38284690135627281 -0.91680361764142804 +0.38518927822713656 0.58714563680322251 -0.71196153064740486 +0.38284690135627281 0.91680361764142804 -0.1135754234044079 +0.58714563680322263 0.71196153064740497 -0.38518927822713661 +0.38284690135627281 -0.91680361764142804 0.1135754234044079 +0.58714563680322263 -0.71196153064740497 0.38518927822713661 +0.91680361764142804 -0.1135754234044079 0.38284690135627281 +0.71196153064740497 -0.38518927822713661 0.58714563680322263 +0.38284690135627286 -0.91680361764142804 -0.11357542340440793 +0.20195635857608607 -0.95002159669381536 0.23806006604641028 +0.1837688953549923 -0.56661579671126516 0.80322819423702008 +-2.5833166429798901e-18 -0.82520570284963268 0.56483231846667881 +0.56661579671126516 -0.80322819423702019 -0.18376889535499233 +0.20195635857608604 -0.95002159669381536 -0.23806006604641028 +-0.38284690135627286 -0.91680361764142804 0.11357542340440793 +-0.20195635857608607 -0.95002159669381536 -0.23806006604641028 +0.68019122011567301 -0.73303472228643585 -2.5747846671290184e-18 +0.58714563680322263 -0.71196153064740508 -0.38518927822713661 +2.5747846671290184e-18 -0.68019122011567301 -0.73303472228643585 +0.38518927822713656 -0.58714563680322251 -0.71196153064740497 +0.56661579671126516 -0.80322819423702008 0.1837688953549923 +0.82520570284963279 -0.56483231846667892 -2.5833166429798908e-18 +0.80322819423702019 -0.18376889535499233 -0.56661579671126516 +0.95002159669381536 -0.23806006604641028 -0.20195635857608604 +-0.11357542340440793 -0.38284690135627286 0.91680361764142804 +0.23806006604641028 -0.20195635857608607 0.95002159669381536 +0.80322819423702008 -0.1837688953549923 0.56661579671126516 +0.56483231846667881 2.5833166429798901e-18 0.82520570284963268 +-0.68019122011567301 -0.73303472228643585 2.5747846671290184e-18 +-0.58714563680322263 -0.71196153064740508 0.38518927822713661 +-2.5747846671290184e-18 -0.68019122011567301 0.73303472228643585 +-0.38518927822713656 -0.58714563680322251 0.71196153064740497 +-0.1135754234044079 -0.38284690135627281 -0.91680361764142804 +-0.38518927822713656 -0.58714563680322251 -0.71196153064740486 +-0.38284690135627281 -0.91680361764142804 -0.1135754234044079 +-0.58714563680322263 -0.71196153064740497 -0.38518927822713661 +0.80322819423702008 0.1837688953549923 -0.56661579671126516 +0.56483231846667892 -2.5833166429798908e-18 -0.82520570284963279 +0.18376889535499233 -0.56661579671126516 -0.80322819423702019 +0.23806006604641028 -0.20195635857608604 -0.95002159669381536 +0.80322819423702019 0.18376889535499233 0.56661579671126516 +0.95002159669381536 0.23806006604641028 0.20195635857608604 +0.91680361764142804 -0.11357542340440793 -0.38284690135627286 +0.95002159669381536 0.23806006604641028 -0.20195635857608607 +-0.55182462374514241 0.27566524843940665 0.78708211479576407 +0.27566524843940665 0.78708211479576407 0.55182462374514241 +0.3410463733036202 0.82748987218454895 -0.44603574149214392 +-0.44603574149214392 0.3410463733036202 -0.82748987218454895 +-0.99786036523728616 0 -0.065381124864213602 +0.44603574149214392 0.3410463733036202 0.82748987218454895 +-0.55182462374514241 -0.27566524843940665 0.78708211479576407 +-0.82748987218454895 -0.44603574149214392 -0.3410463733036202 +0 0.06538112486421363 -0.99786036523728616 +0.78708211479576407 0.55182462374514241 -0.27566524843940665 +0.55182462374514241 -0.27566524843940665 0.78708211479576407 +-0.27566524843940665 -0.78708211479576407 0.55182462374514241 +-0.3410463733036202 -0.82748987218454895 -0.44603574149214392 +0.44603574149214392 -0.3410463733036202 -0.82748987218454895 +0.99786036523728616 0 -0.06538112486421363 +0.55182462374514241 0.27566524843940665 0.78708211479576407 +-0.44603574149214392 -0.3410463733036202 0.82748987218454895 +-0.78708211479576407 -0.55182462374514241 -0.27566524843940665 +0 -0.06538112486421363 -0.99786036523728616 +0.82748987218454895 0.44603574149214392 -0.3410463733036202 +-0.27566524843940665 0.78708211479576407 0.55182462374514241 +-0.78708211479576407 0.55182462374514241 0.27566524843940665 +0.065381124864213602 0.99786036523728616 0 +-0.3410463733036202 0.82748987218454895 0.44603574149214392 +-0.27566524843940665 0.78708211479576407 -0.55182462374514241 +-0.065381124864213602 0.99786036523728616 0 +-0.82748987218454895 0.44603574149214392 -0.3410463733036202 +-0.3410463733036202 0.82748987218454895 -0.44603574149214392 +-0.82748987218454895 0.44603574149214392 0.3410463733036202 +-0.78708211479576407 0.55182462374514241 -0.27566524843940665 +0.82748987218454895 0.44603574149214392 0.3410463733036202 +0.3410463733036202 0.82748987218454895 0.44603574149214392 +-6.881302299434426e-18 -0.065381124864213602 0.99786036523728616 +-0.44603574149214392 0.3410463733036202 0.82748987218454895 +-0.78708211479576407 -0.55182462374514241 0.27566524843940665 +-0.99786036523728616 0 0.065381124864213602 +-0.44603574149214392 -0.3410463733036202 -0.82748987218454895 +-0.55182462374514241 0.27566524843940665 -0.78708211479576407 +0.55182462374514241 0.27566524843940665 -0.78708211479576407 +0.27566524843940665 0.78708211479576407 -0.55182462374514241 +0.27566524843940665 -0.78708211479576407 0.55182462374514241 +0.78708211479576407 -0.55182462374514241 0.27566524843940665 +-0.065381124864213602 -0.99786036523728616 6.881302299434426e-18 +0.3410463733036202 -0.82748987218454895 0.44603574149214392 +0.27566524843940665 -0.78708211479576407 -0.55182462374514241 +0.065381124864213602 -0.99786036523728616 6.881302299434426e-18 +0.82748987218454895 -0.44603574149214392 -0.3410463733036202 +0.3410463733036202 -0.82748987218454895 -0.44603574149214392 +0.82748987218454895 -0.44603574149214392 0.3410463733036202 +0.78708211479576407 -0.55182462374514241 -0.27566524843940665 +-6.8813022994344276e-18 0.06538112486421363 0.99786036523728616 +0.44603574149214392 -0.3410463733036202 0.82748987218454895 +-0.82748987218454895 -0.44603574149214392 0.3410463733036202 +-0.3410463733036202 -0.82748987218454895 0.44603574149214392 +-0.55182462374514241 -0.27566524843940665 -0.78708211479576407 +-0.27566524843940665 -0.78708211479576407 -0.55182462374514241 +0.44603574149214392 0.3410463733036202 -0.82748987218454895 +0.55182462374514241 -0.27566524843940665 -0.78708211479576407 +0.78708211479576407 0.55182462374514241 0.27566524843940665 +0.99786036523728616 0 0.06538112486421363 +-0.11888789759516753 0.26114525299171243 0.9579503247273814 +-0.261632633191903 0.6348558224990829 0.72698449081674643 +0.6348558224990829 0.72698449081674643 0.26163263319190305 +0.26114525299171243 0.9579503247273814 0.11888789759516753 +0.30444259547546554 0.52277788618361543 -0.79625246484865153 +-0.0692679740319051 0.75374372009425039 -0.65350772925191603 +-0.65350772925191603 -0.069267974031905072 -0.75374372009425039 +-0.79625246484865153 0.30444259547546554 -0.52277788618361543 +-0.91514036244381902 -0.23096583391063502 0.33041322702361747 +-0.91514036244381902 0.23096583391063499 0.33041322702361747 +0.65350772925191603 -0.069267974031905072 0.75374372009425039 +0.79625246484865153 0.30444259547546554 0.52277788618361543 +-0.26163263319190305 -0.6348558224990829 0.72698449081674643 +-0.11888789759516753 -0.26114525299171243 0.9579503247273814 +-0.52277788618361543 -0.79625246484865153 -0.30444259547546554 +-0.75374372009425039 -0.65350772925191603 0.0692679740319051 +0.23096583391063502 -0.33041322702361747 -0.91514036244381902 +-0.23096583391063499 -0.33041322702361747 -0.91514036244381902 +0.9579503247273814 0.11888789759516753 -0.26114525299171243 +0.72698449081674643 0.261632633191903 -0.6348558224990829 +0.11888789759516753 -0.26114525299171243 0.9579503247273814 +0.261632633191903 -0.6348558224990829 0.72698449081674643 +-0.6348558224990829 -0.72698449081674643 0.26163263319190305 +-0.26114525299171243 -0.9579503247273814 0.11888789759516753 +-0.30444259547546554 -0.52277788618361543 -0.79625246484865153 +0.0692679740319051 -0.75374372009425039 -0.65350772925191603 +0.65350772925191603 0.069267974031905072 -0.75374372009425039 +0.79625246484865153 -0.30444259547546554 -0.52277788618361543 +0.91514036244381902 0.23096583391063502 0.33041322702361747 +0.91514036244381902 -0.23096583391063499 0.33041322702361747 +0.26163263319190305 0.6348558224990829 0.72698449081674643 +0.11888789759516753 0.26114525299171243 0.9579503247273814 +-0.65350772925191603 0.069267974031905072 0.75374372009425039 +-0.79625246484865153 -0.30444259547546554 0.52277788618361543 +-0.9579503247273814 -0.11888789759516753 -0.26114525299171243 +-0.72698449081674643 -0.261632633191903 -0.6348558224990829 +-0.23096583391063502 0.33041322702361747 -0.91514036244381902 +0.23096583391063499 0.33041322702361747 -0.91514036244381902 +0.52277788618361543 0.79625246484865153 -0.30444259547546554 +0.75374372009425039 0.65350772925191603 0.0692679740319051 +-0.26114525299171243 0.9579503247273814 0.11888789759516753 +-0.6348558224990829 0.72698449081674643 0.261632633191903 +-0.9579503247273814 0.11888789759516753 0.26114525299171243 +-0.72698449081674643 0.261632633191903 0.6348558224990829 +-0.33041322702361747 0.91514036244381902 -0.23096583391063502 +-0.33041322702361747 0.91514036244381902 0.23096583391063499 +-0.30444259547546554 0.52277788618361543 0.79625246484865153 +0.0692679740319051 0.75374372009425039 0.65350772925191603 +-0.6348558224990829 0.72698449081674643 -0.26163263319190305 +-0.26114525299171243 0.9579503247273814 -0.11888789759516753 +0.33041322702361747 0.91514036244381902 0.23096583391063502 +0.33041322702361747 0.91514036244381902 -0.23096583391063499 +-0.75374372009425039 0.65350772925191603 0.069267974031905072 +-0.52277788618361543 0.79625246484865153 -0.30444259547546554 +0.069267974031905072 0.75374372009425039 -0.65350772925191603 +-0.30444259547546554 0.52277788618361543 -0.79625246484865153 +-0.52277788618361543 0.79625246484865153 0.30444259547546554 +-0.75374372009425039 0.65350772925191603 -0.0692679740319051 +-0.72698449081674643 0.26163263319190305 -0.6348558224990829 +-0.9579503247273814 0.11888789759516753 -0.26114525299171243 +0.75374372009425039 0.65350772925191603 -0.069267974031905072 +0.52277788618361543 0.79625246484865153 0.30444259547546554 +-0.069267974031905072 0.75374372009425039 0.65350772925191603 +0.30444259547546554 0.52277788618361543 0.79625246484865153 +0.23096583391063502 0.33041322702361747 0.91514036244381902 +-0.23096583391063499 0.33041322702361747 0.91514036244381902 +-0.79625246484865153 0.30444259547546554 0.52277788618361543 +-0.65350772925191603 -0.0692679740319051 0.75374372009425039 +-0.72698449081674643 -0.26163263319190305 0.6348558224990829 +-0.9579503247273814 -0.11888789759516753 0.26114525299171243 +-0.91514036244381902 0.23096583391063502 -0.33041322702361747 +-0.91514036244381902 -0.23096583391063499 -0.33041322702361747 +-0.79625246484865153 -0.30444259547546554 -0.52277788618361543 +-0.65350772925191603 0.0692679740319051 -0.75374372009425039 +-0.26163263319190305 0.6348558224990829 -0.72698449081674643 +-0.11888789759516753 0.26114525299171243 -0.9579503247273814 +0.11888789759516753 0.26114525299171243 -0.9579503247273814 +0.261632633191903 0.6348558224990829 -0.72698449081674643 +0.26114525299171243 0.9579503247273814 -0.11888789759516753 +0.6348558224990829 0.72698449081674643 -0.261632633191903 +0.26114525299171243 -0.9579503247273814 0.11888789759516753 +0.6348558224990829 -0.72698449081674643 0.261632633191903 +0.9579503247273814 -0.11888789759516753 0.26114525299171243 +0.72698449081674643 -0.261632633191903 0.6348558224990829 +0.33041322702361747 -0.91514036244381902 -0.23096583391063502 +0.33041322702361747 -0.91514036244381902 0.23096583391063499 +0.30444259547546554 -0.52277788618361543 0.79625246484865153 +-0.0692679740319051 -0.75374372009425039 0.65350772925191603 +0.6348558224990829 -0.72698449081674643 -0.26163263319190305 +0.26114525299171243 -0.9579503247273814 -0.11888789759516753 +-0.33041322702361747 -0.91514036244381902 0.23096583391063502 +-0.33041322702361747 -0.91514036244381902 -0.23096583391063499 +0.75374372009425039 -0.65350772925191603 0.069267974031905072 +0.52277788618361543 -0.79625246484865153 -0.30444259547546554 +-0.069267974031905072 -0.75374372009425039 -0.65350772925191603 +0.30444259547546554 -0.52277788618361543 -0.79625246484865153 +0.52277788618361543 -0.79625246484865153 0.30444259547546554 +0.75374372009425039 -0.65350772925191603 -0.0692679740319051 +0.72698449081674643 -0.26163263319190305 -0.6348558224990829 +0.9579503247273814 -0.11888789759516753 -0.26114525299171243 +-0.23096583391063502 -0.33041322702361747 0.91514036244381902 +0.23096583391063499 -0.33041322702361747 0.91514036244381902 +0.79625246484865153 -0.30444259547546554 0.52277788618361543 +0.65350772925191603 0.0692679740319051 0.75374372009425039 +-0.75374372009425039 -0.65350772925191603 -0.069267974031905072 +-0.52277788618361543 -0.79625246484865153 0.30444259547546554 +0.069267974031905072 -0.75374372009425039 0.65350772925191603 +-0.30444259547546554 -0.52277788618361543 0.79625246484865153 +-0.11888789759516753 -0.26114525299171243 -0.9579503247273814 +-0.261632633191903 -0.6348558224990829 -0.72698449081674643 +-0.26114525299171243 -0.9579503247273814 -0.11888789759516753 +-0.6348558224990829 -0.72698449081674643 -0.261632633191903 +0.79625246484865153 0.30444259547546554 -0.52277788618361543 +0.65350772925191603 -0.0692679740319051 -0.75374372009425039 +0.26163263319190305 -0.6348558224990829 -0.72698449081674643 +0.11888789759516753 -0.26114525299171243 -0.9579503247273814 +0.72698449081674643 0.26163263319190305 0.6348558224990829 +0.9579503247273814 0.11888789759516753 0.26114525299171243 +0.91514036244381902 -0.23096583391063502 -0.33041322702361747 +0.91514036244381902 0.23096583391063499 -0.33041322702361747 +-0.46425215557034577 0.069975445501151617 0.88293452366254366 +-0.34662828228540943 0.2724487347064285 0.89756365839796159 +0.46055935492936023 0.64154039217710024 0.61344193351311094 +0.4686388229143581 0.77631151562962109 0.42156622772499869 +0.5283177429783209 0.68341737901426258 -0.50380655862698787 +0.33548020268271661 0.69401496243142713 -0.63702140115483408 +-0.35461678068422275 0.13773383355011229 -0.924811510499706 +-0.56208345571524498 0.13929011447478698 -0.81526710519976753 +-0.96805871419733358 -0.24139413148544345 -0.067758388048960672 +-0.98364968344024362 -0.12125214276834048 0.13315862023164154 +0.3546167806842227 0.13773383355011226 0.924811510499706 +0.56208345571524498 0.13929011447478698 0.81526710519976753 +-0.61344193351311094 -0.46055935492936023 0.64154039217710024 +-0.42156622772499869 -0.4686388229143581 0.77631151562962109 +-0.68341737901426258 -0.50380655862698787 -0.5283177429783209 +-0.69401496243142724 -0.63702140115483419 -0.33548020268271667 +0.24139413148544353 0.067758388048960672 -0.96805871419733358 +0.12125214276834048 -0.13315862023164154 -0.98364968344024362 +0.88293452366254366 0.46425215557034577 -0.069975445501151617 +0.89756365839796159 0.34662828228540943 -0.2724487347064285 +0.46425215557034577 -0.069975445501151617 0.88293452366254366 +0.34662828228540943 -0.2724487347064285 0.89756365839796159 +-0.46055935492936023 -0.64154039217710024 0.61344193351311094 +-0.4686388229143581 -0.77631151562962109 0.42156622772499869 +-0.5283177429783209 -0.68341737901426258 -0.50380655862698787 +-0.33548020268271661 -0.69401496243142713 -0.63702140115483408 +0.35461678068422275 -0.13773383355011229 -0.924811510499706 +0.56208345571524498 -0.13929011447478698 -0.81526710519976753 +0.96805871419733358 0.24139413148544345 -0.067758388048960672 +0.98364968344024362 0.12125214276834048 0.13315862023164154 +0.61344193351311094 0.46055935492936023 0.64154039217710024 +0.42156622772499869 0.4686388229143581 0.77631151562962109 +-0.3546167806842227 -0.13773383355011226 0.924811510499706 +-0.56208345571524498 -0.13929011447478698 0.81526710519976753 +-0.88293452366254366 -0.46425215557034577 -0.069975445501151617 +-0.89756365839796159 -0.34662828228540943 -0.2724487347064285 +-0.24139413148544353 -0.067758388048960672 -0.96805871419733358 +-0.12125214276834048 0.13315862023164154 -0.98364968344024362 +0.68341737901426258 0.50380655862698787 -0.5283177429783209 +0.69401496243142724 0.63702140115483419 -0.33548020268271667 +-0.069975445501151617 0.88293452366254366 0.46425215557034577 +-0.2724487347064285 0.89756365839796159 0.34662828228540943 +-0.88293452366254355 0.46425215557034583 0.069975445501151617 +-0.89756365839796159 0.34662828228540954 0.2724487347064285 +0.067758388048960672 0.96805871419733358 -0.24139413148544345 +-0.13315862023164154 0.98364968344024362 -0.12125214276834048 +-0.5283177429783209 0.68341737901426258 0.50380655862698787 +-0.33548020268271661 0.69401496243142713 0.63702140115483408 +-0.46055935492936023 0.64154039217710024 -0.61344193351311094 +-0.4686388229143581 0.77631151562962109 -0.42156622772499869 +-0.067758388048960672 0.96805871419733358 0.24139413148544345 +0.13315862023164154 0.98364968344024362 0.12125214276834048 +-0.924811510499706 0.35461678068422275 -0.13773383355011229 +-0.81526710519976753 0.56208345571524498 -0.13929011447478698 +-0.13773383355011226 0.924811510499706 -0.3546167806842227 +-0.13929011447478698 0.81526710519976753 -0.56208345571524498 +-0.68341737901426258 0.50380655862698787 0.5283177429783209 +-0.69401496243142724 0.63702140115483419 0.33548020268271667 +-0.64154039217710024 0.61344193351311094 -0.46055935492936023 +-0.77631151562962109 0.42156622772499869 -0.4686388229143581 +0.924811510499706 0.3546167806842227 0.13773383355011226 +0.81526710519976753 0.56208345571524498 0.13929011447478698 +0.13773383355011226 0.924811510499706 0.3546167806842227 +0.13929011447478698 0.81526710519976753 0.56208345571524498 +0.24139413148544345 -0.067758388048960672 0.96805871419733358 +0.12125214276834048 0.13315862023164154 0.98364968344024362 +-0.50380655862698787 0.5283177429783209 0.68341737901426258 +-0.63702140115483408 0.33548020268271661 0.69401496243142713 +-0.64154039217710024 -0.61344193351311094 0.46055935492936023 +-0.77631151562962109 -0.42156622772499869 0.4686388229143581 +-0.96805871419733358 0.24139413148544353 0.067758388048960672 +-0.98364968344024362 0.12125214276834048 -0.13315862023164154 +-0.50380655862698787 -0.5283177429783209 -0.68341737901426258 +-0.63702140115483408 -0.33548020268271661 -0.69401496243142713 +-0.61344193351311094 0.46055935492936023 -0.64154039217710024 +-0.42156622772499869 0.4686388229143581 -0.77631151562962109 +0.46425215557034583 0.069975445501151617 -0.88293452366254355 +0.34662828228540954 0.2724487347064285 -0.89756365839796159 +0.069975445501151617 0.88293452366254366 -0.46425215557034577 +0.2724487347064285 0.89756365839796159 -0.34662828228540943 +0.069975445501151617 -0.88293452366254366 0.46425215557034577 +0.2724487347064285 -0.89756365839796159 0.34662828228540943 +0.88293452366254355 -0.46425215557034583 0.069975445501151617 +0.89756365839796159 -0.34662828228540954 0.2724487347064285 +-0.067758388048960672 -0.96805871419733358 -0.24139413148544345 +0.13315862023164154 -0.98364968344024362 -0.12125214276834048 +0.5283177429783209 -0.68341737901426258 0.50380655862698787 +0.33548020268271661 -0.69401496243142713 0.63702140115483408 +0.46055935492936023 -0.64154039217710024 -0.61344193351311094 +0.4686388229143581 -0.77631151562962109 -0.42156622772499869 +0.067758388048960672 -0.96805871419733358 0.24139413148544345 +-0.13315862023164154 -0.98364968344024362 0.12125214276834048 +0.924811510499706 -0.35461678068422275 -0.13773383355011229 +0.81526710519976753 -0.56208345571524498 -0.13929011447478698 +0.13773383355011226 -0.924811510499706 -0.3546167806842227 +0.13929011447478698 -0.81526710519976753 -0.56208345571524498 +0.68341737901426258 -0.50380655862698787 0.5283177429783209 +0.69401496243142724 -0.63702140115483419 0.33548020268271667 +0.64154039217710024 -0.61344193351311094 -0.46055935492936023 +0.77631151562962109 -0.42156622772499869 -0.4686388229143581 +-0.24139413148544345 0.067758388048960672 0.96805871419733358 +-0.12125214276834048 -0.13315862023164154 0.98364968344024362 +0.50380655862698787 -0.5283177429783209 0.68341737901426258 +0.63702140115483408 -0.33548020268271661 0.69401496243142713 +-0.924811510499706 -0.3546167806842227 0.13773383355011226 +-0.81526710519976753 -0.56208345571524498 0.13929011447478698 +-0.13773383355011226 -0.924811510499706 0.3546167806842227 +-0.13929011447478698 -0.81526710519976753 0.56208345571524498 +-0.46425215557034583 -0.069975445501151617 -0.88293452366254355 +-0.34662828228540954 -0.2724487347064285 -0.89756365839796159 +-0.069975445501151617 -0.88293452366254366 -0.46425215557034577 +-0.2724487347064285 -0.89756365839796159 -0.34662828228540943 +0.50380655862698787 0.5283177429783209 -0.68341737901426258 +0.63702140115483408 0.33548020268271661 -0.69401496243142713 +0.61344193351311094 -0.46055935492936023 -0.64154039217710024 +0.42156622772499869 -0.4686388229143581 -0.77631151562962109 +0.64154039217710024 0.61344193351311094 0.46055935492936023 +0.77631151562962109 0.42156622772499869 0.4686388229143581 +0.96805871419733358 -0.24139413148544353 0.067758388048960672 +0.98364968344024362 -0.12125214276834048 -0.13315862023164154 +0 0.43195547637044063 0.90189493092798001 +-0.21362338119554267 0.45325313160797581 0.86540548281955476 +-0.46055935492936023 0.64154039217710024 0.61344193351311094 +-0.42156622772499869 0.4686388229143581 0.77631151562962109 +0.59616674324956287 0.80040678666100251 0.06272312261214491 +0.45325313160797587 0.86540548281955487 0.21362338119554269 +0.067758388048960672 0.96805871419733358 0.24139413148544347 +0.27244873470642855 0.89756365839796148 0.34662828228540948 +0.10148814426697755 0.49467859898258537 -0.86312990927314737 +0.13202651037052049 0.66687651280351856 -0.73337897244903427 +-0.069975445501151617 0.88293452366254355 -0.46425215557034577 +0.13929011447478695 0.81526710519976753 -0.56208345571524498 +-0.80040678666100251 -0.06272312261214491 -0.59616674324956287 +-0.73337897244903427 0.13202651037052052 -0.66687651280351845 +-0.68341737901426258 0.50380655862698787 -0.5283177429783209 +-0.63702140115483408 0.33548020268271661 -0.69401496243142713 +-0.86312990927314737 -0.10148814426697755 0.49467859898258537 +-0.94700235364457697 0 0.32122662123745532 +-0.924811510499706 0.35461678068422275 0.13773383355011229 +-0.98364968344024362 0.12125214276834048 0.13315862023164154 +0.80040678666100251 -0.06272312261214491 0.59616674324956287 +0.73337897244903427 0.13202651037052052 0.66687651280351845 +0.68341737901426258 0.50380655862698787 0.5283177429783209 +0.63702140115483408 0.33548020268271661 0.69401496243142713 +-0.06272312261214491 -0.59616674324956287 0.80040678666100251 +-0.21362338119554267 -0.45325313160797581 0.86540548281955476 +-0.24139413148544347 -0.067758388048960672 0.96805871419733358 +-0.34662828228540948 -0.27244873470642855 0.89756365839796148 +-0.49467859898258548 -0.86312990927314737 -0.10148814426697755 +-0.66687651280351856 -0.73337897244903427 -0.13202651037052049 +-0.88293452366254355 -0.46425215557034577 0.069975445501151617 +-0.81526710519976753 -0.56208345571524498 -0.13929011447478695 +0.10148814426697755 -0.49467859898258537 -0.86312990927314737 +0 -0.32122662123745532 -0.94700235364457697 +-0.35461678068422275 -0.13773383355011229 -0.924811510499706 +-0.12125214276834048 -0.13315862023164154 -0.98364968344024362 +0.90189493092798001 0 -0.43195547637044063 +0.86540548281955487 0.21362338119554269 -0.45325313160797587 +0.61344193351311094 0.46055935492936023 -0.64154039217710024 +0.77631151562962109 0.42156622772499869 -0.4686388229143581 +0 -0.43195547637044052 0.90189493092798001 +0.21362338119554267 -0.45325313160797581 0.86540548281955476 +0.46055935492936023 -0.64154039217710024 0.61344193351311094 +0.42156622772499869 -0.4686388229143581 0.77631151562962109 +-0.59616674324956287 -0.80040678666100251 0.06272312261214491 +-0.45325313160797587 -0.86540548281955487 0.21362338119554269 +-0.067758388048960672 -0.96805871419733358 0.24139413148544347 +-0.27244873470642855 -0.89756365839796148 0.34662828228540948 +-0.10148814426697755 -0.49467859898258548 -0.86312990927314737 +-0.13202651037052049 -0.66687651280351856 -0.73337897244903427 +0.069975445501151617 -0.88293452366254355 -0.46425215557034577 +-0.13929011447478695 -0.81526710519976753 -0.56208345571524498 +0.80040678666100251 0.06272312261214491 -0.59616674324956287 +0.73337897244903427 -0.13202651037052052 -0.66687651280351845 +0.68341737901426258 -0.50380655862698787 -0.5283177429783209 +0.63702140115483408 -0.33548020268271661 -0.69401496243142713 +0.86312990927314737 0.10148814426697755 0.49467859898258537 +0.94700235364457697 0 0.32122662123745532 +0.924811510499706 -0.35461678068422275 0.13773383355011229 +0.98364968344024362 -0.12125214276834048 0.13315862023164154 +0.06272312261214491 0.59616674324956287 0.80040678666100251 +0.21362338119554267 0.45325313160797581 0.86540548281955476 +0.24139413148544347 0.067758388048960672 0.96805871419733358 +0.34662828228540948 0.27244873470642855 0.89756365839796148 +-0.80040678666100251 0.06272312261214491 0.59616674324956287 +-0.73337897244903427 -0.13202651037052052 0.66687651280351845 +-0.68341737901426258 -0.50380655862698787 0.5283177429783209 +-0.63702140115483408 -0.33548020268271661 0.69401496243142713 +-0.90189493092798001 0 -0.43195547637044052 +-0.86540548281955487 -0.21362338119554269 -0.45325313160797587 +-0.61344193351311094 -0.46055935492936023 -0.64154039217710024 +-0.77631151562962109 -0.42156622772499869 -0.4686388229143581 +-0.10148814426697755 0.49467859898258537 -0.86312990927314737 +0 0.32122662123745532 -0.94700235364457697 +0.35461678068422275 0.13773383355011229 -0.924811510499706 +0.12125214276834048 0.13315862023164154 -0.98364968344024362 +0.49467859898258548 0.86312990927314737 -0.10148814426697755 +0.66687651280351856 0.73337897244903427 -0.13202651037052049 +0.88293452366254355 0.46425215557034577 0.069975445501151617 +0.81526710519976753 0.56208345571524498 -0.13929011447478695 +-0.43195547637044052 0.90189493092798001 0 +-0.45325313160797587 0.86540548281955487 0.21362338119554269 +-0.64154039217710024 0.61344193351311094 0.46055935492936023 +-0.4686388229143581 0.77631151562962109 0.42156622772499869 +-0.90189493092798001 0 0.43195547637044052 +-0.86540548281955487 0.21362338119554269 0.45325313160797587 +-0.61344193351311094 0.46055935492936023 0.64154039217710024 +-0.77631151562962109 0.42156622772499869 0.4686388229143581 +-0.49467859898258537 0.86312990927314737 -0.10148814426697755 +-0.32122662123745532 0.94700235364457697 0 +-0.13773383355011229 0.924811510499706 0.3546167806842227 +-0.13315862023164154 0.98364968344024362 0.12125214276834048 +-0.10148814426697755 0.49467859898258548 0.86312990927314737 +-0.13202651037052049 0.66687651280351856 0.73337897244903427 +0.069975445501151617 0.88293452366254355 0.46425215557034577 +-0.13929011447478695 0.81526710519976753 0.56208345571524498 +-0.59616674324956287 0.80040678666100251 -0.06272312261214491 +-0.45325313160797587 0.86540548281955487 -0.21362338119554269 +-0.067758388048960672 0.96805871419733358 -0.24139413148544347 +-0.27244873470642855 0.89756365839796148 -0.34662828228540948 +0.49467859898258537 0.86312990927314737 0.10148814426697755 +0.32122662123745532 0.94700235364457697 0 +0.13773383355011229 0.924811510499706 -0.3546167806842227 +0.13315862023164154 0.98364968344024362 -0.12125214276834048 +-0.59616674324956287 0.80040678666100251 0.06272312261214491 +-0.66687651280351845 0.73337897244903427 -0.13202651037052052 +-0.5283177429783209 0.68341737901426258 -0.50380655862698787 +-0.69401496243142724 0.63702140115483419 -0.33548020268271667 +0.06272312261214491 0.59616674324956287 -0.80040678666100251 +-0.13202651037052052 0.66687651280351845 -0.73337897244903427 +-0.50380655862698787 0.5283177429783209 -0.68341737901426258 +-0.33548020268271661 0.69401496243142713 -0.63702140115483408 +-0.49467859898258548 0.86312990927314737 0.10148814426697755 +-0.66687651280351856 0.73337897244903427 0.13202651037052049 +-0.88293452366254355 0.46425215557034583 -0.069975445501151617 +-0.81526710519976753 0.56208345571524498 0.13929011447478695 +-0.80040678666100251 0.06272312261214491 -0.59616674324956287 +-0.86540548281955487 0.21362338119554269 -0.45325313160797587 +-0.96805871419733358 0.24139413148544347 -0.067758388048960672 +-0.89756365839796148 0.34662828228540948 -0.27244873470642855 +0.59616674324956287 0.80040678666100251 -0.06272312261214491 +0.66687651280351845 0.73337897244903427 0.13202651037052052 +0.5283177429783209 0.68341737901426258 0.50380655862698787 +0.69401496243142724 0.63702140115483419 0.33548020268271667 +-0.06272312261214491 0.59616674324956287 0.80040678666100251 +0.13202651037052052 0.66687651280351845 0.73337897244903427 +0.50380655862698787 0.5283177429783209 0.68341737901426258 +0.33548020268271661 0.69401496243142713 0.63702140115483408 +0.10148814426697755 0.49467859898258537 0.86312990927314737 +0 0.32122662123745532 0.94700235364457697 +-0.3546167806842227 0.13773383355011229 0.924811510499706 +-0.12125214276834048 0.13315862023164154 0.98364968344024362 +-0.86312990927314737 0.10148814426697755 0.49467859898258548 +-0.73337897244903427 0.13202651037052049 0.66687651280351856 +-0.46425215557034583 -0.069975445501151631 0.88293452366254366 +-0.56208345571524498 0.13929011447478695 0.81526710519976753 +-0.80040678666100251 -0.06272312261214491 0.59616674324956287 +-0.86540548281955487 -0.21362338119554269 0.45325313160797587 +-0.96805871419733358 -0.24139413148544347 0.067758388048960672 +-0.89756365839796148 -0.34662828228540948 0.27244873470642855 +-0.86312990927314737 0.10148814426697755 -0.49467859898258537 +-0.94700235364457697 0 -0.32122662123745532 +-0.924811510499706 -0.3546167806842227 -0.13773383355011229 +-0.98364968344024362 -0.12125214276834048 -0.13315862023164154 +-0.86312990927314737 -0.10148814426697755 -0.49467859898258548 +-0.73337897244903427 -0.13202651037052049 -0.66687651280351856 +-0.46425215557034583 0.069975445501151617 -0.88293452366254355 +-0.56208345571524498 -0.13929011447478695 -0.81526710519976753 +-0.06272312261214491 0.59616674324956287 -0.80040678666100251 +-0.21362338119554267 0.45325313160797581 -0.86540548281955476 +-0.24139413148544347 0.067758388048960672 -0.96805871419733358 +-0.34662828228540948 0.27244873470642855 -0.89756365839796148 +0 0.43195547637044063 -0.90189493092798001 +0.21362338119554267 0.45325313160797581 -0.86540548281955476 +0.46055935492936023 0.64154039217710024 -0.61344193351311094 +0.42156622772499869 0.4686388229143581 -0.77631151562962109 +0.43195547637044052 0.90189493092798001 0 +0.45325313160797587 0.86540548281955487 -0.21362338119554269 +0.64154039217710024 0.61344193351311094 -0.46055935492936023 +0.4686388229143581 0.77631151562962109 -0.42156622772499869 +0.43195547637044052 -0.90189493092798001 0 +0.45325313160797587 -0.86540548281955487 0.21362338119554269 +0.64154039217710024 -0.61344193351311094 0.46055935492936023 +0.4686388229143581 -0.77631151562962109 0.42156622772499869 +0.90189493092798001 0 0.43195547637044063 +0.86540548281955487 -0.21362338119554269 0.45325313160797587 +0.61344193351311094 -0.46055935492936023 0.64154039217710024 +0.77631151562962109 -0.42156622772499869 0.4686388229143581 +0.49467859898258537 -0.86312990927314737 -0.10148814426697755 +0.32122662123745532 -0.94700235364457697 0 +0.13773383355011229 -0.924811510499706 0.3546167806842227 +0.13315862023164154 -0.98364968344024362 0.12125214276834048 +0.10148814426697755 -0.49467859898258548 0.86312990927314737 +0.13202651037052049 -0.66687651280351856 0.73337897244903427 +-0.069975445501151617 -0.88293452366254355 0.46425215557034577 +0.13929011447478695 -0.81526710519976753 0.56208345571524498 +0.59616674324956287 -0.80040678666100251 -0.06272312261214491 +0.45325313160797587 -0.86540548281955487 -0.21362338119554269 +0.067758388048960672 -0.96805871419733358 -0.24139413148544347 +0.27244873470642855 -0.89756365839796148 -0.34662828228540948 +-0.49467859898258537 -0.86312990927314737 0.10148814426697755 +-0.32122662123745532 -0.94700235364457697 0 +-0.13773383355011229 -0.924811510499706 -0.3546167806842227 +-0.13315862023164154 -0.98364968344024362 -0.12125214276834048 +0.59616674324956287 -0.80040678666100251 0.06272312261214491 +0.66687651280351845 -0.73337897244903427 -0.13202651037052052 +0.5283177429783209 -0.68341737901426258 -0.50380655862698787 +0.69401496243142724 -0.63702140115483419 -0.33548020268271667 +-0.06272312261214491 -0.59616674324956287 -0.80040678666100251 +0.13202651037052052 -0.66687651280351845 -0.73337897244903427 +0.50380655862698787 -0.5283177429783209 -0.68341737901426258 +0.33548020268271661 -0.69401496243142713 -0.63702140115483408 +0.49467859898258548 -0.86312990927314737 0.10148814426697755 +0.66687651280351856 -0.73337897244903427 0.13202651037052049 +0.88293452366254355 -0.46425215557034583 -0.069975445501151617 +0.81526710519976753 -0.56208345571524498 0.13929011447478695 +0.80040678666100251 -0.06272312261214491 -0.59616674324956287 +0.86540548281955487 -0.21362338119554269 -0.45325313160797587 +0.96805871419733358 -0.24139413148544347 -0.067758388048960672 +0.89756365839796148 -0.34662828228540948 -0.27244873470642855 +-0.10148814426697755 -0.49467859898258537 0.86312990927314737 +0 -0.32122662123745532 0.94700235364457697 +0.3546167806842227 -0.13773383355011229 0.924811510499706 +0.12125214276834048 -0.13315862023164154 0.98364968344024362 +0.86312990927314737 -0.10148814426697755 0.49467859898258548 +0.73337897244903427 -0.13202651037052049 0.66687651280351856 +0.46425215557034583 0.069975445501151631 0.88293452366254366 +0.56208345571524498 -0.13929011447478695 0.81526710519976753 +-0.59616674324956287 -0.80040678666100251 -0.06272312261214491 +-0.66687651280351845 -0.73337897244903427 0.13202651037052052 +-0.5283177429783209 -0.68341737901426258 0.50380655862698787 +-0.69401496243142724 -0.63702140115483419 0.33548020268271667 +0.06272312261214491 -0.59616674324956287 0.80040678666100251 +-0.13202651037052052 -0.66687651280351845 0.73337897244903427 +-0.50380655862698787 -0.5283177429783209 0.68341737901426258 +-0.33548020268271661 -0.69401496243142713 0.63702140115483408 +0 -0.43195547637044063 -0.90189493092798001 +-0.21362338119554267 -0.45325313160797581 -0.86540548281955476 +-0.46055935492936023 -0.64154039217710024 -0.61344193351311094 +-0.42156622772499869 -0.4686388229143581 -0.77631151562962109 +-0.43195547637044052 -0.90189493092798001 0 +-0.45325313160797587 -0.86540548281955487 -0.21362338119554269 +-0.64154039217710024 -0.61344193351311094 -0.46055935492936023 +-0.4686388229143581 -0.77631151562962109 -0.42156622772499869 +0.86312990927314737 0.10148814426697755 -0.49467859898258537 +0.73337897244903427 0.13202651037052049 -0.66687651280351856 +0.46425215557034583 -0.069975445501151617 -0.88293452366254355 +0.56208345571524498 0.13929011447478695 -0.81526710519976753 +0.06272312261214491 -0.59616674324956287 -0.80040678666100251 +0.21362338119554267 -0.45325313160797581 -0.86540548281955476 +0.24139413148544347 -0.067758388048960672 -0.96805871419733358 +0.34662828228540948 -0.27244873470642855 -0.89756365839796148 +0.80040678666100251 0.06272312261214491 0.59616674324956287 +0.86540548281955487 0.21362338119554269 0.45325313160797587 +0.96805871419733358 0.24139413148544347 0.067758388048960672 +0.89756365839796148 0.34662828228540948 0.27244873470642855 +0.86312990927314737 -0.10148814426697755 -0.49467859898258537 +0.94700235364457697 0 -0.32122662123745532 +0.924811510499706 0.3546167806842227 -0.13773383355011229 +0.98364968344024362 0.12125214276834048 -0.13315862023164154 +3 305 125 272 +3 303 123 273 +3 311 131 274 +3 309 129 275 +3 307 127 276 +3 287 107 277 +3 288 108 278 +3 289 109 279 +3 290 110 280 +3 291 111 281 +3 323 143 282 +3 325 145 283 +3 327 147 284 +3 329 149 285 +3 331 151 286 +3 277 97 287 +3 278 98 288 +3 279 99 289 +3 280 100 290 +3 281 101 291 +3 295 115 292 +3 300 120 293 +3 297 117 294 +3 292 112 295 +3 299 119 296 +3 294 114 297 +3 301 121 298 +3 296 116 299 +3 293 113 300 +3 298 118 301 +3 330 150 302 +3 273 93 303 +3 322 142 304 +3 272 92 305 +3 324 144 306 +3 276 96 307 +3 326 146 308 +3 275 95 309 +3 328 148 310 +3 274 94 311 +3 315 135 312 +3 320 140 313 +3 317 137 314 +3 312 132 315 +3 319 139 316 +3 314 134 317 +3 321 141 318 +3 316 136 319 +3 313 133 320 +3 318 138 321 +3 304 124 322 +3 282 102 323 +3 306 126 324 +3 283 103 325 +3 308 128 326 +3 284 104 327 +3 310 130 328 +3 285 105 329 +3 302 122 330 +3 286 106 331 +3 397 217 332 +3 378 198 333 +3 393 213 334 +3 382 202 335 +3 409 229 336 +3 386 206 337 +3 405 225 338 +3 390 210 339 +3 401 221 340 +3 374 194 341 +3 435 255 342 +3 448 268 343 +3 439 259 344 +3 432 252 345 +3 443 263 346 +3 436 256 347 +3 447 267 348 +3 440 260 349 +3 451 271 350 +3 444 264 351 +3 433 253 352 +3 418 238 353 +3 437 257 354 +3 422 242 355 +3 441 261 356 +3 426 246 357 +3 445 265 358 +3 430 250 359 +3 449 269 360 +3 414 234 361 +3 395 215 362 +3 396 216 363 +3 399 219 364 +3 400 220 365 +3 403 223 366 +3 404 224 367 +3 407 227 368 +3 408 228 369 +3 411 231 370 +3 392 212 371 +3 377 197 372 +3 388 208 373 +3 341 161 374 +3 398 218 375 +3 381 201 376 +3 372 192 377 +3 333 153 378 +3 394 214 379 +3 385 205 380 +3 376 196 381 +3 335 155 382 +3 410 230 383 +3 389 209 384 +3 380 200 385 +3 337 157 386 +3 406 226 387 +3 373 193 388 +3 384 204 389 +3 339 159 390 +3 402 222 391 +3 371 191 392 +3 334 154 393 +3 379 199 394 +3 362 182 395 +3 363 183 396 +3 332 152 397 +3 375 195 398 +3 364 184 399 +3 365 185 400 +3 340 160 401 +3 391 211 402 +3 366 186 403 +3 367 187 404 +3 338 158 405 +3 387 207 406 +3 368 188 407 +3 369 189 408 +3 336 156 409 +3 383 203 410 +3 370 190 411 +3 417 237 412 +3 428 248 413 +3 361 181 414 +3 434 254 415 +3 421 241 416 +3 412 232 417 +3 353 173 418 +3 438 258 419 +3 425 245 420 +3 416 236 421 +3 355 175 422 +3 442 262 423 +3 429 249 424 +3 420 240 425 +3 357 177 426 +3 446 266 427 +3 413 233 428 +3 424 244 429 +3 359 179 430 +3 450 270 431 +3 345 165 432 +3 352 172 433 +3 415 235 434 +3 342 162 435 +3 347 167 436 +3 354 174 437 +3 419 239 438 +3 344 164 439 +3 349 169 440 +3 356 176 441 +3 423 243 442 +3 346 166 443 +3 351 171 444 +3 358 178 445 +3 427 247 446 +3 348 168 447 +3 343 163 448 +3 360 180 449 +3 431 251 450 +3 350 170 451 +3 707 219 452 +3 702 217 453 +3 699 215 454 +3 694 213 455 +3 731 231 456 +3 726 229 457 +3 723 227 458 +3 718 225 459 +3 715 223 460 +3 710 221 461 +3 635 183 462 +3 778 255 463 +3 639 185 464 +3 786 259 465 +3 643 187 466 +3 794 263 467 +3 647 189 468 +3 802 267 469 +3 651 191 470 +3 810 271 471 +3 779 255 472 +3 774 253 473 +3 787 259 474 +3 782 257 475 +3 795 263 476 +3 790 261 477 +3 803 267 478 +3 798 265 479 +3 811 271 480 +3 806 269 481 +3 595 163 482 +3 698 215 483 +3 599 165 484 +3 706 219 485 +3 603 167 486 +3 714 223 487 +3 607 169 488 +3 722 227 489 +3 611 171 490 +3 730 231 491 +3 667 199 492 +3 662 197 493 +3 687 209 494 +3 590 161 495 +3 675 203 496 +3 670 201 497 +3 655 193 498 +3 574 153 499 +3 683 207 500 +3 678 205 501 +3 663 197 502 +3 578 155 503 +3 691 211 504 +3 686 209 505 +3 671 201 506 +3 582 157 507 +3 659 195 508 +3 654 193 509 +3 679 205 510 +3 586 159 511 +3 807 269 512 +3 650 191 513 +3 579 155 514 +3 666 199 515 +3 775 253 516 +3 634 183 517 +3 575 153 518 +3 658 195 519 +3 783 257 520 +3 638 185 521 +3 591 161 522 +3 690 211 523 +3 791 261 524 +3 642 187 525 +3 587 159 526 +3 682 207 527 +3 799 265 528 +3 646 189 529 +3 583 157 530 +3 674 203 531 +3 747 239 532 +3 742 237 533 +3 767 249 534 +3 630 181 535 +3 755 243 536 +3 750 241 537 +3 735 233 538 +3 614 173 539 +3 763 247 540 +3 758 245 541 +3 743 237 542 +3 618 175 543 +3 771 251 544 +3 766 249 545 +3 751 241 546 +3 622 177 547 +3 739 235 548 +3 734 233 549 +3 759 245 550 +3 626 179 551 +3 703 217 552 +3 598 165 553 +3 615 173 554 +3 738 235 555 +3 711 221 556 +3 602 167 557 +3 619 175 558 +3 746 239 559 +3 719 225 560 +3 606 169 561 +3 623 177 562 +3 754 243 563 +3 727 229 564 +3 610 171 565 +3 627 179 566 +3 762 247 567 +3 695 213 568 +3 594 163 569 +3 631 181 570 +3 770 251 571 +3 701 216 572 +3 664 198 573 +3 499 115 574 +3 518 125 575 +3 693 212 576 +3 672 202 577 +3 503 117 578 +3 514 123 579 +3 725 228 580 +3 680 206 581 +3 507 119 582 +3 530 131 583 +3 717 224 584 +3 688 210 585 +3 511 121 586 +3 526 129 587 +3 709 220 588 +3 656 194 589 +3 495 113 590 +3 522 127 591 +3 777 254 592 +3 804 268 593 +3 569 150 594 +3 482 107 595 +3 785 258 596 +3 772 252 597 +3 553 142 598 +3 484 108 599 +3 793 262 600 +3 780 256 601 +3 557 144 602 +3 486 109 603 +3 801 266 604 +3 788 260 605 +3 561 146 606 +3 488 110 607 +3 809 270 608 +3 796 264 609 +3 565 148 610 +3 490 111 611 +3 773 252 612 +3 744 238 613 +3 539 135 614 +3 554 143 615 +3 781 256 616 +3 752 242 617 +3 543 137 618 +3 558 145 619 +3 789 260 620 +3 760 246 621 +3 547 139 622 +3 562 147 623 +3 797 264 624 +3 768 250 625 +3 551 141 626 +3 566 149 627 +3 805 268 628 +3 736 234 629 +3 535 133 630 +3 570 151 631 +3 697 214 632 +3 700 216 633 +3 517 124 634 +3 462 97 635 +3 705 218 636 +3 708 220 637 +3 521 126 638 +3 464 98 639 +3 713 222 640 +3 716 224 641 +3 525 128 642 +3 466 99 643 +3 721 226 644 +3 724 228 645 +3 529 130 646 +3 468 100 647 +3 729 230 648 +3 692 212 649 +3 513 122 650 +3 470 101 651 +3 661 196 652 +3 684 208 653 +3 509 120 654 +3 498 115 655 +3 589 160 656 +3 704 218 657 +3 519 125 658 +3 508 120 659 +3 669 200 660 +3 652 192 661 +3 493 112 662 +3 502 117 663 +3 573 152 664 +3 696 214 665 +3 515 123 666 +3 492 112 667 +3 677 204 668 +3 660 196 669 +3 497 114 670 +3 506 119 671 +3 577 154 672 +3 728 230 673 +3 531 131 674 +3 496 114 675 +3 685 208 676 +3 668 200 677 +3 501 116 678 +3 510 121 679 +3 581 156 680 +3 720 226 681 +3 527 129 682 +3 500 116 683 +3 653 192 684 +3 676 204 685 +3 505 118 686 +3 494 113 687 +3 585 158 688 +3 712 222 689 +3 523 127 690 +3 504 118 691 +3 649 190 692 +3 576 154 693 +3 455 93 694 +3 568 150 695 +3 665 198 696 +3 632 182 697 +3 483 107 698 +3 454 93 699 +3 633 182 700 +3 572 152 701 +3 453 92 702 +3 552 142 703 +3 657 194 704 +3 636 184 705 +3 485 108 706 +3 452 92 707 +3 637 184 708 +3 588 160 709 +3 461 96 710 +3 556 144 711 +3 689 210 712 +3 640 186 713 +3 487 109 714 +3 460 96 715 +3 641 186 716 +3 584 158 717 +3 459 95 718 +3 560 146 719 +3 681 206 720 +3 644 188 721 +3 489 110 722 +3 458 95 723 +3 645 188 724 +3 580 156 725 +3 457 94 726 +3 564 148 727 +3 673 202 728 +3 648 190 729 +3 491 111 730 +3 456 94 731 +3 741 236 732 +3 764 248 733 +3 549 140 734 +3 538 135 735 +3 629 180 736 +3 776 254 737 +3 555 143 738 +3 548 140 739 +3 749 240 740 +3 732 232 741 +3 533 132 742 +3 542 137 743 +3 613 172 744 +3 784 258 745 +3 559 145 746 +3 532 132 747 +3 757 244 748 +3 740 236 749 +3 537 134 750 +3 546 139 751 +3 617 174 752 +3 792 262 753 +3 563 147 754 +3 536 134 755 +3 765 248 756 +3 748 240 757 +3 541 136 758 +3 550 141 759 +3 621 176 760 +3 800 266 761 +3 567 149 762 +3 540 136 763 +3 733 232 764 +3 756 244 765 +3 545 138 766 +3 534 133 767 +3 625 178 768 +3 808 270 769 +3 571 151 770 +3 544 138 771 +3 597 164 772 +3 612 172 773 +3 473 102 774 +3 516 124 775 +3 737 234 776 +3 592 162 777 +3 463 97 778 +3 472 102 779 +3 601 166 780 +3 616 174 781 +3 475 103 782 +3 520 126 783 +3 745 238 784 +3 596 164 785 +3 465 98 786 +3 474 103 787 +3 605 168 788 +3 620 176 789 +3 477 104 790 +3 524 128 791 +3 753 242 792 +3 600 166 793 +3 467 99 794 +3 476 104 795 +3 609 170 796 +3 624 178 797 +3 479 105 798 +3 528 130 799 +3 761 246 800 +3 604 168 801 +3 469 100 802 +3 478 105 803 +3 593 162 804 +3 628 180 805 +3 481 106 806 +3 512 122 807 +3 769 250 808 +3 608 170 809 +3 471 101 810 +3 480 106 811 +3 519 65 272 +3 707 92 272 +3 515 63 273 +3 699 93 273 +3 531 71 274 +3 731 94 274 +3 527 69 275 +3 723 95 275 +3 523 67 276 +3 715 96 276 +3 483 47 277 +3 635 97 277 +3 485 48 278 +3 639 98 278 +3 487 49 279 +3 643 99 279 +3 489 50 280 +3 647 100 280 +3 491 51 281 +3 651 101 281 +3 555 83 282 +3 779 102 282 +3 559 85 283 +3 787 103 283 +3 563 87 284 +3 795 104 284 +3 567 89 285 +3 803 105 285 +3 571 91 286 +3 811 106 286 +3 463 37 287 +3 595 107 287 +3 465 38 288 +3 599 108 288 +3 467 39 289 +3 603 109 289 +3 469 40 290 +3 607 110 290 +3 471 41 291 +3 611 111 291 +3 499 55 292 +3 667 112 292 +3 509 60 293 +3 687 113 293 +3 503 57 294 +3 675 114 294 +3 493 52 295 +3 655 115 295 +3 507 59 296 +3 683 116 296 +3 497 54 297 +3 663 117 297 +3 511 61 298 +3 691 118 298 +3 501 56 299 +3 671 119 299 +3 495 53 300 +3 659 120 300 +3 505 58 301 +3 679 121 301 +3 569 90 302 +3 807 122 302 +3 455 33 303 +3 579 123 303 +3 553 82 304 +3 775 124 304 +3 453 32 305 +3 575 125 305 +3 557 84 306 +3 783 126 306 +3 461 36 307 +3 591 127 307 +3 561 86 308 +3 791 128 308 +3 459 35 309 +3 587 129 309 +3 565 88 310 +3 799 130 310 +3 457 34 311 +3 583 131 311 +3 539 75 312 +3 747 132 312 +3 549 80 313 +3 767 133 313 +3 543 77 314 +3 755 134 314 +3 533 72 315 +3 735 135 315 +3 547 79 316 +3 763 136 316 +3 537 74 317 +3 743 137 317 +3 551 81 318 +3 771 138 318 +3 541 76 319 +3 751 139 319 +3 535 73 320 +3 739 140 320 +3 545 78 321 +3 759 141 321 +3 517 64 322 +3 703 142 322 +3 473 42 323 +3 615 143 323 +3 521 66 324 +3 711 144 324 +3 475 43 325 +3 619 145 325 +3 525 68 326 +3 719 146 326 +3 477 44 327 +3 623 147 327 +3 529 70 328 +3 727 148 328 +3 479 45 329 +3 627 149 329 +3 513 62 330 +3 695 150 330 +3 481 46 331 +3 631 151 331 +3 703 64 332 +3 701 152 332 +3 665 55 333 +3 499 153 333 +3 695 62 334 +3 693 154 334 +3 673 57 335 +3 503 155 335 +3 727 70 336 +3 725 156 336 +3 681 59 337 +3 507 157 337 +3 719 68 338 +3 717 158 338 +3 689 61 339 +3 511 159 339 +3 711 66 340 +3 709 160 340 +3 657 53 341 +3 495 161 341 +3 779 83 342 +3 777 162 342 +3 805 90 343 +3 569 163 343 +3 787 85 344 +3 785 164 344 +3 773 82 345 +3 553 165 345 +3 795 87 346 +3 793 166 346 +3 781 84 347 +3 557 167 347 +3 803 89 348 +3 801 168 348 +3 789 86 349 +3 561 169 349 +3 811 91 350 +3 809 170 350 +3 797 88 351 +3 565 171 351 +3 775 82 352 +3 773 172 352 +3 745 75 353 +3 539 173 353 +3 783 84 354 +3 781 174 354 +3 753 77 355 +3 543 175 355 +3 791 86 356 +3 789 176 356 +3 761 79 357 +3 547 177 357 +3 799 88 358 +3 797 178 358 +3 769 81 359 +3 551 179 359 +3 807 90 360 +3 805 180 360 +3 737 73 361 +3 535 181 361 +3 699 63 362 +3 697 182 362 +3 701 64 363 +3 517 183 363 +3 707 65 364 +3 705 184 364 +3 709 66 365 +3 521 185 365 +3 715 67 366 +3 713 186 366 +3 717 68 367 +3 525 187 367 +3 723 69 368 +3 721 188 368 +3 725 70 369 +3 529 189 369 +3 731 71 370 +3 729 190 370 +3 693 62 371 +3 513 191 371 +3 663 54 372 +3 661 192 372 +3 685 60 373 +3 509 193 373 +3 591 36 374 +3 589 194 374 +3 705 65 375 +3 519 195 375 +3 671 56 376 +3 669 196 376 +3 653 52 377 +3 493 197 377 +3 575 32 378 +3 573 198 378 +3 697 63 379 +3 515 199 379 +3 679 58 380 +3 677 200 380 +3 661 54 381 +3 497 201 381 +3 579 33 382 +3 577 202 382 +3 729 71 383 +3 531 203 383 +3 687 60 384 +3 685 204 384 +3 669 56 385 +3 501 205 385 +3 583 34 386 +3 581 206 386 +3 721 69 387 +3 527 207 387 +3 655 52 388 +3 653 208 388 +3 677 58 389 +3 505 209 389 +3 587 35 390 +3 585 210 390 +3 713 67 391 +3 523 211 391 +3 651 51 392 +3 649 212 392 +3 577 33 393 +3 455 213 393 +3 667 55 394 +3 665 214 394 +3 633 47 395 +3 483 215 395 +3 635 47 396 +3 633 216 396 +3 573 32 397 +3 453 217 397 +3 659 53 398 +3 657 218 398 +3 637 48 399 +3 485 219 399 +3 639 48 400 +3 637 220 400 +3 589 36 401 +3 461 221 401 +3 691 61 402 +3 689 222 402 +3 641 49 403 +3 487 223 403 +3 643 49 404 +3 641 224 404 +3 585 35 405 +3 459 225 405 +3 683 59 406 +3 681 226 406 +3 645 50 407 +3 489 227 407 +3 647 50 408 +3 645 228 408 +3 581 34 409 +3 457 229 409 +3 675 57 410 +3 673 230 410 +3 649 51 411 +3 491 231 411 +3 743 74 412 +3 741 232 412 +3 765 80 413 +3 549 233 413 +3 631 46 414 +3 629 234 414 +3 777 83 415 +3 555 235 415 +3 751 76 416 +3 749 236 416 +3 733 72 417 +3 533 237 417 +3 615 42 418 +3 613 238 418 +3 785 85 419 +3 559 239 419 +3 759 78 420 +3 757 240 420 +3 741 74 421 +3 537 241 421 +3 619 43 422 +3 617 242 422 +3 793 87 423 +3 563 243 423 +3 767 80 424 +3 765 244 424 +3 749 76 425 +3 541 245 425 +3 623 44 426 +3 621 246 426 +3 801 89 427 +3 567 247 427 +3 735 72 428 +3 733 248 428 +3 757 78 429 +3 545 249 429 +3 627 45 430 +3 625 250 430 +3 809 91 431 +3 571 251 431 +3 599 38 432 +3 597 252 432 +3 613 42 433 +3 473 253 433 +3 739 73 434 +3 737 254 434 +3 593 37 435 +3 463 255 435 +3 603 39 436 +3 601 256 436 +3 617 43 437 +3 475 257 437 +3 747 75 438 +3 745 258 438 +3 597 38 439 +3 465 259 439 +3 607 40 440 +3 605 260 440 +3 621 44 441 +3 477 261 441 +3 755 77 442 +3 753 262 442 +3 601 39 443 +3 467 263 443 +3 611 41 444 +3 609 264 444 +3 625 45 445 +3 479 265 445 +3 763 79 446 +3 761 266 446 +3 605 40 447 +3 469 267 447 +3 595 37 448 +3 593 268 448 +3 629 46 449 +3 481 269 449 +3 771 81 450 +3 769 270 450 +3 609 41 451 +3 471 271 451 +3 706 18 452 +3 702 92 452 +3 397 32 453 +3 305 92 453 +3 698 17 454 +3 694 93 454 +3 393 33 455 +3 303 93 455 +3 730 21 456 +3 726 94 456 +3 409 34 457 +3 311 94 457 +3 722 20 458 +3 718 95 458 +3 405 35 459 +3 309 95 459 +3 714 19 460 +3 710 96 460 +3 401 36 461 +3 307 96 461 +3 634 27 462 +3 778 97 462 +3 435 37 463 +3 287 97 463 +3 638 28 464 +3 786 98 464 +3 439 38 465 +3 288 98 465 +3 642 29 466 +3 794 99 466 +3 443 39 467 +3 289 99 467 +3 646 30 468 +3 802 100 468 +3 447 40 469 +3 290 100 469 +3 650 31 470 +3 810 101 470 +3 451 41 471 +3 291 101 471 +3 778 27 472 +3 774 102 472 +3 433 42 473 +3 323 102 473 +3 786 28 474 +3 782 103 474 +3 437 43 475 +3 325 103 475 +3 794 29 476 +3 790 104 476 +3 441 44 477 +3 327 104 477 +3 802 30 478 +3 798 105 478 +3 445 45 479 +3 329 105 479 +3 810 31 480 +3 806 106 480 +3 449 46 481 +3 331 106 481 +3 594 17 482 +3 698 107 482 +3 395 47 483 +3 277 107 483 +3 598 18 484 +3 706 108 484 +3 399 48 485 +3 278 108 485 +3 602 19 486 +3 714 109 486 +3 403 49 487 +3 279 109 487 +3 606 20 488 +3 722 110 488 +3 407 50 489 +3 280 110 489 +3 610 21 490 +3 730 111 490 +3 411 51 491 +3 281 111 491 +3 666 13 492 +3 662 112 492 +3 377 52 493 +3 295 112 493 +3 686 16 494 +3 590 113 494 +3 341 53 495 +3 300 113 495 +3 674 14 496 +3 670 114 496 +3 381 54 497 +3 297 114 497 +3 654 12 498 +3 574 115 498 +3 333 55 499 +3 292 115 499 +3 682 15 500 +3 678 116 500 +3 385 56 501 +3 299 116 501 +3 662 13 502 +3 578 117 502 +3 335 57 503 +3 294 117 503 +3 690 16 504 +3 686 118 504 +3 389 58 505 +3 301 118 505 +3 670 14 506 +3 582 119 506 +3 337 59 507 +3 296 119 507 +3 658 12 508 +3 654 120 508 +3 373 60 509 +3 293 120 509 +3 678 15 510 +3 586 121 510 +3 339 61 511 +3 298 121 511 +3 806 31 512 +3 650 122 512 +3 371 62 513 +3 330 122 513 +3 578 13 514 +3 666 123 514 +3 379 63 515 +3 273 123 515 +3 774 27 516 +3 634 124 516 +3 363 64 517 +3 322 124 517 +3 574 12 518 +3 658 125 518 +3 375 65 519 +3 272 125 519 +3 782 28 520 +3 638 126 520 +3 365 66 521 +3 324 126 521 +3 590 16 522 +3 690 127 522 +3 391 67 523 +3 276 127 523 +3 790 29 524 +3 642 128 524 +3 367 68 525 +3 326 128 525 +3 586 15 526 +3 682 129 526 +3 387 69 527 +3 275 129 527 +3 798 30 528 +3 646 130 528 +3 369 70 529 +3 328 130 529 +3 582 14 530 +3 674 131 530 +3 383 71 531 +3 274 131 531 +3 746 23 532 +3 742 132 532 +3 417 72 533 +3 315 132 533 +3 766 26 534 +3 630 133 534 +3 361 73 535 +3 320 133 535 +3 754 24 536 +3 750 134 536 +3 421 74 537 +3 317 134 537 +3 734 22 538 +3 614 135 538 +3 353 75 539 +3 312 135 539 +3 762 25 540 +3 758 136 540 +3 425 76 541 +3 319 136 541 +3 742 23 542 +3 618 137 542 +3 355 77 543 +3 314 137 543 +3 770 26 544 +3 766 138 544 +3 429 78 545 +3 321 138 545 +3 750 24 546 +3 622 139 546 +3 357 79 547 +3 316 139 547 +3 738 22 548 +3 734 140 548 +3 413 80 549 +3 313 140 549 +3 758 25 550 +3 626 141 550 +3 359 81 551 +3 318 141 551 +3 702 18 552 +3 598 142 552 +3 345 82 553 +3 304 142 553 +3 614 22 554 +3 738 143 554 +3 415 83 555 +3 282 143 555 +3 710 19 556 +3 602 144 556 +3 347 84 557 +3 306 144 557 +3 618 23 558 +3 746 145 558 +3 419 85 559 +3 283 145 559 +3 718 20 560 +3 606 146 560 +3 349 86 561 +3 308 146 561 +3 622 24 562 +3 754 147 562 +3 423 87 563 +3 284 147 563 +3 726 21 564 +3 610 148 564 +3 351 88 565 +3 310 148 565 +3 626 25 566 +3 762 149 566 +3 427 89 567 +3 285 149 567 +3 694 17 568 +3 594 150 568 +3 343 90 569 +3 302 150 569 +3 630 26 570 +3 770 151 570 +3 431 91 571 +3 286 151 571 +3 700 5 572 +3 664 152 572 +3 378 32 573 +3 397 152 573 +3 498 12 574 +3 518 153 574 +3 305 32 575 +3 378 153 575 +3 692 1 576 +3 672 154 576 +3 382 33 577 +3 393 154 577 +3 502 13 578 +3 514 155 578 +3 303 33 579 +3 382 155 579 +3 724 7 580 +3 680 156 580 +3 386 34 581 +3 409 156 581 +3 506 14 582 +3 530 157 582 +3 311 34 583 +3 386 157 583 +3 716 10 584 +3 688 158 584 +3 390 35 585 +3 405 158 585 +3 510 15 586 +3 526 159 586 +3 309 35 587 +3 390 159 587 +3 708 11 588 +3 656 160 588 +3 374 36 589 +3 401 160 589 +3 494 16 590 +3 522 161 590 +3 307 36 591 +3 374 161 591 +3 776 9 592 +3 804 162 592 +3 448 37 593 +3 435 162 593 +3 568 17 594 +3 482 163 594 +3 287 37 595 +3 448 163 595 +3 784 4 596 +3 772 164 596 +3 432 38 597 +3 439 164 597 +3 552 18 598 +3 484 165 598 +3 288 38 599 +3 432 165 599 +3 792 2 600 +3 780 166 600 +3 436 39 601 +3 443 166 601 +3 556 19 602 +3 486 167 602 +3 289 39 603 +3 436 167 603 +3 800 6 604 +3 788 168 604 +3 440 40 605 +3 447 168 605 +3 560 20 606 +3 488 169 606 +3 290 40 607 +3 440 169 607 +3 808 8 608 +3 796 170 608 +3 444 41 609 +3 451 170 609 +3 564 21 610 +3 490 171 610 +3 291 41 611 +3 444 171 611 +3 772 4 612 +3 744 172 612 +3 418 42 613 +3 433 172 613 +3 538 22 614 +3 554 173 614 +3 323 42 615 +3 418 173 615 +3 780 2 616 +3 752 174 616 +3 422 43 617 +3 437 174 617 +3 542 23 618 +3 558 175 618 +3 325 43 619 +3 422 175 619 +3 788 6 620 +3 760 176 620 +3 426 44 621 +3 441 176 621 +3 546 24 622 +3 562 177 622 +3 327 44 623 +3 426 177 623 +3 796 8 624 +3 768 178 624 +3 430 45 625 +3 445 178 625 +3 550 25 626 +3 566 179 626 +3 329 45 627 +3 430 179 627 +3 804 9 628 +3 736 180 628 +3 414 46 629 +3 449 180 629 +3 534 26 630 +3 570 181 630 +3 331 46 631 +3 414 181 631 +3 696 5 632 +3 700 182 632 +3 396 47 633 +3 395 182 633 +3 516 27 634 +3 462 183 634 +3 277 47 635 +3 396 183 635 +3 704 11 636 +3 708 184 636 +3 400 48 637 +3 399 184 637 +3 520 28 638 +3 464 185 638 +3 278 48 639 +3 400 185 639 +3 712 10 640 +3 716 186 640 +3 404 49 641 +3 403 186 641 +3 524 29 642 +3 466 187 642 +3 279 49 643 +3 404 187 643 +3 720 7 644 +3 724 188 644 +3 408 50 645 +3 407 188 645 +3 528 30 646 +3 468 189 646 +3 280 50 647 +3 408 189 647 +3 728 1 648 +3 692 190 648 +3 392 51 649 +3 411 190 649 +3 512 31 650 +3 470 191 650 +3 281 51 651 +3 392 191 651 +3 660 0 652 +3 684 192 652 +3 388 52 653 +3 377 192 653 +3 508 12 654 +3 498 193 654 +3 295 52 655 +3 388 193 655 +3 588 11 656 +3 704 194 656 +3 398 53 657 +3 341 194 657 +3 518 12 658 +3 508 195 658 +3 300 53 659 +3 398 195 659 +3 668 0 660 +3 652 196 660 +3 372 54 661 +3 381 196 661 +3 492 13 662 +3 502 197 662 +3 297 54 663 +3 372 197 663 +3 572 5 664 +3 696 198 664 +3 394 55 665 +3 333 198 665 +3 514 13 666 +3 492 199 666 +3 292 55 667 +3 394 199 667 +3 676 0 668 +3 660 200 668 +3 376 56 669 +3 385 200 669 +3 496 14 670 +3 506 201 670 +3 299 56 671 +3 376 201 671 +3 576 1 672 +3 728 202 672 +3 410 57 673 +3 335 202 673 +3 530 14 674 +3 496 203 674 +3 294 57 675 +3 410 203 675 +3 684 0 676 +3 668 204 676 +3 380 58 677 +3 389 204 677 +3 500 15 678 +3 510 205 678 +3 301 58 679 +3 380 205 679 +3 580 7 680 +3 720 206 680 +3 406 59 681 +3 337 206 681 +3 526 15 682 +3 500 207 682 +3 296 59 683 +3 406 207 683 +3 652 0 684 +3 676 208 684 +3 384 60 685 +3 373 208 685 +3 504 16 686 +3 494 209 686 +3 293 60 687 +3 384 209 687 +3 584 10 688 +3 712 210 688 +3 402 61 689 +3 339 210 689 +3 522 16 690 +3 504 211 690 +3 298 61 691 +3 402 211 691 +3 648 1 692 +3 576 212 692 +3 334 62 693 +3 371 212 693 +3 454 17 694 +3 568 213 694 +3 330 62 695 +3 334 213 695 +3 664 5 696 +3 632 214 696 +3 362 63 697 +3 379 214 697 +3 482 17 698 +3 454 215 698 +3 273 63 699 +3 362 215 699 +3 632 5 700 +3 572 216 700 +3 332 64 701 +3 363 216 701 +3 452 18 702 +3 552 217 702 +3 322 64 703 +3 332 217 703 +3 656 11 704 +3 636 218 704 +3 364 65 705 +3 375 218 705 +3 484 18 706 +3 452 219 706 +3 272 65 707 +3 364 219 707 +3 636 11 708 +3 588 220 708 +3 340 66 709 +3 365 220 709 +3 460 19 710 +3 556 221 710 +3 324 66 711 +3 340 221 711 +3 688 10 712 +3 640 222 712 +3 366 67 713 +3 391 222 713 +3 486 19 714 +3 460 223 714 +3 276 67 715 +3 366 223 715 +3 640 10 716 +3 584 224 716 +3 338 68 717 +3 367 224 717 +3 458 20 718 +3 560 225 718 +3 326 68 719 +3 338 225 719 +3 680 7 720 +3 644 226 720 +3 368 69 721 +3 387 226 721 +3 488 20 722 +3 458 227 722 +3 275 69 723 +3 368 227 723 +3 644 7 724 +3 580 228 724 +3 336 70 725 +3 369 228 725 +3 456 21 726 +3 564 229 726 +3 328 70 727 +3 336 229 727 +3 672 1 728 +3 648 230 728 +3 370 71 729 +3 383 230 729 +3 490 21 730 +3 456 231 730 +3 274 71 731 +3 370 231 731 +3 740 3 732 +3 764 232 732 +3 428 72 733 +3 417 232 733 +3 548 22 734 +3 538 233 734 +3 315 72 735 +3 428 233 735 +3 628 9 736 +3 776 234 736 +3 434 73 737 +3 361 234 737 +3 554 22 738 +3 548 235 738 +3 320 73 739 +3 434 235 739 +3 748 3 740 +3 732 236 740 +3 412 74 741 +3 421 236 741 +3 532 23 742 +3 542 237 742 +3 317 74 743 +3 412 237 743 +3 612 4 744 +3 784 238 744 +3 438 75 745 +3 353 238 745 +3 558 23 746 +3 532 239 746 +3 312 75 747 +3 438 239 747 +3 756 3 748 +3 740 240 748 +3 416 76 749 +3 425 240 749 +3 536 24 750 +3 546 241 750 +3 319 76 751 +3 416 241 751 +3 616 2 752 +3 792 242 752 +3 442 77 753 +3 355 242 753 +3 562 24 754 +3 536 243 754 +3 314 77 755 +3 442 243 755 +3 764 3 756 +3 748 244 756 +3 420 78 757 +3 429 244 757 +3 540 25 758 +3 550 245 758 +3 321 78 759 +3 420 245 759 +3 620 6 760 +3 800 246 760 +3 446 79 761 +3 357 246 761 +3 566 25 762 +3 540 247 762 +3 316 79 763 +3 446 247 763 +3 732 3 764 +3 756 248 764 +3 424 80 765 +3 413 248 765 +3 544 26 766 +3 534 249 766 +3 313 80 767 +3 424 249 767 +3 624 8 768 +3 808 250 768 +3 450 81 769 +3 359 250 769 +3 570 26 770 +3 544 251 770 +3 318 81 771 +3 450 251 771 +3 596 4 772 +3 612 252 772 +3 352 82 773 +3 345 252 773 +3 472 27 774 +3 516 253 774 +3 304 82 775 +3 352 253 775 +3 736 9 776 +3 592 254 776 +3 342 83 777 +3 415 254 777 +3 462 27 778 +3 472 255 778 +3 282 83 779 +3 342 255 779 +3 600 2 780 +3 616 256 780 +3 354 84 781 +3 347 256 781 +3 474 28 782 +3 520 257 782 +3 306 84 783 +3 354 257 783 +3 744 4 784 +3 596 258 784 +3 344 85 785 +3 419 258 785 +3 464 28 786 +3 474 259 786 +3 283 85 787 +3 344 259 787 +3 604 6 788 +3 620 260 788 +3 356 86 789 +3 349 260 789 +3 476 29 790 +3 524 261 790 +3 308 86 791 +3 356 261 791 +3 752 2 792 +3 600 262 792 +3 346 87 793 +3 423 262 793 +3 466 29 794 +3 476 263 794 +3 284 87 795 +3 346 263 795 +3 608 8 796 +3 624 264 796 +3 358 88 797 +3 351 264 797 +3 478 30 798 +3 528 265 798 +3 310 88 799 +3 358 265 799 +3 760 6 800 +3 604 266 800 +3 348 89 801 +3 427 266 801 +3 468 30 802 +3 478 267 802 +3 285 89 803 +3 348 267 803 +3 592 9 804 +3 628 268 804 +3 360 90 805 +3 343 268 805 +3 480 31 806 +3 512 269 806 +3 302 90 807 +3 360 269 807 +3 768 8 808 +3 608 270 808 +3 350 91 809 +3 431 270 809 +3 470 31 810 +3 480 271 810 +3 286 91 811 +3 350 271 811 diff --git a/Heat_method_3/test/Heat_method_3/heat_method_concept.cpp b/Heat_method_3/test/Heat_method_3/heat_method_concept.cpp new file mode 100644 index 00000000000..e099e1f1530 --- /dev/null +++ b/Heat_method_3/test/Heat_method_3/heat_method_concept.cpp @@ -0,0 +1,66 @@ +#include +#include +#include + +#include "Heat_method_traits_3.h" + +#include +#include + +#include + +typedef Heat_method_traits_3 Kernel; +typedef Kernel::Point_3 Point_3; +typedef CGAL::Surface_mesh Surface_mesh; + +typedef boost::graph_traits::vertex_descriptor vertex_descriptor; +typedef Surface_mesh::Property_map Vertex_distance_map; +typedef CGAL::Heat_method_3::Surface_mesh_geodesic_distances_3::const_type, + CGAL::Eigen_solver_traits::EigenType > >, + Kernel> Heat_method; + + + +int main() +{ + //read in mesh + Surface_mesh sm; + + if(sm.is_empty()){ + return 0; + } + //the heat intensity will hold the distance values from the source set + Vertex_distance_map heat_intensity = sm.add_property_map("v:heat_intensity", 0).first; + + Heat_method hm(sm); + + //add the first vertex as the source set + vertex_descriptor source = *(vertices(sm).first); + hm.add_source(source); + hm.estimate_geodesic_distances(heat_intensity); + + //Point_3 sp = sm.point(source); + + vertex_descriptor far; + // double sdistance = 0; + + BOOST_FOREACH(vertex_descriptor vd , vertices(sm)){ + std::cout << vd << " is at distance " << get(heat_intensity, vd) << " from " << source << std::endl; + /* + if(squared_distance(sp,sm.point(vd)) > sdistance){ + far = vd; + sdistance = squared_distance(sp,sm.point(vd)); + } + */ + } + hm.add_source(far); + hm.estimate_geodesic_distances(heat_intensity); + + BOOST_FOREACH(vertex_descriptor vd , vertices(sm)){ + std::cout << vd << " is at distance " << get(heat_intensity, vd) << " " << std::endl; + } + + return 0; +} diff --git a/Heat_method_3/test/Heat_method_3/heat_method_surface_mesh_direct_test.cpp b/Heat_method_3/test/Heat_method_3/heat_method_surface_mesh_direct_test.cpp new file mode 100644 index 00000000000..710eed07757 --- /dev/null +++ b/Heat_method_3/test/Heat_method_3/heat_method_surface_mesh_direct_test.cpp @@ -0,0 +1,117 @@ +#include +#include +#include +#include +#include + +#include + +typedef CGAL::Simple_cartesian Kernel; +typedef Kernel::Point_3 Point_3; +typedef CGAL::Surface_mesh Surface_mesh; + +typedef boost::graph_traits::vertex_descriptor vertex_descriptor; +typedef Surface_mesh::Property_map Vertex_distance_map; +typedef CGAL::Heat_method_3::Surface_mesh_geodesic_distances_3 Heat_method; + + + +int main(int argc, char* argv[]) +{ + //read in mesh + Surface_mesh sm; + const char* filename = (argc > 1) ? argv[1] : "./data/sphere.off"; + std::ifstream in(filename); + in >> sm; + //property map for the distance values to the source set + Vertex_distance_map vertex_distance = sm.add_property_map("v:distance", 0).first; + + Heat_method hm(sm); + + //add the first vertex as the source set + vertex_descriptor source = *(vertices(sm).first); + hm.add_source(source); + assert(hm.sources().size() == 1); + hm.estimate_geodesic_distances(vertex_distance); + + Point_3 sp = sm.point(source); + + std::cout << "source: " << sp << " " << source << std::endl; + vertex_descriptor far; + double sdistance = 0; + + BOOST_FOREACH(vertex_descriptor vd , vertices(sm)){ + if(get(vertex_distance,vd) > sdistance){ + far = vd; + sdistance = get(vertex_distance,vd); + } + } + assert(sdistance > 2.9); + assert(sdistance < CGAL_PI); + + hm.add_source(far); + assert(hm.sources().size() == 2); + hm.estimate_geodesic_distances(vertex_distance); + + sdistance = 0; + BOOST_FOREACH(vertex_descriptor vd , vertices(sm)){ + if(get(vertex_distance,vd) > sdistance){ + sdistance = get(vertex_distance,vd); + } + } + + assert(sdistance > 1.4); + assert(sdistance < CGAL_PI/2.0); + + hm.remove_source(far); + assert(hm.sources().size() == 1); + + hm.clear_sources(); + + // add range of sources + std::vector vrange; + vrange.push_back(source); + vrange.push_back(far); + hm.add_sources(vrange); + assert(hm.sources().size() == 2); + hm.estimate_geodesic_distances(vertex_distance); + sdistance = 0; + BOOST_FOREACH(vertex_descriptor vd , vertices(sm)){ + if(get(vertex_distance,vd) > sdistance){ + sdistance = get(vertex_distance,vd); + } + } + + + assert(sdistance > 1.4); + assert(sdistance < CGAL_PI/2.0); + + // do it again for one source + hm.clear_sources(); + assert(hm.sources().size() == 0); + hm.add_source(source); + hm.estimate_geodesic_distances(vertex_distance); + BOOST_FOREACH(vertex_descriptor vd , vertices(sm)){ + if(get(vertex_distance,vd) > sdistance){ + sdistance = get(vertex_distance,vd); + } + } + assert(sdistance > 2.9); + assert(sdistance < CGAL_PI); + + + CGAL::Heat_method_3::estimate_geodesic_distances(sm, vertex_distance, source, CGAL::Heat_method_3::Direct()); + sdistance = 0; + BOOST_FOREACH(vertex_descriptor vd , vertices(sm)){ + if(get(vertex_distance,vd) > sdistance){ + sdistance = get(vertex_distance,vd); + } + } + + assert(sdistance > 2.9); + assert(sdistance < CGAL_PI); + + + std::cout << "done" << std::endl; + return 0; +} diff --git a/Heat_method_3/test/Heat_method_3/heat_method_surface_mesh_test.cpp b/Heat_method_3/test/Heat_method_3/heat_method_surface_mesh_test.cpp new file mode 100644 index 00000000000..ad119c9c666 --- /dev/null +++ b/Heat_method_3/test/Heat_method_3/heat_method_surface_mesh_test.cpp @@ -0,0 +1,117 @@ +#include +#include +#include +#include +#include + +#include + +typedef CGAL::Simple_cartesian Kernel; +typedef Kernel::Point_3 Point_3; +typedef CGAL::Surface_mesh Surface_mesh; + +typedef boost::graph_traits::vertex_descriptor vertex_descriptor; +typedef Surface_mesh::Property_map Vertex_distance_map; +typedef CGAL::Heat_method_3::Surface_mesh_geodesic_distances_3 Heat_method; + + + +int main(int argc, char* argv[]) +{ + //read in mesh + Surface_mesh sm; + const char* filename = (argc > 1) ? argv[1] : "./data/sphere.off"; + std::ifstream in(filename); + in >> sm; + //property map for the distance values to the source set + Vertex_distance_map vertex_distance = sm.add_property_map("v:distance", 0).first; + + Heat_method hm(sm); + + //add the first vertex as the source set + vertex_descriptor source = *(vertices(sm).first); + hm.add_source(source); + assert(hm.sources().size() == 1); + hm.estimate_geodesic_distances(vertex_distance); + + Point_3 sp = sm.point(source); + + std::cout << "source: " << sp << " " << source << std::endl; + vertex_descriptor far; + double sdistance = 0; + + BOOST_FOREACH(vertex_descriptor vd , vertices(sm)){ + if(get(vertex_distance,vd) > sdistance){ + far = vd; + sdistance = get(vertex_distance,vd); + } + } + assert(sdistance > 2.9); + assert(sdistance < CGAL_PI); + + hm.add_source(far); + assert(hm.sources().size() == 2); + hm.estimate_geodesic_distances(vertex_distance); + + sdistance = 0; + BOOST_FOREACH(vertex_descriptor vd , vertices(sm)){ + if(get(vertex_distance,vd) > sdistance){ + sdistance = get(vertex_distance,vd); + } + } + + assert(sdistance > 1.4); + assert(sdistance < CGAL_PI/2.0); + + hm.remove_source(far); + assert(hm.sources().size() == 1); + + hm.clear_sources(); + + // add range of sources + std::vector vrange; + vrange.push_back(source); + vrange.push_back(far); + hm.add_sources(vrange); + assert(hm.sources().size() == 2); + hm.estimate_geodesic_distances(vertex_distance); + sdistance = 0; + BOOST_FOREACH(vertex_descriptor vd , vertices(sm)){ + if(get(vertex_distance,vd) > sdistance){ + sdistance = get(vertex_distance,vd); + } + } + + + assert(sdistance > 1.4); + assert(sdistance < CGAL_PI/2.0); + + // do it again for one source + hm.clear_sources(); + assert(hm.sources().size() == 0); + hm.add_source(source); + hm.estimate_geodesic_distances(vertex_distance); + BOOST_FOREACH(vertex_descriptor vd , vertices(sm)){ + if(get(vertex_distance,vd) > sdistance){ + sdistance = get(vertex_distance,vd); + } + } + assert(sdistance > 2.9); + assert(sdistance < CGAL_PI); + + + CGAL::Heat_method_3::estimate_geodesic_distances(sm, vertex_distance, source, CGAL::Heat_method_3::Direct()); + sdistance = 0; + BOOST_FOREACH(vertex_descriptor vd , vertices(sm)){ + if(get(vertex_distance,vd) > sdistance){ + sdistance = get(vertex_distance,vd); + } + } + + assert(sdistance > 2.9); + assert(sdistance < CGAL_PI); + + + std::cout << "done" << std::endl; + return 0; +} diff --git a/Inscribed_areas/include/CGAL/Extremal_polygon_traits_2.h b/Inscribed_areas/include/CGAL/Extremal_polygon_traits_2.h index 93c51b2da63..d4b163ee92b 100644 --- a/Inscribed_areas/include/CGAL/Extremal_polygon_traits_2.h +++ b/Inscribed_areas/include/CGAL/Extremal_polygon_traits_2.h @@ -167,7 +167,19 @@ struct Extremal_polygon_perimeter_traits_2 { typedef FT result_type; Kgon_triangle_perimeter(const K& k_): k(k_) {} - + + // Added as workaround for VC2017 with /arch:AVX to fix + // https://cgal.geometryfactory.com/CGAL/testsuite/CGAL-4.14-I-95/Inscribed_areas_Examples/TestReport_afabri_x64_Cygwin-Windows10_MSVC2017-Release-64bits.gz + Kgon_triangle_perimeter(const Kgon_triangle_perimeter& other) + : k(other.k) + {} + + Kgon_triangle_perimeter& operator=(const Kgon_triangle_perimeter& other) + { + k = other.k; + return *this; + } + result_type operator()(const Point_2& p, const Point_2& q, const Point_2& r) const { return dist(p, r) + dist(p, q) - dist(q, r); } diff --git a/Installation/CHANGES.md b/Installation/CHANGES.md index 6c988b63b82..839fe0848cc 100644 --- a/Installation/CHANGES.md +++ b/Installation/CHANGES.md @@ -6,6 +6,12 @@ Release 4.14 Release date: March 2019 +### The Heat Method (new package) +- This package provides an algorithm that solves the single- or multiple-source + shortest path problem by returning an approximation of the geodesic distance + for all vertices of a triangle mesh to the closest vertex in a given set of + source vertices. + ### Triangulated Surface Mesh Approximation (new package) - This package implements the Variational Shape Approximation method to approximate @@ -67,10 +73,17 @@ Release date: March 2019 `Arr_polyline_traits_2`, `Arr_polycurve_traits_2`, and `Arr_polycurve_basic_traits_2`. +### 2D Minkowski Sums + +- Fixed a bug in the function that computed the Minkowski sum using the + reduced-convolution method. In particular, correctly handled the case where + one of the summands does not have an outer boundaey. + ### CGAL and the Boost Graph Library (BGL) - Add function `write_wrl()` for writing into VRML 2.0 format. + Release 4.13 ------------ diff --git a/Installation/CMakeLists.txt b/Installation/CMakeLists.txt index 4a45bf89485..88e41c1c455 100644 --- a/Installation/CMakeLists.txt +++ b/Installation/CMakeLists.txt @@ -364,10 +364,11 @@ endif() # CGAL-4.10 : 13.0.0 (Change the API/ABI in CGAL_ImageIO.) # CGAL-4.11 : 13.0.1 (Nothing different in CGAL compiled libraries.) # CGAL-4.12 : 13.0.2 (Nothing different in CGAL compiled libraries.) +# CGAL-4.14 : 14.0.0 (ABI broken in CGAL::Image_3.) # ¹) According to http://upstream-tracker.org/versions/cgal.html -set( CGAL_SONAME_VERSION "13" ) -set( CGAL_SOVERSION "13.0.2" ) +set( CGAL_SONAME_VERSION "14" ) +set( CGAL_SOVERSION "14.0.0" ) message( STATUS "CGAL_SONAME_VERSION=${CGAL_SONAME_VERSION}" ) message( STATUS "CGAL_SOVERSION =${CGAL_SOVERSION}" ) diff --git a/Installation/cmake/modules/CGALConfig_install.cmake.in b/Installation/cmake/modules/CGALConfig_install.cmake.in index e978b14d93d..cbb7695d6d0 100644 --- a/Installation/cmake/modules/CGALConfig_install.cmake.in +++ b/Installation/cmake/modules/CGALConfig_install.cmake.in @@ -13,7 +13,7 @@ get_filename_component(CGAL_CONFIG_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH) set(CGAL_HEADER_ONLY "@CGAL_HEADER_ONLY@" ) # CGAL_DIR is the directory where this CGALConfig.cmake is installed -string(REPLACE "@CGAL_INSTALL_CMAKE_DIR@" "" CGAL_INSTALL_PREFIX "${CGAL_CONFIG_DIR}") +string(REPLACE "/@CGAL_INSTALL_CMAKE_DIR@" "" CGAL_INSTALL_PREFIX "${CGAL_CONFIG_DIR}") if(NOT EXISTS "${CGAL_INSTALL_PREFIX}/@CGAL_INSTALL_CMAKE_DIR@/CGALConfig.cmake") # Cannot compute CGAL_INSTALL_PREFIX! diff --git a/Installation/include/CGAL/license/Heat_method_3.h b/Installation/include/CGAL/license/Heat_method_3.h new file mode 100644 index 00000000000..7f270ec9338 --- /dev/null +++ b/Installation/include/CGAL/license/Heat_method_3.h @@ -0,0 +1,67 @@ +// Copyright (c) 2016 GeometryFactory SARL (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org); you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 3 of the License, +// or (at your option) any later version. +// +// 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$ +// SPDX-License-Identifier: LGPL-3.0+ +// +// Author(s) : Andreas Fabri +// +// Warning: this file is generated, see include/CGAL/licence/README.md + + +#ifndef CGAL_LICENSE_HEAT_METHOD_3_H +#define CGAL_LICENSE_HEAT_METHOD_3_H + +#include +#include + + + + +#ifdef CGAL_HEAT_METHOD_3_COMMERCIAL_LICENSE + +# if CGAL_HEAT_METHOD_3_COMMERCIAL_LICENSE < CGAL_RELEASE_DATE + +# if defined(CGAL_LICENSE_WARNING) + + CGAL_pragma_warning("Your commercial license for CGAL does not cover " + "this release of the 3D Heat Method package.") +# endif + +# ifdef CGAL_LICENSE_ERROR +# error "Your commercial license for CGAL does not cover this release \ +of the 3D Heat Method package. \ +You get this error, as you defined CGAL_LICENSE_ERROR." +# endif // CGAL_LICENSE_ERROR + +# endif // CGAL_HEAT_METHOD_3_COMMERCIAL_LICENSE < CGAL_RELEASE_DATE + +#else // no CGAL_HEAT_METHOD_3_COMMERCIAL_LICENSE + +# if defined(CGAL_LICENSE_WARNING) + CGAL_pragma_warning("\nThe macro CGAL_HEAT_METHOD_3_COMMERCIAL_LICENSE is not defined." + "\nYou use the CGAL 3D Heat Method package under " + "the terms of the GPLv3+.") +# endif // CGAL_LICENSE_WARNING + +# ifdef CGAL_LICENSE_ERROR +# error "The macro CGAL_HEAT_METHOD_3_COMMERCIAL_LICENSE is not defined.\ + You use the CGAL 3D Heat Method package under the terms of \ +the GPLv3+. You get this error, as you defined CGAL_LICENSE_ERROR." +# endif // CGAL_LICENSE_ERROR + +#endif // no CGAL_HEAT_METHOD_3_COMMERCIAL_LICENSE + +#endif // CGAL_LICENSE_CHECK_HEAT_METHOD_3_H diff --git a/Intersections_2/include/CGAL/Intersection_traits.h b/Intersections_2/include/CGAL/Intersection_traits.h index aaf0c51d280..3b751bc5c73 100644 --- a/Intersections_2/include/CGAL/Intersection_traits.h +++ b/Intersections_2/include/CGAL/Intersection_traits.h @@ -68,6 +68,8 @@ #endif + + #define CGAL_INTERSECTION_FUNCTION(A, B, DIM) \ template \ inline \ @@ -143,6 +145,8 @@ template class IT : public Intersection_traits< typename Kernel_traits::Kernel, CGAL::Bbox_3, B > { }; + +namespace Intersections { namespace internal { // this function is used to call either make_object or a @@ -246,8 +250,9 @@ do_intersect_impl(const A& a, const B& b, Dynamic_dimension_tag) { return Kernel().do_intersect_d_object()(a, b); } -} // internal - +} // namespace internal +} // namespace Intersections + // See overloads in the respective header files // template diff --git a/Intersections_2/include/CGAL/Intersections_2/Bbox_2_Circle_2.h b/Intersections_2/include/CGAL/Intersections_2/Bbox_2_Circle_2.h new file mode 100644 index 00000000000..aaa9f323f1c --- /dev/null +++ b/Intersections_2/include/CGAL/Intersections_2/Bbox_2_Circle_2.h @@ -0,0 +1,46 @@ +// Copyright (c) 2018 GeometryFactory (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org); you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 3 of the License, +// or (at your option) any later version. +// +// 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$ +// SPDX-License-Identifier: LGPL-3.0+ +// +// +// Author(s) : Andreas Fabri +// + +#ifndef CGAL_INTERSECTIONS_2_BBOX_2_CIRCLE_2_H +#define CGAL_INTERSECTIONS_2_BBOX_2_CIRCLE_2_H + +#include +#include + +#include + +namespace CGAL { + +template +bool do_intersect(const CGAL::Bbox_2& a, + const Circle_2& b) { + return K().do_intersect_2_object()(a, b); +} + +template +bool do_intersect(const Circle_2& a, + const CGAL::Bbox_2& b) { + return K().do_intersect_2_object()(a, b); +} + +} +#endif // CGAL_INTERSECTIONS_2_BBOX_2_CIRCLE_2_H diff --git a/Intersections_2/include/CGAL/Bbox_2_Line_2_intersection.h b/Intersections_2/include/CGAL/Intersections_2/Bbox_2_Line_2.h similarity index 93% rename from Intersections_2/include/CGAL/Bbox_2_Line_2_intersection.h rename to Intersections_2/include/CGAL/Intersections_2/Bbox_2_Line_2.h index 515bd311f05..c5804de228c 100644 --- a/Intersections_2/include/CGAL/Bbox_2_Line_2_intersection.h +++ b/Intersections_2/include/CGAL/Intersections_2/Bbox_2_Line_2.h @@ -24,13 +24,11 @@ // Author(s) : Geert-Jan Giezeman -#ifndef CGAL_BBOX_2_LINE_2_INTERSECTION_H -#define CGAL_BBOX_2_LINE_2_INTERSECTION_H +#ifndef CGAL_INTERSECTIONS_2_BBOX_2_LINE_2_H +#define CGAL_INTERSECTIONS_2_BBOX_2_LINE_2_H #include #include -//#include -//#include #include #include @@ -98,7 +96,7 @@ inline bool do_intersect( } //namespace CGAL #ifdef CGAL_HEADER_ONLY -#include +#include #endif // CGAL_HEADER_ONLY #endif diff --git a/Intersections_2/include/CGAL/Intersections_2/Bbox_2_Point_2.h b/Intersections_2/include/CGAL/Intersections_2/Bbox_2_Point_2.h new file mode 100644 index 00000000000..5df79996e48 --- /dev/null +++ b/Intersections_2/include/CGAL/Intersections_2/Bbox_2_Point_2.h @@ -0,0 +1,97 @@ +// Copyright (c) 2010 GeometryFactory (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org); you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 3 of the License, +// or (at your option) any later version. +// +// 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$ +// SPDX-License-Identifier: LGPL-3.0+ +// +// +// Author(s) : Sebastien Loriot +// + +#ifndef CGAL_INTERSECTIONS_2_BBOX_2_POINT_2_H +#define CGAL_INTERSECTIONS_2_BBOX_2_POINT_2_H + +#include +#include + +#include + +namespace CGAL { + +template +bool do_intersect(const CGAL::Bbox_2& a, + const Point_2& b) +{ + Point_2 bl(a.xmin(), a.ymin()), tr(a.xmax(), a.ymax()); + + Iso_rectangle_2 ic(bl,tr); + return K().do_intersect_2_object()(ic, b); +} + + +template +bool do_intersect(const Point_2& a, + const CGAL::Bbox_2& b) +{ + return do_intersect(b,a); +} + +namespace Intersections { + +namespace internal { + +template +typename CGAL::Intersection_traits::result_type +intersection(const Point_2& a, + const CGAL::Bbox_2& b) +{ + if (do_intersect(a,b)) + return Intersections::internal::intersection_return(a); + return Intersections::internal::intersection_return(); +} + + +template +typename CGAL::Intersection_traits::result_type +intersection(const CGAL::Bbox_2& b, + const typename K::Point_2 & a, + const K& /*k*/ ) +{ + if (do_intersect(a,b)) + return Intersections::internal::intersection_return(a); + return Intersections::internal::intersection_return(); +} + +} // namespace internal +} // namespace Intersections + +template +typename CGAL::Intersection_traits >::result_type +intersection(const Bbox_2& b, + const Point_2 & a) +{ + return Intersections::internal::intersection(b,a,K()); +} + +template +typename CGAL::Intersection_traits >::result_type + intersection(const Point_2 & a, + const Bbox_2& b) +{ + return Intersections::internal::intersection(b,a,K()); +} +} // namespace CGAL + +#endif // CGAL_INTERSECTIONS_2_BBOX_2_POINT_2_H diff --git a/Intersections_2/include/CGAL/Ray_2_Bbox_2_intersection.h b/Intersections_2/include/CGAL/Intersections_2/Bbox_2_Ray_2.h similarity index 93% rename from Intersections_2/include/CGAL/Ray_2_Bbox_2_intersection.h rename to Intersections_2/include/CGAL/Intersections_2/Bbox_2_Ray_2.h index cf902aae04a..512f4779b2f 100644 --- a/Intersections_2/include/CGAL/Ray_2_Bbox_2_intersection.h +++ b/Intersections_2/include/CGAL/Intersections_2/Bbox_2_Ray_2.h @@ -24,8 +24,8 @@ // Author(s) : Geert-Jan Giezeman -#ifndef CGAL_RAY_2_BBOX_2_INTERSECTION_H -#define CGAL_RAY_2_BBOX_2_INTERSECTION_H +#ifndef CGAL_INTERSECTIONS_BBOX_2_RAY_2_H +#define CGAL_INTERSECTIONS_BBOX_2_RAY_2_H #include #include @@ -77,7 +77,7 @@ inline bool do_intersect_ray_2( } //namespace CGAL #ifdef CGAL_HEADER_ONLY -#include +#include #endif // CGAL_HEADER_ONLY #endif diff --git a/Intersections_2/include/CGAL/Circle_2_Circle_2_intersection.h b/Intersections_2/include/CGAL/Intersections_2/Circle_2_Circle_2.h similarity index 91% rename from Intersections_2/include/CGAL/Circle_2_Circle_2_intersection.h rename to Intersections_2/include/CGAL/Intersections_2/Circle_2_Circle_2.h index 05b3ca66e32..230d2e6791a 100644 --- a/Intersections_2/include/CGAL/Circle_2_Circle_2_intersection.h +++ b/Intersections_2/include/CGAL/Intersections_2/Circle_2_Circle_2.h @@ -24,13 +24,15 @@ // Author(s) : Geert-Jan Giezeman -#ifndef CGAL_CIRCLE_2_CIRCLE_2_INTERSECTION_H -#define CGAL_CIRCLE_2_CIRCLE_2_INTERSECTION_H +#ifndef CGAL_INTERSECTIONS_2_CIRCLE_2_CIRCLE_2_H +#define CGAL_INTERSECTIONS_2_CIRCLE_2_CIRCLE_2_H #include #include namespace CGAL { + +namespace Intersections { namespace internal { @@ -49,6 +51,7 @@ do_intersect(const typename K::Circle_2 & circ1, } } // namespace internal +} // namespace Intersections template inline diff --git a/Intersections_2/include/CGAL/Intersections_2/Circle_2_Iso_rectangle_2.h b/Intersections_2/include/CGAL/Intersections_2/Circle_2_Iso_rectangle_2.h new file mode 100644 index 00000000000..8aae18ec2d2 --- /dev/null +++ b/Intersections_2/include/CGAL/Intersections_2/Circle_2_Iso_rectangle_2.h @@ -0,0 +1,35 @@ +// Copyright (c) 2018 GeometryFactory (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org); you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 3 of the License, +// or (at your option) any later version. +// +// 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$ +// SPDX-License-Identifier: LGPL-3.0+ +// +// +// Author(s) : Andreas Fabri +// + +#ifndef CGAL_INTERSECTIONS_2_ISO_RECTANGLE_2_CIRCLE_2_H +#define CGAL_INTERSECTIONS_2_ISO_RECTANGLE_2_CIRCLE_2_H + +#include +#include + +#include + +namespace CGAL { + CGAL_DO_INTERSECT_FUNCTION(Iso_rectangle_2, Circle_2, 2) +} + +#endif // CGAL_INTERSECTIONS_2_ISO_RECTANGLE_2_CIRCLE_2_H diff --git a/Intersections_2/include/CGAL/Circle_2_Line_2_intersection.h b/Intersections_2/include/CGAL/Intersections_2/Circle_2_Line_2.h similarity index 92% rename from Intersections_2/include/CGAL/Circle_2_Line_2_intersection.h rename to Intersections_2/include/CGAL/Intersections_2/Circle_2_Line_2.h index a7fbe843c1e..c678fa3b426 100644 --- a/Intersections_2/include/CGAL/Circle_2_Line_2_intersection.h +++ b/Intersections_2/include/CGAL/Intersections_2/Circle_2_Line_2.h @@ -24,15 +24,15 @@ // Author(s) : Geert-Jan Giezeman -#ifndef CGAL_CIRCLE_2_LINE_2_INTERSECTION_H -#define CGAL_CIRCLE_2_LINE_2_INTERSECTION_H +#ifndef CGAL_INTERSECTIONS_2_CIRCLE_2_LINE_2_H +#define CGAL_INTERSECTIONS_2_CIRCLE_2_LINE_2_H #include #include #include namespace CGAL { - +namespace Intersections { namespace internal { template @@ -54,7 +54,8 @@ do_intersect(const typename K::Line_2& l, } } // namespace internal - +} // namespace Intersections + template inline bool diff --git a/Intersections_2/include/CGAL/Intersections_2/Circle_2_Point_2.h b/Intersections_2/include/CGAL/Intersections_2/Circle_2_Point_2.h new file mode 100644 index 00000000000..17483d4ec86 --- /dev/null +++ b/Intersections_2/include/CGAL/Intersections_2/Circle_2_Point_2.h @@ -0,0 +1,86 @@ +// Copyright (c) 2018 INRIA Sophia-Antipolis (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org); you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 3 of the License, +// or (at your option) any later version. +// +// 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$ +// SPDX-License-Identifier: LGPL-3.0+ +// +// +// Author(s) : Maxime Gimeno + +#ifndef CGAL_INTERSECTIONS_2_POINT_2_CIRCLE_2_H +#define CGAL_INTERSECTIONS_2_POINT_2_CIRCLE_2_H + +#include +#include +#include + +namespace CGAL { + +namespace Intersections { + +namespace internal { + +template +inline +bool +do_intersect(const typename K::Point_2 &pt, + const typename K::Circle_2 &circle, + const K&) +{ + return circle.has_on_boundary(pt); +} + + +template +inline +bool +do_intersect(const typename K::Circle_2 &circle, + const typename K::Point_2 &pt, + const K&) +{ + return circle.has_on_boundary(pt); +} + + +template +typename CGAL::Intersection_traits +::result_type +intersection(const typename K::Point_2 &pt, + const typename K::Circle_2 &circle, + const K& k) +{ + if (do_intersect(pt,circle, k)) + return intersection_return(pt); + return intersection_return(); +} + +template +typename CGAL::Intersection_traits +::result_type +intersection(const typename K::Circle_2 &circle, + const typename K::Point_2 &pt, + const K& k) +{ + return internal::intersection(pt, circle, k); +} + +} // namespace internal +} // namespace Intersections + +CGAL_INTERSECTION_FUNCTION(Point_2, Circle_2, 2) +CGAL_DO_INTERSECT_FUNCTION(Circle_2, Point_2, 2) + +} //namespace CGAL +#endif // CGAL_INTERSECTIONS_2_POINT_2_CIRCLE_2_H diff --git a/Intersections_2/include/CGAL/Iso_rectangle_2_Iso_rectangle_2_intersection.h b/Intersections_2/include/CGAL/Intersections_2/Iso_rectangle_2_Iso_rectangle_2.h similarity index 95% rename from Intersections_2/include/CGAL/Iso_rectangle_2_Iso_rectangle_2_intersection.h rename to Intersections_2/include/CGAL/Intersections_2/Iso_rectangle_2_Iso_rectangle_2.h index 6677e951f39..2f50e2e6e28 100644 --- a/Intersections_2/include/CGAL/Iso_rectangle_2_Iso_rectangle_2_intersection.h +++ b/Intersections_2/include/CGAL/Intersections_2/Iso_rectangle_2_Iso_rectangle_2.h @@ -24,13 +24,15 @@ // Author(s) : Geert-Jan Giezeman -#ifndef CGAL_ISO_RECTANGLE_2_ISO_RECTANGLE_2_INTERSECTION_H -#define CGAL_ISO_RECTANGLE_2_ISO_RECTANGLE_2_INTERSECTION_H +#ifndef CGAL_INTERSECTIONS_2_ISO_RECTANGLE_2_ISO_RECTANGLE_2_H +#define CGAL_INTERSECTIONS_2_ISO_RECTANGLE_2_ISO_RECTANGLE_2_H #include #include namespace CGAL { + +namespace Intersections { namespace internal { @@ -89,6 +91,7 @@ do_intersect(const typename K::Iso_rectangle_2 &irect1, } } // namespace internal +} // namespace Intersections CGAL_INTERSECTION_FUNCTION_SELF(Iso_rectangle_2, 2) diff --git a/Intersections_2/include/CGAL/Line_2_Iso_rectangle_2_intersection.h b/Intersections_2/include/CGAL/Intersections_2/Iso_rectangle_2_Line_2.h similarity index 97% rename from Intersections_2/include/CGAL/Line_2_Iso_rectangle_2_intersection.h rename to Intersections_2/include/CGAL/Intersections_2/Iso_rectangle_2_Line_2.h index 70cc67ce43d..9d085b4a2aa 100644 --- a/Intersections_2/include/CGAL/Line_2_Iso_rectangle_2_intersection.h +++ b/Intersections_2/include/CGAL/Intersections_2/Iso_rectangle_2_Line_2.h @@ -24,20 +24,21 @@ // Author(s) : Geert-Jan Giezeman -#ifndef CGAL_LINE_2_ISO_RECTANGLE_2_INTERSECTION_H -#define CGAL_LINE_2_ISO_RECTANGLE_2_INTERSECTION_H +#ifndef CGAL_INTERSECTIONS_2_ISO_RECTANGLE_2_LINE_2_H +#define CGAL_INTERSECTIONS_2_ISO_RECTANGLE_2_LINE_2_H #include #include #include -#include #include #include #include namespace CGAL { + +namespace Intersections { namespace internal { @@ -219,6 +220,7 @@ intersection(const typename K::Iso_rectangle_2 &iso, } } // namespace internal +} // namespace Intersections CGAL_INTERSECTION_FUNCTION(Line_2, Iso_rectangle_2, 2) CGAL_DO_INTERSECT_FUNCTION(Line_2, Iso_rectangle_2, 2) diff --git a/Intersections_2/include/CGAL/Point_2_Iso_rectangle_2_intersection.h b/Intersections_2/include/CGAL/Intersections_2/Iso_rectangle_2_Point_2.h similarity index 93% rename from Intersections_2/include/CGAL/Point_2_Iso_rectangle_2_intersection.h rename to Intersections_2/include/CGAL/Intersections_2/Iso_rectangle_2_Point_2.h index bbe234b9eed..5a52d5dd142 100644 --- a/Intersections_2/include/CGAL/Point_2_Iso_rectangle_2_intersection.h +++ b/Intersections_2/include/CGAL/Intersections_2/Iso_rectangle_2_Point_2.h @@ -24,14 +24,16 @@ // Author(s) : Geert-Jan Giezeman -#ifndef CGAL_POINT_2_ISO_RECTANGLE_2_INTERSECTION_H -#define CGAL_POINT_2_ISO_RECTANGLE_2_INTERSECTION_H +#ifndef CGAL_INTERSECTIONS_2_POINT_2_ISO_RECTANGLE_2_H +#define CGAL_INTERSECTIONS_2_POINT_2_ISO_RECTANGLE_2_H #include #include #include namespace CGAL { + +namespace Intersections { namespace internal { @@ -79,6 +81,7 @@ intersection(const typename K::Iso_rectangle_2 &iso, } } // namespace internal +} // namespace Intersections CGAL_INTERSECTION_FUNCTION(Point_2, Iso_rectangle_2, 2) CGAL_DO_INTERSECT_FUNCTION(Point_2, Iso_rectangle_2, 2) diff --git a/Intersections_2/include/CGAL/Ray_2_Iso_rectangle_2_intersection.h b/Intersections_2/include/CGAL/Intersections_2/Iso_rectangle_2_Ray_2.h similarity index 97% rename from Intersections_2/include/CGAL/Ray_2_Iso_rectangle_2_intersection.h rename to Intersections_2/include/CGAL/Intersections_2/Iso_rectangle_2_Ray_2.h index 8a862b153dd..1b925bf7003 100644 --- a/Intersections_2/include/CGAL/Ray_2_Iso_rectangle_2_intersection.h +++ b/Intersections_2/include/CGAL/Intersections_2/Iso_rectangle_2_Ray_2.h @@ -24,20 +24,20 @@ // Author(s) : Geert-Jan Giezeman -#ifndef CGAL_RAY_2_ISO_RECTANGLE_2_INTERSECTION_H -#define CGAL_RAY_2_ISO_RECTANGLE_2_INTERSECTION_H +#ifndef CGAL_INTERSECTIONS_2_ISO_RECTANGLE_2_RAY_2_H +#define CGAL_INTERSECTIONS_2_ISO_RECTANGLE_2_RAY_2_H #include #include #include -#include -#include #include #include #include namespace CGAL { + +namespace Intersections { namespace internal { @@ -206,6 +206,7 @@ Ray_2_Iso_rectangle_2_pair::intersection_point() const } } // namespace internal +} // namespace Intersections CGAL_INTERSECTION_FUNCTION(Ray_2, Iso_rectangle_2, 2) CGAL_DO_INTERSECT_FUNCTION(Ray_2, Iso_rectangle_2, 2) diff --git a/Intersections_2/include/CGAL/Segment_2_Iso_rectangle_2_intersection.h b/Intersections_2/include/CGAL/Intersections_2/Iso_rectangle_2_Segment_2.h similarity index 97% rename from Intersections_2/include/CGAL/Segment_2_Iso_rectangle_2_intersection.h rename to Intersections_2/include/CGAL/Intersections_2/Iso_rectangle_2_Segment_2.h index 7b85db690b2..423b7d40a61 100644 --- a/Intersections_2/include/CGAL/Segment_2_Iso_rectangle_2_intersection.h +++ b/Intersections_2/include/CGAL/Intersections_2/Iso_rectangle_2_Segment_2.h @@ -24,20 +24,22 @@ // Author(s) : Geert-Jan Giezeman -#ifndef CGAL_SEGMENT_2_ISO_RECTANGLE_2_INTERSECTION_H -#define CGAL_SEGMENT_2_ISO_RECTANGLE_2_INTERSECTION_H +#ifndef CGAL_INTERSECTIONS_2_ISO_RECTANGLE_2_SEGMENT_2_H +#define CGAL_INTERSECTIONS_2_ISO_RECTANGLE_2_SEGMENT_2_H #include #include #include -#include #include #include #include namespace CGAL { + +namespace Intersections { + namespace internal { template @@ -232,6 +234,7 @@ inline bool do_intersect( } } // namespace internal +} // namespace Intersections CGAL_INTERSECTION_FUNCTION(Segment_2, Iso_rectangle_2, 2) CGAL_DO_INTERSECT_FUNCTION(Segment_2, Iso_rectangle_2, 2) diff --git a/Intersections_2/include/CGAL/Triangle_2_Iso_rectangle_2_intersection.h b/Intersections_2/include/CGAL/Intersections_2/Iso_rectangle_2_Triangle_2.h similarity index 97% rename from Intersections_2/include/CGAL/Triangle_2_Iso_rectangle_2_intersection.h rename to Intersections_2/include/CGAL/Intersections_2/Iso_rectangle_2_Triangle_2.h index 1e6a4c4e269..58991d7dfde 100644 --- a/Intersections_2/include/CGAL/Triangle_2_Iso_rectangle_2_intersection.h +++ b/Intersections_2/include/CGAL/Intersections_2/Iso_rectangle_2_Triangle_2.h @@ -19,22 +19,24 @@ // // Author(s) : Radu Ursu -#ifndef CGAL_TRIANGLE_2_ISO_RECTANGLE_2_INTERSECTION_H -#define CGAL_TRIANGLE_2_ISO_RECTANGLE_2_INTERSECTION_H +#ifndef CGAL_INTERSECTIONS_2_ISO_RECTANGLE_2_TRIANGLE_2_H +#define CGAL_INTERSECTIONS_2_ISO_RECTANGLE_2_TRIANGLE_2_H -#include -#include #include #include -#include +#include #include -#include +#include #include #include -namespace CGAL{ namespace internal { +namespace CGAL{ + +namespace Intersections { + +namespace internal { template typename Intersection_traits::result_type @@ -331,6 +333,7 @@ namespace CGAL{ namespace internal { } } //namespace internal +} // namespace Intersections CGAL_INTERSECTION_FUNCTION(Triangle_2, Iso_rectangle_2, 2) CGAL_DO_INTERSECT_FUNCTION(Triangle_2, Iso_rectangle_2, 2) diff --git a/Intersections_2/include/CGAL/Line_2_Line_2_intersection.h b/Intersections_2/include/CGAL/Intersections_2/Line_2_Line_2.h similarity index 96% rename from Intersections_2/include/CGAL/Line_2_Line_2_intersection.h rename to Intersections_2/include/CGAL/Intersections_2/Line_2_Line_2.h index 8748f689415..b1dca54be02 100644 --- a/Intersections_2/include/CGAL/Line_2_Line_2_intersection.h +++ b/Intersections_2/include/CGAL/Intersections_2/Line_2_Line_2.h @@ -24,18 +24,22 @@ // Author(s) : Geert-Jan Giezeman -#ifndef CGAL_LINE_2_LINE_2_INTERSECTION_H -#define CGAL_LINE_2_LINE_2_INTERSECTION_H +#ifndef CGAL_INTERSECTIONS_2_LINE_2_LINE_2_H +#define CGAL_INTERSECTIONS_2_LINE_2_LINE_2_H #include #include -#include #include #include #include namespace CGAL { +class Cartesian_tag; +class Homogeneous_tag; + +namespace Intersections { + namespace internal { template @@ -202,6 +206,7 @@ Line_2_Line_2_pair::intersection_line() const } } // namespace internal +} // namespace Intersections CGAL_INTERSECTION_FUNCTION_SELF(Line_2, 2) CGAL_DO_INTERSECT_FUNCTION_SELF(Line_2, 2) diff --git a/Intersections_2/include/CGAL/Point_2_Line_2_intersection.h b/Intersections_2/include/CGAL/Intersections_2/Line_2_Point_2.h similarity index 93% rename from Intersections_2/include/CGAL/Point_2_Line_2_intersection.h rename to Intersections_2/include/CGAL/Intersections_2/Line_2_Point_2.h index b57a8bfcb78..9838ea93468 100644 --- a/Intersections_2/include/CGAL/Point_2_Line_2_intersection.h +++ b/Intersections_2/include/CGAL/Intersections_2/Line_2_Point_2.h @@ -24,14 +24,16 @@ // Author(s) : Geert-Jan Giezeman -#ifndef CGAL_POINT_2_LINE_2_INTERSECTION_H -#define CGAL_POINT_2_LINE_2_INTERSECTION_H +#ifndef CGAL_INTERSECTIONS_2_POINT_2_LINE_2_H +#define CGAL_INTERSECTIONS_2_POINT_2_LINE_2_H #include #include #include namespace CGAL { + +namespace Intersections { namespace internal { @@ -77,6 +79,8 @@ intersection(const typename K::Line_2 &line, } } // namespace internal +} // namespace Intersections + CGAL_INTERSECTION_FUNCTION(Point_2, Line_2, 2) CGAL_DO_INTERSECT_FUNCTION(Point_2, Line_2, 2) diff --git a/Intersections_2/include/CGAL/Ray_2_Line_2_intersection.h b/Intersections_2/include/CGAL/Intersections_2/Line_2_Ray_2.h similarity index 96% rename from Intersections_2/include/CGAL/Ray_2_Line_2_intersection.h rename to Intersections_2/include/CGAL/Intersections_2/Line_2_Ray_2.h index ca9ca2308fb..bc8bb35cdd9 100644 --- a/Intersections_2/include/CGAL/Ray_2_Line_2_intersection.h +++ b/Intersections_2/include/CGAL/Intersections_2/Line_2_Ray_2.h @@ -24,18 +24,20 @@ // Author(s) : Geert-Jan Giezeman -#ifndef CGAL_RAY_2_LINE_2_INTERSECTION_H -#define CGAL_RAY_2_LINE_2_INTERSECTION_H +#ifndef CGAL_INTERSECTIONS_2_LINE_2_RAY_2_H +#define CGAL_INTERSECTIONS_2_LINE_2_RAY_2_H #include #include #include #include #include -#include +#include #include namespace CGAL { + +namespace Intersections { namespace internal { @@ -166,6 +168,7 @@ Ray_2_Line_2_pair::intersection_ray() const } } // namespace internal +} // namespace Intersections CGAL_INTERSECTION_FUNCTION(Ray_2, Line_2, 2) CGAL_DO_INTERSECT_FUNCTION(Ray_2, Line_2, 2) diff --git a/Intersections_2/include/CGAL/Segment_2_Line_2_intersection.h b/Intersections_2/include/CGAL/Intersections_2/Line_2_Segment_2.h similarity index 95% rename from Intersections_2/include/CGAL/Segment_2_Line_2_intersection.h rename to Intersections_2/include/CGAL/Intersections_2/Line_2_Segment_2.h index 6eb9459dd65..e26ebae6b47 100644 --- a/Intersections_2/include/CGAL/Segment_2_Line_2_intersection.h +++ b/Intersections_2/include/CGAL/Intersections_2/Line_2_Segment_2.h @@ -24,18 +24,19 @@ // Author(s) : Geert-Jan Giezeman -#ifndef CGAL_SEGMENT_2_LINE_2_INTERSECTION_H -#define CGAL_SEGMENT_2_LINE_2_INTERSECTION_H +#ifndef CGAL_INTERSECTIONS_2_SEGMENT_2_LINE_2_H +#define CGAL_INTERSECTIONS_2_SEGMENT_2_LINE_2_H #include #include -#include #include #include -#include +#include #include namespace CGAL { + +namespace Intersections { namespace internal { @@ -159,6 +160,7 @@ Segment_2_Line_2_pair::intersection_segment() const } } // namespace internal +} // namespace Intersections CGAL_INTERSECTION_FUNCTION(Segment_2, Line_2, 2) CGAL_DO_INTERSECT_FUNCTION(Segment_2, Line_2, 2) diff --git a/Intersections_2/include/CGAL/Line_2_Triangle_2_intersection.h b/Intersections_2/include/CGAL/Intersections_2/Line_2_Triangle_2.h similarity index 96% rename from Intersections_2/include/CGAL/Line_2_Triangle_2_intersection.h rename to Intersections_2/include/CGAL/Intersections_2/Line_2_Triangle_2.h index 1818e1e7c91..5f1c817b792 100644 --- a/Intersections_2/include/CGAL/Line_2_Triangle_2_intersection.h +++ b/Intersections_2/include/CGAL/Intersections_2/Line_2_Triangle_2.h @@ -24,19 +24,21 @@ // Author(s) : Geert-Jan Giezeman -#ifndef CGAL_LINE_2_TRIANGLE_2_INTERSECTION_H -#define CGAL_LINE_2_TRIANGLE_2_INTERSECTION_H +#ifndef CGAL_INTERSECTIONS_2_LINE_2_TRIANGLE_2_H +#define CGAL_INTERSECTIONS_2_LINE_2_TRIANGLE_2_H #include #include #include #include -#include +#include #include #include #include namespace CGAL { + +namespace Intersections { namespace internal { @@ -194,6 +196,7 @@ intersection(const typename K::Triangle_2 &tr, } } // namespace internal +} // namespace Intersections CGAL_INTERSECTION_FUNCTION(Line_2, Triangle_2, 2) CGAL_DO_INTERSECT_FUNCTION(Line_2, Triangle_2, 2) diff --git a/Intersections_2/include/CGAL/Point_2_Point_2_intersection.h b/Intersections_2/include/CGAL/Intersections_2/Point_2_Point_2.h similarity index 92% rename from Intersections_2/include/CGAL/Point_2_Point_2_intersection.h rename to Intersections_2/include/CGAL/Intersections_2/Point_2_Point_2.h index 70d8e9e4d13..0baa0f0a6a8 100644 --- a/Intersections_2/include/CGAL/Point_2_Point_2_intersection.h +++ b/Intersections_2/include/CGAL/Intersections_2/Point_2_Point_2.h @@ -24,13 +24,15 @@ // Author(s) : Geert-Jan Giezeman -#ifndef CGAL_POINT_2_POINT_2_INTERSECTION_H -#define CGAL_POINT_2_POINT_2_INTERSECTION_H +#ifndef CGAL_INTERSECTIONS_2_POINT_2_POINT_2_H +#define CGAL_INTERSECTIONS_2_POINT_2_POINT_2_H #include #include namespace CGAL { + +namespace Intersections { namespace internal { @@ -55,6 +57,7 @@ intersection(const typename K::Point_2 &pt1, } }// namespace internal +} // namespace Intersections CGAL_INTERSECTION_FUNCTION_SELF(Point_2, 2) CGAL_DO_INTERSECT_FUNCTION_SELF(Point_2, 2) diff --git a/Intersections_2/include/CGAL/Point_2_Ray_2_intersection.h b/Intersections_2/include/CGAL/Intersections_2/Point_2_Ray_2.h similarity index 93% rename from Intersections_2/include/CGAL/Point_2_Ray_2_intersection.h rename to Intersections_2/include/CGAL/Intersections_2/Point_2_Ray_2.h index 3a6e6ec1b1d..c7efa2cc868 100644 --- a/Intersections_2/include/CGAL/Point_2_Ray_2_intersection.h +++ b/Intersections_2/include/CGAL/Intersections_2/Point_2_Ray_2.h @@ -24,14 +24,16 @@ // Author(s) : Geert-Jan Giezeman -#ifndef CGAL_POINT_2_RAY_2_INTERSECTION_H -#define CGAL_POINT_2_RAY_2_INTERSECTION_H +#ifndef CGAL_INTERSECTIONS_2_POINT_2_RAY_2_H +#define CGAL_INTERSECTIONS_2_POINT_2_RAY_2_H #include #include #include namespace CGAL { + +namespace Intersections { namespace internal { @@ -81,6 +83,7 @@ intersection(const typename K::Ray_2 &ray, } } // namespace internal +} // namespace Intersections CGAL_INTERSECTION_FUNCTION(Point_2, Ray_2, 2) CGAL_DO_INTERSECT_FUNCTION(Point_2, Ray_2, 2) diff --git a/Intersections_2/include/CGAL/Point_2_Segment_2_intersection.h b/Intersections_2/include/CGAL/Intersections_2/Point_2_Segment_2.h similarity index 93% rename from Intersections_2/include/CGAL/Point_2_Segment_2_intersection.h rename to Intersections_2/include/CGAL/Intersections_2/Point_2_Segment_2.h index 47563eb2003..94edc1ad098 100644 --- a/Intersections_2/include/CGAL/Point_2_Segment_2_intersection.h +++ b/Intersections_2/include/CGAL/Intersections_2/Point_2_Segment_2.h @@ -24,14 +24,16 @@ // Author(s) : Geert-Jan Giezeman -#ifndef CGAL_POINT_2_SEGMENT_2_INTERSECTION_H -#define CGAL_POINT_2_SEGMENT_2_INTERSECTION_H +#ifndef CGAL_INTERSECTIONS_2_POINT_2_SEGMENT_2_H +#define CGAL_INTERSECTIONS_2_POINT_2_SEGMENT_2_H #include #include #include namespace CGAL { + +namespace Intersections { namespace internal { @@ -82,6 +84,8 @@ intersection( const typename K::Segment_2 &seg, } } // namespace internal +} // namespace Intersections + CGAL_INTERSECTION_FUNCTION(Point_2, Segment_2, 2) CGAL_DO_INTERSECT_FUNCTION(Point_2, Segment_2, 2) diff --git a/Intersections_2/include/CGAL/Point_2_Triangle_2_intersection.h b/Intersections_2/include/CGAL/Intersections_2/Point_2_Triangle_2.h similarity index 82% rename from Intersections_2/include/CGAL/Point_2_Triangle_2_intersection.h rename to Intersections_2/include/CGAL/Intersections_2/Point_2_Triangle_2.h index 6e4b25e9d32..c758d55a66b 100644 --- a/Intersections_2/include/CGAL/Point_2_Triangle_2_intersection.h +++ b/Intersections_2/include/CGAL/Intersections_2/Point_2_Triangle_2.h @@ -24,18 +24,19 @@ // Author(s) : Geert-Jan Giezeman -#ifndef CGAL_POINT_2_TRIANGLE_2_INTERSECTION_H -#define CGAL_POINT_2_TRIANGLE_2_INTERSECTION_H +#ifndef CGAL_INTERSECTIONS_2_POINT_2_TRIANGLE_2_H +#define CGAL_INTERSECTIONS_2_POINT_2_TRIANGLE_2_H #include #include -#include #include #include -#include +#include namespace CGAL { +namespace Intersections { + namespace internal { template @@ -91,26 +92,6 @@ Point_2_Triangle_2_pair::intersection_type() const _result = POINT; } return _result; -/* - typedef typename K::Line_2 line_t; - line_t l(_trian->vertex(0), _trian->vertex(1)); - if (l.has_on_positive_side(_trian->vertex(2))) { - for (int i=0; i<3; i++) { - if (line_t(_trian->vertex(i), _trian->vertex(i+1)). - has_on_negative_side(*_pt)) { - _result = NO_INTERSECTION; - return _result; - } - } - } else { - for (int i=0; i<3; i++) - if(line_t(_trian->vertex(i), _trian->vertex(i-1)). - has_on_negative_side(*_pt)){ - _result = NO_INTERSECTION; - return _result; - } - } -*/ } @@ -158,6 +139,7 @@ intersection(const typename K::Triangle_2 &tr, } } // namespace internal +} // namespace Intersections CGAL_INTERSECTION_FUNCTION(Point_2, Triangle_2, 2) CGAL_DO_INTERSECT_FUNCTION(Point_2, Triangle_2, 2) diff --git a/Intersections_2/include/CGAL/Ray_2_Ray_2_intersection.h b/Intersections_2/include/CGAL/Intersections_2/Ray_2_Ray_2.h similarity index 97% rename from Intersections_2/include/CGAL/Ray_2_Ray_2_intersection.h rename to Intersections_2/include/CGAL/Intersections_2/Ray_2_Ray_2.h index 2ef90d97dc9..5413d498b2e 100644 --- a/Intersections_2/include/CGAL/Ray_2_Ray_2_intersection.h +++ b/Intersections_2/include/CGAL/Intersections_2/Ray_2_Ray_2.h @@ -24,20 +24,21 @@ // Author(s) : Geert-Jan Giezeman -#ifndef CGAL_RAY_2_RAY_2_INTERSECTION_H -#define CGAL_RAY_2_RAY_2_INTERSECTION_H +#ifndef CGAL_INTERSECTIONS_2_RAY_2_RAY_2_H +#define CGAL_INTERSECTIONS_2_RAY_2_RAY_2_H #include #include #include #include #include -#include -#include +#include #include namespace CGAL { + +namespace Intersections { namespace internal { @@ -257,6 +258,7 @@ intersection(const typename K::Ray_2 &ray1, } } // namespace internal +} // namespace Intersections CGAL_INTERSECTION_FUNCTION_SELF(Ray_2, 2) CGAL_DO_INTERSECT_FUNCTION_SELF(Ray_2, 2) diff --git a/Intersections_2/include/CGAL/Ray_2_Segment_2_intersection.h b/Intersections_2/include/CGAL/Intersections_2/Ray_2_Segment_2.h similarity index 97% rename from Intersections_2/include/CGAL/Ray_2_Segment_2_intersection.h rename to Intersections_2/include/CGAL/Intersections_2/Ray_2_Segment_2.h index 07630d0ae79..323f285aef2 100644 --- a/Intersections_2/include/CGAL/Ray_2_Segment_2_intersection.h +++ b/Intersections_2/include/CGAL/Intersections_2/Ray_2_Segment_2.h @@ -24,20 +24,22 @@ // Author(s) : Geert-Jan Giezeman -#ifndef CGAL_RAY_2_SEGMENT_2_INTERSECTION_H -#define CGAL_RAY_2_SEGMENT_2_INTERSECTION_H +#ifndef CGAL_INTERSECTIONS_2_RAY_2_SEGMENT_2_H +#define CGAL_INTERSECTIONS_2_RAY_2_SEGMENT_2_H #include #include #include +#include #include #include -#include -#include +#include #include namespace CGAL { + +namespace Intersections { namespace internal { @@ -269,6 +271,7 @@ intersection(const typename K::Segment_2 &seg, } } // namespace internal +} // namespace Intersections CGAL_INTERSECTION_FUNCTION(Ray_2, Segment_2, 2) CGAL_DO_INTERSECT_FUNCTION(Ray_2, Segment_2, 2) diff --git a/Intersections_2/include/CGAL/Ray_2_Triangle_2_intersection.h b/Intersections_2/include/CGAL/Intersections_2/Ray_2_Triangle_2.h similarity index 96% rename from Intersections_2/include/CGAL/Ray_2_Triangle_2_intersection.h rename to Intersections_2/include/CGAL/Intersections_2/Ray_2_Triangle_2.h index 740f9c42d77..650eb3ad0ab 100644 --- a/Intersections_2/include/CGAL/Ray_2_Triangle_2_intersection.h +++ b/Intersections_2/include/CGAL/Intersections_2/Ray_2_Triangle_2.h @@ -24,20 +24,19 @@ // Author(s) : Geert-Jan Giezeman -#ifndef CGAL_RAY_2_TRIANGLE_2_INTERSECTION_H -#define CGAL_RAY_2_TRIANGLE_2_INTERSECTION_H +#ifndef CGAL_INTERSECTIONS_2_RAY_2_TRIANGLE_2_H +#define CGAL_INTERSECTIONS_2_RAY_2_TRIANGLE_2_H -#include #include #include -#include -#include #include #include -#include +#include #include namespace CGAL { + +namespace Intersections { namespace internal { @@ -200,6 +199,7 @@ inline bool do_intersect( } } // namespace internal +} // namespace Intersections CGAL_INTERSECTION_FUNCTION(Ray_2, Triangle_2, 2) CGAL_DO_INTERSECT_FUNCTION(Ray_2, Triangle_2, 2) diff --git a/Intersections_2/include/CGAL/Segment_2_Segment_2_intersection.h b/Intersections_2/include/CGAL/Intersections_2/Segment_2_Segment_2.h similarity index 98% rename from Intersections_2/include/CGAL/Segment_2_Segment_2_intersection.h rename to Intersections_2/include/CGAL/Intersections_2/Segment_2_Segment_2.h index 216ebdaff4c..da7cebe3db8 100644 --- a/Intersections_2/include/CGAL/Segment_2_Segment_2_intersection.h +++ b/Intersections_2/include/CGAL/Intersections_2/Segment_2_Segment_2.h @@ -24,8 +24,8 @@ // Author(s) : Geert-Jan Giezeman -#ifndef CGAL_SEGMENT_2_SEGMENT_2_INTERSECTION_H -#define CGAL_SEGMENT_2_SEGMENT_2_INTERSECTION_H +#ifndef CGAL_INTERSECTIONS_2_SEGMENT_2_SEGMENT_2_H +#define CGAL_INTERSECTIONS_2_SEGMENT_2_SEGMENT_2_H #include #include @@ -33,11 +33,13 @@ #include #include #include -#include +#include #include #include namespace CGAL { + +namespace Intersections { namespace internal { @@ -453,6 +455,7 @@ intersection(const typename K::Segment_2 &seg1, } } // namespace internal +} // namespace Intersections CGAL_INTERSECTION_FUNCTION_SELF(Segment_2, 2) CGAL_DO_INTERSECT_FUNCTION_SELF(Segment_2, 2) diff --git a/Intersections_2/include/CGAL/Segment_2_Triangle_2_intersection.h b/Intersections_2/include/CGAL/Intersections_2/Segment_2_Triangle_2.h similarity index 96% rename from Intersections_2/include/CGAL/Segment_2_Triangle_2_intersection.h rename to Intersections_2/include/CGAL/Intersections_2/Segment_2_Triangle_2.h index 1de8852547d..4f8cc825748 100644 --- a/Intersections_2/include/CGAL/Segment_2_Triangle_2_intersection.h +++ b/Intersections_2/include/CGAL/Intersections_2/Segment_2_Triangle_2.h @@ -24,19 +24,19 @@ // Author(s) : Geert-Jan Giezeman -#ifndef CGAL_SEGMENT_2_TRIANGLE_2_INTERSECTION_H -#define CGAL_SEGMENT_2_TRIANGLE_2_INTERSECTION_H +#ifndef CGAL_INTERSECTIONS_2_SEGMENT_2_TRIANGLE_2_H +#define CGAL_INTERSECTIONS_2_SEGMENT_2_TRIANGLE_2_H #include #include -#include -#include #include #include -#include +#include #include namespace CGAL { + +namespace Intersections { namespace internal { @@ -198,6 +198,7 @@ inline bool do_intersect( } } // namespace internal +} // namespace Intersections CGAL_INTERSECTION_FUNCTION(Segment_2, Triangle_2, 2) CGAL_DO_INTERSECT_FUNCTION(Segment_2, Triangle_2, 2) diff --git a/Intersections_2/include/CGAL/intersection_2_3.h b/Intersections_2/include/CGAL/Intersections_2/Triangle_2_Triangle_2.h similarity index 69% rename from Intersections_2/include/CGAL/intersection_2_3.h rename to Intersections_2/include/CGAL/Intersections_2/Triangle_2_Triangle_2.h index 55f8d7b0c3c..09bdea7198d 100644 --- a/Intersections_2/include/CGAL/intersection_2_3.h +++ b/Intersections_2/include/CGAL/Intersections_2/Triangle_2_Triangle_2.h @@ -24,11 +24,15 @@ // Author(s) : Geert-Jan Giezeman +#ifndef CGAL_INTERSECTIONS_2_TRIANGLE_2_TRIANGLE_2_H +#define CGAL_INTERSECTIONS_2_TRIANGLE_2_TRIANGLE_2_H -#ifndef CGAL_INTERSECTION_2_3_H -#define CGAL_INTERSECTION_2_3_H +#include +#include -#include -#include +namespace CGAL { +CGAL_DO_INTERSECT_FUNCTION_SELF(Triangle_2, 2) +CGAL_INTERSECTION_FUNCTION_SELF(Triangle_2, 2) +} // namespace CGAL #endif diff --git a/Intersections_2/include/CGAL/Intersections_2/internal/Bbox_2_Circle_2_do_intersect.h b/Intersections_2/include/CGAL/Intersections_2/internal/Bbox_2_Circle_2_do_intersect.h new file mode 100644 index 00000000000..6306d383ef3 --- /dev/null +++ b/Intersections_2/include/CGAL/Intersections_2/internal/Bbox_2_Circle_2_do_intersect.h @@ -0,0 +1,112 @@ +// Copyright (c) 2018 GeometryFactory (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org); you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 3 of the License, +// or (at your option) any later version. +// +// 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$ +// SPDX-License-Identifier: LGPL-3.0+ +// +// +// Author(s) : Andreas Fabri + + +#ifndef CGAL_INTERNAL_INTERSECTIONS_2_BBOX_2_CIRCLE_2_DO_INTERSECT_H +#define CGAL_INTERNAL_INTERSECTIONS_2_BBOX_2_CIRCLE_2_DO_INTERSECT_H + +#include +#include + +#include + + +namespace CGAL { + +namespace Intersections { + +namespace internal { + +template +bool do_intersect_circle_box_2(const typename K::Circle_2& circle, + const Box3& bbox, + const K&) +{ + typedef typename K::FT FT; + typedef typename K::Point_2 Point; + FT d = FT(0); + FT distance = FT(0); + Point center = circle.center(); + + if(center.x() < FT(bbox.xmin())) + { + d = FT(bbox.xmin()) - center.x(); + distance += d * d; + } + else if(center.x() > FT(bbox.xmax())) + { + d = center.x() - FT(bbox.xmax()); + distance += d * d; + } + + if(center.y() < FT(bbox.ymin())) + { + d = FT(bbox.ymin()) - center.y(); + distance += d * d; + } + else if(center.y() > FT(bbox.ymax())) + { + d = center.y() - FT(bbox.ymax()); + distance += d * d; + } + + return distance <= circle.squared_radius(); +} + +template +bool do_intersect(const CGAL::Bbox_2& bbox, + const typename K::Circle_2& circle, + const K&) +{ + return do_intersect_circle_box_2(circle, bbox, K()); +} + + +template +bool do_intersect(const typename K::Circle_2& circle, + const CGAL::Bbox_2& bbox, + const K&) +{ + return do_intersect_circle_box_2(circle, bbox, K()); +} + +template +bool do_intersect(const typename K::Iso_rectangle_2& bbox, + const typename K::Circle_2& circle, + const K&) +{ + return do_intersect_circle_box_2(circle, bbox, K()); +} + + +template +bool do_intersect(const typename K::Circle_2& circle, + const typename K::Iso_rectangle_2& bbox, + const K&) +{ + return do_intersect_circle_box_2(circle, bbox, K()); +} + +} // namespace internal +} // namespace Intersections +} //namespace CGAL + +#endif // CGAL_INTERNAL_INTERSECTIONS_2_BBOX_2_CIRCLE_2_DO_INTERSECT_H diff --git a/Intersections_2/include/CGAL/Bbox_2_Line_2_intersection_impl.h b/Intersections_2/include/CGAL/Intersections_2/internal/Bbox_2_Line_2_intersection_impl.h similarity index 100% rename from Intersections_2/include/CGAL/Bbox_2_Line_2_intersection_impl.h rename to Intersections_2/include/CGAL/Intersections_2/internal/Bbox_2_Line_2_intersection_impl.h diff --git a/Intersections_2/include/CGAL/Ray_2_Bbox_2_intersection_impl.h b/Intersections_2/include/CGAL/Intersections_2/internal/Ray_2_Bbox_2_intersection_impl.h similarity index 100% rename from Intersections_2/include/CGAL/Ray_2_Bbox_2_intersection_impl.h rename to Intersections_2/include/CGAL/Intersections_2/internal/Ray_2_Bbox_2_intersection_impl.h diff --git a/Intersections_2/include/CGAL/Straight_2.h b/Intersections_2/include/CGAL/Intersections_2/internal/Straight_2.h similarity index 96% rename from Intersections_2/include/CGAL/Straight_2.h rename to Intersections_2/include/CGAL/Intersections_2/internal/Straight_2.h index 5c9553ddf5d..490fddf2698 100644 --- a/Intersections_2/include/CGAL/Straight_2.h +++ b/Intersections_2/include/CGAL/Intersections_2/internal/Straight_2.h @@ -24,14 +24,16 @@ // Author(s) : Geert-Jan Giezeman -#ifndef CGAL_STRAIGHT_2_H -#define CGAL_STRAIGHT_2_H +#ifndef CGAL_INTERSECTIONS_2_INTERNAL_STRAIGHT_2_H +#define CGAL_INTERSECTIONS_2_INTERNAL_STRAIGHT_2_H -#include +#include #include #include namespace CGAL { + +namespace Intersections { namespace internal { @@ -267,8 +269,8 @@ sign_of_cross(typename K::Direction_2 const &dir1, typename K::Direction_2 const &dir2, const K&) { - return static_cast(internal::orientation(dir1.to_vector(), - dir2.to_vector(), K())); + return static_cast(CGAL::internal::orientation(dir1.to_vector(), + dir2.to_vector(), K())); } template @@ -351,12 +353,7 @@ collinear_order(typename K::Point_2 const &pt1, typename K::Point_2 const & pt2) } } // namespace internal - +} // namespace Intersections } //namespace CGAL - - - - - #endif diff --git a/Intersections_2/include/CGAL/Triangle_2_Triangle_2_do_intersect.h b/Intersections_2/include/CGAL/Intersections_2/internal/Triangle_2_Triangle_2_do_intersect_impl.h similarity index 98% rename from Intersections_2/include/CGAL/Triangle_2_Triangle_2_do_intersect.h rename to Intersections_2/include/CGAL/Intersections_2/internal/Triangle_2_Triangle_2_do_intersect_impl.h index 23c752a5897..7bdc6542428 100644 --- a/Intersections_2/include/CGAL/Triangle_2_Triangle_2_do_intersect.h +++ b/Intersections_2/include/CGAL/Intersections_2/internal/Triangle_2_Triangle_2_do_intersect_impl.h @@ -26,8 +26,8 @@ #include namespace CGAL { - - + +namespace Intersections { namespace internal { @@ -172,9 +172,7 @@ bool do_intersect(const typename K::Triangle_2 &t1, } } // namespace internal - -CGAL_DO_INTERSECT_FUNCTION_SELF(Triangle_2, 2) - +} // namespace Intersections } //namespace CGAL #endif //CGAL_TRIANGLE_2_TRIANGLE_2_DO_INTERSECT_H diff --git a/Intersections_2/include/CGAL/Intersections_2/Triangle_2_Triangle_2_intersection_impl.h b/Intersections_2/include/CGAL/Intersections_2/internal/Triangle_2_Triangle_2_intersection_impl.h similarity index 98% rename from Intersections_2/include/CGAL/Intersections_2/Triangle_2_Triangle_2_intersection_impl.h rename to Intersections_2/include/CGAL/Intersections_2/internal/Triangle_2_Triangle_2_intersection_impl.h index 3592deca591..ab5d9386874 100644 --- a/Intersections_2/include/CGAL/Intersections_2/Triangle_2_Triangle_2_intersection_impl.h +++ b/Intersections_2/include/CGAL/Intersections_2/internal/Triangle_2_Triangle_2_intersection_impl.h @@ -23,17 +23,17 @@ // // Author(s) : Geert-Jan Giezeman -#include #include -#include #include #include #include -#include +#include #include namespace CGAL { + +namespace Intersections { namespace internal { @@ -349,7 +349,5 @@ intersection(const typename K::Triangle_2 &tr1, } } // namespace internal - -CGAL_INTERSECTION_FUNCTION_SELF(Triangle_2, 2) - +} // namespace Intersections } //namespace CGAL diff --git a/Intersections_2/include/CGAL/Iso_rectangle_2_Line_2_intersection.h b/Intersections_2/include/CGAL/Iso_rectangle_2_Line_2_intersection.h deleted file mode 100644 index 1ea17f837e0..00000000000 --- a/Intersections_2/include/CGAL/Iso_rectangle_2_Line_2_intersection.h +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (c) 2000 -// Utrecht University (The Netherlands), -// ETH Zurich (Switzerland), -// INRIA Sophia-Antipolis (France), -// Max-Planck-Institute Saarbruecken (Germany), -// and Tel-Aviv University (Israel). All rights reserved. -// -// This file is part of CGAL (www.cgal.org); you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 3 of the License, -// or (at your option) any later version. -// -// 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$ -// SPDX-License-Identifier: LGPL-3.0+ -// -// -// Author(s) : Geert-Jan Giezeman - -#include diff --git a/Intersections_2/include/CGAL/Iso_rectangle_2_Segment_2_intersection.h b/Intersections_2/include/CGAL/Iso_rectangle_2_Segment_2_intersection.h deleted file mode 100644 index cadfdfbbce7..00000000000 --- a/Intersections_2/include/CGAL/Iso_rectangle_2_Segment_2_intersection.h +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (c) 2000 -// Utrecht University (The Netherlands), -// ETH Zurich (Switzerland), -// INRIA Sophia-Antipolis (France), -// Max-Planck-Institute Saarbruecken (Germany), -// and Tel-Aviv University (Israel). All rights reserved. -// -// This file is part of CGAL (www.cgal.org); you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 3 of the License, -// or (at your option) any later version. -// -// 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$ -// SPDX-License-Identifier: LGPL-3.0+ -// -// -// Author(s) : Geert-Jan Giezeman - -#include diff --git a/Intersections_2/include/CGAL/Line_2_Bbox_2_intersection.h b/Intersections_2/include/CGAL/Line_2_Bbox_2_intersection.h deleted file mode 100644 index 59b6a2c982c..00000000000 --- a/Intersections_2/include/CGAL/Line_2_Bbox_2_intersection.h +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (c) 2000 -// Utrecht University (The Netherlands), -// ETH Zurich (Switzerland), -// INRIA Sophia-Antipolis (France), -// Max-Planck-Institute Saarbruecken (Germany), -// and Tel-Aviv University (Israel). All rights reserved. -// -// This file is part of CGAL (www.cgal.org); you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 3 of the License, -// or (at your option) any later version. -// -// 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$ -// SPDX-License-Identifier: LGPL-3.0+ -// -// -// Author(s) : Geert-Jan Giezeman - -#include diff --git a/Intersections_2/include/CGAL/Line_2_Point_2_intersection.h b/Intersections_2/include/CGAL/Line_2_Point_2_intersection.h deleted file mode 100644 index d957a00b1eb..00000000000 --- a/Intersections_2/include/CGAL/Line_2_Point_2_intersection.h +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (c) 2000 -// Utrecht University (The Netherlands), -// ETH Zurich (Switzerland), -// INRIA Sophia-Antipolis (France), -// Max-Planck-Institute Saarbruecken (Germany), -// and Tel-Aviv University (Israel). All rights reserved. -// -// This file is part of CGAL (www.cgal.org); you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 3 of the License, -// or (at your option) any later version. -// -// 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$ -// SPDX-License-Identifier: LGPL-3.0+ -// -// -// Author(s) : Geert-Jan Giezeman - -#include diff --git a/Intersections_2/include/CGAL/Line_2_Ray_2_intersection.h b/Intersections_2/include/CGAL/Line_2_Ray_2_intersection.h deleted file mode 100644 index ba965eae711..00000000000 --- a/Intersections_2/include/CGAL/Line_2_Ray_2_intersection.h +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (c) 2000 -// Utrecht University (The Netherlands), -// ETH Zurich (Switzerland), -// INRIA Sophia-Antipolis (France), -// Max-Planck-Institute Saarbruecken (Germany), -// and Tel-Aviv University (Israel). All rights reserved. -// -// This file is part of CGAL (www.cgal.org); you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 3 of the License, -// or (at your option) any later version. -// -// 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$ -// SPDX-License-Identifier: LGPL-3.0+ -// -// -// Author(s) : Geert-Jan Giezeman - -#include diff --git a/Intersections_2/include/CGAL/Line_2_Segment_2_intersection.h b/Intersections_2/include/CGAL/Line_2_Segment_2_intersection.h deleted file mode 100644 index 36e4429f9b3..00000000000 --- a/Intersections_2/include/CGAL/Line_2_Segment_2_intersection.h +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (c) 2000 -// Utrecht University (The Netherlands), -// ETH Zurich (Switzerland), -// INRIA Sophia-Antipolis (France), -// Max-Planck-Institute Saarbruecken (Germany), -// and Tel-Aviv University (Israel). All rights reserved. -// -// This file is part of CGAL (www.cgal.org); you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 3 of the License, -// or (at your option) any later version. -// -// 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$ -// SPDX-License-Identifier: LGPL-3.0+ -// -// -// Author(s) : Geert-Jan Giezeman - -#include diff --git a/Intersections_2/include/CGAL/Ray_2_Point_2_intersection.h b/Intersections_2/include/CGAL/Ray_2_Point_2_intersection.h deleted file mode 100644 index 44bb85184cb..00000000000 --- a/Intersections_2/include/CGAL/Ray_2_Point_2_intersection.h +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (c) 2000 -// Utrecht University (The Netherlands), -// ETH Zurich (Switzerland), -// INRIA Sophia-Antipolis (France), -// Max-Planck-Institute Saarbruecken (Germany), -// and Tel-Aviv University (Israel). All rights reserved. -// -// This file is part of CGAL (www.cgal.org); you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 3 of the License, -// or (at your option) any later version. -// -// 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$ -// SPDX-License-Identifier: LGPL-3.0+ -// -// -// Author(s) : Geert-Jan Giezeman - -#include diff --git a/Intersections_2/include/CGAL/Segment_2_Point_2_intersection.h b/Intersections_2/include/CGAL/Segment_2_Point_2_intersection.h deleted file mode 100644 index d8da2c4a887..00000000000 --- a/Intersections_2/include/CGAL/Segment_2_Point_2_intersection.h +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (c) 2000 -// Utrecht University (The Netherlands), -// ETH Zurich (Switzerland), -// INRIA Sophia-Antipolis (France), -// Max-Planck-Institute Saarbruecken (Germany), -// and Tel-Aviv University (Israel). All rights reserved. -// -// This file is part of CGAL (www.cgal.org); you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 3 of the License, -// or (at your option) any later version. -// -// 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$ -// SPDX-License-Identifier: LGPL-3.0+ -// -// -// Author(s) : Geert-Jan Giezeman - -#include diff --git a/Intersections_2/include/CGAL/Segment_2_Ray_2_intersection.h b/Intersections_2/include/CGAL/Segment_2_Ray_2_intersection.h deleted file mode 100644 index e723553a143..00000000000 --- a/Intersections_2/include/CGAL/Segment_2_Ray_2_intersection.h +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (c) 2000 -// Utrecht University (The Netherlands), -// ETH Zurich (Switzerland), -// INRIA Sophia-Antipolis (France), -// Max-Planck-Institute Saarbruecken (Germany), -// and Tel-Aviv University (Israel). All rights reserved. -// -// This file is part of CGAL (www.cgal.org); you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 3 of the License, -// or (at your option) any later version. -// -// 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$ -// SPDX-License-Identifier: LGPL-3.0+ -// -// -// Author(s) : Geert-Jan Giezeman - -#include diff --git a/Intersections_2/include/CGAL/Triangle_2_Line_2_intersection.h b/Intersections_2/include/CGAL/Triangle_2_Line_2_intersection.h deleted file mode 100644 index bf7e131465a..00000000000 --- a/Intersections_2/include/CGAL/Triangle_2_Line_2_intersection.h +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (c) 2000 -// Utrecht University (The Netherlands), -// ETH Zurich (Switzerland), -// INRIA Sophia-Antipolis (France), -// Max-Planck-Institute Saarbruecken (Germany), -// and Tel-Aviv University (Israel). All rights reserved. -// -// This file is part of CGAL (www.cgal.org); you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 3 of the License, -// or (at your option) any later version. -// -// 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$ -// SPDX-License-Identifier: LGPL-3.0+ -// -// -// Author(s) : Geert-Jan Giezeman - -#include diff --git a/Intersections_2/include/CGAL/Triangle_2_Point_2_intersection.h b/Intersections_2/include/CGAL/Triangle_2_Point_2_intersection.h deleted file mode 100644 index 2185ccd20c2..00000000000 --- a/Intersections_2/include/CGAL/Triangle_2_Point_2_intersection.h +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (c) 2000 -// Utrecht University (The Netherlands), -// ETH Zurich (Switzerland), -// INRIA Sophia-Antipolis (France), -// Max-Planck-Institute Saarbruecken (Germany), -// and Tel-Aviv University (Israel). All rights reserved. -// -// This file is part of CGAL (www.cgal.org); you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 3 of the License, -// or (at your option) any later version. -// -// 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$ -// SPDX-License-Identifier: LGPL-3.0+ -// -// -// Author(s) : Geert-Jan Giezeman - -#include diff --git a/Intersections_2/include/CGAL/Triangle_2_Ray_2_intersection.h b/Intersections_2/include/CGAL/Triangle_2_Ray_2_intersection.h deleted file mode 100644 index 9ebf9300661..00000000000 --- a/Intersections_2/include/CGAL/Triangle_2_Ray_2_intersection.h +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (c) 2000 -// Utrecht University (The Netherlands), -// ETH Zurich (Switzerland), -// INRIA Sophia-Antipolis (France), -// Max-Planck-Institute Saarbruecken (Germany), -// and Tel-Aviv University (Israel). All rights reserved. -// -// This file is part of CGAL (www.cgal.org); you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 3 of the License, -// or (at your option) any later version. -// -// 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$ -// SPDX-License-Identifier: LGPL-3.0+ -// -// -// Author(s) : Geert-Jan Giezeman - -#include diff --git a/Intersections_2/include/CGAL/Triangle_2_Segment_2_intersection.h b/Intersections_2/include/CGAL/Triangle_2_Segment_2_intersection.h deleted file mode 100644 index 8025b5fc3ca..00000000000 --- a/Intersections_2/include/CGAL/Triangle_2_Segment_2_intersection.h +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (c) 2000 -// Utrecht University (The Netherlands), -// ETH Zurich (Switzerland), -// INRIA Sophia-Antipolis (France), -// Max-Planck-Institute Saarbruecken (Germany), -// and Tel-Aviv University (Israel). All rights reserved. -// -// This file is part of CGAL (www.cgal.org); you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 3 of the License, -// or (at your option) any later version. -// -// 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$ -// SPDX-License-Identifier: LGPL-3.0+ -// -// -// Author(s) : Geert-Jan Giezeman - -#include diff --git a/Intersections_2/include/CGAL/intersection_2.h b/Intersections_2/include/CGAL/intersection_2.h index cce2e59e778..d1672662b5b 100644 --- a/Intersections_2/include/CGAL/intersection_2.h +++ b/Intersections_2/include/CGAL/intersection_2.h @@ -28,8 +28,40 @@ #ifndef CGAL_INTERSECTION_2_H #define CGAL_INTERSECTION_2_H -#include -#include -#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include + +#include +#include + +#include + #endif // CGAL_INTERSECTION_2_H diff --git a/Intersections_2/include/CGAL/intersection_2_1.h b/Intersections_2/include/CGAL/intersection_2_1.h deleted file mode 100644 index 14046e5da92..00000000000 --- a/Intersections_2/include/CGAL/intersection_2_1.h +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright (c) 2000 -// Utrecht University (The Netherlands), -// ETH Zurich (Switzerland), -// INRIA Sophia-Antipolis (France), -// Max-Planck-Institute Saarbruecken (Germany), -// and Tel-Aviv University (Israel). All rights reserved. -// -// This file is part of CGAL (www.cgal.org); you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 3 of the License, -// or (at your option) any later version. -// -// 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$ -// SPDX-License-Identifier: LGPL-3.0+ -// -// -// Author(s) : Geert-Jan Giezeman - - - -#ifndef CGAL_INTERSECTION_2_1_H -#define CGAL_INTERSECTION_2_1_H - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#endif diff --git a/Intersections_2/include/CGAL/intersection_2_2.h b/Intersections_2/include/CGAL/intersection_2_2.h deleted file mode 100644 index 9059ecf1412..00000000000 --- a/Intersections_2/include/CGAL/intersection_2_2.h +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright (c) 2000 -// Utrecht University (The Netherlands), -// ETH Zurich (Switzerland), -// INRIA Sophia-Antipolis (France), -// Max-Planck-Institute Saarbruecken (Germany), -// and Tel-Aviv University (Israel). All rights reserved. -// -// This file is part of CGAL (www.cgal.org); you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 3 of the License, -// or (at your option) any later version. -// -// 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$ -// SPDX-License-Identifier: LGPL-3.0+ -// -// -// Author(s) : Geert-Jan Giezeman - - - -#ifndef CGAL_INTERSECTION_2_2_H -#define CGAL_INTERSECTION_2_2_H - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#endif diff --git a/Intersections_2/src/CGAL/Bbox_2_intersections.cpp b/Intersections_2/src/CGAL/Bbox_2_intersections.cpp index 63d0ddd12bb..3e0edcecc58 100644 --- a/Intersections_2/src/CGAL/Bbox_2_intersections.cpp +++ b/Intersections_2/src/CGAL/Bbox_2_intersections.cpp @@ -25,10 +25,10 @@ #ifndef CGAL_HEADER_ONLY -#include -#include +#include +#include -#include -#include +#include +#include #endif // CGAL_HEADER_ONLY diff --git a/Intersections_2/test/Intersections_2/test_intersections_2.cpp b/Intersections_2/test/Intersections_2/test_intersections_2.cpp index 512236d8933..b43d81c9643 100644 --- a/Intersections_2/test/Intersections_2/test_intersections_2.cpp +++ b/Intersections_2/test/Intersections_2/test_intersections_2.cpp @@ -8,12 +8,17 @@ #include #include #include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include #include #include @@ -65,6 +70,7 @@ struct Test { typedef CGAL::Ray_2< K > R; typedef CGAL::Triangle_2< K > T; typedef CGAL::Iso_rectangle_2< K > Rec; + typedef CGAL::Circle_2< K > C; typedef std::vector

Pol; @@ -152,6 +158,17 @@ struct Test { return P(to_nt(x*w), to_nt(y*w), to_nt(w)); } + void B_P() + { + CGAL::Bbox_2 bb(0,0,10,10); + P p(1,0), bl(0,0), tr(10,10); + C c(bl,1); + Rec r(bl,tr); + check_intersection(bb,p,p,true); + check_intersection(c,p,p,true); + assert(do_intersect(r,c)); + } + void L_L() { std::cout << "Line - Line\n"; @@ -330,6 +347,7 @@ check_no_intersection (L(p(0, 0), p(10,10)), L(p(8,7), p(1, 0))); void run() { std::cout << "2D Intersection tests\n"; + B_P(); L_L(); S_S(); R_R(); diff --git a/Intersections_3/include/CGAL/Intersection_traits_3.h b/Intersections_3/include/CGAL/Intersection_traits_3.h index 832790cdedc..c74186bc6cc 100644 --- a/Intersections_3/include/CGAL/Intersection_traits_3.h +++ b/Intersections_3/include/CGAL/Intersection_traits_3.h @@ -135,6 +135,153 @@ template struct Intersection_traits : public Intersection_traits {}; +// Point_3 Iso_cuboid_3, variant of one +template +struct Intersection_traits { + typedef typename + boost::variant< typename K::Point_3 > variant_type; + typedef typename boost::optional< variant_type > result_type; +}; + +// Bbox_3 Point_3, variant of one +template +struct Intersection_traits { + typedef typename + boost::variant< typename K::Point_3 > variant_type; + typedef typename boost::optional< variant_type > result_type; +}; + + template +struct Intersection_traits { + typedef typename + boost::variant< typename K::Point_3 > variant_type; + typedef typename boost::optional< variant_type > result_type; +}; + +// Iso_cuboid_3 Point_3, variant of one +template +struct Intersection_traits { + typedef typename + boost::variant< typename K::Point_3 > variant_type; + typedef typename boost::optional< variant_type > result_type; +}; + +// Point_3 Line_3, variant of one +template +struct Intersection_traits { + typedef typename + boost::variant< typename K::Point_3 > variant_type; + typedef typename boost::optional< variant_type > result_type; +}; + +// Line_3 Point_3, variant of one +template +struct Intersection_traits { + typedef typename + boost::variant< typename K::Point_3 > variant_type; + typedef typename boost::optional< variant_type > result_type; +}; + +// Point_3 Ray_3, variant of one +template +struct Intersection_traits { + typedef typename + boost::variant< typename K::Point_3 > variant_type; + typedef typename boost::optional< variant_type > result_type; +}; + +// Ray_3 Point_3, variant of one +template +struct Intersection_traits { + typedef typename + boost::variant< typename K::Point_3 > variant_type; + typedef typename boost::optional< variant_type > result_type; +}; + +// Point_3 Segment_3, variant of one +template +struct Intersection_traits { + typedef typename + boost::variant< typename K::Point_3 > variant_type; + typedef typename boost::optional< variant_type > result_type; +}; + +// Segment_3 Point_3, variant of one +template +struct Intersection_traits { + typedef typename + boost::variant< typename K::Point_3 > variant_type; + typedef typename boost::optional< variant_type > result_type; +}; + +// Point_3 Point_3, variant of one +template +struct Intersection_traits { + typedef typename + boost::variant< typename K::Point_3 > variant_type; + typedef typename boost::optional< variant_type > result_type; +}; + +// Point_3 Plane_3, variant of one +template +struct Intersection_traits { + typedef typename + boost::variant< typename K::Point_3 > variant_type; + typedef typename boost::optional< variant_type > result_type; +}; + +// Plane_3 Point_3, variant of one +template +struct Intersection_traits { + typedef typename + boost::variant< typename K::Point_3 > variant_type; + typedef typename boost::optional< variant_type > result_type; +}; + +// Point_3 Triangle_3, variant of one +template +struct Intersection_traits { + typedef typename + boost::variant< typename K::Point_3 > variant_type; + typedef typename boost::optional< variant_type > result_type; +}; +// Triangle_3 Point_3, variant of one +template +struct Intersection_traits { + typedef typename + boost::variant< typename K::Point_3 > variant_type; + typedef typename boost::optional< variant_type > result_type; +}; + +// Point_3 Tetrahedron_3, variant of one +template +struct Intersection_traits { + typedef typename + boost::variant< typename K::Point_3 > variant_type; + typedef typename boost::optional< variant_type > result_type; +}; +// Tetrahedron_3 Point_3, variant of one +template +struct Intersection_traits { + typedef typename + boost::variant< typename K::Point_3 > variant_type; + typedef typename boost::optional< variant_type > result_type; +}; + +// Point_3 Sphere_3, variant of one +template +struct Intersection_traits { + typedef typename + boost::variant< typename K::Point_3 > variant_type; + typedef typename boost::optional< variant_type > result_type; +}; +// Sphere_3 Point_3, variant of one +template +struct Intersection_traits { + typedef typename + boost::variant< typename K::Point_3 > variant_type; + typedef typename boost::optional< variant_type > result_type; +}; } // namespace #endif // !(CGAL_INTERSECTION_VERSION < 2) diff --git a/Intersections_2/include/CGAL/Iso_rectangle_2_Ray_2_intersection.h b/Intersections_3/include/CGAL/Intersections_3/Bbox_3_Bbox_3.h similarity index 59% rename from Intersections_2/include/CGAL/Iso_rectangle_2_Ray_2_intersection.h rename to Intersections_3/include/CGAL/Intersections_3/Bbox_3_Bbox_3.h index 99501b578e0..d742cb8ff43 100644 --- a/Intersections_2/include/CGAL/Iso_rectangle_2_Ray_2_intersection.h +++ b/Intersections_3/include/CGAL/Intersections_3/Bbox_3_Bbox_3.h @@ -1,9 +1,5 @@ -// Copyright (c) 2000 -// Utrecht University (The Netherlands), -// ETH Zurich (Switzerland), -// INRIA Sophia-Antipolis (France), -// Max-Planck-Institute Saarbruecken (Germany), -// and Tel-Aviv University (Israel). All rights reserved. +// Copyright (c) 2010 GeometryFactory (France). +// All rights reserved. // // This file is part of CGAL (www.cgal.org); you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public License as @@ -19,8 +15,27 @@ // $URL$ // $Id$ // SPDX-License-Identifier: LGPL-3.0+ -// // -// Author(s) : Geert-Jan Giezeman +// +// Author(s) : Sebastien Loriot +// -#include +#ifndef CGAL_INTERSECTIONS_3_BBOX_3_BBOX_3_H +#define CGAL_INTERSECTIONS_3_BBOX_3_BBOX_3_H + + +#include + +namespace CGAL { +bool +inline +do_intersect(const CGAL::Bbox_3& c, + const CGAL::Bbox_3& bbox) +{ + return CGAL::do_overlap(c, bbox); +} + +} //namespace CGAL + + +#endif // CGAL_INTERSECTIONS_3_BBOX_3_BBOX_3_H diff --git a/Intersections_3/include/CGAL/Intersections_3/Bbox_3_Iso_cuboid_3.h b/Intersections_3/include/CGAL/Intersections_3/Bbox_3_Iso_cuboid_3.h new file mode 100644 index 00000000000..37f439444b5 --- /dev/null +++ b/Intersections_3/include/CGAL/Intersections_3/Bbox_3_Iso_cuboid_3.h @@ -0,0 +1,47 @@ +// Copyright (c) 2010 GeometryFactory (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org); you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 3 of the License, +// or (at your option) any later version. +// +// 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$ +// SPDX-License-Identifier: LGPL-3.0+ +// +// +// Author(s) : Sebastien Loriot +// + +#ifndef CGAL_INTERSECTIONS_3_BBOX_3_ISO_CUBOID_3_H +#define CGAL_INTERSECTIONS_3_BBOX_3_ISO_CUBOID_3_H + +#include +#include + +#include + +namespace CGAL { + +template +bool do_intersect(const CGAL::Bbox_3& a, + const Iso_cuboid_3& b) { + return K().do_intersect_3_object()(a, b); +} + +template +bool do_intersect(const Iso_cuboid_3& a, + const CGAL::Bbox_3& b) { + return K().do_intersect_3_object()(b, a); +} + +} // namespace CGAL + +#endif // CGAL_INTERSECTIONS_3_BBOX_3_ISO_CUBOID_3_H diff --git a/Intersections_3/include/CGAL/Intersections_3/Bbox_3_Line_3.h b/Intersections_3/include/CGAL/Intersections_3/Bbox_3_Line_3.h new file mode 100644 index 00000000000..16afa74a743 --- /dev/null +++ b/Intersections_3/include/CGAL/Intersections_3/Bbox_3_Line_3.h @@ -0,0 +1,61 @@ +// Copyright (c) 2010 GeometryFactory (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org); you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 3 of the License, +// or (at your option) any later version. +// +// 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$ +// SPDX-License-Identifier: LGPL-3.0+ +// +// +// Author(s) : Sebastien Loriot +// + +#ifndef CGAL_INTERSECTIONS_3_BBOX_3_LINE_3_H +#define CGAL_INTERSECTIONS_3_BBOX_3_LINE_3_H + +#include +#include + +#include +#include + +namespace CGAL { + +template +bool do_intersect(const CGAL::Bbox_3& a, + const Line_3& b) { + return K().do_intersect_3_object()(a, b); +} + +template +bool do_intersect(const Line_3& a, + const CGAL::Bbox_3& b) { + return K().do_intersect_3_object()(a, b); +} + +template +typename Intersection_traits::result_type +intersection(const CGAL::Bbox_3& a, + const Line_3& b) { + return K().intersect_3_object()(a, b); +} + +template +typename Intersection_traits::result_type +intersection(const Line_3& a, + const CGAL::Bbox_3& b) { + return K().intersect_3_object()(a, b); +} +} + +#endif // CGAL_INTERSECTIONS_3_BBOX_3_LINE_3_H diff --git a/Intersections_3/include/CGAL/Intersections_3/Bbox_3_Plane_3.h b/Intersections_3/include/CGAL/Intersections_3/Bbox_3_Plane_3.h new file mode 100644 index 00000000000..639a7986aee --- /dev/null +++ b/Intersections_3/include/CGAL/Intersections_3/Bbox_3_Plane_3.h @@ -0,0 +1,48 @@ +// Copyright (c) 2010 GeometryFactory (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org); you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 3 of the License, +// or (at your option) any later version. +// +// 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$ +// SPDX-License-Identifier: LGPL-3.0+ +// +// +// Author(s) : Sebastien Loriot +// + +#ifndef CGAL_INTERSECTIONS_3_BBOX_3_PLANE_3_H +#define CGAL_INTERSECTIONS_3_BBOX_3_PLANE_3_H + +#include +#include + +#include + + +namespace CGAL { + +template +bool do_intersect(const CGAL::Bbox_3& a, + const Plane_3& b) { + return K().do_intersect_3_object()(a, b); +} + +template +bool do_intersect(const Plane_3& a, + const CGAL::Bbox_3& b) { + return K().do_intersect_3_object()(a, b); +} + +} + +#endif // CGAL_INTERSECTIONS_3_BBOX_3_PLANE_3_H diff --git a/Intersections_3/include/CGAL/Intersections_3/Bbox_3_Point_3.h b/Intersections_3/include/CGAL/Intersections_3/Bbox_3_Point_3.h new file mode 100644 index 00000000000..e923357c38c --- /dev/null +++ b/Intersections_3/include/CGAL/Intersections_3/Bbox_3_Point_3.h @@ -0,0 +1,74 @@ +// Copyright (c) 2010 GeometryFactory (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org); you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 3 of the License, +// or (at your option) any later version. +// +// 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$ +// SPDX-License-Identifier: LGPL-3.0+ +// +// +// Author(s) : Sebastien Loriot +// + +#ifndef CGAL_INTERSECTIONS_3_BBOX_3_POINT_3_H +#define CGAL_INTERSECTIONS_3_BBOX_3_POINT_3_H + +#include +#include + +#include +#include + +namespace CGAL { + +template +bool do_intersect(const CGAL::Bbox_3& a, + const Point_3& b) { + Point_3 bl(a.xmin(), a.ymin(),a.zmin()), tr(a.xmax(), a.ymax(),a.zmax()); + + Iso_cuboid_3 ic(bl,tr); + return K().do_intersect_3_object()(ic, b); +} + + +template +bool do_intersect(const Point_3& a, + const CGAL::Bbox_3& b) { + return do_intersect(b,a); +} + + +template +typename Intersection_traits::result_type +intersection(const Point_3& a, + const CGAL::Bbox_3& b) +{ + if (do_intersect(a,b)) + return Intersections::internal::intersection_return(a); + return Intersections::internal::intersection_return(); +} + + +template +typename Intersection_traits::result_type +intersection(const CGAL::Bbox_3& b, + const Point_3& a) +{ + if (do_intersect(a,b)) + return Intersections::internal::intersection_return(a); + return Intersections::internal::intersection_return(); +} + +} // namespace CGAL + +#endif // CGAL_INTERSECTIONS_3_BBOX_3_POINT_3_H diff --git a/Intersections_3/include/CGAL/Intersections_3/Bbox_3_Ray_3.h b/Intersections_3/include/CGAL/Intersections_3/Bbox_3_Ray_3.h new file mode 100644 index 00000000000..72441388ff0 --- /dev/null +++ b/Intersections_3/include/CGAL/Intersections_3/Bbox_3_Ray_3.h @@ -0,0 +1,61 @@ +// Copyright (c) 2010 GeometryFactory (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org); you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 3 of the License, +// or (at your option) any later version. +// +// 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$ +// SPDX-License-Identifier: LGPL-3.0+ +// +// +// Author(s) : Sebastien Loriot +// + +#ifndef CGAL_INTERSECTIONS_3_BBOX_3_RAY_3_H +#define CGAL_INTERSECTIONS_3_BBOX_3_RAY_3_H + +#include +#include + +#include +#include + +namespace CGAL { + +template +bool do_intersect(const CGAL::Bbox_3& a, + const Ray_3& b) { + return K().do_intersect_3_object()(a, b); +} + +template +bool do_intersect(const Ray_3& a, + const CGAL::Bbox_3& b) { + return K().do_intersect_3_object()(a, b); +} + +template +typename Intersection_traits::result_type +intersection(const CGAL::Bbox_3& a, + const Ray_3& b) { + return K().intersect_3_object()(a, b); +} + +template +typename Intersection_traits::result_type +intersection(const Ray_3& a, + const CGAL::Bbox_3& b) { + return K().intersect_3_object()(a, b); +} + +} +#endif // CGAL_INTERSECTIONS_3_BBOX_3_RAY_3_H diff --git a/Intersections_3/include/CGAL/Intersections_3/Bbox_3_Segment_3.h b/Intersections_3/include/CGAL/Intersections_3/Bbox_3_Segment_3.h new file mode 100644 index 00000000000..243e37d5374 --- /dev/null +++ b/Intersections_3/include/CGAL/Intersections_3/Bbox_3_Segment_3.h @@ -0,0 +1,61 @@ +// Copyright (c) 2010 GeometryFactory (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org); you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 3 of the License, +// or (at your option) any later version. +// +// 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$ +// SPDX-License-Identifier: LGPL-3.0+ +// +// +// Author(s) : Sebastien Loriot +// + +#ifndef CGAL_INTERSECTIONS_3_BBOX_3_SEGMENT_3_H +#define CGAL_INTERSECTIONS_3_BBOX_3_SEGMENT_3_H + +#include +#include +#include +#include + +namespace CGAL { + +template +bool do_intersect(const CGAL::Bbox_3& a, + const Segment_3& b) { + return K().do_intersect_3_object()(a, b); +} + +template +bool do_intersect(const Segment_3& a, + const CGAL::Bbox_3& b) { + return K().do_intersect_3_object()(a, b); +} + +template +typename Intersection_traits::result_type +intersection(const CGAL::Bbox_3& a, + const Segment_3& b) { + return K().intersect_3_object()(a, b); +} + +template +typename Intersection_traits::result_type +intersection(const Segment_3& a, + const CGAL::Bbox_3& b) { + return K().intersect_3_object()(a, b); +} + +} // namespace CGAL + +#endif // CGAL_INTERSECTIONS_3_BBOX_3_SEGMENT_3_H diff --git a/Intersections_3/include/CGAL/Intersections_3/Bbox_3_Sphere_3.h b/Intersections_3/include/CGAL/Intersections_3/Bbox_3_Sphere_3.h new file mode 100644 index 00000000000..62445c404e5 --- /dev/null +++ b/Intersections_3/include/CGAL/Intersections_3/Bbox_3_Sphere_3.h @@ -0,0 +1,47 @@ +// Copyright (c) 2010 GeometryFactory (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org); you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 3 of the License, +// or (at your option) any later version. +// +// 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$ +// SPDX-License-Identifier: LGPL-3.0+ +// +// +// Author(s) : Sebastien Loriot +// + +#ifndef CGAL_INTERSECTIONS_3_BBOX_3_SPHERE_3_H +#define CGAL_INTERSECTIONS_3_BBOX_3_SPHERE_3_H + +#include +#include + +#include + +namespace CGAL { + +template +bool do_intersect(const CGAL::Bbox_3& a, + const Sphere_3& b) { + return K().do_intersect_3_object()(a, b); +} + +template +bool do_intersect(const Sphere_3& a, + const CGAL::Bbox_3& b) { + return K().do_intersect_3_object()(a, b); +} + +} + +#endif // CGAL_INTERSECTIONS_3_BBOX_3_SPHERE_3_H diff --git a/Intersections_3/include/CGAL/Intersections_3/Bbox_3_Tetrahedron_3.h b/Intersections_3/include/CGAL/Intersections_3/Bbox_3_Tetrahedron_3.h new file mode 100644 index 00000000000..b62050eefed --- /dev/null +++ b/Intersections_3/include/CGAL/Intersections_3/Bbox_3_Tetrahedron_3.h @@ -0,0 +1,47 @@ +// Copyright (c) 2010 GeometryFactory (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org); you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 3 of the License, +// or (at your option) any later version. +// +// 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$ +// SPDX-License-Identifier: LGPL-3.0+ +// +// +// Author(s) : Sebastien Loriot +// + +#ifndef CGAL_INTERSECTIONS_3_BBOX_3_TETRAHEDRON_3_H +#define CGAL_INTERSECTIONS_3_BBOX_3_TETRAHEDRON_3_H + +#include +#include + +#include + +namespace CGAL { + +template +bool do_intersect(const CGAL::Bbox_3& a, + const Tetrahedron_3& b) { + return K().do_intersect_3_object()(a, b); +} + +template +bool do_intersect(const Tetrahedron_3& a, + const CGAL::Bbox_3& b) { + return K().do_intersect_3_object()(a, b); +} + +} // namespace CGAL + +#endif // CGAL_INTERSECTIONS_3_BBOX_3_TETRAHEDRON_3_H diff --git a/Intersections_3/include/CGAL/Intersections_3/Bbox_3_Triangle_3.h b/Intersections_3/include/CGAL/Intersections_3/Bbox_3_Triangle_3.h new file mode 100644 index 00000000000..c7d5a122a9e --- /dev/null +++ b/Intersections_3/include/CGAL/Intersections_3/Bbox_3_Triangle_3.h @@ -0,0 +1,48 @@ +// Copyright (c) 2010 GeometryFactory (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org); you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 3 of the License, +// or (at your option) any later version. +// +// 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$ +// SPDX-License-Identifier: LGPL-3.0+ +// +// +// Author(s) : Sebastien Loriot +// + +#ifndef CGAL_INTERSECTIONS_3_BBOX_3_TRIANGLE_3_H +#define CGAL_INTERSECTIONS_3_BBOX_3_TRIANGLE_3_H + +#include +#include + +#include + +namespace CGAL { + +template +bool do_intersect(const CGAL::Bbox_3& a, + const Triangle_3& b) { + return K().do_intersect_3_object()(a, b); +} + +template +bool do_intersect(const Triangle_3& a, + const CGAL::Bbox_3& b) { + return K().do_intersect_3_object()(a, b); +} + + +} // namespace CGAL + +#endif // CGAL_INTERSECTIONS_3_BBOX_3_TRIANGLE_3_H diff --git a/Intersections_3/include/CGAL/Intersections_3/Iso_cuboid_3_Iso_cuboid_3.h b/Intersections_3/include/CGAL/Intersections_3/Iso_cuboid_3_Iso_cuboid_3.h new file mode 100644 index 00000000000..db74ad6152b --- /dev/null +++ b/Intersections_3/include/CGAL/Intersections_3/Iso_cuboid_3_Iso_cuboid_3.h @@ -0,0 +1,35 @@ +// Copyright (c) 2010 GeometryFactory (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org); you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 3 of the License, +// or (at your option) any later version. +// +// 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$ +// SPDX-License-Identifier: LGPL-3.0+ +// +// +// Author(s) : Sebastien Loriot +// + +#ifndef CGAL_INTERSECTIONS_3_ISO_CUBOID_3_ISO_CUBOID_3_H +#define CGAL_INTERSECTIONS_3_ISO_CUBOID_3_ISO_CUBOID_3_H + +#include + +#include + +namespace CGAL { +CGAL_INTERSECTION_FUNCTION_SELF(Iso_cuboid_3, 3) +CGAL_DO_INTERSECT_FUNCTION_SELF(Iso_cuboid_3, 3) +} + +#endif // CGAL_INTERSECTIONS_3_ISO_CUBOID_3_ISO_CUBOID_3_H diff --git a/Intersections_2/include/CGAL/Triangle_2_Triangle_2_intersection.h b/Intersections_3/include/CGAL/Intersections_3/Iso_cuboid_3_Line_3.h similarity index 55% rename from Intersections_2/include/CGAL/Triangle_2_Triangle_2_intersection.h rename to Intersections_3/include/CGAL/Intersections_3/Iso_cuboid_3_Line_3.h index f68dd0b61d6..59305d45aca 100644 --- a/Intersections_2/include/CGAL/Triangle_2_Triangle_2_intersection.h +++ b/Intersections_3/include/CGAL/Intersections_3/Iso_cuboid_3_Line_3.h @@ -1,9 +1,5 @@ -// Copyright (c) 2000 -// Utrecht University (The Netherlands), -// ETH Zurich (Switzerland), -// INRIA Sophia-Antipolis (France), -// Max-Planck-Institute Saarbruecken (Germany), -// and Tel-Aviv University (Israel). All rights reserved. +// Copyright (c) 2010 GeometryFactory (France). +// All rights reserved. // // This file is part of CGAL (www.cgal.org); you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public License as @@ -19,15 +15,21 @@ // $URL$ // $Id$ // SPDX-License-Identifier: LGPL-3.0+ -// // -// Author(s) : Geert-Jan Giezeman +// +// Author(s) : Sebastien Loriot +// +#ifndef CGAL_INTERSECTIONS_3_ISO_CUBOID_3_LINE_3_H +#define CGAL_INTERSECTIONS_3_ISO_CUBOID_3_LINE_3_H -#ifndef CGAL_TRIANGLE_2_TRIANGLE_2_INTERSECTION_H -#define CGAL_TRIANGLE_2_TRIANGLE_2_INTERSECTION_H +#include +#include +#include -#include -#include +namespace CGAL { + CGAL_DO_INTERSECT_FUNCTION(Iso_cuboid_3,Line_3, 3) + CGAL_INTERSECTION_FUNCTION(Line_3, Iso_cuboid_3, 3) +} -#endif +#endif // CGAL_INTERSECTIONS_3_BBOX_3_LINE_3_H diff --git a/Intersections_2/include/CGAL/Bbox_2_intersection.h b/Intersections_3/include/CGAL/Intersections_3/Iso_cuboid_3_Plane_3.h similarity index 57% rename from Intersections_2/include/CGAL/Bbox_2_intersection.h rename to Intersections_3/include/CGAL/Intersections_3/Iso_cuboid_3_Plane_3.h index 1b345b4b981..11c5eff3120 100644 --- a/Intersections_2/include/CGAL/Bbox_2_intersection.h +++ b/Intersections_3/include/CGAL/Intersections_3/Iso_cuboid_3_Plane_3.h @@ -1,9 +1,5 @@ -// Copyright (c) 2000 -// Utrecht University (The Netherlands), -// ETH Zurich (Switzerland), -// INRIA Sophia-Antipolis (France), -// Max-Planck-Institute Saarbruecken (Germany), -// and Tel-Aviv University (Israel). All rights reserved. +// Copyright (c) 2010 GeometryFactory (France). +// All rights reserved. // // This file is part of CGAL (www.cgal.org); you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public License as @@ -19,15 +15,21 @@ // $URL$ // $Id$ // SPDX-License-Identifier: LGPL-3.0+ -// // -// Author(s) : Geert-Jan Giezeman +// +// Author(s) : Sebastien Loriot +// + +#ifndef CGAL_INTERSECTIONS_3_ISO_CUBOID_3_PLANE_3_H +#define CGAL_INTERSECTIONS_3_ISO_CUBOID_3_PLANE_3_H + +#include +#include +#include +namespace CGAL { + CGAL_DO_INTERSECT_FUNCTION(Iso_cuboid_3, Plane_3, 3) +} -#ifndef CGAL_BBOX_2_INTERSECTIONS_H -#define CGAL_BBOX_2_INTERSECTIONS_H - -#include -#include -#endif // CGAL_BBOX_2_INTERSECTIONS_H +#endif // CGAL_INTERSECTIONS_3_ISO_CUBOID_3_PLANE_3_H diff --git a/Intersections_3/include/CGAL/Intersections_3/Iso_cuboid_3_Point_3.h b/Intersections_3/include/CGAL/Intersections_3/Iso_cuboid_3_Point_3.h new file mode 100644 index 00000000000..c03335611ea --- /dev/null +++ b/Intersections_3/include/CGAL/Intersections_3/Iso_cuboid_3_Point_3.h @@ -0,0 +1,83 @@ +// Copyright (c) 2018 INRIA Sophia-Antipolis (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org); you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 3 of the License, +// or (at your option) any later version. +// +// 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$ +// SPDX-License-Identifier: LGPL-3.0+ +// +// +// Author(s) : Maxime Gimeno + +#ifndef CGAL_INTERSECTIONS_3_ISO_CUBOID_3_POINT_3_H +#define CGAL_INTERSECTIONS_3_ISO_CUBOID_3_POINT_3_H + +#include +#include +#include + +namespace CGAL { +namespace Intersections { +namespace internal { + +template +inline +bool +do_intersect(const typename K::Point_3 &pt, + const typename K::Iso_cuboid_3 &iso, + const K&) +{ + return !iso.has_on_unbounded_side(pt); +} + +template +inline +bool +do_intersect(const typename K::Iso_cuboid_3 &iso, + const typename K::Point_3 &pt, + const K&) +{ + return !iso.has_on_unbounded_side(pt); +} + +template +typename CGAL::Intersection_traits +::result_type +intersection(const typename K::Point_3 &pt, + const typename K::Iso_cuboid_3 &iso, + const K& k) +{ + if (internal::do_intersect(pt,iso,k)) + return intersection_return(pt); + return intersection_return(); +} + +template +typename CGAL::Intersection_traits +::result_type +intersection(const typename K::Iso_cuboid_3 &iso, + const typename K::Point_3 &pt, + const K& k) +{ + return internal::intersection(pt, iso, k); +} + +} // namespace internal +} // namespace Intersections + +CGAL_INTERSECTION_FUNCTION(Point_3, Iso_cuboid_3, 3) +CGAL_DO_INTERSECT_FUNCTION(Point_3, Iso_cuboid_3, 3) + +} //namespace CGAL + +#endif // CGAL_INTERSECTIONS_3_ISO_CUBOID_3_POINT_3_H diff --git a/Intersections_3/include/CGAL/Intersections_3/Iso_cuboid_3_Ray_3.h b/Intersections_3/include/CGAL/Intersections_3/Iso_cuboid_3_Ray_3.h new file mode 100644 index 00000000000..8798b295b5a --- /dev/null +++ b/Intersections_3/include/CGAL/Intersections_3/Iso_cuboid_3_Ray_3.h @@ -0,0 +1,37 @@ +// Copyright (c) 2010 GeometryFactory (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org); you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 3 of the License, +// or (at your option) any later version. +// +// 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$ +// SPDX-License-Identifier: LGPL-3.0+ +// +// +// Author(s) : Sebastien Loriot +// + +#ifndef CGAL_INTERSECTIONS_3_ISO_CUBOID_3_RAY_3_H +#define CGAL_INTERSECTIONS_3_ISO_CUBOID_3_RAY_3_H + +#include +#include + +#include +#include + +namespace CGAL { + CGAL_DO_INTERSECT_FUNCTION(Iso_cuboid_3,Ray_3, 3) + CGAL_INTERSECTION_FUNCTION(Ray_3, Iso_cuboid_3, 3) +} + +#endif // CGAL_INTERSECTIONS_3_ISSO_CUBOID_3_RAY_3_H diff --git a/Intersections_3/include/CGAL/Intersections_3/Iso_cuboid_3_Segment_3.h b/Intersections_3/include/CGAL/Intersections_3/Iso_cuboid_3_Segment_3.h new file mode 100644 index 00000000000..8bd316d77f3 --- /dev/null +++ b/Intersections_3/include/CGAL/Intersections_3/Iso_cuboid_3_Segment_3.h @@ -0,0 +1,37 @@ +// Copyright (c) 2010 GeometryFactory (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org); you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 3 of the License, +// or (at your option) any later version. +// +// 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$ +// SPDX-License-Identifier: LGPL-3.0+ +// +// +// Author(s) : Sebastien Loriot +// + +#ifndef CGAL_INTERSECTIONS_3_ISO_CUBOID_3_SEGMENT_3_H +#define CGAL_INTERSECTIONS_3_ISO_CUBOID_3_SEGMENT_3_H + +#include +#include + +#include +#include + +namespace CGAL { + CGAL_DO_INTERSECT_FUNCTION(Iso_cuboid_3,Segment_3, 3) + CGAL_INTERSECTION_FUNCTION(Segment_3, Iso_cuboid_3, 3) +} + +#endif // CGAL_INTERSECTIONS_3_BBOX_3_SEGMENT_3_H diff --git a/Intersections_3/include/CGAL/Intersections_3/Iso_cuboid_3_Sphere_3.h b/Intersections_3/include/CGAL/Intersections_3/Iso_cuboid_3_Sphere_3.h new file mode 100644 index 00000000000..b63ea70bc62 --- /dev/null +++ b/Intersections_3/include/CGAL/Intersections_3/Iso_cuboid_3_Sphere_3.h @@ -0,0 +1,35 @@ +// Copyright (c) 2010 GeometryFactory (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org); you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 3 of the License, +// or (at your option) any later version. +// +// 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$ +// SPDX-License-Identifier: LGPL-3.0+ +// +// +// Author(s) : Sebastien Loriot +// + +#ifndef CGAL_INTERSECTIONS_3_ISO_CUBOID_3_SPHERE_3_H +#define CGAL_INTERSECTIONS_3_ISO_CUBOID_3_SPHERE_3_H + +#include +#include + +#include + +namespace CGAL { + CGAL_DO_INTERSECT_FUNCTION(Iso_cuboid_3, Sphere_3, 3) +} + +#endif // CGAL_INTERSECTIONS_3_ISO_CUBOID_3_SPHERE_3_H diff --git a/Intersections_3/include/CGAL/Intersections_3/Iso_cuboid_3_Tetrahedron_3.h b/Intersections_3/include/CGAL/Intersections_3/Iso_cuboid_3_Tetrahedron_3.h new file mode 100644 index 00000000000..e211d8f19a5 --- /dev/null +++ b/Intersections_3/include/CGAL/Intersections_3/Iso_cuboid_3_Tetrahedron_3.h @@ -0,0 +1,35 @@ +// Copyright (c) 2010 GeometryFactory (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org); you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 3 of the License, +// or (at your option) any later version. +// +// 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$ +// SPDX-License-Identifier: LGPL-3.0+ +// +// +// Author(s) : Sebastien Loriot +// + +#ifndef CGAL_INTERSECTIONS_3_ISO_CUBOID_3_TETRAHEDRON_3_H +#define CGAL_INTERSECTIONS_3_ISO_CUBOID_3_TETRAHEDRON_3_H + +#include +#include + +#include + +namespace CGAL { + CGAL_DO_INTERSECT_FUNCTION(Iso_cuboid_3, Tetrahedron_3, 3) +} + +#endif // CGAL_INTERSECTIONS_3_ISO_CUBOID_3_TETRAHEDRON_3_H diff --git a/Intersections_3/include/CGAL/Intersections_3/Iso_cuboid_3_Triangle_3.h b/Intersections_3/include/CGAL/Intersections_3/Iso_cuboid_3_Triangle_3.h new file mode 100644 index 00000000000..9c0e6ac71e2 --- /dev/null +++ b/Intersections_3/include/CGAL/Intersections_3/Iso_cuboid_3_Triangle_3.h @@ -0,0 +1,35 @@ +// Copyright (c) 2010 GeometryFactory (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org); you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 3 of the License, +// or (at your option) any later version. +// +// 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$ +// SPDX-License-Identifier: LGPL-3.0+ +// +// +// Author(s) : Sebastien Loriot +// + +#ifndef CGAL_INTERSECTIONS_3_ISO_CUBOID_3_TRIANGLE_3_H +#define CGAL_INTERSECTIONS_3_ISO_CUBOID_3_TRIANGLE_3_H + +#include +#include + +#include + +namespace CGAL { + CGAL_DO_INTERSECT_FUNCTION(Iso_cuboid_3,Triangle_3, 3) +} + +#endif // CGAL_INTERSECTIONS_3_BBOX_3_TRIANGLE_3_H diff --git a/Intersections_2/include/CGAL/Iso_rectangle_2_Point_2_intersection.h b/Intersections_3/include/CGAL/Intersections_3/Line_3_Line_3.h similarity index 58% rename from Intersections_2/include/CGAL/Iso_rectangle_2_Point_2_intersection.h rename to Intersections_3/include/CGAL/Intersections_3/Line_3_Line_3.h index 9d498dcb798..ec964297439 100644 --- a/Intersections_2/include/CGAL/Iso_rectangle_2_Point_2_intersection.h +++ b/Intersections_3/include/CGAL/Intersections_3/Line_3_Line_3.h @@ -1,9 +1,5 @@ -// Copyright (c) 2000 -// Utrecht University (The Netherlands), -// ETH Zurich (Switzerland), -// INRIA Sophia-Antipolis (France), -// Max-Planck-Institute Saarbruecken (Germany), -// and Tel-Aviv University (Israel). All rights reserved. +// Copyright (c) 2010 GeometryFactory (France). +// All rights reserved. // // This file is part of CGAL (www.cgal.org); you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public License as @@ -19,8 +15,21 @@ // $URL$ // $Id$ // SPDX-License-Identifier: LGPL-3.0+ -// // -// Author(s) : Geert-Jan Giezeman +// +// Author(s) : Sebastien Loriot +// -#include +#ifndef CGAL_INTERSECTIONS_3_LINE_3_LINE_3_H +#define CGAL_INTERSECTIONS_3_LINE_3_LINE_3_H + +#include + +#include + +namespace CGAL { +CGAL_INTERSECTION_FUNCTION_SELF(Line_3, 3) +CGAL_DO_INTERSECT_FUNCTION_SELF(Line_3, 3) +} + +#endif // CGAL_INTERSECTIONS_3_LINE_3_LINE_3_H diff --git a/Intersections_3/include/CGAL/Intersections_3/Line_3_Plane_3.h b/Intersections_3/include/CGAL/Intersections_3/Line_3_Plane_3.h new file mode 100644 index 00000000000..36f2b8f4eef --- /dev/null +++ b/Intersections_3/include/CGAL/Intersections_3/Line_3_Plane_3.h @@ -0,0 +1,36 @@ +// Copyright (c) 2010 GeometryFactory (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org); you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 3 of the License, +// or (at your option) any later version. +// +// 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$ +// SPDX-License-Identifier: LGPL-3.0+ +// +// +// Author(s) : Sebastien Loriot +// + +#ifndef CGAL_INTERSECTIONS_3_LINE_PLANE_3_H +#define CGAL_INTERSECTIONS_3_LINE_PLANE_3_H + +#include +#include + +#include + +namespace CGAL { +CGAL_INTERSECTION_FUNCTION(Plane_3, Line_3, 3) +CGAL_DO_INTERSECT_FUNCTION(Plane_3, Line_3, 3) +} + +#endif // CGAL_INTERSECTIONS_3_LINE_PLANE_3_H diff --git a/Intersections_3/include/CGAL/Intersections_3/Line_3_Point_3.h b/Intersections_3/include/CGAL/Intersections_3/Line_3_Point_3.h new file mode 100644 index 00000000000..e05e8ac2ed2 --- /dev/null +++ b/Intersections_3/include/CGAL/Intersections_3/Line_3_Point_3.h @@ -0,0 +1,83 @@ +// Copyright (c) 2018 INRIA Sophia-Antipolis (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org); you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 3 of the License, +// or (at your option) any later version. +// +// 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$ +// SPDX-License-Identifier: LGPL-3.0+ +// +// +// Author(s) : Maxime Gimeno + +#ifndef CGAL_INTERSECTIONS_3_LINE_3_POINT_3_H +#define CGAL_INTERSECTIONS_3_LINE_3_POINT_3_H + +#include +#include +#include + +namespace CGAL { + +namespace Intersections { + +namespace internal { + +template +inline bool +do_intersect(const typename K::Point_3 &pt, + const typename K::Line_3 &line, + const K&) +{ + return line.has_on(pt); +} + +template +inline bool +do_intersect(const typename K::Line_3 &line, + const typename K::Point_3 &pt, + const K&) +{ + return line.has_on(pt); +} + +template +typename CGAL::Intersection_traits +::result_type +intersection(const typename K::Point_3 &pt, + const typename K::Line_3 &line, + const K& k) +{ + if (do_intersect(pt,line,k)) + return intersection_return(pt); + return intersection_return(); +} + +template +typename CGAL::Intersection_traits +::result_type +intersection(const typename K::Line_3 &line, + const typename K::Point_3 &pt, + const K& k) +{ + return internal::intersection(pt, line, k); +} + +} // namespace internal +} // namespace Intersections + +CGAL_INTERSECTION_FUNCTION(Point_3, Line_3, 3) +CGAL_DO_INTERSECT_FUNCTION(Point_3, Line_3, 3) + +} //namespace CGAL + +#endif // CGAL_INTERSECTIONS_3_LINE_3_POINT_3_H diff --git a/Intersections_3/include/CGAL/Intersections_3/Line_3_Ray_3.h b/Intersections_3/include/CGAL/Intersections_3/Line_3_Ray_3.h new file mode 100644 index 00000000000..3846288730d --- /dev/null +++ b/Intersections_3/include/CGAL/Intersections_3/Line_3_Ray_3.h @@ -0,0 +1,36 @@ +// Copyright (c) 2010 GeometryFactory (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org); you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 3 of the License, +// or (at your option) any later version. +// +// 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$ +// SPDX-License-Identifier: LGPL-3.0+ +// +// +// Author(s) : Sebastien Loriot +// + +#ifndef CGAL_INTERSECTIONS_3_LINE_3_RAY_3_H +#define CGAL_INTERSECTIONS_3_LINE_3_RAY_3_H + +#include +#include + +#include + +namespace CGAL { +CGAL_INTERSECTION_FUNCTION(Ray_3, Line_3, 3) +CGAL_DO_INTERSECT_FUNCTION(Ray_3, Line_3, 3) +} + +#endif // CGAL_INTERSECTIONS_3_LINE_3_RAY_3_H diff --git a/Intersections_3/include/CGAL/Intersections_3/Line_3_Segment_3.h b/Intersections_3/include/CGAL/Intersections_3/Line_3_Segment_3.h new file mode 100644 index 00000000000..0421e7ce342 --- /dev/null +++ b/Intersections_3/include/CGAL/Intersections_3/Line_3_Segment_3.h @@ -0,0 +1,36 @@ +// Copyright (c) 2010 GeometryFactory (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org); you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 3 of the License, +// or (at your option) any later version. +// +// 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$ +// SPDX-License-Identifier: LGPL-3.0+ +// +// +// Author(s) : Sebastien Loriot +// + +#ifndef CGAL_INTERSECTIONS_3_LINE_3_SEGMENT_3_H +#define CGAL_INTERSECTIONS_3_LINE_3_SEGMENT_3_H + +#include +#include + +#include + +namespace CGAL { + CGAL_INTERSECTION_FUNCTION(Line_3, Segment_3, 3) + CGAL_DO_INTERSECT_FUNCTION(Line_3, Segment_3, 3) +} + +#endif // CGAL_INTERSECTIONS_3_LINE_3_SEGMENT_3_H diff --git a/Intersections_3/include/CGAL/Intersections_3/Line_3_Sphere_3.h b/Intersections_3/include/CGAL/Intersections_3/Line_3_Sphere_3.h new file mode 100644 index 00000000000..7419504d724 --- /dev/null +++ b/Intersections_3/include/CGAL/Intersections_3/Line_3_Sphere_3.h @@ -0,0 +1,35 @@ +// Copyright (c) 2010 GeometryFactory (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org); you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 3 of the License, +// or (at your option) any later version. +// +// 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$ +// SPDX-License-Identifier: LGPL-3.0+ +// +// +// Author(s) : Sebastien Loriot +// + +#ifndef CGAL_INTERSECTIONS_3_LINE_3_SPHERE_3_H +#define CGAL_INTERSECTIONS_3_LINE_3_SPHERE_3_H + +#include +#include + +#include + +namespace CGAL { + CGAL_DO_INTERSECT_FUNCTION(Line_3, Sphere_3, 3) +} + +#endif // CGAL_INTERSECTIONS_3_LINE_3_SPHERE_3_H diff --git a/Intersections_3/include/CGAL/Intersections_3/Line_3_Tetrahedron_3.h b/Intersections_3/include/CGAL/Intersections_3/Line_3_Tetrahedron_3.h new file mode 100644 index 00000000000..0566ccb561b --- /dev/null +++ b/Intersections_3/include/CGAL/Intersections_3/Line_3_Tetrahedron_3.h @@ -0,0 +1,35 @@ +// Copyright (c) 2010 GeometryFactory (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org); you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 3 of the License, +// or (at your option) any later version. +// +// 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$ +// SPDX-License-Identifier: LGPL-3.0+ +// +// +// Author(s) : Sebastien Loriot +// + +#ifndef CGAL_INTERSECTIONS_3_LINE_3_TETRAHEDRON_3_H +#define CGAL_INTERSECTIONS_3_LINE_3_TETRAHEDRON_3_H + +#include +#include + +#include + +namespace CGAL { + CGAL_DO_INTERSECT_FUNCTION(Line_3, Tetrahedron_3, 3) +} + +#endif // CGAL_INTERSECTIONS_3_LINE_3_TETRAHEDRON_3_H diff --git a/Intersections_3/include/CGAL/Intersections_3/Line_3_Triangle_3.h b/Intersections_3/include/CGAL/Intersections_3/Line_3_Triangle_3.h new file mode 100644 index 00000000000..9be4e73a8d2 --- /dev/null +++ b/Intersections_3/include/CGAL/Intersections_3/Line_3_Triangle_3.h @@ -0,0 +1,37 @@ +// Copyright (c) 2010 GeometryFactory (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org); you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 3 of the License, +// or (at your option) any later version. +// +// 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$ +// SPDX-License-Identifier: LGPL-3.0+ +// +// +// Author(s) : Sebastien Loriot +// + +#ifndef CGAL_INTERSECTIONS_3_LINE_3_TRIANGLE_3_H +#define CGAL_INTERSECTIONS_3_LINE_3_TRIANGLE_3_H + +#include +#include + +#include +#include + +namespace CGAL { +CGAL_INTERSECTION_FUNCTION(Triangle_3, Line_3, 3) +CGAL_DO_INTERSECT_FUNCTION(Triangle_3, Line_3, 3) +} + +#endif // CGAL_INTERSECTIONS_3_LINE_3_TRIANGLE_3_H diff --git a/Intersections_3/include/CGAL/Intersections_3/Plane_3_Plane_3.h b/Intersections_3/include/CGAL/Intersections_3/Plane_3_Plane_3.h new file mode 100644 index 00000000000..501afd4bf20 --- /dev/null +++ b/Intersections_3/include/CGAL/Intersections_3/Plane_3_Plane_3.h @@ -0,0 +1,35 @@ +// Copyright (c) 2010 GeometryFactory (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org); you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 3 of the License, +// or (at your option) any later version. +// +// 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$ +// SPDX-License-Identifier: LGPL-3.0+ +// +// +// Author(s) : Sebastien Loriot +// + +#ifndef CGAL_INTERSECTIONS_3_PLANE_3_PLANE_3_H +#define CGAL_INTERSECTIONS_3_PLANE_3_PLANE_3_H + +#include + +#include + +namespace CGAL { +CGAL_INTERSECTION_FUNCTION_SELF(Plane_3, 3) +CGAL_DO_INTERSECT_FUNCTION_SELF(Plane_3, 3) +} + +#endif // CGAL_INTERSECTIONS_3_PLANE_3_PLANE_3_H diff --git a/Intersections_3/include/CGAL/Intersections_3/Plane_3_Point_3.h b/Intersections_3/include/CGAL/Intersections_3/Plane_3_Point_3.h new file mode 100644 index 00000000000..090ba9c0ae5 --- /dev/null +++ b/Intersections_3/include/CGAL/Intersections_3/Plane_3_Point_3.h @@ -0,0 +1,82 @@ +// Copyright (c) 2018 INRIA Sophia-Antipolis (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org); you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 3 of the License, +// or (at your option) any later version. +// +// 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$ +// SPDX-License-Identifier: LGPL-3.0+ +// +// +// Author(s) : Maxime Gimeno + +#ifndef CGAL_INTERSECTIONS_3_PLANE_3_POINT_3_PLANE_3_H +#define CGAL_INTERSECTIONS_3_PLANE_3_POINT_3_PLANE_3_H + +#include +#include +#include + +namespace CGAL { + +namespace Intersections { + +namespace internal { + +template +inline bool +do_intersect(const typename K::Point_3 &pt, + const typename K::Plane_3 &plane, + const K&) +{ + return plane.has_on(pt); +} + +template +inline bool +do_intersect(const typename K::Plane_3 &plane, + const typename K::Point_3 &pt, + const K&) +{ + return plane.has_on(pt); +} + +template +typename CGAL::Intersection_traits +::result_type +intersection(const typename K::Point_3 &pt, + const typename K::Plane_3 &plane, + const K& k) +{ + if (do_intersect(pt,plane,k)) + return intersection_return(pt); + return intersection_return(); +} + +template +typename CGAL::Intersection_traits +::result_type +intersection(const typename K::Plane_3 &plane, + const typename K::Point_3 &pt, + const K& k) +{ + return internal::intersection(pt, plane,k); +} + +} // namespace internal +} // namespace Intersections + +CGAL_INTERSECTION_FUNCTION(Point_3, Plane_3, 3) +CGAL_DO_INTERSECT_FUNCTION(Point_3, Plane_3, 3) + +} //namespace CGAL +#endif // CGAL_INTERSECTIONS_3_PLANE_3_POINT_3_PLANE_3_H diff --git a/Intersections_3/include/CGAL/Intersections_3/Plane_3_Ray_3.h b/Intersections_3/include/CGAL/Intersections_3/Plane_3_Ray_3.h new file mode 100644 index 00000000000..1572729b694 --- /dev/null +++ b/Intersections_3/include/CGAL/Intersections_3/Plane_3_Ray_3.h @@ -0,0 +1,36 @@ +// Copyright (c) 2010 GeometryFactory (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org); you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 3 of the License, +// or (at your option) any later version. +// +// 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$ +// SPDX-License-Identifier: LGPL-3.0+ +// +// +// Author(s) : Sebastien Loriot +// + +#ifndef CGAL_INTERSECTIONS_3_PLANE_3_RAY_3_H +#define CGAL_INTERSECTIONS_3_PLANE_3_RAY_3_H + +#include +#include + +#include + +namespace CGAL { +CGAL_INTERSECTION_FUNCTION(Ray_3, Plane_3, 3) +CGAL_DO_INTERSECT_FUNCTION(Ray_3, Plane_3, 3) +} + +#endif // CGAL_INTERSECTIONS_3_PLANE_3_RAY_3_H diff --git a/Intersections_3/include/CGAL/Intersections_3/Plane_3_Segment_3.h b/Intersections_3/include/CGAL/Intersections_3/Plane_3_Segment_3.h new file mode 100644 index 00000000000..c2739743d2e --- /dev/null +++ b/Intersections_3/include/CGAL/Intersections_3/Plane_3_Segment_3.h @@ -0,0 +1,36 @@ +// Copyright (c) 2010 GeometryFactory (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org); you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 3 of the License, +// or (at your option) any later version. +// +// 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$ +// SPDX-License-Identifier: LGPL-3.0+ +// +// +// Author(s) : Sebastien Loriot +// + +#ifndef CGAL_INTERSECTIONS_3_PLANE_3_SEGMENT_3_H +#define CGAL_INTERSECTIONS_3_PLANE_3_SEGMENT_3_H + +#include +#include + +#include + +namespace CGAL { +CGAL_INTERSECTION_FUNCTION(Segment_3, Plane_3, 3) +CGAL_DO_INTERSECT_FUNCTION(Segment_3, Plane_3, 3) +} + +#endif // CGAL_INTERSECTIONS_3_PLANE_3_SEGMENT_3_H diff --git a/Intersections_3/include/CGAL/Intersections_3/Plane_3_Sphere_3.h b/Intersections_3/include/CGAL/Intersections_3/Plane_3_Sphere_3.h new file mode 100644 index 00000000000..2669afd39af --- /dev/null +++ b/Intersections_3/include/CGAL/Intersections_3/Plane_3_Sphere_3.h @@ -0,0 +1,36 @@ +// Copyright (c) 2010 GeometryFactory (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org); you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 3 of the License, +// or (at your option) any later version. +// +// 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$ +// SPDX-License-Identifier: LGPL-3.0+ +// +// +// Author(s) : Sebastien Loriot +// + +#ifndef CGAL_INTERSECTIONS_3_PLANE_3_SPHERE_3_H +#define CGAL_INTERSECTIONS_3_PLANE_3_SPHERE_3_H + +#include +#include + +#include + +namespace CGAL { +CGAL_INTERSECTION_FUNCTION(Sphere_3, Plane_3, 3) +CGAL_DO_INTERSECT_FUNCTION(Sphere_3, Plane_3, 3) +} + +#endif // CGAL_INTERSECTIONS_3_PLANE_3_SPHERE_3_H diff --git a/Intersections_3/include/CGAL/Intersections_3/Plane_3_Tetrahedron_3.h b/Intersections_3/include/CGAL/Intersections_3/Plane_3_Tetrahedron_3.h new file mode 100644 index 00000000000..ef92801ef67 --- /dev/null +++ b/Intersections_3/include/CGAL/Intersections_3/Plane_3_Tetrahedron_3.h @@ -0,0 +1,35 @@ +// Copyright (c) 2010 GeometryFactory (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org); you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 3 of the License, +// or (at your option) any later version. +// +// 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$ +// SPDX-License-Identifier: LGPL-3.0+ +// +// +// Author(s) : Sebastien Loriot +// + +#ifndef CGAL_INTERSECTIONS_3_PLANE_3_TETRAHEDRON_3_H +#define CGAL_INTERSECTIONS_3_PLANE_3_TETRAHEDRON_3_H + +#include +#include + +#include + +namespace CGAL { + CGAL_DO_INTERSECT_FUNCTION(Tetrahedron_3, Plane_3, 3) +} + +#endif // CGAL_INTERSECTIONS_3_PLANE_3_TETRAHEDRON_3_H diff --git a/Intersections_3/include/CGAL/Intersections_3/Plane_3_Triangle_3.h b/Intersections_3/include/CGAL/Intersections_3/Plane_3_Triangle_3.h new file mode 100644 index 00000000000..fe92f4873b4 --- /dev/null +++ b/Intersections_3/include/CGAL/Intersections_3/Plane_3_Triangle_3.h @@ -0,0 +1,37 @@ +// Copyright (c) 2010 GeometryFactory (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org); you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 3 of the License, +// or (at your option) any later version. +// +// 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$ +// SPDX-License-Identifier: LGPL-3.0+ +// +// +// Author(s) : Sebastien Loriot +// + +#ifndef CGAL_INTERSECTIONS_3_PLANE_3_TRIANGLE_3_H +#define CGAL_INTERSECTIONS_3_PLANE_3_TRIANGLE_3_H + +#include +#include + +#include +#include + +namespace CGAL { +CGAL_INTERSECTION_FUNCTION(Triangle_3, Plane_3, 3) +CGAL_DO_INTERSECT_FUNCTION(Triangle_3, Plane_3, 3) +} + +#endif // CGAL_INTERSECTIONS_3_PLANE_3_TRIANGLE_3_H diff --git a/Intersections_3/include/CGAL/Intersections_3/Point_3_Point_3.h b/Intersections_3/include/CGAL/Intersections_3/Point_3_Point_3.h new file mode 100644 index 00000000000..f7e815fd1c0 --- /dev/null +++ b/Intersections_3/include/CGAL/Intersections_3/Point_3_Point_3.h @@ -0,0 +1,62 @@ +// Copyright (c) 2018 INRIA Sophia-Antipolis (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org); you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 3 of the License, +// or (at your option) any later version. +// +// 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$ +// SPDX-License-Identifier: LGPL-3.0+ +// +// +// Author(s) : Maxime Gimeno + +#ifndef CGAL_INTERSECTIONS_3_POINT_3_POINT_3_H +#define CGAL_INTERSECTIONS_3_POINT_3_POINT_3_H + +#include +#include + +namespace CGAL { + +namespace Intersections { + +namespace internal { + +template +inline bool +do_intersect(const typename K::Point_3 &pt1, + const typename K::Point_3 &pt2, + const K&) +{ + return pt1 == pt2; +} + +template +typename CGAL::Intersection_traits +::result_type +intersection(const typename K::Point_3 &pt1, + const typename K::Point_3 &pt2, + const K&) +{ + if (pt1 == pt2) + return intersection_return(pt1); + return intersection_return(); +} + +} // namespace internal +} // namespace Intersections + +CGAL_INTERSECTION_FUNCTION_SELF(Point_3, 3) +CGAL_DO_INTERSECT_FUNCTION_SELF(Point_3, 3) +}//nmaespace cgal + +#endif // CGAL_INTERSECTIONS_3_POINT_3_POINT_3_H diff --git a/Intersections_3/include/CGAL/Intersections_3/Point_3_Ray_3.h b/Intersections_3/include/CGAL/Intersections_3/Point_3_Ray_3.h new file mode 100644 index 00000000000..9951c634c72 --- /dev/null +++ b/Intersections_3/include/CGAL/Intersections_3/Point_3_Ray_3.h @@ -0,0 +1,88 @@ +// Copyright (c) 2018 INRIA Sophia-Antipolis (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org); you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 3 of the License, +// or (at your option) any later version. +// +// 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$ +// SPDX-License-Identifier: LGPL-3.0+ +// +// +// Author(s) : Maxime Gimeno + +#ifndef CGAL_INTERSECTIONS_3_POINT_3_RAY_3_H +#define CGAL_INTERSECTIONS_3_POINT_3_RAY_3_H + +#include +#include +#include + +namespace CGAL { + +namespace Intersections { + +namespace internal { + +template +inline +bool +do_intersect(const typename K::Point_3 &pt, + const typename K::Ray_3 &ray, + const K&) +{ + return ray.has_on(pt); +} + + +template +inline +bool +do_intersect(const typename K::Ray_3 &ray, + const typename K::Point_3 &pt, + const K&) +{ + return ray.has_on(pt); +} + + +template +typename CGAL::Intersection_traits +::result_type +intersection(const typename K::Point_3 &pt, + const typename K::Ray_3 &ray, + const K& k) +{ + if (do_intersect(pt,ray, k)) { + return intersection_return(pt); + } + return intersection_return(); +} + +template +typename CGAL::Intersection_traits +::result_type +intersection(const typename K::Ray_3 &ray, + const typename K::Point_3 &pt, + const K& k) +{ + return internal::intersection(pt, ray, k); +} + +} // namespace internal +} // namespace Intersections + +CGAL_INTERSECTION_FUNCTION(Point_3, Ray_3, 3) +CGAL_DO_INTERSECT_FUNCTION(Point_3, Ray_3, 3) + + +} //namespace CGAL +#endif // CGAL_INTERSECTIONS_3_POINT_3_RAY_3_H diff --git a/Intersections_3/include/CGAL/Intersections_3/Point_3_Segment_3.h b/Intersections_3/include/CGAL/Intersections_3/Point_3_Segment_3.h new file mode 100644 index 00000000000..93d441674a5 --- /dev/null +++ b/Intersections_3/include/CGAL/Intersections_3/Point_3_Segment_3.h @@ -0,0 +1,88 @@ +// Copyright (c) 2018 INRIA Sophia-Antipolis (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org); you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 3 of the License, +// or (at your option) any later version. +// +// 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$ +// SPDX-License-Identifier: LGPL-3.0+ +// +// +// Author(s) : Maxime Gimeno + +#ifndef CGAL_INTERSECTIONS_3_POINT_3_SEGMENT_3_H +#define CGAL_INTERSECTIONS_3_POINT_3_SEGMENT_3_H + +#include +#include +#include + +namespace CGAL { + +namespace Intersections { + +namespace internal { + +template +inline +bool +do_intersect(const typename K::Point_3 &pt, + const typename K::Segment_3 &seg, + const K&) +{ + return seg.has_on(pt); +} + +template +inline +bool +do_intersect(const typename K::Segment_3 &seg, + const typename K::Point_3 &pt, + const K&) +{ + return seg.has_on(pt); +} + + +template +inline +typename CGAL::Intersection_traits +::result_type +intersection(const typename K::Point_3 &pt, + const typename K::Segment_3 &seg, + const K& k) +{ + if (do_intersect(pt,seg, k)) + return intersection_return(pt); + return intersection_return(); +} + +template +inline +typename CGAL::Intersection_traits +::result_type +intersection( const typename K::Segment_3 &seg, + const typename K::Point_3 &pt, + const K& k) +{ + return internal::intersection(pt, seg, k); +} + +} // namespace internal +} // namespace Intersections + +CGAL_INTERSECTION_FUNCTION(Point_3, Segment_3, 3) +CGAL_DO_INTERSECT_FUNCTION(Point_3, Segment_3, 3) + +} //namespace CGAL + +#endif // CGAL_INTERSECTIONS_3_POINT_3_SEGMENT_3_H diff --git a/Intersections_3/include/CGAL/Intersections_3/Point_3_Sphere_3.h b/Intersections_3/include/CGAL/Intersections_3/Point_3_Sphere_3.h new file mode 100644 index 00000000000..0470340ef77 --- /dev/null +++ b/Intersections_3/include/CGAL/Intersections_3/Point_3_Sphere_3.h @@ -0,0 +1,86 @@ +// Copyright (c) 2018 INRIA Sophia-Antipolis (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org); you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 3 of the License, +// or (at your option) any later version. +// +// 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$ +// SPDX-License-Identifier: LGPL-3.0+ +// +// +// Author(s) : Maxime Gimeno + +#ifndef CGAL_INTERSECTIONS_3_POINT_3_SPHERE_3_H +#define CGAL_INTERSECTIONS_3_POINT_3_SPHERE_3_H + +#include +#include +#include + +namespace CGAL { + +namespace Intersections { + +namespace internal { + +template +inline +bool +do_intersect(const typename K::Point_3 &pt, + const typename K::Sphere_3 &sphere, + const K&) +{ + return sphere.has_on_boundary(pt); +} + + +template +inline +bool +do_intersect(const typename K::Sphere_3 &sphere, + const typename K::Point_3 &pt, + const K&) +{ + return sphere.has_on_boundary(pt); +} + + +template +typename CGAL::Intersection_traits +::result_type +intersection(const typename K::Point_3 &pt, + const typename K::Sphere_3 &sphere, + const K& k) +{ + if (do_intersect(pt,sphere, k)) + return intersection_return(pt); + return intersection_return(); +} + +template +typename CGAL::Intersection_traits +::result_type +intersection(const typename K::Sphere_3 &sphere, + const typename K::Point_3 &pt, + const K& k) +{ + return internal::intersection(pt, sphere, k); +} + +} // namespace internal +} // namespace Intersections + +CGAL_INTERSECTION_FUNCTION(Point_3, Sphere_3, 3) +CGAL_DO_INTERSECT_FUNCTION(Point_3, Sphere_3, 3) + +} //namespace CGAL +#endif // CGAL_INTERSECTIONS_3_POINT_3_SPHERE_3_H diff --git a/Intersections_3/include/CGAL/Intersections_3/Point_3_Tetrahedron_3.h b/Intersections_3/include/CGAL/Intersections_3/Point_3_Tetrahedron_3.h new file mode 100644 index 00000000000..bb057a3eb7a --- /dev/null +++ b/Intersections_3/include/CGAL/Intersections_3/Point_3_Tetrahedron_3.h @@ -0,0 +1,87 @@ +// Copyright (c) 2018 INRIA Sophia-Antipolis (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org); you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 3 of the License, +// or (at your option) any later version. +// +// 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$ +// SPDX-License-Identifier: LGPL-3.0+ +// +// +// Author(s) : Maxime Gimeno + +#ifndef CGAL_INTERSECTIONS_3_POINT_3_TETRAHEDRON_3_H +#define CGAL_INTERSECTIONS_3_POINT_3_TETRAHEDRON_3_H + +#include +#include +#include + +namespace CGAL { + +namespace Intersections { + +namespace internal { + +template +inline +bool +do_intersect(const typename K::Point_3 &pt, + const typename K::Tetrahedron_3 &tetrahedron, + const K&) +{ + return ! tetrahedron.has_on_unbounded_side(pt); +} + + +template +inline +bool +do_intersect(const typename K::Tetrahedron_3 &tetrahedron, + const typename K::Point_3 &pt, + const K&) +{ + return ! tetrahedron.has_on_unbounded_side(pt); +} + + +template +typename CGAL::Intersection_traits +::result_type +intersection(const typename K::Point_3 &pt, + const typename K::Tetrahedron_3 &tetrahedron, + const K& k) +{ + if (do_intersect(pt,tetrahedron, k)) + return intersection_return(pt); + return intersection_return(); +} + +template +typename CGAL::Intersection_traits +::result_type +intersection(const typename K::Tetrahedron_3 &tetrahedron, + const typename K::Point_3 &pt, + const K& k) +{ + return internal::intersection(pt, tetrahedron, k); +} + +} // namespace internal +} // namespace Intersections + +CGAL_INTERSECTION_FUNCTION(Point_3, Tetrahedron_3, 3) +CGAL_DO_INTERSECT_FUNCTION(Point_3, Tetrahedron_3, 3) + + +} //namespace CGAL +#endif // CGAL_INTERSECTIONS_3_POINT_3_TETRAHEDRON_3_H diff --git a/Intersections_3/include/CGAL/Triangle_3_Point_3_do_intersect.h b/Intersections_3/include/CGAL/Intersections_3/Point_3_Triangle_3.h similarity index 70% rename from Intersections_3/include/CGAL/Triangle_3_Point_3_do_intersect.h rename to Intersections_3/include/CGAL/Intersections_3/Point_3_Triangle_3.h index 4ec47ab0b7c..1a887b0a52e 100644 --- a/Intersections_3/include/CGAL/Triangle_3_Point_3_do_intersect.h +++ b/Intersections_3/include/CGAL/Intersections_3/Point_3_Triangle_3.h @@ -19,8 +19,11 @@ // // Author(s) : Philippe Guigue -#ifndef CGAL_TRIANGLE_3_POINT_3_DO_INTERSECT_H -#define CGAL_TRIANGLE_3_POINT_3_DO_INTERSECT_H +#ifndef CGAL_INTERSECTIONS_3_POINT_3_TRIANGLE_3_H +#define CGAL_INTERSECTIONS_3_POINT_3_TRIANGLE_3_H + +#include +#include #include #include @@ -28,13 +31,8 @@ namespace CGAL { - - template - class Triangle_3; - - template - class Point_3; - +namespace Intersections { + namespace internal { template @@ -101,12 +99,36 @@ bool do_intersect(const typename K::Point_3 &p, return do_intersect(t, p, k); } +template +inline +typename CGAL::Intersection_traits +::result_type +intersection(const typename K::Point_3 &pt, + const typename K::Triangle_3 &tr, + const K& k) +{ + if (do_intersect(pt,tr, k)) { + return intersection_return(pt); + } + return intersection_return(); +} +template +inline +typename CGAL::Intersection_traits +::result_type +intersection( const typename K::Triangle_3 &tr, + const typename K::Point_3 &pt, + const K& k) +{ + return internal::intersection(pt, tr, k); +} } // namespace internal - +} // namespace Intersections CGAL_DO_INTERSECT_FUNCTION(Triangle_3, Point_3, 3) +CGAL_INTERSECTION_FUNCTION(Triangle_3, Point_3, 3) } //namespace CGAL -#endif // CGAL_TRIANGLE_3_POINT_3_DO_INTERSECT_H +#endif // CGAL_INTERSECTIONS_3_POINT_3_TRIANGLE_3_H diff --git a/Intersections_2/include/CGAL/Bbox_2_Ray_2_intersection.h b/Intersections_3/include/CGAL/Intersections_3/Ray_3_Ray_3.h similarity index 59% rename from Intersections_2/include/CGAL/Bbox_2_Ray_2_intersection.h rename to Intersections_3/include/CGAL/Intersections_3/Ray_3_Ray_3.h index 155895580c1..c9eb6a95de7 100644 --- a/Intersections_2/include/CGAL/Bbox_2_Ray_2_intersection.h +++ b/Intersections_3/include/CGAL/Intersections_3/Ray_3_Ray_3.h @@ -1,9 +1,5 @@ -// Copyright (c) 2000 -// Utrecht University (The Netherlands), -// ETH Zurich (Switzerland), -// INRIA Sophia-Antipolis (France), -// Max-Planck-Institute Saarbruecken (Germany), -// and Tel-Aviv University (Israel). All rights reserved. +// Copyright (c) 2010 GeometryFactory (France). +// All rights reserved. // // This file is part of CGAL (www.cgal.org); you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public License as @@ -19,9 +15,21 @@ // $URL$ // $Id$ // SPDX-License-Identifier: LGPL-3.0+ -// // -// Author(s) : Geert-Jan Giezeman +// +// Author(s) : Sebastien Loriot +// +#ifndef CGAL_INTERSECTIONS_3_RAY_3_RAY_3_H +#define CGAL_INTERSECTIONS_3_RAY_3_RAY_3_H -#include +#include + +#include + +namespace CGAL { +CGAL_INTERSECTION_FUNCTION_SELF(Ray_3, 3) +CGAL_DO_INTERSECT_FUNCTION_SELF(Ray_3, 3) +} + +#endif // CGAL_INTERSECTIONS_3_RAY_3_RAY_3_H diff --git a/Intersections_3/include/CGAL/Intersections_3/Ray_3_Segment_3.h b/Intersections_3/include/CGAL/Intersections_3/Ray_3_Segment_3.h new file mode 100644 index 00000000000..25702ff619a --- /dev/null +++ b/Intersections_3/include/CGAL/Intersections_3/Ray_3_Segment_3.h @@ -0,0 +1,36 @@ +// Copyright (c) 2010 GeometryFactory (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org); you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 3 of the License, +// or (at your option) any later version. +// +// 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$ +// SPDX-License-Identifier: LGPL-3.0+ +// +// +// Author(s) : Sebastien Loriot +// + +#ifndef CGAL_INTERSECTIONS_3_RAY_3_SEGMENT_3_H +#define CGAL_INTERSECTIONS_3_RAY_3_SEGMENT_3_H + +#include +#include + +#include + +namespace CGAL { +CGAL_INTERSECTION_FUNCTION(Ray_3, Segment_3, 3) +CGAL_DO_INTERSECT_FUNCTION(Ray_3, Segment_3, 3) +} + +#endif // CGAL_INTERSECTIONS_3_RAY_3_SEGMENT_3_H diff --git a/Intersections_3/include/CGAL/Intersections_3/Ray_3_Sphere_3.h b/Intersections_3/include/CGAL/Intersections_3/Ray_3_Sphere_3.h new file mode 100644 index 00000000000..d706e7b82be --- /dev/null +++ b/Intersections_3/include/CGAL/Intersections_3/Ray_3_Sphere_3.h @@ -0,0 +1,35 @@ +// Copyright (c) 2010 GeometryFactory (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org); you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 3 of the License, +// or (at your option) any later version. +// +// 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$ +// SPDX-License-Identifier: LGPL-3.0+ +// +// +// Author(s) : Sebastien Loriot +// + +#ifndef CGAL_INTERSECTIONS_3_RAY_3_SPHERE_3_H +#define CGAL_INTERSECTIONS_3_RAY_3_SPHERE_3_H + +#include +#include + +#include + +namespace CGAL { + CGAL_DO_INTERSECT_FUNCTION(Ray_3, Sphere_3, 3) +} + +#endif // CGAL_INTERSECTIONS_3_RAY_3_SPHERE_3_H diff --git a/Intersections_3/include/CGAL/Intersections_3/Ray_3_Tetrahedron_3.h b/Intersections_3/include/CGAL/Intersections_3/Ray_3_Tetrahedron_3.h new file mode 100644 index 00000000000..b9b4b10c93b --- /dev/null +++ b/Intersections_3/include/CGAL/Intersections_3/Ray_3_Tetrahedron_3.h @@ -0,0 +1,35 @@ +// Copyright (c) 2010 GeometryFactory (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org); you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 3 of the License, +// or (at your option) any later version. +// +// 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$ +// SPDX-License-Identifier: LGPL-3.0+ +// +// +// Author(s) : Sebastien Loriot +// + +#ifndef CGAL_INTERSECTIONS_3_RAY_3_TETRAHEDRON_3_H +#define CGAL_INTERSECTIONS_3_RAY_3_TETRAHEDRON_3_H + +#include +#include + +#include + +namespace CGAL { + CGAL_DO_INTERSECT_FUNCTION(Ray_3, Tetrahedron_3, 3) +} + +#endif // CGAL_INTERSECTIONS_3_RAY_3_TETRAHEDRON_3_H diff --git a/Intersections_3/include/CGAL/Intersections_3/Ray_3_Triangle_3.h b/Intersections_3/include/CGAL/Intersections_3/Ray_3_Triangle_3.h new file mode 100644 index 00000000000..2a4557988dc --- /dev/null +++ b/Intersections_3/include/CGAL/Intersections_3/Ray_3_Triangle_3.h @@ -0,0 +1,37 @@ +// Copyright (c) 2010 GeometryFactory (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org); you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 3 of the License, +// or (at your option) any later version. +// +// 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$ +// SPDX-License-Identifier: LGPL-3.0+ +// +// +// Author(s) : Sebastien Loriot +// + +#ifndef CGAL_INTERSECTIONS_3_RAY_3_TRIANGLE_3_H +#define CGAL_INTERSECTIONS_3_RAY_3_TRIANGLE_3_H + +#include +#include + +#include +#include + +namespace CGAL { + CGAL_INTERSECTION_FUNCTION(Triangle_3, Ray_3, 3) + CGAL_DO_INTERSECT_FUNCTION(Triangle_3, Ray_3, 3) +} + +#endif // CGAL_INTERSECTIONS_3_TRIANGLE_3_TRIANGLE_3_H diff --git a/Intersections_3/include/CGAL/Intersections_3/Segment_3_Segment_3.h b/Intersections_3/include/CGAL/Intersections_3/Segment_3_Segment_3.h new file mode 100644 index 00000000000..ba99ca0b5a1 --- /dev/null +++ b/Intersections_3/include/CGAL/Intersections_3/Segment_3_Segment_3.h @@ -0,0 +1,35 @@ +// Copyright (c) 2010 GeometryFactory (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org); you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 3 of the License, +// or (at your option) any later version. +// +// 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$ +// SPDX-License-Identifier: LGPL-3.0+ +// +// +// Author(s) : Sebastien Loriot +// + +#ifndef CGAL_INTERSECTIONS_3_SEGMENT_3_SEGMENT_3_H +#define CGAL_INTERSECTIONS_3_SEGMENT_3_SEGMENT_3_H + +#include + +#include + +namespace CGAL { +CGAL_INTERSECTION_FUNCTION_SELF(Segment_3, 3) +CGAL_DO_INTERSECT_FUNCTION_SELF(Segment_3, 3) +} + +#endif // CGAL_INTERSECTIONS_3_SEGMENT_3_SEGMENT_3_H diff --git a/Intersections_3/include/CGAL/Intersections_3/Segment_3_Sphere_3.h b/Intersections_3/include/CGAL/Intersections_3/Segment_3_Sphere_3.h new file mode 100644 index 00000000000..1ed0338d690 --- /dev/null +++ b/Intersections_3/include/CGAL/Intersections_3/Segment_3_Sphere_3.h @@ -0,0 +1,35 @@ +// Copyright (c) 2010 GeometryFactory (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org); you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 3 of the License, +// or (at your option) any later version. +// +// 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$ +// SPDX-License-Identifier: LGPL-3.0+ +// +// +// Author(s) : Sebastien Loriot +// + +#ifndef CGAL_INTERSECTIONS_3_SEGMENT_3_SPHERE_3_H +#define CGAL_INTERSECTIONS_3_SEGMENT_3_SPHERE_3_H + +#include +#include + +#include + +namespace CGAL { + CGAL_DO_INTERSECT_FUNCTION(Segment_3, Sphere_3, 3) +} + +#endif // CGAL_INTERSECTIONS_3_SEGMENT_3_SPHERE_3_H diff --git a/Intersections_3/include/CGAL/Intersections_3/Segment_3_Tetrahedron_3.h b/Intersections_3/include/CGAL/Intersections_3/Segment_3_Tetrahedron_3.h new file mode 100644 index 00000000000..3f5dc525a4c --- /dev/null +++ b/Intersections_3/include/CGAL/Intersections_3/Segment_3_Tetrahedron_3.h @@ -0,0 +1,35 @@ +// Copyright (c) 2010 GeometryFactory (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org); you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 3 of the License, +// or (at your option) any later version. +// +// 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$ +// SPDX-License-Identifier: LGPL-3.0+ +// +// +// Author(s) : Sebastien Loriot +// + +#ifndef CGAL_INTERSECTIONS_3_SEGMENT_3_TETRAHEDRON_3_H +#define CGAL_INTERSECTIONS_3_SEGMENT_3_TETRAHEDRON_3_H + +#include +#include + +#include + +namespace CGAL { + CGAL_DO_INTERSECT_FUNCTION(Segment_3, Tetrahedron_3, 3) +} + +#endif // CGAL_INTERSECTIONS_3_SEGMENT_3_TETRAHEDRON_3_H diff --git a/Intersections_3/include/CGAL/Intersections_3/Segment_3_Triangle_3.h b/Intersections_3/include/CGAL/Intersections_3/Segment_3_Triangle_3.h new file mode 100644 index 00000000000..ad40a07a663 --- /dev/null +++ b/Intersections_3/include/CGAL/Intersections_3/Segment_3_Triangle_3.h @@ -0,0 +1,37 @@ +// Copyright (c) 2010 GeometryFactory (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org); you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 3 of the License, +// or (at your option) any later version. +// +// 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$ +// SPDX-License-Identifier: LGPL-3.0+ +// +// +// Author(s) : Sebastien Loriot +// + +#ifndef CGAL_INTERSECTIONS_3_TRIANGLE_3_SEGMENT_3_H +#define CGAL_INTERSECTIONS_3_TRIANGLE_3_SEGMENT_3_H + +#include +#include + +#include +#include + +namespace CGAL { +CGAL_INTERSECTION_FUNCTION(Triangle_3, Segment_3, 3) +CGAL_DO_INTERSECT_FUNCTION(Triangle_3, Segment_3, 3) +} + +#endif // CGAL_INTERSECTIONS_3_TRIANGLE_3_SEGMENT_3_H diff --git a/Intersections_3/include/CGAL/Intersections_3/Sphere_3_Sphere_3.h b/Intersections_3/include/CGAL/Intersections_3/Sphere_3_Sphere_3.h new file mode 100644 index 00000000000..e9fd61803df --- /dev/null +++ b/Intersections_3/include/CGAL/Intersections_3/Sphere_3_Sphere_3.h @@ -0,0 +1,35 @@ +// Copyright (c) 2010 GeometryFactory (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org); you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 3 of the License, +// or (at your option) any later version. +// +// 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$ +// SPDX-License-Identifier: LGPL-3.0+ +// +// +// Author(s) : Sebastien Loriot +// + +#ifndef CGAL_INTERSECTIONS_3_SPHERE_3_SPHERE_3_H +#define CGAL_INTERSECTIONS_3_SPHERE_3_SPHERE_3_H + +#include + +#include + +namespace CGAL { +CGAL_DO_INTERSECT_FUNCTION_SELF(Sphere_3, 3) +CGAL_INTERSECTION_FUNCTION_SELF(Sphere_3, 3) +} + +#endif // CGAL_INTERSECTIONS_3_SPHERE_3_SPHERE_3_H diff --git a/Intersections_3/include/CGAL/Intersections_3/Sphere_3_Tetrahedron_3.h b/Intersections_3/include/CGAL/Intersections_3/Sphere_3_Tetrahedron_3.h new file mode 100644 index 00000000000..2ccdfe0b4f4 --- /dev/null +++ b/Intersections_3/include/CGAL/Intersections_3/Sphere_3_Tetrahedron_3.h @@ -0,0 +1,35 @@ +// Copyright (c) 2010 GeometryFactory (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org); you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 3 of the License, +// or (at your option) any later version. +// +// 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$ +// SPDX-License-Identifier: LGPL-3.0+ +// +// +// Author(s) : Sebastien Loriot +// + +#ifndef CGAL_INTERSECTIONS_3_SPHERE_3_TETRAHEDRON_3_H +#define CGAL_INTERSECTIONS_3_SPHERE_3_TETRAHEDRON_3_H + +#include +#include + +#include + +namespace CGAL { + CGAL_DO_INTERSECT_FUNCTION(Sphere_3, Tetrahedron_3, 3) +} + +#endif // CGAL_INTERSECTIONS_3_SPHERE_3_TETRAHEDRON_3_H diff --git a/Intersections_3/include/CGAL/Intersections_3/Sphere_3_Triangle_3.h b/Intersections_3/include/CGAL/Intersections_3/Sphere_3_Triangle_3.h new file mode 100644 index 00000000000..fbb765f7b57 --- /dev/null +++ b/Intersections_3/include/CGAL/Intersections_3/Sphere_3_Triangle_3.h @@ -0,0 +1,35 @@ +// Copyright (c) 2010 GeometryFactory (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org); you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 3 of the License, +// or (at your option) any later version. +// +// 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$ +// SPDX-License-Identifier: LGPL-3.0+ +// +// +// Author(s) : Sebastien Loriot +// + +#ifndef CGAL_INTERSECTIONS_3_SPHERE_3_TRIANGLE_3_H +#define CGAL_INTERSECTIONS_3_SPHERE_3_TRIANGLE_3_H + +#include +#include + +#include + +namespace CGAL { + CGAL_DO_INTERSECT_FUNCTION(Sphere_3, Triangle_3, 3) +} + +#endif // CGAL_INTERSECTIONS_3_SPHERE_3_TRIANGLE_3_H diff --git a/Intersections_3/include/CGAL/Intersections_3/Tetrahedron_3_Tetrahedron_3.h b/Intersections_3/include/CGAL/Intersections_3/Tetrahedron_3_Tetrahedron_3.h new file mode 100644 index 00000000000..d98d450609b --- /dev/null +++ b/Intersections_3/include/CGAL/Intersections_3/Tetrahedron_3_Tetrahedron_3.h @@ -0,0 +1,34 @@ +// Copyright (c) 2010 GeometryFactory (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org); you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 3 of the License, +// or (at your option) any later version. +// +// 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$ +// SPDX-License-Identifier: LGPL-3.0+ +// +// +// Author(s) : Sebastien Loriot +// + +#ifndef CGAL_INTERSECTIONS_3_TETRAHEDRON_3_TETRAHEDRON_3_H +#define CGAL_INTERSECTIONS_3_TETRAHEDRON_3_TETRAHEDRON_3_H + +#include + +#include + +namespace CGAL { + CGAL_DO_INTERSECT_FUNCTION_SELF(Tetrahedron_3, 3) +} + +#endif // CGAL_INTERSECTIONS_3_TETRAHEDRON_3_TETRAHEDRON_3_H diff --git a/Intersections_3/include/CGAL/Intersections_3/Tetrahedron_3_Triangle_3.h b/Intersections_3/include/CGAL/Intersections_3/Tetrahedron_3_Triangle_3.h new file mode 100644 index 00000000000..da0193e3291 --- /dev/null +++ b/Intersections_3/include/CGAL/Intersections_3/Tetrahedron_3_Triangle_3.h @@ -0,0 +1,35 @@ +// Copyright (c) 2010 GeometryFactory (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org); you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 3 of the License, +// or (at your option) any later version. +// +// 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$ +// SPDX-License-Identifier: LGPL-3.0+ +// +// +// Author(s) : Sebastien Loriot +// + +#ifndef CGAL_INTERSECTIONS_3_TETRAHEDRON_3_TRIANGLE_3_H +#define CGAL_INTERSECTIONS_3_TETRAHEDRON_3_TRIANGLE_3_H + +#include +#include + +#include + +namespace CGAL { + CGAL_DO_INTERSECT_FUNCTION(Tetrahedron_3, Triangle_3, 3) +} + +#endif // CGAL_INTERSECTIONS_3_TETRAHEDRON_3_TRIANGLE_3_H diff --git a/Intersections_3/include/CGAL/Intersections_3/Triangle_3_Triangle_3.h b/Intersections_3/include/CGAL/Intersections_3/Triangle_3_Triangle_3.h new file mode 100644 index 00000000000..0654ef9d989 --- /dev/null +++ b/Intersections_3/include/CGAL/Intersections_3/Triangle_3_Triangle_3.h @@ -0,0 +1,36 @@ +// Copyright (c) 2010 GeometryFactory (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org); you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 3 of the License, +// or (at your option) any later version. +// +// 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$ +// SPDX-License-Identifier: LGPL-3.0+ +// +// +// Author(s) : Sebastien Loriot +// + +#ifndef CGAL_INTERSECTIONS_3_TRIANGLE_3_TRIANGLE_3_H +#define CGAL_INTERSECTIONS_3_TRIANGLE_3_TRIANGLE_3_H + +#include + +#include +#include + +namespace CGAL { +CGAL_INTERSECTION_FUNCTION_SELF(Triangle_3, 3) +CGAL_DO_INTERSECT_FUNCTION_SELF(Triangle_3, 3) +} + +#endif // CGAL_INTERSECTIONS_3_TRIANGLE_3_TRIANGLE_3_H diff --git a/Intersections_3/include/CGAL/internal/Intersections_3/Bbox_3_Bbox_3_do_intersect.h b/Intersections_3/include/CGAL/Intersections_3/internal/Bbox_3_Bbox_3_do_intersect.h similarity index 99% rename from Intersections_3/include/CGAL/internal/Intersections_3/Bbox_3_Bbox_3_do_intersect.h rename to Intersections_3/include/CGAL/Intersections_3/internal/Bbox_3_Bbox_3_do_intersect.h index 6d21409ce12..94ba0853ffa 100644 --- a/Intersections_3/include/CGAL/internal/Intersections_3/Bbox_3_Bbox_3_do_intersect.h +++ b/Intersections_3/include/CGAL/Intersections_3/internal/Bbox_3_Bbox_3_do_intersect.h @@ -39,6 +39,7 @@ namespace CGAL { { return CGAL::do_overlap(c, bbox); } + } //namespace CGAL #endif // CGAL_INTERNAL_INTERSECTIONS_3_BBOX_3_BBOX_3_DO_INTERSECT_H diff --git a/Intersections_3/include/CGAL/Intersections_3/internal/Bbox_3_Iso_cuboid_3_do_intersect.h b/Intersections_3/include/CGAL/Intersections_3/internal/Bbox_3_Iso_cuboid_3_do_intersect.h new file mode 100644 index 00000000000..8aff1c21721 --- /dev/null +++ b/Intersections_3/include/CGAL/Intersections_3/internal/Bbox_3_Iso_cuboid_3_do_intersect.h @@ -0,0 +1,53 @@ +// Copyright (c) 2008 INRIA Sophia-Antipolis (France), ETH Zurich (Switzerland). +// Copyright (c) 2010, 2014 GeometryFactory Sarl (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org); you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 3 of the License, +// or (at your option) any later version. +// +// 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$ +// SPDX-License-Identifier: LGPL-3.0+ +// +// +// Author(s) : Camille Wormser, Jane Tournois, Pierre Alliez + +#ifndef CGAL_INTERNAL_INTERSECTIONS_3_BBOX_3_ISO_CUBOID_3_DO_INTERSECT_H +#define CGAL_INTERNAL_INTERSECTIONS_3_BBOX_3_ISO_CUBOID_3_DO_INTERSECT_H + +#include +#include + +namespace CGAL { + +namespace Intersections { + +namespace internal { + +template +bool do_intersect(const CGAL::Bbox_3& bb, + const typename K::Iso_cuboid_3& ic, + const K& /* k */) +{ + if (bb.xmax() < ic.xmin() || ic.xmax() < bb.xmin()) + return false; + if (bb.ymax() < ic.ymin() || ic.ymax() < bb.ymin()) + return false; + if (bb.zmax() < ic.zmin() || ic.zmax() < bb.zmin()) + return false; + return true; +} + +} // namespace internal +} // namespace Intersections +} //namespace CGAL + +#endif // CGAL_INTERNAL_INTERSECTIONS_3_BBOX_3_ISO_CUBOID_3_DO_INTERSECT_H diff --git a/Intersections_3/include/CGAL/internal/Intersections_3/Bbox_3_Line_3_do_intersect.h b/Intersections_3/include/CGAL/Intersections_3/internal/Bbox_3_Line_3_do_intersect.h similarity index 93% rename from Intersections_3/include/CGAL/internal/Intersections_3/Bbox_3_Line_3_do_intersect.h rename to Intersections_3/include/CGAL/Intersections_3/internal/Bbox_3_Line_3_do_intersect.h index fc57c9d0ad6..95448fd3c6f 100644 --- a/Intersections_3/include/CGAL/internal/Intersections_3/Bbox_3_Line_3_do_intersect.h +++ b/Intersections_3/include/CGAL/Intersections_3/internal/Bbox_3_Line_3_do_intersect.h @@ -30,6 +30,8 @@ // inspired from http://cag.csail.mit.edu/~amy/papers/box-jgt.pdf namespace CGAL { + +namespace Intersections { namespace internal { @@ -155,20 +157,7 @@ namespace internal { } // namespace internal - -template -bool do_intersect(const CGAL::Bbox_3 a, - const Line_3& b) { - return K().do_intersect_3_object()(a, b); -} - -template -bool do_intersect(const Line_3& a, - const CGAL::Bbox_3& b) { - return K().do_intersect_3_object()(a, b); -} - - +} // namespace Intersections } //namespace CGAL #endif // CGAL_INTERNAL_INTERSECTIONS_3_BBOX_3_LINE_3_DO_INTERSECT_H diff --git a/Intersections_3/include/CGAL/internal/Intersections_3/Bbox_3_Plane_3_do_intersect.h b/Intersections_3/include/CGAL/Intersections_3/internal/Bbox_3_Plane_3_do_intersect.h similarity index 82% rename from Intersections_3/include/CGAL/internal/Intersections_3/Bbox_3_Plane_3_do_intersect.h rename to Intersections_3/include/CGAL/Intersections_3/internal/Bbox_3_Plane_3_do_intersect.h index 7c05ee63ad1..0dbb95e2e02 100644 --- a/Intersections_3/include/CGAL/internal/Intersections_3/Bbox_3_Plane_3_do_intersect.h +++ b/Intersections_3/include/CGAL/Intersections_3/internal/Bbox_3_Plane_3_do_intersect.h @@ -24,17 +24,20 @@ #define CGAL_INTERNAL_INTERSECTIONS_3_BBOX_3_PLANE_3_DO_INTERSECT_H #include +#include #include // Opcode like namespace CGAL { + +namespace Intersections { namespace internal { - template + template Uncertain get_min_max(const typename K::Vector_3& p, - const CGAL::Bbox_3& bbox, + Box3& bbox, typename K::Point_3& p_min, typename K::Point_3& p_max) { @@ -89,10 +92,10 @@ namespace internal { return Uncertain::indeterminate(); } - template - bool do_intersect(const typename K::Plane_3& plane, - const CGAL::Bbox_3& bbox, - const K&) + template + bool do_intersect_plane_box(const typename K::Plane_3& plane, + const Box3& bbox, + const K&) { typedef typename K::Point_3 Point_3; Point_3 p_max, p_min; @@ -121,27 +124,35 @@ namespace internal { } template - bool do_intersect(const CGAL::Bbox_3& bbox, const typename K::Plane_3& plane, + bool do_intersect(const typename K::Plane_3& plane, + const Bbox_3& bbox, const K&) { - return do_intersect(plane, bbox, K()); + return do_intersect_plane_box(plane, bbox, K()); } + template + bool do_intersect(const typename K::Plane_3& plane, + const typename K::Iso_cuboid_3& bbox, + const K&) { + return do_intersect_plane_box(plane, bbox, K()); + } + + template + bool do_intersect(const Bbox_3& bbox, + const typename K::Plane_3& plane, + const K&) { + return do_intersect_plane_box(plane, bbox, K()); + } + + template + bool do_intersect(const typename K::Iso_cuboid_3& bbox, + const typename K::Plane_3& plane, + const K&) { + return do_intersect_plane_box(plane, bbox, K()); + } } // namespace internal - -template -bool do_intersect(const CGAL::Bbox_3 a, - const Plane_3& b) { - return K().do_intersect_3_object()(a, b); -} - -template -bool do_intersect(const Plane_3& a, - const CGAL::Bbox_3& b) { - return K().do_intersect_3_object()(a, b); -} - - +} // namespace Intersections } //namespace CGAL #endif // CGAL_INTERNAL_INTERSECTIONS_3_BBOX_3_PLANE_3_DO_INTERSECT_H diff --git a/Intersections_3/include/CGAL/internal/Intersections_3/Bbox_3_Ray_3_do_intersect.h b/Intersections_3/include/CGAL/Intersections_3/internal/Bbox_3_Ray_3_do_intersect.h similarity index 85% rename from Intersections_3/include/CGAL/internal/Intersections_3/Bbox_3_Ray_3_do_intersect.h rename to Intersections_3/include/CGAL/Intersections_3/internal/Bbox_3_Ray_3_do_intersect.h index 55a9b05c45f..e0fcd062625 100644 --- a/Intersections_3/include/CGAL/internal/Intersections_3/Bbox_3_Ray_3_do_intersect.h +++ b/Intersections_3/include/CGAL/Intersections_3/internal/Bbox_3_Ray_3_do_intersect.h @@ -26,12 +26,14 @@ #include #include -#include +#include // for CGAL::internal::do_intersect_bbox_segment_aux // inspired from http://cag.csail.mit.edu/~amy/papers/box-jgt.pdf namespace CGAL { + +namespace Intersections { namespace internal { @@ -64,20 +66,9 @@ namespace internal { const K&) { return do_intersect(ray, bbox, K()); } + } // namespace internal - -template -bool do_intersect(const CGAL::Bbox_3 a, - const Ray_3& b) { - return K().do_intersect_3_object()(a, b); -} - -template -bool do_intersect(const Ray_3& a, - const CGAL::Bbox_3& b) { - return K().do_intersect_3_object()(a, b); -} - +} // namespace Intersections } //namespace CGAL #endif // CGAL_INTERNAL_INTERSECTIONS_3_BBOX_3_RAY_3_DO_INTERSECT_H diff --git a/Intersections_3/include/CGAL/internal/Intersections_3/Bbox_3_Segment_3_do_intersect.h b/Intersections_3/include/CGAL/Intersections_3/internal/Bbox_3_Segment_3_do_intersect.h similarity index 91% rename from Intersections_3/include/CGAL/internal/Intersections_3/Bbox_3_Segment_3_do_intersect.h rename to Intersections_3/include/CGAL/Intersections_3/internal/Bbox_3_Segment_3_do_intersect.h index 47b20df326c..2f2b27113f3 100644 --- a/Intersections_3/include/CGAL/internal/Intersections_3/Bbox_3_Segment_3_do_intersect.h +++ b/Intersections_3/include/CGAL/Intersections_3/internal/Bbox_3_Segment_3_do_intersect.h @@ -25,6 +25,8 @@ #include +#include +#include #include #include #include @@ -44,6 +46,8 @@ // [t1, t2] intersects [0, 1]. namespace CGAL { + +namespace Intersections { namespace internal { @@ -120,7 +124,10 @@ namespace internal { }; // end specialization Do_intersect_bbox_segment_aux_is_greater + + template @@ -134,16 +141,9 @@ namespace internal { do_intersect_bbox_segment_aux( const FT& px, const FT& py, const FT& pz, const FT& qx, const FT& qy, const FT& qz, - const Bbox_3& bbox) + const BFT& bxmin, const BFT& bymin, const BFT& bzmin, + const BFT& bxmax, const BFT& bymax, const BFT& bzmax) { - const double& bxmin = bbox.xmin(); - const double& bymin = bbox.ymin(); - const double& bzmin = bbox.zmin(); - const double& bxmax = bbox.xmax(); - const double& bymax = bbox.ymax(); - const double& bzmax = bbox.zmax(); - - if( ( (px >= bxmin) && (px <= bxmax) && (py >= bymin) && (py <= bymax) && (pz >= bzmin) && (pz <= bzmax) ) || @@ -409,6 +409,33 @@ namespace internal { return true; } + + template + inline + typename Do_intersect_bbox_segment_aux_is_greater + < + FT, + bounded_0, + use_static_filters + >::result_type + do_intersect_bbox_segment_aux( + const FT& px, const FT& py, const FT& pz, + const FT& qx, const FT& qy, const FT& qz, + const Bbox_3& bb) + + { + return do_intersect_bbox_segment_aux(px, py, pz, + qx, qy, qz, + bb.xmin(), bb.ymin(), bb.zmin(), + bb.xmax(), bb.ymax(), bb.zmax()); + } + + + + template bool do_intersect(const typename K::Segment_3& segment, const CGAL::Bbox_3& bbox, @@ -435,20 +462,7 @@ namespace internal { } } // namespace internal - -template -bool do_intersect(const CGAL::Bbox_3 a, - const Segment_3& b) { - return K().do_intersect_3_object()(a, b); -} - -template -bool do_intersect(const Segment_3& a, - const CGAL::Bbox_3& b) { - return K().do_intersect_3_object()(a, b); -} - - +} // namespace Intersections } //namespace CGAL #include diff --git a/Intersections_3/include/CGAL/internal/Intersections_3/Bbox_3_Sphere_3_do_intersect.h b/Intersections_3/include/CGAL/Intersections_3/internal/Bbox_3_Sphere_3_do_intersect.h similarity index 73% rename from Intersections_3/include/CGAL/internal/Intersections_3/Bbox_3_Sphere_3_do_intersect.h rename to Intersections_3/include/CGAL/Intersections_3/internal/Bbox_3_Sphere_3_do_intersect.h index 1ee8e0dd3b0..29953fe3009 100644 --- a/Intersections_3/include/CGAL/internal/Intersections_3/Bbox_3_Sphere_3_do_intersect.h +++ b/Intersections_3/include/CGAL/Intersections_3/internal/Bbox_3_Sphere_3_do_intersect.h @@ -30,13 +30,15 @@ namespace CGAL { + +namespace Intersections { namespace internal { - template - bool do_intersect(const typename K::Sphere_3& sphere, - const CGAL::Bbox_3& bbox, - const K&) + template + bool do_intersect_sphere_box_3(const typename K::Sphere_3& sphere, + const Box3& bbox, + const K&) { typedef typename K::FT FT; typedef typename K::Point_3 Point; @@ -101,24 +103,38 @@ namespace internal { bool do_intersect(const CGAL::Bbox_3& bbox, const typename K::Sphere_3& sphere, const K&) - { return do_intersect(sphere, bbox, K()); } + { + return do_intersect_sphere_box_3(sphere, bbox, K()); + } + + template + bool do_intersect(const typename K::Sphere_3& sphere, + const CGAL::Bbox_3& bbox, + const K&) + { + return do_intersect_sphere_box_3(sphere, bbox, K()); + } + + template + bool do_intersect(const typename K::Iso_cuboid_3& bbox, + const typename K::Sphere_3& sphere, + const K&) + { + return do_intersect_sphere_box_3(sphere, bbox, K()); + } + + + template + bool do_intersect(const typename K::Sphere_3& sphere, + const typename K::Iso_cuboid_3& bbox, + const K&) + { + return do_intersect_sphere_box_3(sphere, bbox, K()); + } } // namespace internal - -template -bool do_intersect(const CGAL::Bbox_3& a, - const Sphere_3& b) { - return K().do_intersect_3_object()(a, b); -} - -template -bool do_intersect(const Sphere_3& a, - const CGAL::Bbox_3& b) { - return K().do_intersect_3_object()(a, b); -} - - +} // namespace Intersections } //namespace CGAL #endif // CGAL_INTERNAL_INTERSECTIONS_3_BBOX_3_SPHERE_3_DO_INTERSECT_H diff --git a/Intersections_3/include/CGAL/internal/Intersections_3/Bbox_3_Triangle_3_do_intersect.h b/Intersections_3/include/CGAL/Intersections_3/internal/Bbox_3_Triangle_3_do_intersect.h similarity index 81% rename from Intersections_3/include/CGAL/internal/Intersections_3/Bbox_3_Triangle_3_do_intersect.h rename to Intersections_3/include/CGAL/Intersections_3/internal/Bbox_3_Triangle_3_do_intersect.h index 7584aac800b..58f030a5d5c 100644 --- a/Intersections_3/include/CGAL/internal/Intersections_3/Bbox_3_Triangle_3_do_intersect.h +++ b/Intersections_3/include/CGAL/Intersections_3/internal/Bbox_3_Triangle_3_do_intersect.h @@ -33,16 +33,18 @@ // a minimal cost (and we use C++ ;). #include -#include +#include namespace CGAL { + +namespace Intersections { namespace internal { - template + template inline bool do_bbox_intersect(const typename K::Triangle_3& triangle, - const CGAL::Bbox_3& bbox) + const Box3& bbox) { const typename K::Point_3& p = triangle.vertex(0); const typename K::Point_3& q = triangle.vertex(1); @@ -51,32 +53,32 @@ namespace internal { for(int i = 0; i < 3; ++i) { if(p[i] <= q[i]) { if(q[i] <= r[i]) { // pqr - if(((bbox.max)(i) < p[i]) || ((bbox.min)(i) > r[i])) + if((bbox.max_coord(i) < p[i]) || (bbox.min_coord(i) > r[i])) return false; } else { if(p[i] <= r[i]) { // prq - if((bbox.max)(i) < p[i] || (bbox.min)(i) > q[i]) + if(bbox.max_coord(i) < p[i] || bbox.min_coord(i) > q[i]) return false; } else { // rpq - if((bbox.max)(i) < r[i] || (bbox.min)(i) > q[i]) + if(bbox.max_coord(i) < r[i] || bbox.min_coord(i) > q[i]) return false; } } } else { if(p[i] <= r[i]) { // qpr - if((bbox.max)(i) < q[i] || (bbox.min)(i) > r[i]) + if(bbox.max_coord(i) < q[i] || bbox.min_coord(i) > r[i]) return false; } else { if(q[i] <= r[i]) { // qrp - if((bbox.max)(i) < q[i] || (bbox.min)(i) > p[i]) + if(bbox.max_coord(i) < q[i] || bbox.min_coord(i) > p[i]) return false; } else { // rqp - if((bbox.max)(i) < r[i] || (bbox.min)(i) > p[i]) + if(bbox.max_coord(i) < r[i] || bbox.min_coord(i) > p[i]) return false; } } @@ -89,12 +91,12 @@ namespace internal { // if you do not know it, or if it does not exist, // use get_min_max without the AXE template parameter // available in _plane_is_cuboid_do_intersect.h - template + template inline void get_min_max(const typename K::FT& px, const typename K::FT& py, const typename K::FT& pz, - const CGAL::Bbox_3& c, + const Box3& c, typename K::Point_3& p_min, typename K::Point_3& p_max) { @@ -186,20 +188,20 @@ namespace internal { return -1; } - template + template inline Uncertain do_axis_intersect(const typename K::Triangle_3& triangle, const typename K::Vector_3* sides, - const CGAL::Bbox_3& bbox) + const Box3& bbox) { const typename K::Point_3* j = & triangle.vertex(SIDE); const typename K::Point_3* k = & triangle.vertex((SIDE+2)%3); typename K::Point_3 p_min, p_max; - get_min_max(AXE==0? 0: AXE==1? sides[SIDE].z(): -sides[SIDE].y(), - AXE==0? -sides[SIDE].z(): AXE==1? 0: sides[SIDE].x(), - AXE==0? sides[SIDE].y(): AXE==1? -sides[SIDE].x(): - typename K::FT(0), bbox, p_min, p_max); + get_min_max(AXE==0? 0: AXE==1? sides[SIDE].z(): -sides[SIDE].y(), + AXE==0? -sides[SIDE].z(): AXE==1? 0: sides[SIDE].x(), + AXE==0? sides[SIDE].y(): AXE==1? -sides[SIDE].x(): + typename K::FT(0), bbox, p_min, p_max); switch ( AXE ) { @@ -238,10 +240,10 @@ namespace internal { } } - template - bool do_intersect(const typename K::Triangle_3& a_triangle, - const CGAL::Bbox_3& a_bbox, - const K& k) + template + bool do_intersect_bbox_or_iso_cuboid(const typename K::Triangle_3& a_triangle, + const Box3& a_bbox, + const K& k) { if(certainly_not( do_bbox_intersect(a_triangle, a_bbox) )) @@ -286,11 +288,11 @@ namespace internal { typename K::Triangle_3 triangle(a_triangle[0]-v, a_triangle[1]-v, a_triangle[2]-v); - Bbox_3 bbox( (p-v).bbox() + (q-v).bbox()); + Box3 bbox( (p-v).bbox() + (q-v).bbox()); #else const typename K::Triangle_3& triangle = a_triangle; - const Bbox_3& bbox = a_bbox; + const Box3& bbox = a_bbox; #endif // Create a "certainly true" @@ -298,7 +300,7 @@ namespace internal { if (forbidden_axis!=0){ if (forbidden_size!=0){ - Uncertain b = do_axis_intersect(triangle, sides, bbox); + Uncertain b = do_axis_intersect(triangle, sides, bbox); if(is_indeterminate(b)){ ind_or_true = b; } else if(! b){ @@ -306,7 +308,7 @@ namespace internal { } } if (forbidden_size!=1){ - Uncertain b = do_axis_intersect(triangle, sides, bbox); + Uncertain b = do_axis_intersect(triangle, sides, bbox); if(is_indeterminate(b)){ ind_or_true = b; } else if(! b){ @@ -314,7 +316,7 @@ namespace internal { } } if (forbidden_size!=2){ - Uncertain b = do_axis_intersect(triangle, sides, bbox); + Uncertain b = do_axis_intersect(triangle, sides, bbox); if(is_indeterminate(b)){ ind_or_true = b; } else if(! b){ @@ -325,7 +327,7 @@ namespace internal { if (forbidden_axis!=1){ if (forbidden_size!=0){ - Uncertain b = do_axis_intersect(triangle, sides, bbox); + Uncertain b = do_axis_intersect(triangle, sides, bbox); if(is_indeterminate(b)){ ind_or_true = b; } else if(! b){ @@ -333,7 +335,7 @@ namespace internal { } } if (forbidden_size!=1){ - Uncertain b = do_axis_intersect(triangle, sides, bbox); + Uncertain b = do_axis_intersect(triangle, sides, bbox); if(is_indeterminate(b)){ ind_or_true = b; } else if(! b){ @@ -341,7 +343,7 @@ namespace internal { } } if (forbidden_size!=2){ - Uncertain b = do_axis_intersect(triangle, sides, bbox); + Uncertain b = do_axis_intersect(triangle, sides, bbox); if(is_indeterminate(b)){ ind_or_true = b; } else if(! b){ @@ -352,7 +354,7 @@ namespace internal { if (forbidden_axis!=2){ if (forbidden_size!=0){ - Uncertain b = do_axis_intersect(triangle, sides, bbox); + Uncertain b = do_axis_intersect(triangle, sides, bbox); if(is_indeterminate(b)){ ind_or_true = b; } else if(! b){ @@ -360,7 +362,7 @@ namespace internal { } } if (forbidden_size!=1){ - Uncertain b = do_axis_intersect(triangle, sides, bbox); + Uncertain b = do_axis_intersect(triangle, sides, bbox); if(is_indeterminate(b)){ ind_or_true = b; } else if(! b){ @@ -368,7 +370,7 @@ namespace internal { } } if (forbidden_size!=2){ - Uncertain b = do_axis_intersect(triangle, sides, bbox); + Uncertain b = do_axis_intersect(triangle, sides, bbox); if(is_indeterminate(b)){ ind_or_true = b; } else if(! b){ @@ -379,29 +381,24 @@ namespace internal { return ind_or_true; // throws exception in case it is indeterminate } + template + bool do_intersect(const typename K::Triangle_3& triangle, + const CGAL::Bbox_3& bbox, + const K& k) + { + return do_intersect_bbox_or_iso_cuboid(triangle, bbox, k); + } + template bool do_intersect(const CGAL::Bbox_3& bbox, const typename K::Triangle_3& triangle, const K& k) { - return do_intersect(triangle, bbox, k); + return do_intersect_bbox_or_iso_cuboid(triangle, bbox, k); } } // namespace internal - -template -bool do_intersect(const CGAL::Bbox_3 a, - const Triangle_3& b) { - return K().do_intersect_3_object()(a, b); -} - -template -bool do_intersect(const Triangle_3& a, - const CGAL::Bbox_3& b) { - return K().do_intersect_3_object()(a, b); -} - - +} // namespace Intersections } //namespace CGAL #include diff --git a/Intersections_3/include/CGAL/Intersections_3/internal/Iso_cuboid_3_Ray_3_do_intersect.h b/Intersections_3/include/CGAL/Intersections_3/internal/Iso_cuboid_3_Ray_3_do_intersect.h new file mode 100644 index 00000000000..16baac9bf82 --- /dev/null +++ b/Intersections_3/include/CGAL/Intersections_3/internal/Iso_cuboid_3_Ray_3_do_intersect.h @@ -0,0 +1,75 @@ +// Copyright (c) 2008 ETH Zurich (Switzerland) +// Copyright (c) 2008-2009 INRIA Sophia-Antipolis (France) +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org); you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 3 of the License, +// or (at your option) any later version. +// +// 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$ +// SPDX-License-Identifier: LGPL-3.0+ +// +// +// Author(s) : Camille Wormser, Jane Tournois, Pierre Alliez, Stephane Tayeb + +#ifndef CGAL_INTERNAL_INTERSECTIONS_3_ISO_CUBOID_3_RAY_3_DO_INTERSECT_H +#define CGAL_INTERNAL_INTERSECTIONS_3_ISO_CUBOID_3_RAY_3_DO_INTERSECT_H + +#include +#include + +#include +// for CGAL::internal::do_intersect_bbox_segment_aux + +// inspired from http://cag.csail.mit.edu/~amy/papers/box-jgt.pdf + +namespace CGAL { + +namespace Intersections { + +namespace internal { + +template +bool do_intersect(const typename K::Ray_3& ray, + const typename K::Iso_cuboid_3& ic, + const K&) +{ + typedef typename K::FT FT; + typedef typename K::Point_3 Point_3; + + const Point_3& source = ray.source(); + const Point_3& point_on_ray = ray.second_point(); + + return do_intersect_bbox_segment_aux + // do not use static filters + ( + source.x(), source.y(), source.z(), + point_on_ray.x(), point_on_ray.y(), point_on_ray.z(), + (ic.min)().x(), (ic.min)().y(), (ic.min)().z(), + (ic.max)().x(), (ic.max)().y(), (ic.max)().z() + ); +} + +template +bool do_intersect(const typename K::Iso_cuboid_3& ic, + const typename K::Ray_3& ray, + const K&) { + return do_intersect(ray, ic, K()); +} + +} // namespace internal +} // namespace Intersections +} //namespace CGAL + +#endif // CGAL_INTERNAL_INTERSECTIONS_3_ISO_CUBOID_3_RAY_3_DO_INTERSECT_H diff --git a/Intersections_3/include/CGAL/Intersections_3/internal/Iso_cuboid_3_Segment_3_do_intersect.h b/Intersections_3/include/CGAL/Intersections_3/internal/Iso_cuboid_3_Segment_3_do_intersect.h new file mode 100644 index 00000000000..87d1ef922d3 --- /dev/null +++ b/Intersections_3/include/CGAL/Intersections_3/internal/Iso_cuboid_3_Segment_3_do_intersect.h @@ -0,0 +1,75 @@ +// Copyright (c) 2008 ETH Zurich (Switzerland) +// Copyright (c) 2008-2009 INRIA Sophia-Antipolis (France) +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org); you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 3 of the License, +// or (at your option) any later version. +// +// 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$ +// SPDX-License-Identifier: LGPL-3.0+ +// +// +// Author(s) : Camille Wormser, Jane Tournois, Pierre Alliez, Stephane Tayeb + +#ifndef CGAL_INTERNAL_INTERSECTIONS_3_ISO_CUBOID_3_SEGMENT_3_DO_INTERSECT_H +#define CGAL_INTERNAL_INTERSECTIONS_3_ISO_CUBOID_3_SEGMENT_3_DO_INTERSECT_H + +#include +#include + +#include +// for CGAL::internal::do_intersect_bbox_segment_aux + +// inspired from http://cag.csail.mit.edu/~amy/papers/box-jgt.pdf + +namespace CGAL { + +namespace Intersections { + +namespace internal { + +template +bool do_intersect(const typename K::Segment_3& seg, + const typename K::Iso_cuboid_3& ic, + const K&) +{ + typedef typename K::FT FT; + typedef typename K::Point_3 Point_3; + + const Point_3& source = seg.source(); + const Point_3& target = seg.target(); + + return do_intersect_bbox_segment_aux + // do not use static filters + ( + source.x(), source.y(), source.z(), + target.x(), target.y(), target.z(), + (ic.min)().x(), (ic.min)().y(), (ic.min)().z(), + (ic.max)().x(), (ic.max)().y(), (ic.max)().z() + ); +} + +template +bool do_intersect(const typename K::Iso_cuboid_3& ic, + const typename K::Segment_3& seg, + const K&) { + return do_intersect(seg, ic, K()); +} + +} // namespace internal +} // namespace Intersections +} //namespace CGAL + +#endif // CGAL_INTERNAL_INTERSECTIONS_3_ISO_CUBOID_3_SEGMENT_3_DO_INTERSECT_H diff --git a/Intersections_3/include/CGAL/Intersections_3/internal/Iso_cuboid_3_Sphere_3_do_intersect.h b/Intersections_3/include/CGAL/Intersections_3/internal/Iso_cuboid_3_Sphere_3_do_intersect.h new file mode 100644 index 00000000000..1e70cfef505 --- /dev/null +++ b/Intersections_3/include/CGAL/Intersections_3/internal/Iso_cuboid_3_Sphere_3_do_intersect.h @@ -0,0 +1,69 @@ +// Copyright (c) 2008 INRIA Sophia-Antipolis (France), ETH Zurich (Switzerland). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org); you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 3 of the License, +// or (at your option) any later version. +// +// 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$ +// SPDX-License-Identifier: LGPL-3.0+ +// +// +// Author(s) : Camille Wormser, Jane Tournois, Pierre Alliez + + +#ifndef CGAL_INTERNAL_INTERSECTIONS_3_ISO_CUBOID_3_SPHERE_3_DO_INTERSECT_H +#define CGAL_INTERNAL_INTERSECTIONS_3_ISO_CUBOID_3_SPHERE_3_DO_INTERSECT_H + +#include +#include +#include + +namespace CGAL { + +namespace Intersections { + +namespace internal { + +template +bool do_intersect(const typename K::Iso_cuboid_3& ic, + const typename K::Sphere_3& sphere, + const K&) +{ + return do_intersect_sphere_box_3(sphere, ic, K()); +} + +template +bool do_intersect(const typename K::Sphere_3& sphere, + const typename K::Iso_cuboid_3& ic, + const K&) +{ + return do_intersect_sphere_box_3(sphere, ic, K()); +} + +} // namespace internal +} // namespace Intersections + +template +bool do_intersect(const Iso_cuboid_3& a, + const Sphere_3& b) { + return K().do_intersect_3_object()(a, b); +} + +template +bool do_intersect(const Sphere_3& a, + const Iso_cuboid_3& b) { + return K().do_intersect_3_object()(a, b); +} + +} //namespace CGAL + +#endif // CGAL_INTERNAL_INTERSECTIONS_3_ISO_CUBOID_3_SPHERE_3_DO_INTERSECT_H diff --git a/Intersections_3/include/CGAL/Intersections_3/internal/Iso_cuboid_3_Triangle_3_do_intersect.h b/Intersections_3/include/CGAL/Intersections_3/internal/Iso_cuboid_3_Triangle_3_do_intersect.h new file mode 100644 index 00000000000..5af2050b235 --- /dev/null +++ b/Intersections_3/include/CGAL/Intersections_3/internal/Iso_cuboid_3_Triangle_3_do_intersect.h @@ -0,0 +1,65 @@ +// Copyright (c) 2008 INRIA Sophia-Antipolis (France), ETH Zurich (Switzerland). +// Copyright (c) 2010, 2014 GeometryFactory Sarl (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org); you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 3 of the License, +// or (at your option) any later version. +// +// 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$ +// SPDX-License-Identifier: LGPL-3.0+ +// +// +// Author(s) : Camille Wormser, Jane Tournois, Pierre Alliez + +#ifndef CGAL_INTERNAL_INTERSECTIONS_3_ISO_CUBOID_3_TRIANGLE_3_DO_INTERSECT_H +#define CGAL_INTERNAL_INTERSECTIONS_3_ISO_CUBOID_3_TRIANGLE_3_DO_INTERSECT_H + +#include +#include + +// Fast Triangle-Cuboid intersection test, following Tomas Akenine-Moeller description. +// The code looks slightly different from his code because we avoid the translation at +// a minimal cost (and we use C++ ;). + +#include +#include + +namespace CGAL { + +namespace Intersections { + +namespace internal { + +template +bool do_intersect(const typename K::Triangle_3& triangle, + const typename K::Iso_cuboid_3& bbox, + const K& k) +{ + return do_intersect_bbox_or_iso_cuboid(triangle, bbox, k); +} + +template +bool do_intersect(const typename K::Iso_cuboid_3& bbox, + const typename K::Triangle_3& triangle, + const K& k) +{ + return do_intersect_bbox_or_iso_cuboid(triangle, bbox, k); +} + +} // namespace internal +} // namespace Intersections + + + +} //namespace CGAL + +#endif // CGAL_INTERNAL_INTERSECTIONS_3_ISO_CUBOID_3_TRIANGLE_3_DO_INTERSECT_H diff --git a/Intersections_3/include/CGAL/Intersections_3/internal/Tetrahedron_3_Bounded_3_do_intersect.h b/Intersections_3/include/CGAL/Intersections_3/internal/Tetrahedron_3_Bounded_3_do_intersect.h new file mode 100644 index 00000000000..8470ccd03c6 --- /dev/null +++ b/Intersections_3/include/CGAL/Intersections_3/internal/Tetrahedron_3_Bounded_3_do_intersect.h @@ -0,0 +1,187 @@ +// Copyright (c) 2005 +// Utrecht University (The Netherlands), +// ETH Zurich (Switzerland), +// INRIA Sophia-Antipolis (France), +// Max-Planck-Institute Saarbruecken (Germany), +// and Tel-Aviv University (Israel). All rights reserved. +// +// This file is part of CGAL (www.cgal.org); you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 3 of the License, +// or (at your option) any later version. +// +// 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$ +// SPDX-License-Identifier: LGPL-3.0+ +// +// +// Author(s) : Nico Kruithof + +#ifndef CGAL_TETRAHEDRON_3_BOUNDED_3_DO_INTERSECT_H +#define CGAL_TETRAHEDRON_3_BOUNDED_3_DO_INTERSECT_H + +#include +#include +#include +#include + +namespace CGAL { + +template +class Tetrahedron_3; + +namespace Intersections { + +namespace internal { + +template +typename K::Boolean +do_intersect(const typename K::Tetrahedron_3 &tet, + const typename K::Triangle_3 &tr, + const K & k); + +// This code is not optimized: + template +typename K::Boolean +do_intersect_tetrahedron_bounded(const Bounded &tr, + const typename K::Tetrahedron_3 &tet, + const typename K::Point_3 &p, + const K & k) +{ + typedef typename K::Triangle_3 Triangle; + + CGAL_kernel_precondition( ! k.is_degenerate_3_object() (tr) ); + CGAL_kernel_precondition( ! k.is_degenerate_3_object() (tet) ); + + typedef typename K::Triangle_3 Triangle; + if (do_intersect(tr, Triangle(tet[0], tet[1], tet[2]), k)) return true; + if (do_intersect(tr, Triangle(tet[0], tet[1], tet[3]), k)) return true; + if (do_intersect(tr, Triangle(tet[0], tet[2], tet[3]), k)) return true; + if (do_intersect(tr, Triangle(tet[1], tet[2], tet[3]), k)) return true; + + return k.has_on_bounded_side_3_object()(tet, p); +} + + +template +inline +typename K::Boolean +do_intersect(const typename K::Tetrahedron_3 &tet, + const typename K::Triangle_3 &tr, + const K & k) +{ + return do_intersect_tetrahedron_bounded(tr, tet, tr[0], k); +} + +template +inline +typename K::Boolean +do_intersect(const typename K::Triangle_3 &tr, + const typename K::Tetrahedron_3 &tet, + const K & k) +{ + return do_intersect_tetrahedron_bounded(tr, tet, tr[0], k); +} + + +template +inline +typename K::Boolean +do_intersect(const typename K::Tetrahedron_3 &tet, + const typename K::Segment_3 &seg, + const K & k) +{ + return do_intersect_tetrahedron_bounded(seg, tet, seg.source(), k); +} + +template +inline +typename K::Boolean +do_intersect(const typename K::Segment_3 &seg, + const typename K::Tetrahedron_3 &tet, + const K & k) +{ + return do_intersect_tetrahedron_bounded(seg, tet, seg.source(), k); +} + +template +inline +typename K::Boolean +do_intersect(const typename K::Tetrahedron_3 &tet, + const typename K::Iso_cuboid_3 &ic, + const K & k) +{ + return do_intersect_tetrahedron_bounded(ic, tet, ic[0], k); +} + +template +inline +typename K::Boolean +do_intersect(const typename K::Iso_cuboid_3 &ic, + const typename K::Tetrahedron_3 &tet, + const K & k) +{ + return do_intersect_tetrahedron_bounded(ic, tet, ic[0], k); +} + +template +inline +typename K::Boolean +do_intersect(const typename K::Tetrahedron_3 &tet, + const typename K::Sphere_3 &sp, + const K & k) +{ + return do_intersect_tetrahedron_bounded(sp, tet, sp.center(), k); +} + +template +inline +typename K::Boolean +do_intersect(const typename K::Sphere_3 &sp, + const typename K::Tetrahedron_3 &tet, + const K & k) +{ + return do_intersect_tetrahedron_bounded(sp, tet, sp.center(), k); +} + +template +inline +typename K::Boolean +do_intersect(const typename K::Tetrahedron_3 &tet, + const typename K::Tetrahedron_3 &sp, + const K & k) +{ + return do_intersect_tetrahedron_bounded(sp, tet, tet[0], k); +} + +template +inline +typename K::Boolean +do_intersect(const typename K::Tetrahedron_3 &tet, + const CGAL::Bbox_3 &bb, + const K & k) +{ + return do_intersect_tetrahedron_bounded(bb, tet, typename K::Point_3(bb.xmin(), bb.ymin(), bb.zmin()), k); +} + + template +inline +typename K::Boolean +do_intersect(const CGAL::Bbox_3 &bb, + const typename K::Tetrahedron_3 &tet, + const K & k) +{ + return do_intersect_tetrahedron_bounded(bb, tet, typename K::Point_3(bb.xmin(), bb.ymin(), bb.zmin()), k); +} + +} // namespace internal +} // namespace Intersections +} //namespace CGAL + +#endif // CGAL_TETRAHEDRON_3_BOUNDED_3_DO_INTERSECT_H diff --git a/Intersections_3/include/CGAL/Intersections_3/internal/Tetrahedron_3_Unbounded_3_do_intersect.h b/Intersections_3/include/CGAL/Intersections_3/internal/Tetrahedron_3_Unbounded_3_do_intersect.h new file mode 100644 index 00000000000..65c9d38c3be --- /dev/null +++ b/Intersections_3/include/CGAL/Intersections_3/internal/Tetrahedron_3_Unbounded_3_do_intersect.h @@ -0,0 +1,97 @@ +// Copyright (c) 2018 GeometryFactory Sarl (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org); you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 3 of the License, +// or (at your option) any later version. +// +// 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$ +// SPDX-License-Identifier: LGPL-3.0+ +// +// +// Author(s) : Andreas Fabri + +#ifndef CGAL_INTERNAL_INTERSECTIONS_3_TETRAHEDRON_3_DO_INTERSECT_H +#define CGAL_INTERNAL_INTERSECTIONS_3_TETRAHEDRON_3_DO_INTERSECT_H + +#include +#include +#include + +namespace CGAL { + +namespace Intersections { + +namespace internal { + +template +bool do_intersect_tetrahedron_unbounded(const typename K::Tetrahedron_3& tet, + const Unbounded& unb, + const K& k) { + typedef typename K::Triangle_3 Triangle; + if (do_intersect(unb,Triangle(tet[0], tet[1], tet[2]), k)) return true; + if (do_intersect(unb, Triangle(tet[0], tet[1], tet[3]), k)) return true; + if (do_intersect(unb, Triangle(tet[0], tet[2], tet[3]), k)) return true; + if (do_intersect(unb, Triangle(tet[1], tet[2], tet[3]), k)) return true; + return false; +} + + + +template +bool do_intersect(const typename K::Plane_3& unb, + const typename K::Tetrahedron_3& tet, + const K& k) { + return do_intersect_tetrahedron_unbounded(tet, unb, k); +} + +template +bool do_intersect(const typename K::Tetrahedron_3& tet, + const typename K::Plane_3& unb, + const K& k) { + return do_intersect_tetrahedron_unbounded(tet, unb, k); +} + + +template +bool do_intersect(const typename K::Line_3& unb, + const typename K::Tetrahedron_3& tet, + const K& k) { + return do_intersect_tetrahedron_unbounded(tet, unb, k); +} + +template +bool do_intersect(const typename K::Tetrahedron_3& tet, + const typename K::Line_3& unb, + const K& k) { + return do_intersect_tetrahedron_unbounded(tet, unb, k); +} + + +template +bool do_intersect(const typename K::Ray_3& unb, + const typename K::Tetrahedron_3& tet, + const K& k) { + return do_intersect_tetrahedron_unbounded(tet, unb, k); +} + +template +bool do_intersect(const typename K::Tetrahedron_3& tet, + const typename K::Ray_3& unb, + const K& k) { + return do_intersect_tetrahedron_unbounded(tet, unb, k); +} + +} // namespace internal +} // namespace Intersections +} // namespace CGAL + +#endif // CGAL_INTERNAL_INTERSECTIONS_3_TETRAHEDRON_3_DO_INTERSECT_H diff --git a/Intersections_3/include/CGAL/Triangle_3_Line_3_do_intersect.h b/Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Line_3_do_intersect.h similarity index 98% rename from Intersections_3/include/CGAL/Triangle_3_Line_3_do_intersect.h rename to Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Line_3_do_intersect.h index c73b2d12486..d68297aebea 100644 --- a/Intersections_3/include/CGAL/Triangle_3_Line_3_do_intersect.h +++ b/Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Line_3_do_intersect.h @@ -34,6 +34,9 @@ namespace CGAL { template class Line_3; + +namespace Intersections { + namespace internal { template @@ -117,9 +120,7 @@ bool do_intersect(const typename K::Line_3 &l, } } // namespace internal - -CGAL_DO_INTERSECT_FUNCTION(Triangle_3, Line_3, 3) - +} // namespace Intersections } //namespace CGAL #endif //CGAL_TRIANGLE_3_LINE_3_DO_INTERSECT_H diff --git a/Intersections_3/include/CGAL/internal/Intersections_3/Triangle_3_Line_3_intersection.h b/Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Line_3_intersection.h similarity index 99% rename from Intersections_3/include/CGAL/internal/Intersections_3/Triangle_3_Line_3_intersection.h rename to Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Line_3_intersection.h index a290b1b77d8..fa32149ab80 100644 --- a/Intersections_3/include/CGAL/internal/Intersections_3/Triangle_3_Line_3_intersection.h +++ b/Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Line_3_intersection.h @@ -28,6 +28,9 @@ #include namespace CGAL { + +namespace Intersections { + namespace internal { template @@ -420,10 +423,7 @@ intersection(const typename K::Line_3 &l, } // end namespace internal - -CGAL_INTERSECTION_FUNCTION(Triangle_3, Line_3, 3) - - +} // namespace Intersections } // end namespace CGAL #endif // CGAL_INTERNAL_INTERSECTIONS_3_TRIANGLE_3_LINE_3_INTERSECTION_H diff --git a/Intersections_3/include/CGAL/Triangle_3_Plane_3_do_intersect.h b/Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Plane_3_do_intersect.h similarity index 97% rename from Intersections_3/include/CGAL/Triangle_3_Plane_3_do_intersect.h rename to Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Plane_3_do_intersect.h index ac785f0ce97..5d6c5a1e5e3 100644 --- a/Intersections_3/include/CGAL/Triangle_3_Plane_3_do_intersect.h +++ b/Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Plane_3_do_intersect.h @@ -34,6 +34,8 @@ namespace CGAL { template class Plane_3; +namespace Intersections { + namespace internal { template @@ -81,9 +83,7 @@ bool do_intersect(const typename K::Plane_3 &h, } // namespace internal - -CGAL_DO_INTERSECT_FUNCTION(Triangle_3, Plane_3, 3) - +} // namespace Intersections } //namespace CGAL #endif //CGAL_TRIANGLE_3_PLANE_3_DO_INTERSECT_H diff --git a/Intersections_3/include/CGAL/Triangle_3_Ray_3_do_intersect.h b/Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Ray_3_do_intersect.h similarity index 99% rename from Intersections_3/include/CGAL/Triangle_3_Ray_3_do_intersect.h rename to Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Ray_3_do_intersect.h index 93864cfdf60..3a181a43466 100644 --- a/Intersections_3/include/CGAL/Triangle_3_Ray_3_do_intersect.h +++ b/Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Ray_3_do_intersect.h @@ -34,6 +34,8 @@ namespace CGAL { template class Ray_3; + +namespace Intersections { namespace internal { namespace R3T3_intersection{ @@ -380,9 +382,7 @@ do_intersect_coplanar(const typename K::Triangle_3 &t, } // namespace internal - -CGAL_DO_INTERSECT_FUNCTION(Triangle_3, Ray_3, 3) - +} // namespace Intersections } //namespace CGAL #endif // CGAL_TRIANGLE_3_RAY_3_DO_INTERSECT_H diff --git a/Intersections_3/include/CGAL/internal/Intersections_3/Triangle_3_Ray_3_intersection.h b/Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Ray_3_intersection.h similarity index 99% rename from Intersections_3/include/CGAL/internal/Intersections_3/Triangle_3_Ray_3_intersection.h rename to Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Ray_3_intersection.h index bdf8830f627..da50c997f0a 100644 --- a/Intersections_3/include/CGAL/internal/Intersections_3/Triangle_3_Ray_3_intersection.h +++ b/Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Ray_3_intersection.h @@ -28,6 +28,9 @@ #include namespace CGAL { + +namespace Intersections { + namespace internal { template @@ -577,13 +580,11 @@ typename Intersection_traits::resu intersection(const typename K::Ray_3 &r, const typename K::Triangle_3 &t, const K& k) { - return CGAL::internal::intersection(t, r, k); + return Intersections::internal::intersection(t, r, k); } } // end namespace internal - -CGAL_INTERSECTION_FUNCTION(Triangle_3, Ray_3, 3) - +} // namespace Intersections } // end namespace CGAL #endif // CGAL_INTERNAL_INTERSECTIONS_3_TRIANGLE_3_RAY_3_INTERSECTION_H diff --git a/Intersections_3/include/CGAL/Triangle_3_Segment_3_do_intersect.h b/Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Segment_3_do_intersect.h similarity index 99% rename from Intersections_3/include/CGAL/Triangle_3_Segment_3_do_intersect.h rename to Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Segment_3_do_intersect.h index 3cac5f89d7a..95431085bff 100644 --- a/Intersections_3/include/CGAL/Triangle_3_Segment_3_do_intersect.h +++ b/Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Segment_3_do_intersect.h @@ -34,6 +34,8 @@ namespace CGAL { template class Segment_3; +namespace Intersections { + namespace internal { template @@ -329,9 +331,7 @@ bool do_intersect(const typename K::Segment_3 &s, } } // namespace internal - -CGAL_DO_INTERSECT_FUNCTION(Triangle_3, Segment_3, 3) - +} // namespace Intersections } //namespace CGAL #endif //CGAL_TRIANGLE_3_SEGMENT_3_DO_INTERSECT_H diff --git a/Intersections_3/include/CGAL/internal/Intersections_3/Triangle_3_Segment_3_intersection.h b/Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Segment_3_intersection.h similarity index 99% rename from Intersections_3/include/CGAL/internal/Intersections_3/Triangle_3_Segment_3_intersection.h rename to Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Segment_3_intersection.h index 31f9fcf7dcf..f0bf64c31f3 100644 --- a/Intersections_3/include/CGAL/internal/Intersections_3/Triangle_3_Segment_3_intersection.h +++ b/Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Segment_3_intersection.h @@ -28,6 +28,9 @@ #include namespace CGAL { + +namespace Intersections { + namespace internal { template @@ -560,11 +563,8 @@ intersection(const typename K::Segment_3 &s, return internal::intersection(t,s,k); } - } // end namespace internal - -CGAL_INTERSECTION_FUNCTION(Triangle_3, Segment_3, 3) - +} // namespace Intersections } // end namespace CGAL #endif // CGAL_INTERNAL_INTERSECTIONS_3_TRIANGLE_3_SEGMENT_3_INTERSECTION_H diff --git a/Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Sphere_3_do_intersect.h b/Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Sphere_3_do_intersect.h new file mode 100644 index 00000000000..4cfb6c4b737 --- /dev/null +++ b/Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Sphere_3_do_intersect.h @@ -0,0 +1,131 @@ +// Copyright (c) 2018 GeometryFactory Sarl +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org); you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 3 of the License, +// or (at your option) any later version. +// +// 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$ +// SPDX-License-Identifier: LGPL-3.0+ +// +// +// Author(s) : Andreas Fabri + +#ifndef CGAL_TRIANGLE_3_SPHERE_3_DO_INTERSECT_H +#define CGAL_TRIANGLE_3_SPHERE_3_DO_INTERSECT_H + +#include +#include + +namespace CGAL { + +template +class Triangle_3; + +template +class Sphere_3; + +template +class Line_3; + +namespace Intersections { + +namespace internal { + +template +inline +typename K::Boolean +do_intersect(const typename K::Sphere_3 &sp, + const typename K::Triangle_3 &tr, + const K & /* k */) +{ + return squared_distance(sp.center(), tr) <= sp.squared_radius(); +} + +template +inline +typename K::Boolean +do_intersect(const typename K::Triangle_3 &tr, + const typename K::Sphere_3 &sp, + const K & /* k */) +{ + return squared_distance(sp.center(), tr) <= sp.squared_radius(); +} +template +inline +typename K::Boolean +do_intersect(const typename K::Sphere_3 &sp, + const typename K::Line_3 &lin, + const K & /* k */) +{ + return squared_distance(sp.center(), lin) <= sp.squared_radius(); +} + + +template +inline +typename K::Boolean +do_intersect(const typename K::Line_3 &lin, + const typename K::Sphere_3 &sp, + const K & /* k */) +{ + return squared_distance(sp.center(), lin) <= sp.squared_radius(); +} + + + +template +inline +typename K::Boolean +do_intersect(const typename K::Sphere_3 &sp, + const typename K::Ray_3 &lin, + const K & /* k */) +{ + return squared_distance(sp.center(), lin) <= sp.squared_radius(); +} + + +template +inline +typename K::Boolean +do_intersect(const typename K::Ray_3 &lin, + const typename K::Sphere_3 &sp, + const K & /* k */) +{ + return squared_distance(sp.center(), lin) <= sp.squared_radius(); +} + +template +inline +typename K::Boolean +do_intersect(const typename K::Sphere_3 &sp, + const typename K::Segment_3 &lin, + const K & /* k */) +{ + return squared_distance(sp.center(), lin) <= sp.squared_radius(); +} + + +template +inline +typename K::Boolean +do_intersect(const typename K::Segment_3 &lin, + const typename K::Sphere_3 &sp, + const K & /* k */) +{ + return squared_distance(sp.center(), lin) <= sp.squared_radius(); +} + +} // namespace internal +} // namespace Intersections +} // namespace CGAL + +#endif // CGAL_TRIANGLE_3_SPHERE_3_DO_INTERSECT_H diff --git a/Intersections_3/include/CGAL/Triangle_3_Triangle_3_do_intersect.h b/Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Triangle_3_do_intersect.h similarity index 99% rename from Intersections_3/include/CGAL/Triangle_3_Triangle_3_do_intersect.h rename to Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Triangle_3_do_intersect.h index 12dbbe6b92a..72b6893d6ee 100644 --- a/Intersections_3/include/CGAL/Triangle_3_Triangle_3_do_intersect.h +++ b/Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Triangle_3_do_intersect.h @@ -31,6 +31,8 @@ namespace CGAL { template class Triangle_3; + +namespace Intersections { namespace internal { @@ -450,9 +452,7 @@ do_intersect(const typename K::Triangle_3 &t1, } } // namespace internal - -CGAL_DO_INTERSECT_FUNCTION_SELF(Triangle_3, 3) - +} // namespace Intersections } //namespace CGAL #endif // CGAL_TRIANGLE_3_TRIANGLE_3_DO_INTERSECT_H diff --git a/Intersections_3/include/CGAL/Triangle_3_Triangle_3_intersection.h b/Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Triangle_3_intersection.h similarity index 98% rename from Intersections_3/include/CGAL/Triangle_3_Triangle_3_intersection.h rename to Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Triangle_3_intersection.h index 1035e367c2b..8bcf0c3963d 100644 --- a/Intersections_3/include/CGAL/Triangle_3_Triangle_3_intersection.h +++ b/Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Triangle_3_intersection.h @@ -24,6 +24,7 @@ #define CGAL_TRIANGLE_3_TRIANGLE_3_INTERSECTION_H #include +#include #include #include @@ -34,6 +35,8 @@ namespace CGAL { template class Triangle_3; + +namespace Intersections { namespace internal{ @@ -226,10 +229,8 @@ intersection( return intersection_return(); } -}//namespace internal - -CGAL_INTERSECTION_FUNCTION_SELF(Triangle_3, 3) - +} //namespace internal +} // namespace Intersections } // namespace CGAL diff --git a/Intersections_3/include/CGAL/bbox_intersection_3.h b/Intersections_3/include/CGAL/Intersections_3/internal/bbox_intersection_3.h similarity index 98% rename from Intersections_3/include/CGAL/bbox_intersection_3.h rename to Intersections_3/include/CGAL/Intersections_3/internal/bbox_intersection_3.h index 1351e9650f8..f5a197d144d 100644 --- a/Intersections_3/include/CGAL/bbox_intersection_3.h +++ b/Intersections_3/include/CGAL/Intersections_3/internal/bbox_intersection_3.h @@ -32,6 +32,9 @@ namespace CGAL { +namespace Intersections { + + namespace internal { // This function intersects a bbox with a ray, line or segment // Its essentially a copy of the function that was in Bbox_3_intersections.cpp // But it must be a template function since the original kernel must be @@ -187,6 +190,8 @@ intersection_bl(const Bbox_3 &box, #endif } +} // namespace internal +} // namespace Intersections } //namespace CGAL diff --git a/Intersections_3/include/CGAL/Intersections_3/intersection_3_1_impl.h b/Intersections_3/include/CGAL/Intersections_3/internal/intersection_3_1_impl.h similarity index 94% rename from Intersections_3/include/CGAL/Intersections_3/intersection_3_1_impl.h rename to Intersections_3/include/CGAL/Intersections_3/internal/intersection_3_1_impl.h index 9f65b83e86e..26e25aad2da 100644 --- a/Intersections_3/include/CGAL/Intersections_3/intersection_3_1_impl.h +++ b/Intersections_3/include/CGAL/Intersections_3/internal/intersection_3_1_impl.h @@ -24,12 +24,17 @@ // Author(s) : Geert-Jan Giezeman // Sebastien Loriot +#ifndef CGAL_INTERSECTIONS_3_INTERNAL_INTERSECTION_3_1_IMPL_H +#define CGAL_INTERSECTIONS_3_INTERNAL_INTERSECTION_3_1_IMPL_H #include #include #include #include +#include +#include +#include namespace CGAL { template @@ -53,6 +58,9 @@ namespace CGAL { template class Iso_cuboid_3; + template + class Point_3; + // the special plane_3 function template inline @@ -67,100 +75,7 @@ intersection(const Plane_3 &plane1, const Plane_3 &plane2, return K().intersect_3_object()(plane1, plane2, plane3); } -CGAL_INTERSECTION_FUNCTION(Plane_3, Line_3, 3) -CGAL_DO_INTERSECT_FUNCTION(Plane_3, Line_3, 3) -CGAL_INTERSECTION_FUNCTION_SELF(Plane_3, 3) - -CGAL_INTERSECTION_FUNCTION_SELF(Line_3, 3) -CGAL_DO_INTERSECT_FUNCTION_SELF(Line_3, 3) - -CGAL_INTERSECTION_FUNCTION_SELF(Segment_3, 3) -CGAL_DO_INTERSECT_FUNCTION_SELF(Segment_3, 3) - -CGAL_INTERSECTION_FUNCTION(Line_3, Segment_3, 3) -CGAL_DO_INTERSECT_FUNCTION(Line_3, Segment_3, 3) - -CGAL_INTERSECTION_FUNCTION(Line_3, Ray_3, 3) -CGAL_DO_INTERSECT_FUNCTION(Line_3, Ray_3, 3) - -CGAL_INTERSECTION_FUNCTION(Segment_3, Ray_3, 3) -CGAL_DO_INTERSECT_FUNCTION(Segment_3, Ray_3, 3) - -CGAL_INTERSECTION_FUNCTION_SELF(Ray_3, 3) -CGAL_DO_INTERSECT_FUNCTION_SELF(Ray_3, 3) - -CGAL_INTERSECTION_FUNCTION(Plane_3, Sphere_3, 3) -CGAL_DO_INTERSECT_FUNCTION(Plane_3, Sphere_3, 3) - -CGAL_INTERSECTION_FUNCTION_SELF(Sphere_3, 3) -CGAL_DO_INTERSECT_FUNCTION_SELF(Sphere_3, 3) - -CGAL_INTERSECTION_FUNCTION(Plane_3, Ray_3, 3) -CGAL_DO_INTERSECT_FUNCTION(Plane_3, Ray_3, 3) - -CGAL_INTERSECTION_FUNCTION(Plane_3, Segment_3, 3) -CGAL_DO_INTERSECT_FUNCTION(Plane_3, Segment_3, 3) - -CGAL_INTERSECTION_FUNCTION(Plane_3, Triangle_3, 3) - -template -inline typename -cpp11::result_of::type -intersection(const Line_3 &a, - const Bbox_3 &b) { - return K().intersect_3_object()(a, b); -} - -template -inline typename -cpp11::result_of::type -intersection(const Bbox_3 &a, - const Line_3 &b) { - return K().intersect_3_object()(a, b); -} - -template -inline typename -cpp11::result_of::type -intersection(const Ray_3 &a, - const Bbox_3 &b) { - return K().intersect_3_object()(a, b); -} - -template -inline typename -cpp11::result_of::type -intersection(const Bbox_3 &a, - const Ray_3 &b) { - return K().intersect_3_object()(a, b); -} - -template -inline typename -cpp11::result_of::type -intersection(const Segment_3 &a, - const Bbox_3 &b) { - return K().intersect_3_object()(a, b); -} - -template -inline typename -cpp11::result_of::type -intersection(const Bbox_3 &a, - const Segment_3 &b) { - return K().intersect_3_object()(a, b); -} - -CGAL_INTERSECTION_FUNCTION(Line_3, Iso_cuboid_3, 3) - -CGAL_INTERSECTION_FUNCTION(Ray_3, Iso_cuboid_3, 3) - -CGAL_INTERSECTION_FUNCTION(Segment_3, Iso_cuboid_3, 3) - -CGAL_INTERSECTION_FUNCTION_SELF(Iso_cuboid_3, 3) - -CGAL_DO_INTERSECT_FUNCTION_SELF(Plane_3, 3) template inline bool @@ -169,11 +84,10 @@ do_intersect(const Plane_3 &plane1, const Plane_3 &plane2, return R().do_intersect_3_object()(plane1, plane2, plane3); } -CGAL_DO_INTERSECT_FUNCTION_SELF(Iso_cuboid_3, 3) -CGAL_DO_INTERSECT_FUNCTION(Iso_cuboid_3, Line_3, 3) -CGAL_DO_INTERSECT_FUNCTION(Iso_cuboid_3, Ray_3, 3) -CGAL_DO_INTERSECT_FUNCTION(Iso_cuboid_3, Segment_3, 3) + + +namespace Intersections { namespace internal { template @@ -1699,34 +1613,8 @@ do_intersect(const Iso_cuboid_3 &j, const Line_3 &l, const R&) return bool(CGAL::intersection(l, j)); } -template -inline bool -do_intersect(const Ray_3 &r, const Iso_cuboid_3 &j, const R&) -{ - return bool(CGAL::intersection(r, j)); -} - -template -inline bool -do_intersect(const Iso_cuboid_3 &j, const Ray_3 &r, const R&) -{ - return bool(CGAL::intersection(r, j)); -} - -template -inline bool -do_intersect(const Segment_3 &s, const Iso_cuboid_3 &j, const R&) -{ - return bool(CGAL::intersection(s, j)); -} - -template -inline bool -do_intersect(const Iso_cuboid_3 &j, const Segment_3 &s, const R&) -{ - return bool(CGAL::intersection(s, j)); -} - } // namespace internal +} // namespace Intersections +} // namespace CGAL -} //namespace CGAL +#endif // CGAL_INTERSECTIONS_3_INTERNAL_INTERSECTION_3_1_IMPL_H diff --git a/Intersections_3/include/CGAL/Triangle_3_Tetrahedron_3_do_intersect.h b/Intersections_3/include/CGAL/Triangle_3_Tetrahedron_3_do_intersect.h deleted file mode 100644 index a0987b3529f..00000000000 --- a/Intersections_3/include/CGAL/Triangle_3_Tetrahedron_3_do_intersect.h +++ /dev/null @@ -1,80 +0,0 @@ -// Copyright (c) 2005 -// Utrecht University (The Netherlands), -// ETH Zurich (Switzerland), -// INRIA Sophia-Antipolis (France), -// Max-Planck-Institute Saarbruecken (Germany), -// and Tel-Aviv University (Israel). All rights reserved. -// -// This file is part of CGAL (www.cgal.org); you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 3 of the License, -// or (at your option) any later version. -// -// 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$ -// SPDX-License-Identifier: LGPL-3.0+ -// -// -// Author(s) : Nico Kruithof - -#ifndef CGAL_TRIANGLE_3_TETRAHEDRON_3_DO_INTERSECT_H -#define CGAL_TRIANGLE_3_TETRAHEDRON_3_DO_INTERSECT_H - -#include - -namespace CGAL { - - template - class Tetrahedron_3; - -namespace internal { - -// This code is not optimized: -template -typename K::Boolean -do_intersect(const typename K::Triangle_3 &tr, - const typename K::Tetrahedron_3 &tet, - const K & k) -{ - typedef typename K::Triangle_3 Triangle; - - CGAL_kernel_precondition( ! k.is_degenerate_3_object() (tr) ); - CGAL_kernel_precondition( ! k.is_degenerate_3_object() (tet) ); - - if (do_intersect(tr, Triangle(tet[0], tet[1], tet[2]), k)) return true; - if (do_intersect(tr, Triangle(tet[0], tet[1], tet[3]), k)) return true; - if (do_intersect(tr, Triangle(tet[0], tet[2], tet[3]), k)) return true; - if (do_intersect(tr, Triangle(tet[1], tet[2], tet[3]), k)) return true; - - CGAL_kernel_assertion(k.bounded_side_3_object()(tet, tr[0]) == - k.bounded_side_3_object()(tet, tr[1])); - CGAL_kernel_assertion(k.bounded_side_3_object()(tet, tr[0]) == - k.bounded_side_3_object()(tet, tr[2])); - - return k.has_on_bounded_side_3_object()(tet, tr[0]); -} - - -template -inline -typename K::Boolean -do_intersect(const typename K::Tetrahedron_3 &tet, - const typename K::Triangle_3 &tr, - const K & k) -{ - return do_intersect(tr, tet, k); -} - -} // namespace internal - -CGAL_DO_INTERSECT_FUNCTION(Triangle_3, Tetrahedron_3, 3) - -} //namespace CGAL - -#endif // CGAL_TRIANGLE_3_TETRAHEDRON_3_DO_INTERSECT_H diff --git a/Intersections_3/include/CGAL/intersection_3.h b/Intersections_3/include/CGAL/intersection_3.h index 2aa69cf954c..cc50d65cf87 100644 --- a/Intersections_3/include/CGAL/intersection_3.h +++ b/Intersections_3/include/CGAL/intersection_3.h @@ -1,9 +1,9 @@ -// Copyright (c) 1997 +// Copyright (c) 1997 // Utrecht University (The Netherlands), // ETH Zurich (Switzerland), // INRIA Sophia-Antipolis (France), // Max-Planck-Institute Saarbruecken (Germany), -// and Tel-Aviv University (Israel). All rights reserved. +// and Tel-Aviv University (Israel). All rights reserved. // // This file is part of CGAL (www.cgal.org); you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public License as @@ -19,7 +19,7 @@ // $URL$ // $Id$ // SPDX-License-Identifier: LGPL-3.0+ -// +// // // Author(s) : Geert-Jan Giezeman @@ -29,28 +29,71 @@ #include -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include + +#include +#include + +#include #include diff --git a/Intersections_3/include/CGAL/intersection_3_1.h b/Intersections_3/include/CGAL/intersection_3_1.h index 3d6a6338ade..b8b607d3500 100644 --- a/Intersections_3/include/CGAL/intersection_3_1.h +++ b/Intersections_3/include/CGAL/intersection_3_1.h @@ -28,7 +28,7 @@ #ifndef CGAL_INTERSECTION_3_1_H #define CGAL_INTERSECTION_3_1_H -#include -#include +#include +#include #endif // CGAL_INTERSECTION_3_1_H diff --git a/Intersections_3/package_info/Intersections_3/dependencies b/Intersections_3/package_info/Intersections_3/dependencies index 9404dbf7f32..a53fa50a264 100644 --- a/Intersections_3/package_info/Intersections_3/dependencies +++ b/Intersections_3/package_info/Intersections_3/dependencies @@ -1,5 +1,6 @@ Algebraic_foundations Distance_2 +Distance_3 Installation Intersections_2 Intersections_3 diff --git a/Intersections_3/test/Intersections_3/CMakeLists.txt b/Intersections_3/test/Intersections_3/CMakeLists.txt index 97393c87e2d..f218d33bd42 100644 --- a/Intersections_3/test/Intersections_3/CMakeLists.txt +++ b/Intersections_3/test/Intersections_3/CMakeLists.txt @@ -15,7 +15,6 @@ if ( CGAL_FOUND ) foreach(cppfile ${cppfiles}) create_single_source_cgal_program( "${cppfile}" ) endforeach() - else() message(STATUS "This program requires the CGAL library, and will not be compiled.") diff --git a/Intersections_3/test/Intersections_3/bbox_other_do_intersect_test.cpp b/Intersections_3/test/Intersections_3/bbox_other_do_intersect_test.cpp index 8364de1f8fb..9880a7bc056 100644 --- a/Intersections_3/test/Intersections_3/bbox_other_do_intersect_test.cpp +++ b/Intersections_3/test/Intersections_3/bbox_other_do_intersect_test.cpp @@ -31,7 +31,6 @@ // leda_rational, or Gmpq, or Quotient typedef CGAL::Exact_rational Rational; -#include #include #include #include @@ -62,10 +61,10 @@ typename K::Point_3 random_point_in(const CGAL::Bbox_3& bbox) } -template +template bool test_aux(const T& t, const std::string& name, - const CGAL::Bbox_3& bbox, + const Box3& bbox, bool expected, bool /*exact_predicates*/ = false) { bool b = CGAL::do_intersect(t,bbox); @@ -386,6 +385,7 @@ bool test(bool exact_kernel = false) typedef typename K::Sphere_3 Sphere; typedef typename K::Plane_3 Plane; typedef typename K::Triangle_3 Triangle; + typedef typename K::Iso_cuboid_3 Iso_cuboid_3; CGAL::Bbox_3 bbox(1.0,1.0,1.0,10.0,50.0,100.0); @@ -540,6 +540,12 @@ bool test(bool exact_kernel = false) b &= test_aux(sphE_1,"sphE_1",bbox,true); b &= test_aux(sph1_3,"sph1_3",bbox,true); + b &= test_aux(sphA_1,"sphA_1",Iso_cuboid_3(bbox),false); + b &= test_aux(sphB_1,"sphB_1",Iso_cuboid_3(bbox),true); + b &= test_aux(sphC_1,"sphC_1",Iso_cuboid_3(bbox),false); + b &= test_aux(sphE_1,"sphE_1",Iso_cuboid_3(bbox),true); + b &= test_aux(sph1_3,"sph1_3",Iso_cuboid_3(bbox),true); + Plane Pl1(Point(1,1,1),Vector(0,0,1)); Plane Pl2(Point(1,1,1),Vector(1,1,1)); Plane Pl3(Point(5,5,5),Vector(1,2,-5)); @@ -550,6 +556,11 @@ bool test(bool exact_kernel = false) b &= test_aux(Pl3,"Pl3",bbox,true); b &= test_aux(Pl4,"Pl4",bbox,false); + b &= test_aux(Pl1,"Pl1",Iso_cuboid_3(bbox),true); + b &= test_aux(Pl2,"Pl2",Iso_cuboid_3(bbox),true); + b &= test_aux(Pl3,"Pl3",Iso_cuboid_3(bbox),true); + b &= test_aux(Pl4,"Pl4",Iso_cuboid_3(bbox),false); + Triangle t123(p1,p2,p3); Triangle t124(p1,p2,p4); Triangle t126(p1,p2,p6); @@ -568,6 +579,14 @@ bool test(bool exact_kernel = false) b &= test_aux(t2,"t2",bbox,true); b &= test_aux(t3,"t3",bbox,false); + b &= test_aux(t123,"t123",Iso_cuboid_3(bbox),true); + b &= test_aux(t124,"t124",Iso_cuboid_3(bbox),true); + b &= test_aux(t126,"t126",Iso_cuboid_3(bbox),true); + b &= test_aux(t136,"t136",Iso_cuboid_3(bbox),true); + b &= test_aux(tABC,"tABC",Iso_cuboid_3(bbox),true); + b &= test_aux(t1,"t1",Iso_cuboid_3(bbox),true); + b &= test_aux(t2,"t2",Iso_cuboid_3(bbox),true); + b &= test_aux(t3,"t3",Iso_cuboid_3(bbox),false); // Test more bboxes CGAL::Bbox_3 bbox2(-0.248143,-0.49325,0.0747943,-0.107021,-0.406955,0.151042); @@ -601,6 +620,9 @@ bool test(bool exact_kernel = false) b &= test_aux(line2, "line2", bbox2, false); b &= test_aux(line3, "line3", bbox3, true); b &= test_aux(line4, "line4", bbox4, false); + + Iso_cuboid_3 ic(bbox); + b &= test_aux(ic, "ic", bbox, true); // Use do_intersect(bbox,bbox) CGAL::do_intersect(bbox2,bbox4); diff --git a/Intersections_3/test/Intersections_3/call_test.cpp b/Intersections_3/test/Intersections_3/call_test.cpp index 303078d0076..768c7d4ac6e 100644 --- a/Intersections_3/test/Intersections_3/call_test.cpp +++ b/Intersections_3/test/Intersections_3/call_test.cpp @@ -1,8 +1,5 @@ -#include #include #include -#include -#include #include #include diff --git a/Intersections_3/test/Intersections_3/test_intersections_3.cpp b/Intersections_3/test/Intersections_3/test_intersections_3.cpp index 4a4ec69e0bf..fd14042279b 100644 --- a/Intersections_3/test/Intersections_3/test_intersections_3.cpp +++ b/Intersections_3/test/Intersections_3/test_intersections_3.cpp @@ -62,6 +62,7 @@ struct Test { typedef CGAL::Triangle_3< K > Tr; typedef CGAL::Ray_3< K > R; typedef CGAL::Iso_cuboid_3< K > Cub; + typedef CGAL::Sphere_3< K > Sph; typedef CGAL::Bbox_3 Bbox; @@ -155,6 +156,18 @@ struct Test { return Pl(to_nt(a*w), to_nt(b*w), to_nt(c*w), to_nt(d*w)); } + void P_do_intersect() + { + P p(0,0,0), q(1,0,0), r(2,0,0), s(10,10,10); + Sph sph(p,1); + Cub cub(p,r); + assert(do_intersect(q,sph)); + assert(do_intersect(sph,q)); + assert(! do_intersect(s,cub)); + assert(! do_intersect(cub,s)); + } + + void Cub_Cub() { std::cout << "Iso_cuboid - Iso_cuboid\n"; @@ -556,6 +569,7 @@ struct Test { void run() { std::cout << "3D Intersection tests\n"; + P_do_intersect(); Cub_Cub(); L_Cub(); Pl_L(); @@ -583,3 +597,4 @@ int main() Test< CGAL::Homogeneous >().run(); // TODO : test more kernels. } + diff --git a/Intersections_3/test/Intersections_3/test_point_3_intersections.cpp b/Intersections_3/test/Intersections_3/test_point_3_intersections.cpp new file mode 100644 index 00000000000..999c23f2278 --- /dev/null +++ b/Intersections_3/test/Intersections_3/test_point_3_intersections.cpp @@ -0,0 +1,136 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +typedef CGAL::Exact_predicates_exact_constructions_kernel Epeck; +typedef CGAL::Exact_predicates_inexact_constructions_kernel Epick; + +template +void test_P_Cub() +{ + typedef CGAL::Point_3 P; + typedef CGAL::Iso_cuboid_3 Cub; + P p(0.0,1.0,0.5); + Cub cub(P(-1.0,-1.0,-1.0), P(1.0,1.0,1.0)); + assert(CGAL::do_intersect(p, cub)); + CGAL::Object o = CGAL::intersection(p,cub); + P res; + assert(assign(res, o)); + assert(res == p); +} +template +void test_P_L() +{ + typedef CGAL::Point_3 P; + typedef CGAL::Line_3 Line; + P p(0.99,0.99,0.99); + Line line(P(-1.0,-1.0,-1.0), P(1.0,1.0,1.0)); + assert(CGAL::do_intersect(p, line)); + CGAL::Object o = CGAL::intersection(p,line); + P res; + assert(assign(res, o)); + assert(res == p); +} +template +void test_P_R() +{ + typedef CGAL::Point_3 P; + typedef CGAL::Ray_3 Ray; + P p(0.99,0.99,0.99); + Ray ray(P(-1.0,-1.0,-1.0), P(1.0,1.0,1.0)); + assert(CGAL::do_intersect(p, ray)); + CGAL::Object o = CGAL::intersection(p,ray); + P res; + assert(assign(res, o)); + assert(res == p); +} +template +void test_P_S() +{ + typedef CGAL::Point_3 P; + typedef CGAL::Segment_3 S; + P p(0.99,0.99,0.99); + S s(P(-1.0,-1.0,-1.0), P(1.0,1.0,1.0)); + assert(CGAL::do_intersect(p, s)); + CGAL::Object o = CGAL::intersection(p,s); + P res; + assert(assign(res, o)); + assert(res == p); +} +template +void test_P_P() +{ + typedef CGAL::Point_3 P; + P p(0.99,0.99,0.99); + assert(CGAL::do_intersect(p, p)); + CGAL::Object o = CGAL::intersection(p,p); + P res; + assert(assign(res, o)); + assert(res == p); +} +template +void test_P_Pl() +{ + typedef CGAL::Point_3 P; + typedef CGAL::Plane_3 Pl; + P p(0.99,0.99,0.99); + Pl pl(P(-1.0,-1.0,-1.0), P(1.0,1.0,1.0), P(0.0,0.0,0.0)); + assert(CGAL::do_intersect(p, pl)); + CGAL::Object o = CGAL::intersection(p,pl); + P res; + assert(assign(res, o)); + assert(res == p); +} + +template +void test_P_Tet() +{ + typedef CGAL::Point_3 P; + typedef CGAL::Tetrahedron_3 T; + P p(0,0,0), q(1,0,0), r(1,1,0), s(0,0,1); + T t(p,q,r,s); + P q0(0.1, 0.1, 0.1), q1(10,10,10); + + assert(CGAL::do_intersect(p,t)); + assert(CGAL::do_intersect(t,p)); + + assert(CGAL::do_intersect(q0,t)); + assert(CGAL::do_intersect(t,q0)); + + assert(! CGAL::do_intersect(q1,t)); + assert(! CGAL::do_intersect(t,q1)); +} + +int main() +{ + test_P_Cub(); + test_P_Cub(); + + test_P_L(); + test_P_L(); + + test_P_R(); + test_P_R(); + test_P_S(); + test_P_S(); + + test_P_P(); + test_P_P(); + + test_P_Pl(); + test_P_Pl(); + + test_P_Tet(); + test_P_Tet(); +} +#include + + + diff --git a/Intersections_3/test/Intersections_3/tetrahedron.cpp b/Intersections_3/test/Intersections_3/tetrahedron.cpp new file mode 100644 index 00000000000..2e39619ef3b --- /dev/null +++ b/Intersections_3/test/Intersections_3/tetrahedron.cpp @@ -0,0 +1,56 @@ +#include + +#include + +typedef CGAL::Cartesian K; + +typedef K::Point_3 Point; +typedef K::Tetrahedron_3 Tetrahedron; + +typedef K::Segment_3 Segment; +typedef K::Triangle_3 Triangle; +typedef K::Iso_cuboid_3 Iso_cuboid; +typedef K::Sphere_3 Sphere; + +typedef K::Plane_3 Plane; +typedef K::Line_3 Line; +typedef K::Ray_3 Ray; + +typedef CGAL::Bbox_3 Bbox; + +int main() +{ + Point p(0,0,0), q(10,0,0), r(10,10,0), s(0, 10,10); + Point p2(1,1,1), q2(20,20,20), r2(0,0,20); + Tetrahedron tet(p,q,r,s); + Sphere sp(p2,1.0); + + CGAL::do_intersect(tet,Triangle(p2,q2,r2)); + CGAL::do_intersect(tet,Segment(p2,q2)); + CGAL::do_intersect(tet,Iso_cuboid(p2,q2)); + CGAL::do_intersect(tet,sp); + CGAL::do_intersect(tet,Plane(p2,q2,r2)); + CGAL::do_intersect(tet,Line(p2,q2)); + CGAL::do_intersect(tet,Ray(p2,q2)); + CGAL::do_intersect(tet,tet); + CGAL::do_intersect(tet,sp.bbox()); + CGAL::do_intersect(sp, Line(p2,q2)); + CGAL::do_intersect(sp, Ray(p2,q2)); + CGAL::do_intersect(sp, Segment(p2,q2)); + + + CGAL::do_intersect(Triangle(p2,q2,r2), tet); + CGAL::do_intersect(Segment(p2,q2), tet); + CGAL::do_intersect(Iso_cuboid(p2,q2), tet); + CGAL::do_intersect(sp, tet); + CGAL::do_intersect(Plane(p2,q2,r2), tet); + CGAL::do_intersect(Line(p2,q2), tet); + CGAL::do_intersect(Ray(p2,q2), tet); + CGAL::do_intersect(sp.bbox(), tet); + + CGAL::do_intersect(Line(p2,q2), sp); + CGAL::do_intersect(Ray(p2,q2), sp); + CGAL::do_intersect(Segment(p2,q2), sp); + + return 0; +} diff --git a/Intersections_3/test/Intersections_3/triangle_other.cpp b/Intersections_3/test/Intersections_3/triangle_other.cpp index fdfccc372fe..e9ffa8b5861 100644 --- a/Intersections_3/test/Intersections_3/triangle_other.cpp +++ b/Intersections_3/test/Intersections_3/triangle_other.cpp @@ -1,15 +1,14 @@ #include - -#include #include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include #include #include diff --git a/Intersections_3/test/Intersections_3/triangle_other_intersection_test.cpp b/Intersections_3/test/Intersections_3/triangle_other_intersection_test.cpp index 312b2edbd15..c954ea13b0c 100644 --- a/Intersections_3/test/Intersections_3/triangle_other_intersection_test.cpp +++ b/Intersections_3/test/Intersections_3/triangle_other_intersection_test.cpp @@ -21,7 +21,6 @@ #include -#include #include #include #include diff --git a/Kernel_23/doc/Kernel_23/CGAL/intersections.h b/Kernel_23/doc/Kernel_23/CGAL/intersections.h index 29179cfc0bf..0678d09d11c 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/intersections.h +++ b/Kernel_23/doc/Kernel_23/CGAL/intersections.h @@ -63,6 +63,7 @@ Also, `Type1` and `Type2` can be both of type In three-dimensional space, the types `Type1` and `Type2` can be any of the following: +- `Point_3` - `Plane_3` - `Line_3` - `Ray_3` @@ -220,6 +221,9 @@ It is equivalent to `boost::optional< boost::variant< T... > >`, the last column +Additional overloads are provided for the type `Point_2` combined with any other type with the result type being +`boost::optional< boost::variant< Point_2 > >`. + \cgalHeading{3D Intersections} The return type can be obtained through `CGAL::cpp11::result_of::%type`. @@ -319,6 +323,10 @@ p Point_3, or Segment_3 +Additional overloads are provided for the type `Point_3` combined with any other type with the result type being +`boost::optional< boost::variant< Point_3 > >`. + + \cgalHeading{Examples} The following examples demonstrate the most common use of diff --git a/Kernel_23/doc/Kernel_23/Concepts/FunctionObjectConcepts.h b/Kernel_23/doc/Kernel_23/Concepts/FunctionObjectConcepts.h index 5f6f6b9e38e..20b78926626 100644 --- a/Kernel_23/doc/Kernel_23/Concepts/FunctionObjectConcepts.h +++ b/Kernel_23/doc/Kernel_23/Concepts/FunctionObjectConcepts.h @@ -7395,6 +7395,7 @@ public: the types `Type1` and `Type2` can be any of the following: + - `Kernel::Point_2` - `Kernel::Plane_3` - `Kernel::Line_3` - `Kernel::Ray_3` diff --git a/Kernel_23/include/CGAL/Bbox_3.h b/Kernel_23/include/CGAL/Bbox_3.h index c9a35081bfa..447e1cd4fde 100644 --- a/Kernel_23/include/CGAL/Bbox_3.h +++ b/Kernel_23/include/CGAL/Bbox_3.h @@ -77,6 +77,9 @@ public: inline double min BOOST_PREVENT_MACRO_SUBSTITUTION (int i) const; inline double max BOOST_PREVENT_MACRO_SUBSTITUTION (int i) const; + inline double min_coord(int i) const { return (min)(i); } + inline double max_coord(int i) const { return (max)(i); } + Bbox_3 operator+(const Bbox_3& b) const; Bbox_3& operator+=(const Bbox_3& b); diff --git a/Kernel_23/include/CGAL/Kernel/function_objects.h b/Kernel_23/include/CGAL/Kernel/function_objects.h index ef3224824ba..666344462d5 100644 --- a/Kernel_23/include/CGAL/Kernel/function_objects.h +++ b/Kernel_23/include/CGAL/Kernel/function_objects.h @@ -2951,7 +2951,7 @@ namespace CommonKernelFunctors { template result_type operator()(const T1& t1, const T2& t2) const - { return internal::do_intersect(t1, t2, K()); } + { return Intersections::internal::do_intersect(t1, t2, K()); } }; template @@ -2964,11 +2964,11 @@ namespace CommonKernelFunctors { template result_type operator()(const T1& t1, const T2& t2) const - { return internal::do_intersect(t1, t2, K()); } + { return Intersections::internal::do_intersect(t1, t2, K()); } result_type operator()(const typename K::Plane_3& pl1, const typename K::Plane_3& pl2, const typename K::Plane_3& pl3) const - { return internal::do_intersect(pl1, pl2, pl3, K() ); } + { return Intersections::internal::do_intersect(pl1, pl2, pl3, K() ); } }; @@ -3496,7 +3496,7 @@ namespace CommonKernelFunctors { template typename Intersection_traits::result_type operator()(const T1& t1, const T2& t2) const - { return internal::intersection(t1, t2, K()); } + { return Intersections::internal::intersection(t1, t2, K()); } }; template @@ -3529,7 +3529,7 @@ namespace CommonKernelFunctors { template typename cpp11::result_of< Intersect_3(T1, T2) >::type operator()(const T1& t1, const T2& t2) const - { return internal::intersection(t1, t2, K() ); } + { return Intersections::internal::intersection(t1, t2, K() ); } #if CGAL_INTERSECTION_VERSION < 2 CGAL::Object @@ -3537,7 +3537,7 @@ namespace CommonKernelFunctors { typename boost::optional< boost::variant< typename K::Point_3, typename K::Line_3, typename K::Plane_3 > > #endif operator()(const Plane_3& pl1, const Plane_3& pl2, const Plane_3& pl3)const - { return internal::intersection(pl1, pl2, pl3, K() ); } + { return Intersections::internal::intersection(pl1, pl2, pl3, K() ); } }; template diff --git a/Kernel_d/include/CGAL/Kernel_d/DirectionCd_impl.h b/Kernel_d/include/CGAL/Kernel_d/DirectionCd_impl.h index 6a96d50b083..e9105a004ce 100644 --- a/Kernel_d/include/CGAL/Kernel_d/DirectionCd_impl.h +++ b/Kernel_d/include/CGAL/Kernel_d/DirectionCd_impl.h @@ -52,8 +52,8 @@ cmp(const DirectionCd& h1, int c2 = CGAL_NTS sign(h2.delta(i)); if (c1 != c2) return CGAL_NTS compare(c1,c2); - FT s1 = (FT) CGAL_NTS sign(h2.delta(i)) * h2.delta(i); - FT s2 = (FT) CGAL_NTS sign(h1.delta(i)) * h1.delta(i); + FT s1 = (FT) (int) CGAL_NTS sign(h2.delta(i)) * h2.delta(i); + FT s2 = (FT) (int) CGAL_NTS sign(h1.delta(i)) * h1.delta(i); i++; Comparison_result c; diff --git a/Kernel_d/include/CGAL/Kernel_d/DirectionHd_impl.h b/Kernel_d/include/CGAL/Kernel_d/DirectionHd_impl.h index e7d367c2add..bf10f0923fc 100644 --- a/Kernel_d/include/CGAL/Kernel_d/DirectionHd_impl.h +++ b/Kernel_d/include/CGAL/Kernel_d/DirectionHd_impl.h @@ -52,8 +52,8 @@ cmp(const DirectionHd& h1, int c2 = CGAL_NTS sign(h2.delta(i)); if (c1 != c2) return CGAL_NTS compare(c1,c2); - RT s1 = (RT) CGAL_NTS sign(h2.delta(i)) * h2.delta(i); - RT s2 = (RT) CGAL_NTS sign(h1.delta(i)) * h1.delta(i); + RT s1 = (RT) (int) CGAL_NTS sign(h2.delta(i)) * h2.delta(i); + RT s2 = (RT) (int) CGAL_NTS sign(h1.delta(i)) * h1.delta(i); i++; Comparison_result c; diff --git a/Kernel_d/include/CGAL/Kernel_d/HyperplaneCd_impl.h b/Kernel_d/include/CGAL/Kernel_d/HyperplaneCd_impl.h index 74a7226101b..e9dbe09a305 100644 --- a/Kernel_d/include/CGAL/Kernel_d/HyperplaneCd_impl.h +++ b/Kernel_d/include/CGAL/Kernel_d/HyperplaneCd_impl.h @@ -82,8 +82,8 @@ strong_cmp(const HyperplaneCd& h1, int c1 = CGAL_NTS sign(h1.coefficient(i)); int c2 = CGAL_NTS sign(h2.coefficient(i)); if (c1 != c2) return CGAL_NTS compare(c1,c2); - FT s1 = (FT)CGAL_NTS sign(h2.coefficient(i)) * h2.coefficient(i); - FT s2 = (FT)CGAL_NTS sign(h1.coefficient(i)) * h1.coefficient(i); + FT s1 = (FT)(int)CGAL_NTS sign(h2.coefficient(i)) * h2.coefficient(i); + FT s2 = (FT)(int)CGAL_NTS sign(h1.coefficient(i)) * h1.coefficient(i); Comparison_result c; while (++i <= d) { diff --git a/Kernel_d/include/CGAL/Kernel_d/HyperplaneHd_impl.h b/Kernel_d/include/CGAL/Kernel_d/HyperplaneHd_impl.h index 399f64960e1..5b6ff9e870c 100644 --- a/Kernel_d/include/CGAL/Kernel_d/HyperplaneHd_impl.h +++ b/Kernel_d/include/CGAL/Kernel_d/HyperplaneHd_impl.h @@ -85,8 +85,8 @@ strong_cmp(const HyperplaneHd& h1, int c1 = CGAL_NTS sign(h1.coefficient(i)); int c2 = CGAL_NTS sign(h2.coefficient(i)); if (c1 != c2) return CGAL_NTS compare(c1,c2); - RT s1 = (RT)CGAL_NTS sign(h2.coefficient(i)) * h2.coefficient(i); - RT s2 = (RT)CGAL_NTS sign(h1.coefficient(i)) * h1.coefficient(i); + RT s1 = (RT)(int)CGAL_NTS sign(h2.coefficient(i)) * h2.coefficient(i); + RT s2 = (RT)(int)CGAL_NTS sign(h1.coefficient(i)) * h1.coefficient(i); Comparison_result c; while (++i <= d) { diff --git a/Kernel_d/include/CGAL/Kernel_d/function_objects.h b/Kernel_d/include/CGAL/Kernel_d/function_objects.h index 591f4bd313c..4c1bd3b7829 100644 --- a/Kernel_d/include/CGAL/Kernel_d/function_objects.h +++ b/Kernel_d/include/CGAL/Kernel_d/function_objects.h @@ -222,7 +222,7 @@ public: template typename result::type operator()(const T1& t1, const T2& t2) const - { return internal::intersection(t1, t2, R()); } + { return Intersections::internal::intersection(t1, t2, R()); } #endif }; @@ -235,7 +235,7 @@ class Do_intersect template bool operator()(const T1& t1, const T2& t2) const - { return CGAL::internal::do_intersect(t1, t2, R()); } + { return CGAL::Intersections::internal::do_intersect(t1, t2, R()); } }; } // end namespace internal diff --git a/Kernel_d/include/CGAL/intersections_d.h b/Kernel_d/include/CGAL/intersections_d.h index 6ad4e019ba2..b37feb2356c 100644 --- a/Kernel_d/include/CGAL/intersections_d.h +++ b/Kernel_d/include/CGAL/intersections_d.h @@ -30,6 +30,7 @@ #include namespace CGAL { +namespace Intersections { namespace internal { template @@ -358,6 +359,7 @@ inline bool do_intersect(const typename R::Hyperplane_d& h, const typename R::Se { return do_intersect(s,h,r); } } //namespace internal +} // namespace Intersections template class Hyperplane_d; diff --git a/Maintenance/infrastructure/cgal.geometryfactory.com/crontab b/Maintenance/infrastructure/cgal.geometryfactory.com/crontab index 477146a3739..8cc7faac577 100644 --- a/Maintenance/infrastructure/cgal.geometryfactory.com/crontab +++ b/Maintenance/infrastructure/cgal.geometryfactory.com/crontab @@ -9,7 +9,7 @@ # | | | | | # * * * * * command to be executed -PATH=/bin:/usr/bin:/home/lrineau/bin +PATH=/home/lrineau/bin-cmake3:/bin:/usr/bin:/home/lrineau/bin LC_CTYPE=en_US.UTF-8 # Update testsuite result pages diff --git a/Mesh_3/include/CGAL/IO/File_medit.h b/Mesh_3/include/CGAL/IO/File_medit.h index 8b12c81e1c4..656a6b5db98 100644 --- a/Mesh_3/include/CGAL/IO/File_medit.h +++ b/Mesh_3/include/CGAL/IO/File_medit.h @@ -815,27 +815,28 @@ output_to_medit(std::ostream& os, fit != c3t3.facets_in_complex_end(); ++fit) { - for (int i=0; i<4; i++) - { - if (i != fit->second) - { - const Vertex_handle& vh = (*fit).first->vertex(i); - os << V[vh] << ' '; - } - } + typename C3T3::Facet f = (*fit); + + // Apply priority among subdomains, to get consistent facet orientation per subdomain-pair interface. + if (f.first->subdomain_index() < f.first->neighbor(f.second)->subdomain_index()) + f = tr.mirror_facet(f); + + // Get facet vertices in CCW order. + Vertex_handle vh1 = f.first->vertex((f.second + 1) % 4); + Vertex_handle vh2 = f.first->vertex((f.second + 2) % 4); + Vertex_handle vh3 = f.first->vertex((f.second + 3) % 4); + + // Facet orientation also depends on parity. + if (f.second % 2 != 0) + std::swap(vh2, vh3); + + os << V[vh1] << ' ' << V[vh2] << ' ' << V[vh3] << ' '; os << get(facet_pmap, *fit) << '\n'; // Print triangle again if needed if ( print_each_facet_twice ) { - for (int i=0; i<4; i++) - { - if (i != fit->second) - { - const Vertex_handle& vh = (*fit).first->vertex(i); - os << V[vh] << ' '; - } - } + os << V[vh1] << ' ' << V[vh2] << ' ' << V[vh3] << ' '; os << get(facet_twice_pmap, *fit) << '\n'; } } diff --git a/Minkowski_sum_2/include/CGAL/Minkowski_sum_2/AABB_collision_detector_2.h b/Minkowski_sum_2/include/CGAL/Minkowski_sum_2/AABB_collision_detector_2.h index ce242327a99..07237a6828b 100644 --- a/Minkowski_sum_2/include/CGAL/Minkowski_sum_2/AABB_collision_detector_2.h +++ b/Minkowski_sum_2/include/CGAL/Minkowski_sum_2/AABB_collision_detector_2.h @@ -83,22 +83,34 @@ public: // If t_q is inside of P, or t_p is inside of Q, one polygon is completely // inside of the other. - Point_2 t_q = *m_q.outer_boundary().vertices_begin() - Vector_2(ORIGIN, t); - Point_2 t_p = *m_p.outer_boundary().vertices_begin() + Vector_2(ORIGIN, t); + + // Obtain a point on the boundary of m_q: + Point_2 t_q = (! m_q.outer_boundary().is_empty()) ? + *m_q.outer_boundary().vertices_begin() - Vector_2(ORIGIN, t) : + *m_q.holes_begin()->vertices_begin() - Vector_2(ORIGIN, t); + + // Obtain a point on the boundary of m_p: + Point_2 t_p = (! m_p.outer_boundary().is_empty()) ? + *m_p.outer_boundary().vertices_begin() + Vector_2(ORIGIN, t) : + *m_p.holes_begin()->vertices_begin() + Vector_2(ORIGIN, t); // Use bounded_side_2() instead of on_bounded_side() because the latter // checks vor simplicity every time. - bool in_mp = - bounded_side_2(m_p.outer_boundary().vertices_begin(), - m_p.outer_boundary().vertices_end(), t_q, - m_p.outer_boundary().traits_member()) == ON_BOUNDED_SIDE; + bool in_mp(true); + if (! m_p.outer_boundary().is_empty()) + in_mp = + bounded_side_2(m_p.outer_boundary().vertices_begin(), + m_p.outer_boundary().vertices_end(), t_q, + m_p.outer_boundary().traits_member()) == ON_BOUNDED_SIDE; if (m_p.number_of_holes() == 0) { if (in_mp) return true; } - bool in_mq = - bounded_side_2(m_q.outer_boundary().vertices_begin(), - m_q.outer_boundary().vertices_end(), t_p, - m_q.outer_boundary().traits_member()) == ON_BOUNDED_SIDE; + bool in_mq(true); + if (! m_q.outer_boundary().is_empty()) + in_mq = + bounded_side_2(m_q.outer_boundary().vertices_begin(), + m_q.outer_boundary().vertices_end(), t_p, + m_q.outer_boundary().traits_member()) == ON_BOUNDED_SIDE; if (m_q.number_of_holes() == 0) { if (in_mq) return true; } diff --git a/Minkowski_sum_2/include/CGAL/Minkowski_sum_2/Minkowski_sum_by_reduced_convolution_2.h b/Minkowski_sum_2/include/CGAL/Minkowski_sum_2/Minkowski_sum_by_reduced_convolution_2.h index ef37f9d9336..0dfe977b2ee 100644 --- a/Minkowski_sum_2/include/CGAL/Minkowski_sum_2/Minkowski_sum_by_reduced_convolution_2.h +++ b/Minkowski_sum_2/include/CGAL/Minkowski_sum_2/Minkowski_sum_by_reduced_convolution_2.h @@ -169,6 +169,9 @@ private: for (Face_iterator fit = arr.faces_begin(); fit != arr.faces_end(); ++fit) { // Check whether the face is on the M-sum's border. + // The unbounded face cannot contribute to the Minkowski sum + if (fit->is_unbounded()) continue; + // If the face contains holes, it can't be on the Minkowski sum's border if (0 < fit->number_of_holes()) continue; @@ -177,10 +180,8 @@ private: // When the reversed polygon 1, translated by a point inside of this face, // collides with polygon 2, this cannot be a hole - if (! is_outer_boundary_empty) { - Point_2 inner_point = get_point_in_face(fit); - if (collision_detector.check_collision(inner_point)) continue; - } + Point_2 inner_point = get_point_in_face(fit); + if (collision_detector.check_collision(inner_point)) continue; add_face(fit, holes); } diff --git a/Minkowski_sum_2/test/Minkowski_sum_2/data/pwh10.dat b/Minkowski_sum_2/test/Minkowski_sum_2/data/pwh10.dat new file mode 100644 index 00000000000..f483926d047 --- /dev/null +++ b/Minkowski_sum_2/test/Minkowski_sum_2/data/pwh10.dat @@ -0,0 +1,3 @@ +8 +0 0 40 0 40 30 30 30 30 60 10 60 10 30 0 30 +0 diff --git a/Minkowski_sum_2/test/Minkowski_sum_2/data/pwh11.dat b/Minkowski_sum_2/test/Minkowski_sum_2/data/pwh11.dat new file mode 100644 index 00000000000..9e9300123ec --- /dev/null +++ b/Minkowski_sum_2/test/Minkowski_sum_2/data/pwh11.dat @@ -0,0 +1,3 @@ +0 +1 +4 0 40 50 40 50 0 0 0 diff --git a/Minkowski_sum_2/test/Minkowski_sum_2/data/pwh12.dat b/Minkowski_sum_2/test/Minkowski_sum_2/data/pwh12.dat new file mode 100644 index 00000000000..b27a3197cbf --- /dev/null +++ b/Minkowski_sum_2/test/Minkowski_sum_2/data/pwh12.dat @@ -0,0 +1,10 @@ +8 + 0 0 +40 0 +40 30 +30 30 +30 40 +10 40 +10 30 + 0 30 +0 diff --git a/Minkowski_sum_2/test/Minkowski_sum_2/data/pwh9.dat b/Minkowski_sum_2/test/Minkowski_sum_2/data/pwh9.dat new file mode 100644 index 00000000000..3997e4a2e0a --- /dev/null +++ b/Minkowski_sum_2/test/Minkowski_sum_2/data/pwh9.dat @@ -0,0 +1,3 @@ +0 +1 +4 0 40 50 60 50 0 0 0 diff --git a/Minkowski_sum_2/test/Minkowski_sum_2/test_minkowski_sum_with_holes.cmd b/Minkowski_sum_2/test/Minkowski_sum_2/test_minkowski_sum_with_holes.cmd index 864824fd88e..c1c27446dea 100644 --- a/Minkowski_sum_2/test/Minkowski_sum_2/test_minkowski_sum_with_holes.cmd +++ b/Minkowski_sum_2/test/Minkowski_sum_2/test_minkowski_sum_with_holes.cmd @@ -14,3 +14,9 @@ data/pwh7.dat data/pwh6.dat data/pwh2.dat data/pwh8.dat data/pwh8.dat data/pwh2.dat data/pwh8.dat data/pwh8.dat +data/pwh9.dat data/pwh10.dat +data/pwh10.dat data/pwh9.dat +data/pwh11.dat data/pwh10.dat +data/pwh10.dat data/pwh11.dat +data/pwh9.dat data/pwh12.dat +data/pwh12.dat data/pwh9.dat diff --git a/Nef_2/include/CGAL/Bounded_kernel.h b/Nef_2/include/CGAL/Bounded_kernel.h index 736788715f4..09868640f72 100644 --- a/Nef_2/include/CGAL/Bounded_kernel.h +++ b/Nef_2/include/CGAL/Bounded_kernel.h @@ -27,7 +27,7 @@ #include #include -#include +#include #undef CGAL_NEF_DEBUG diff --git a/Nef_2/include/CGAL/Extended_cartesian.h b/Nef_2/include/CGAL/Extended_cartesian.h index 9f6b4603dbb..c0f650302d6 100644 --- a/Nef_2/include/CGAL/Extended_cartesian.h +++ b/Nef_2/include/CGAL/Extended_cartesian.h @@ -27,7 +27,7 @@ #include #include -#include +#include #include #undef CGAL_NEF_DEBUG diff --git a/Nef_2/include/CGAL/Extended_homogeneous.h b/Nef_2/include/CGAL/Extended_homogeneous.h index ffa4a532689..dcbe2e843fb 100644 --- a/Nef_2/include/CGAL/Extended_homogeneous.h +++ b/Nef_2/include/CGAL/Extended_homogeneous.h @@ -28,7 +28,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/Nef_2/include/CGAL/Nef_2/HDS_items.h b/Nef_2/include/CGAL/Nef_2/HDS_items.h index 1265cb2eb87..25b7da232d1 100644 --- a/Nef_2/include/CGAL/Nef_2/HDS_items.h +++ b/Nef_2/include/CGAL/Nef_2/HDS_items.h @@ -389,7 +389,9 @@ public: hit->reset_fcit(); for (Isolated_vertex_iterator vit = iv_begin(); vit!=iv_end(); ++vit) vit->reset_ivit(); - FC.clear(); IV.clear(); } + FC.clear(); IV.clear(); + _e=Halfedge_handle(); + } /*{\Mtext There are the same iterator ranges defined for the const iterators |Hole_const_iterator|, |Isolated_vertex_const_iterator|. diff --git a/Nef_2/include/CGAL/Nef_2/PM_const_decorator.h b/Nef_2/include/CGAL/Nef_2/PM_const_decorator.h index 2e0f62cb940..5f4b92ef5d2 100644 --- a/Nef_2/include/CGAL/Nef_2/PM_const_decorator.h +++ b/Nef_2/include/CGAL/Nef_2/PM_const_decorator.h @@ -473,7 +473,7 @@ check_integrity_and_topological_planarity(bool faces) const int fc_num(0),iv_num(0); Face_const_iterator fit; for (fit = faces_begin(); fit != faces_end(); ++fit) { - if (!first) { + if (!first && halfedge(fit)!=Halfedge_const_handle()) { CGAL_assertion( face(halfedge(fit))==fit ); ++fc_num; } Hole_const_iterator fcit; diff --git a/Nef_2/test/Nef_2/Nef_polyhedron_2-test.cpp b/Nef_2/test/Nef_2/Nef_polyhedron_2-test.cpp index a5e504c971c..17f80e626af 100644 --- a/Nef_2/test/Nef_2/Nef_polyhedron_2-test.cpp +++ b/Nef_2/test/Nef_2/Nef_polyhedron_2-test.cpp @@ -7,16 +7,8 @@ #include #include -#if defined (CGAL_USE_LEDA) || defined (CGAL_USE_GMP) - typedef CGAL::Exact_integer Integer; typedef CGAL::Exact_rational Rational; -#else -typedef long Integer; -typedef double Rational; -#endif - - int main() { diff --git a/Nef_3/test/Nef_3/test_nef_3_io_Cartesian_Lazy.cpp b/Nef_3/test/Nef_3/test_nef_3_io_Cartesian_Lazy.cpp index 0793d81fcaf..370c6c5caf7 100644 --- a/Nef_3/test/Nef_3/test_nef_3_io_Cartesian_Lazy.cpp +++ b/Nef_3/test/Nef_3/test_nef_3_io_Cartesian_Lazy.cpp @@ -9,9 +9,7 @@ #include typedef CGAL::internal::Exact_field_selector::Type FT; -typedef CGAL::Fraction_traits::Numerator_type RT; typedef CGAL::Lazy_exact_nt < FT > Lazy_FT; -typedef CGAL::Lazy_exact_nt < RT > Lazy_RT; typedef CGAL::Cartesian< Lazy_FT > C_Lazy_FT; typedef CGAL::Simple_cartesian< Lazy_FT > SC_Lazy_FT; @@ -22,9 +20,12 @@ void test_write_read() typedef CGAL::Nef_polyhedron_3< Kernel > Nef_polyhedron; typedef CGAL::Polyhedron_3< Kernel > Polyhedron; typedef typename Kernel::Point_3 Point; + typedef typename Kernel::RT RT; + // Boost.Multiprecision has trouble constructing Lazy_FT directly from string + typedef typename RT::Exact_type RTE; - typename Kernel::RT n(RT(std::string("6369051672525773"))); - typename Kernel::RT d(RT(std::string("4503599627370496"))); + RT n(RTE(std::string("6369051672525773"))); + RT d(RTE(std::string("4503599627370496"))); Point p(n, 0, 0, d); Point q(0, n, 0, d); diff --git a/Nef_S2/package_info/Nef_S2/dependencies b/Nef_S2/package_info/Nef_S2/dependencies index 37eb1b85d72..75135011028 100644 --- a/Nef_S2/package_info/Nef_S2/dependencies +++ b/Nef_S2/package_info/Nef_S2/dependencies @@ -16,3 +16,4 @@ Profiling_tools STL_Extension Stream_support Union_find +Distance_3 diff --git a/Number_types/include/CGAL/Exact_integer.h b/Number_types/include/CGAL/Exact_integer.h index 5d0989f922e..c6300e5c5a1 100644 --- a/Number_types/include/CGAL/Exact_integer.h +++ b/Number_types/include/CGAL/Exact_integer.h @@ -24,6 +24,7 @@ // Author(s) : Laurent Rineau #include +#include #if CGAL_USE_GMPXX # include #elif CGAL_USE_GMP @@ -32,8 +33,9 @@ # include #elif CGAL_USE_CORE # include +#elif defined CGAL_USE_BOOST_MP #else -# error CGAL is configured with none of GMP, LEDA and CORE. cannot be used. +# error CGAL is configured with none of GMP, LEDA, Boost.Multiprecision and CORE. cannot be used. #endif namespace CGAL { @@ -62,8 +64,11 @@ typedef unspecified_type Exact_integer; typedef mpz_class Exact_integer; #elif CGAL_USE_GMP - +# ifdef CGAL_USE_BOOST_MP +typedef boost::multiprecision::mpz_int Exact_integer; +# else typedef Gmpz Exact_integer; +# endif #elif CGAL_USE_LEDA @@ -73,6 +78,10 @@ typedef leda_integer Exact_integer; typedef CORE::BigInt Exact_integer; +#elif defined CGAL_USE_BOOST_MP + +typedef boost::multiprecision::cpp_int Exact_integer; + #endif // CGAL_USE_CORE #endif // not DOXYGEN_RUNNING diff --git a/Number_types/include/CGAL/MP_Float.h b/Number_types/include/CGAL/MP_Float.h index e5ac0299c01..f58c678098b 100644 --- a/Number_types/include/CGAL/MP_Float.h +++ b/Number_types/include/CGAL/MP_Float.h @@ -879,6 +879,8 @@ inline MP_Float max BOOST_PREVENT_MACRO_SUBSTITUTION(const MP_Float& x,const MP_ // Coercion_traits CGAL_DEFINE_COERCION_TRAITS_FOR_SELF(MP_Float) CGAL_DEFINE_COERCION_TRAITS_FROM_TO(int, MP_Float) +CGAL_DEFINE_COERCION_TRAITS_FROM_TO(float, MP_Float) +CGAL_DEFINE_COERCION_TRAITS_FROM_TO(double, MP_Float) } //namespace CGAL diff --git a/Number_types/include/CGAL/boost_mp.h b/Number_types/include/CGAL/boost_mp.h new file mode 100644 index 00000000000..cae81077612 --- /dev/null +++ b/Number_types/include/CGAL/boost_mp.h @@ -0,0 +1,538 @@ +// Copyright (c) 2017 +// INRIA Saclay-Ile de France (France), +// +// This file is part of CGAL (www.cgal.org); you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 3 of the License, +// or (at your option) any later version. +// +// 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$ +// SPDX-License-Identifier: LGPL-3.0+ +// +// Author(s) : Marc Glisse + +#ifndef CGAL_BOOST_MP_H +#define CGAL_BOOST_MP_H + +#include +// This could check BOOST_VERSION >= 105300, but before 1.56 there is no +// implicit conversion from double, which makes it hard to use in CGAL. +// It is easier to disable this number type completely for old versions. +// Before 1.63, I/O is broken. Again, disabling the whole file is just the +// easy solution. +// TODO: MSVC has trouble with versions <= 1.69, reenable once 1.70 has been +// tested. https://github.com/boostorg/multiprecision/issues/98 +#if !defined CGAL_DO_NOT_USE_BOOST_MP && BOOST_VERSION >= 106300 && !defined _MSC_VER +#define CGAL_USE_BOOST_MP 1 + +#include // *ary_function +#include +#include +// We can't just include all Boost.Multiprecision here... +#include +#include +// ... but we kind of have to :-( +#include +#ifdef CGAL_USE_GMP +// Same dance as in CGAL/gmp.h +# include +# if defined(BOOST_MSVC) +# pragma warning(push) +# pragma warning(disable: 4127 4244 4146 4267) // conversion with loss of data + // warning on - applied on unsigned number +# endif + +# include + +# if defined(BOOST_MSVC) +# pragma warning(pop) +# endif + +# include +#endif + +// TODO: work on the coercions (end of the file) + +namespace CGAL { + +// Algebraic_structure_traits + +template ::value> > +struct AST_boost_mp; + +template +struct AST_boost_mp > + : Algebraic_structure_traits_base< NT, Euclidean_ring_tag > { + typedef NT Type; + typedef Euclidean_ring_tag Algebraic_category; + typedef Boolean_tag::is_exact> Is_exact; + typedef Tag_false Is_numerical_sensitive; + + struct Is_zero: public CGAL::cpp98::unary_function { + bool operator()( const Type& x) const { + return x.is_zero(); + } + }; + + struct Div: + public CGAL::cpp98::binary_function { + template + Type operator()(const T& x, const U& y) const { + return x / y; + } + }; + + struct Mod: + public CGAL::cpp98::binary_function { + template + Type operator()(const T& x, const U& y) const { + return x % y; + } + }; + + struct Gcd : public CGAL::cpp98::binary_function { + template + Type operator()(const T& x, const U& y) const { + return boost::multiprecision::gcd(x, y); + } + }; + + struct Sqrt : public CGAL::cpp98::unary_function { + template + Type operator()(const T& x) const { + return boost::multiprecision::sqrt(x); + } + }; +}; + +template +struct AST_boost_mp > + : public Algebraic_structure_traits_base< NT , Field_tag > { + public: + typedef NT Type; + typedef Field_tag Algebraic_category; + typedef Tag_true Is_exact; + typedef Tag_false Is_numerical_sensitive; + + struct Is_zero: public CGAL::cpp98::unary_function { + bool operator()( const Type& x) const { + return x.is_zero(); + } + }; + + struct Div: + public CGAL::cpp98::binary_function { + template + Type operator()(const T& x, const U& y) const { + return x / y; + } + }; +}; + +// Real_embeddable_traits + +template +struct RET_boost_mp_base + : public INTERN_RET::Real_embeddable_traits_base< NT , CGAL::Tag_true > { + + typedef NT Type; + + struct Is_zero: public CGAL::cpp98::unary_function { + bool operator()( const Type& x) const { + return x.is_zero(); + } + }; + + struct Is_positive: public CGAL::cpp98::unary_function { + bool operator()( const Type& x) const { + return x.sign() > 0; + } + }; + + struct Is_negative: public CGAL::cpp98::unary_function { + bool operator()( const Type& x) const { + return x.sign() < 0; + } + }; + + struct Abs : public CGAL::cpp98::unary_function { + template + Type operator()(const T& x) const { + return boost::multiprecision::abs(x); + } + }; + + struct Sgn : public CGAL::cpp98::unary_function { + ::CGAL::Sign operator()(Type const& x) const { + return CGAL::sign(x.sign()); + } + }; + + struct Compare + : public CGAL::cpp98::binary_function { + Comparison_result operator()(const Type& x, const Type& y) const { + return CGAL::sign(x.compare(y)); + } + }; + + struct To_double + : public CGAL::cpp98::unary_function { + double operator()(const Type& x) const { + return x.template convert_to(); + } + }; + + struct To_interval + : public CGAL::cpp98::unary_function< Type, std::pair< double, double > > { + std::pair + operator()(const Type& x) const { + // assume the conversion is within 1 ulp + // adding IA::smallest() doesn't work because inf-e=inf, even rounded down. + double d = x.template convert_to(); + double inf = std::numeric_limits::infinity(); + return std::pair (nextafter (d, -inf), nextafter (d, inf)); + } + }; +}; + +template ::value> > +struct RET_boost_mp; + +template +struct RET_boost_mp > + : RET_boost_mp_base {}; + +template +struct RET_boost_mp > + : RET_boost_mp_base { +#if BOOST_VERSION < 105700 + typedef NT Type; + struct To_interval + : public CGAL::cpp98::unary_function< Type, std::pair< double, double > > { + std::pair + operator()(const Type& x) const { + std::pair p_num = CGAL::to_interval (numerator (x)); + std::pair p_den = CGAL::to_interval (denominator (x)); + typedef Interval_nt IA; + IA::Protector P; + // assume the conversion is within 1 ulp for integers, but the conversion from rational may be unsafe, see boost trac #10085 + IA i_num (p_num.first, p_num.second); + IA i_den (p_den.first, p_den.second); + IA i = i_num / i_den; + return std::pair(i.inf(), i.sup()); + } + }; +#endif +}; + +// Modular_traits + +template ::value> > +struct MT_boost_mp { + typedef T NT; + typedef ::CGAL::Tag_false Is_modularizable; + typedef ::CGAL::Null_functor Residue_type; + typedef ::CGAL::Null_functor Modular_image; + typedef ::CGAL::Null_functor Modular_image_representative; +}; + +template +struct MT_boost_mp > { + typedef T NT; + typedef CGAL::Tag_true Is_modularizable; + typedef Residue Residue_type; + + struct Modular_image{ + Residue_type operator()(const NT& a){ + NT tmp(CGAL::mod(a,NT(Residue::get_current_prime()))); + return CGAL::Residue(tmp.template convert_to()); + } + }; + struct Modular_image_representative{ + NT operator()(const Residue_type& x){ + return NT(x.get_value()); + } + }; +}; + +// Split_double + +template ::value> > +struct SD_boost_mp { + void operator()(double d, NT &num, NT &den) const + { + num = d; + den = 1; + } +}; + +template +struct SD_boost_mp > +{ + void operator()(double d, NT &num, NT &den) const + { + std::pair p = split_numerator_denominator(d); + num = NT(p.first); + den = NT(p.second); + } +}; + + +// Fraction_traits + +template ::value> > +struct FT_boost_mp { + typedef T Type; + typedef Tag_false Is_fraction; + typedef Null_tag Numerator_type; + typedef Null_tag Denominator_type; + typedef Null_functor Common_factor; + typedef Null_functor Decompose; + typedef Null_functor Compose; +}; + +template +struct FT_boost_mp > { + typedef NT Type; + + typedef ::CGAL::Tag_true Is_fraction; + typedef typename boost::multiprecision::component_type::type Numerator_type; + typedef Numerator_type Denominator_type; + + typedef typename Algebraic_structure_traits< Numerator_type >::Gcd Common_factor; + + class Decompose { + public: + typedef Type first_argument_type; + typedef Numerator_type& second_argument_type; + typedef Denominator_type& third_argument_type; + void operator () ( + const Type& rat, + Numerator_type& num, + Denominator_type& den) { + num = numerator(rat); + den = denominator(rat); + } + }; + + class Compose { + public: + typedef Numerator_type first_argument_type; + typedef Denominator_type second_argument_type; + typedef Type result_type; + Type operator ()( + const Numerator_type& num , + const Denominator_type& den ) { + return Type(num, den); + } + }; +}; + +template +struct Algebraic_structure_traits > +: AST_boost_mp > {}; +template +struct Algebraic_structure_traits > +: Algebraic_structure_traits::result_type > {}; + +template +struct Real_embeddable_traits > +: RET_boost_mp > {}; +template +struct Real_embeddable_traits > +: Real_embeddable_traits::result_type > {}; + +template +struct Modular_traits > +: MT_boost_mp > {}; +template +struct Modular_traits > +: Modular_traits::result_type > {}; + +template +struct Fraction_traits > +: FT_boost_mp > {}; +template +struct Fraction_traits > +: Fraction_traits::result_type > {}; + +template +struct Split_double > +: SD_boost_mp > {}; +template +struct Split_double > +: Split_double::result_type > {}; + + +// Coercions + +namespace internal { namespace boost_mp { BOOST_MPL_HAS_XXX_TRAIT_DEF(type); } } + +template +struct Coercion_traits, boost::multiprecision::number > +{ + typedef boost::common_type, boost::multiprecision::number > CT; + typedef Boolean_tag::value> Are_implicit_interoperable; + // FIXME: the implicit/explicit answers shouldn't be the same... + typedef Are_implicit_interoperable Are_explicit_interoperable; + // FIXME: won't compile when they are not interoperable. + typedef typename CT::type Type; + struct Cast{ + typedef Type result_type; + template + Type operator()(const U& x) const { + return Type(x); + } + }; +}; +// Avoid ambiguity with the specialization for ... +template +struct Coercion_traits, boost::multiprecision::number > +{ + typedef boost::multiprecision::number Type; + typedef Tag_true Are_implicit_interoperable; + typedef Tag_true Are_explicit_interoperable; + struct Cast{ + typedef Type result_type; + template + Type operator()(const U& x) const { + return Type(x); + } + }; +}; + +template +struct Coercion_traits < +boost::multiprecision::detail::expression, +boost::multiprecision::detail::expression > +: Coercion_traits < +typename boost::multiprecision::detail::expression::result_type, +typename boost::multiprecision::detail::expression::result_type> +{ }; +// Avoid ambiguity with the specialization for ... +template +struct Coercion_traits < +boost::multiprecision::detail::expression, +boost::multiprecision::detail::expression > +: Coercion_traits < +typename boost::multiprecision::detail::expression::result_type, +typename boost::multiprecision::detail::expression::result_type> +{ }; + +template +struct Coercion_traits, boost::multiprecision::detail::expression > +: Coercion_traits < +boost::multiprecision::number, +typename boost::multiprecision::detail::expression::result_type> +{ }; + +template +struct Coercion_traits, boost::multiprecision::number > +: Coercion_traits < +typename boost::multiprecision::detail::expression::result_type, +boost::multiprecision::number > +{ }; + +// TODO: coercion with expressions, fix existing coercions +// (double -> rational is implicit only for 1.56+, see ticket #10082) +// The real solution would be to avoid specializing Coercion_traits for all pairs of number types and let it auto-detect what works, so only broken types need an explicit specialization. + +// Ignore types smaller than long +#define CGAL_COERCE_INT(int) \ +template \ +struct Coercion_traits, int> { \ + typedef boost::multiprecision::number Type; \ + typedef Tag_true Are_implicit_interoperable; \ + typedef Tag_true Are_explicit_interoperable; \ + struct Cast{ \ + typedef Type result_type; \ + template Type operator()(const U& x) const { return Type(x); } \ + }; \ +}; \ +template \ +struct Coercion_traits > \ +: Coercion_traits, int> {} + +CGAL_COERCE_INT(short); +CGAL_COERCE_INT(int); +CGAL_COERCE_INT(long); +#undef CGAL_COERCE_INT + +// Ignore bounded-precision rationals +#define CGAL_COERCE_FLOAT(float) \ +template \ +struct Coercion_traits, float> { \ + typedef boost::multiprecision::number Type; \ + typedef Boolean_tag::value != boost::multiprecision::number_kind_integer> Are_implicit_interoperable; \ + typedef Are_implicit_interoperable Are_explicit_interoperable; \ + struct Cast{ \ + typedef Type result_type; \ + template Type operator()(const U& x) const { return Type(x); } \ + }; \ +}; \ +template \ +struct Coercion_traits > \ +: Coercion_traits, float> {} + +CGAL_COERCE_FLOAT(float); +CGAL_COERCE_FLOAT(double); +#undef CGAL_COERCE_FLOAT + +// Because of https://github.com/boostorg/multiprecision/issues/29 , this is not perfect and fails to read some KDS files. + +template <> +class Input_rep : public IO_rep_is_specialized { + boost::multiprecision::cpp_rational& q; +public: + Input_rep(boost::multiprecision::cpp_rational& qq) : q(qq) {} + std::istream& operator()(std::istream& in) const { + internal::read_float_or_quotient(in, q); + return in; + } +}; +#ifdef CGAL_USE_GMP +template <> +class Input_rep : public IO_rep_is_specialized { + boost::multiprecision::mpq_rational& q; +public: + Input_rep(boost::multiprecision::mpq_rational& qq) : q(qq) {} + std::istream& operator()(std::istream& in) const { + internal::read_float_or_quotient(in, q); + return in; + } +}; +#endif + +// Copied from leda_rational.h +namespace internal { + // See: Stream_support/include/CGAL/IO/io.h + template + void read_float_or_quotient(std::istream & is, ET& et); + + template <> + inline void read_float_or_quotient(std::istream & is, boost::multiprecision::cpp_rational& et) + { + internal::read_float_or_quotient(is, et); + } +#ifdef CGAL_USE_GMP + template <> + inline void read_float_or_quotient(std::istream & is, boost::multiprecision::mpq_rational& et) + { + internal::read_float_or_quotient(is, et); + } +#endif +} // namespace internal + +} //namespace CGAL + +#include + +#endif // BOOST_VERSION +#endif diff --git a/Number_types/include/CGAL/internal/Exact_type_selector.h b/Number_types/include/CGAL/internal/Exact_type_selector.h index fb90f542b53..f98f2ace0d6 100644 --- a/Number_types/include/CGAL/internal/Exact_type_selector.h +++ b/Number_types/include/CGAL/internal/Exact_type_selector.h @@ -33,6 +33,7 @@ #include #include +#include #ifdef CGAL_USE_GMP # include # include @@ -65,9 +66,15 @@ struct Exact_field_selector #ifdef CGAL_USE_GMPXX { typedef mpq_class Type; }; #elif defined(CGAL_USE_GMP) +# if defined(CGAL_USE_BOOST_MP) +{ typedef boost::multiprecision::mpq_rational Type; }; +# else { typedef Gmpq Type; }; +# endif #elif defined(CGAL_USE_LEDA) { typedef leda_rational Type; }; +#elif defined(CGAL_USE_BOOST_MP) +{ typedef boost::multiprecision::cpp_rational Type; }; #else { typedef Quotient Type; }; #endif diff --git a/Optimal_transportation_reconstruction_2/package_info/Optimal_transportation_reconstruction_2/dependencies b/Optimal_transportation_reconstruction_2/package_info/Optimal_transportation_reconstruction_2/dependencies index 625a107675c..9b809650984 100644 --- a/Optimal_transportation_reconstruction_2/package_info/Optimal_transportation_reconstruction_2/dependencies +++ b/Optimal_transportation_reconstruction_2/package_info/Optimal_transportation_reconstruction_2/dependencies @@ -20,3 +20,4 @@ Spatial_sorting Stream_support TDS_2 Triangulation_2 +Distance_3 diff --git a/Partition_2/include/CGAL/Partition_2/Vertex_visibility_graph_2.h b/Partition_2/include/CGAL/Partition_2/Vertex_visibility_graph_2.h index bc931dce3c0..f38034fff5e 100644 --- a/Partition_2/include/CGAL/Partition_2/Vertex_visibility_graph_2.h +++ b/Partition_2/include/CGAL/Partition_2/Vertex_visibility_graph_2.h @@ -68,7 +68,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/Partition_2/include/CGAL/Partition_2/partition_y_monotone_2.h b/Partition_2/include/CGAL/Partition_2/partition_y_monotone_2.h index 41d488b23f4..1b36ff04416 100644 --- a/Partition_2/include/CGAL/Partition_2/partition_y_monotone_2.h +++ b/Partition_2/include/CGAL/Partition_2/partition_y_monotone_2.h @@ -45,7 +45,7 @@ #include #include -#include +#include #include #include #include diff --git a/Periodic_3_triangulation_3/demo/Periodic_3_triangulation_3/CMakeLists.txt b/Periodic_3_triangulation_3/demo/Periodic_3_triangulation_3/CMakeLists.txt index b3b8b63f561..b71c45d5da3 100644 --- a/Periodic_3_triangulation_3/demo/Periodic_3_triangulation_3/CMakeLists.txt +++ b/Periodic_3_triangulation_3/demo/Periodic_3_triangulation_3/CMakeLists.txt @@ -26,7 +26,13 @@ if(Qt5_FOUND) set(CMAKE_INCLUDE_CURRENT_DIR ON) endif(Qt5_FOUND) -if (CGAL_FOUND AND CGAL_Qt5_FOUND AND Qt5_FOUND AND TARGET Qt5::qcollectiongenerator) +if( Qt5Help_VERSION VERSION_LESS 5.12 ) + set(CGAL_QCOLLECTIONGENERATOR_TARGET Qt5::qcollectiongenerator) +else() + set(CGAL_QCOLLECTIONGENERATOR_TARGET Qt5::qhelpgenerator) +endif() + +if (CGAL_FOUND AND CGAL_Qt5_FOUND AND Qt5_FOUND AND TARGET ${CGAL_QCOLLECTIONGENERATOR_TARGET}) # UI files (Qt Designer files) qt5_wrap_ui ( UI_FILES MainWindow.ui ) @@ -39,15 +45,10 @@ if (CGAL_FOUND AND CGAL_Qt5_FOUND AND Qt5_FOUND AND TARGET Qt5::qcollectiongener qt5_generate_moc( "MainWindow.h" "${CMAKE_CURRENT_BINARY_DIR}/moc_MainWindow.cpp" ) qt5_generate_moc( "Viewer.h" "${CMAKE_CURRENT_BINARY_DIR}/moc_Viewer.cpp" ) - if(DEFINED QT_QCOLLECTIONGENERATOR_EXECUTABLE) - else() - set(QT_QCOLLECTIONGENERATOR_EXECUTABLE qcollectiongenerator) - endif() - # generate QtAssistant collection file add_custom_command ( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/Periodic_3_triangulation_3.qhc DEPENDS Periodic_3_triangulation_3.qhp Periodic_3_triangulation_3.qhcp - COMMAND Qt5::qcollectiongenerator + COMMAND ${CGAL_QCOLLECTIONGENERATOR_TARGET} ${CMAKE_CURRENT_SOURCE_DIR}/Periodic_3_triangulation_3.qhcp -o ${CMAKE_CURRENT_BINARY_DIR}/Periodic_3_triangulation_3.qhc ) @@ -83,8 +84,8 @@ else () set(PERIODIC_TRIANGULATION_MISSING_DEPS "Qt5, ${PERIODIC_TRIANGULATION_MISSING_DEPS}") endif() - if (NOT TARGET Qt5::qcollectiongenerator) - set(PERIODIC_TRIANGULATION_MISSING_DEPS "qcollectiongenerator, ${PERIODIC_TRIANGULATION_MISSING_DEPS}") + if (NOT TARGET ${CGAL_QCOLLECTIONGENERATOR_TARGET}) + set(PERIODIC_TRIANGULATION_MISSING_DEPS "${CGAL_QCOLLECTIONGENERATOR_TARGET}, ${PERIODIC_TRIANGULATION_MISSING_DEPS}") endif() message(STATUS "NOTICE: This demo requires ${PERIODIC_TRIANGULATION_MISSING_DEPS}and will not be compiled.") diff --git a/Periodic_3_triangulation_3/demo/Periodic_Lloyd_3/CMakeLists.txt b/Periodic_3_triangulation_3/demo/Periodic_Lloyd_3/CMakeLists.txt index ffd9b3d7e2e..151d1e3afc1 100644 --- a/Periodic_3_triangulation_3/demo/Periodic_Lloyd_3/CMakeLists.txt +++ b/Periodic_3_triangulation_3/demo/Periodic_Lloyd_3/CMakeLists.txt @@ -21,8 +21,13 @@ find_package(CGAL COMPONENTS Qt5) find_package(Qt5 QUIET COMPONENTS Xml Script Help OpenGL Svg) +if( Qt5Help_VERSION VERSION_LESS 5.12 ) + set(CGAL_QCOLLECTIONGENERATOR_TARGET Qt5::qcollectiongenerator) +else() + set(CGAL_QCOLLECTIONGENERATOR_TARGET Qt5::qhelpgenerator) +endif() -if ( CGAL_FOUND AND CGAL_Qt5_FOUND AND Qt5_FOUND AND TARGET Qt5::qcollectiongenerator ) +if ( CGAL_FOUND AND CGAL_Qt5_FOUND AND Qt5_FOUND AND TARGET ${CGAL_QCOLLECTIONGENERATOR_TARGET} ) include_directories (BEFORE ./ ) @@ -41,7 +46,7 @@ if ( CGAL_FOUND AND CGAL_Qt5_FOUND AND Qt5_FOUND AND TARGET Qt5::qcollectiongene # generate QtAssistant collection file add_custom_command ( OUTPUT Periodic_Lloyd_3.qhc DEPENDS Periodic_Lloyd_3.qhp Periodic_Lloyd_3.qhcp - COMMAND Qt5::qcollectiongenerator + COMMAND ${CGAL_QCOLLECTIONGENERATOR_TARGET} ${CMAKE_CURRENT_SOURCE_DIR}/Periodic_Lloyd_3.qhcp -o ${CMAKE_CURRENT_BINARY_DIR}/Periodic_Lloyd_3.qhc WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} @@ -69,7 +74,7 @@ else( CGAL_FOUND AND CGAL_Qt5_FOUND AND Qt5_FOUND AND QT_QCOLLECTIONGENERATOR_EX endif() if(NOT QT_QCOLLECTIONGENERATOR_EXECUTABLE) - set(PERIODIC_LLOYD_MISSING_DEPS "qcollectiongenerator, ${PERIODIC_LLOYD_MISSING_DEPS}") + set(PERIODIC_LLOYD_MISSING_DEPS "${CGAL_QCOLLECTIONGENERATOR_TARGET}, ${PERIODIC_LLOYD_MISSING_DEPS}") endif() diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Corefinement/intersect_triangle_and_segment_3.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Corefinement/intersect_triangle_and_segment_3.h index 0bde009ee57..119d17a8cc6 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Corefinement/intersect_triangle_and_segment_3.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Corefinement/intersect_triangle_and_segment_3.h @@ -26,7 +26,7 @@ #include -#include +#include #include #include @@ -165,7 +165,7 @@ intersection_type( // the segment is coplanar with the triangle's supporting plane // we test whether the segment intersects the triangle in the common // supporting plane - if ( ::CGAL::internal::do_intersect_coplanar(a,b,c,p,q,Kernel()) ) + if ( ::CGAL::Intersections::internal::do_intersect_coplanar(a,b,c,p,q,Kernel()) ) return result_type(COPLANAR_TRIANGLES,GT::null_halfedge(),true,true); return result_type(EMPTY,GT::null_halfedge(),true,true); diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Polygon_mesh_slicer/Traversal_traits.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Polygon_mesh_slicer/Traversal_traits.h index ee65e27aa3a..53c846cd686 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Polygon_mesh_slicer/Traversal_traits.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Polygon_mesh_slicer/Traversal_traits.h @@ -27,7 +27,7 @@ #include -#include +#include #include #include diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Side_of_triangle_mesh/Ray_3_Triangle_3_traversal_traits.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Side_of_triangle_mesh/Ray_3_Triangle_3_traversal_traits.h index c4e94d216f2..57ffe845669 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Side_of_triangle_mesh/Ray_3_Triangle_3_traversal_traits.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Side_of_triangle_mesh/Ray_3_Triangle_3_traversal_traits.h @@ -29,7 +29,7 @@ #include #include #include -#include +#include #include #include @@ -60,16 +60,16 @@ public: template void intersection(const Query& query, const Primitive& primitive) { - internal::r3t3_do_intersect_endpoint_position_visitor visitor; - std::pair res= - internal::do_intersect(m_helper.get_primitive_datum(primitive, m_aabb_traits), query,Kernel(),visitor); + Intersections::internal::r3t3_do_intersect_endpoint_position_visitor visitor; + std::pair res= + Intersections::internal::do_intersect(m_helper.get_primitive_datum(primitive, m_aabb_traits), query,Kernel(),visitor); if (res.first){ switch (res.second){ - case internal::R3T3_intersection::CROSS_FACET: + case Intersections::internal::R3T3_intersection::CROSS_FACET: ++m_status.second; break; - case internal::R3T3_intersection::ENDPOINT_IN_TRIANGLE: + case Intersections::internal::R3T3_intersection::ENDPOINT_IN_TRIANGLE: m_status.first=false; m_stop=true; break; diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/intersection.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/intersection.h index a36b14d8803..916cb5a1377 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/intersection.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/intersection.h @@ -411,6 +411,14 @@ compute_face_face_intersection(const FaceRange& face_range1, typedef TriangleMesh TM; typedef typename boost::graph_traits::face_descriptor face_descriptor; typedef typename CGAL::Box_intersection_d::Box_with_info_d Box; + + CGAL::Bbox_3 b1 = CGAL::Polygon_mesh_processing::bbox(tm1, np1), + b2 = CGAL::Polygon_mesh_processing::bbox(tm2, np2); + + if(!CGAL::do_overlap(b1, b2)) + { + return out; + } // make one box per facet std::vector boxes1; @@ -525,6 +533,11 @@ compute_face_polyline_intersection( const FaceRange& face_range, CGAL_precondition(CGAL::is_triangle_mesh(tm)); + CGAL::Bbox_3 b1 = CGAL::Polygon_mesh_processing::bbox(tm, np), + b2 = CGAL::bbox_3(polyline.begin(), polyline.end()); + + if(!CGAL::do_overlap(b1,b2)) + return out; typedef TriangleMesh TM; typedef typename boost::graph_traits::face_descriptor face_descriptor; typedef typename GetVertexPointMap::const_type VertexPointMap; @@ -648,7 +661,18 @@ compute_face_polylines_intersection(const FaceRange& face_range, using boost::get_param; CGAL_precondition(CGAL::is_triangle_mesh(tm)); - + + CGAL::Bbox_3 b1,b2; + b1 = CGAL::Polygon_mesh_processing::bbox(tm, np); + for(std::size_t i =0; i< polyline_range.size(); ++i) + { + b2 += CGAL::bbox_3(polyline_range[i].begin(), + polyline_range[i].end()); + } + + if(!CGAL::do_overlap(b1,b2)) + return out; + typedef TriangleMesh TM; typedef typename boost::graph_traits::face_descriptor face_descriptor; typedef typename GetVertexPointMap::const_type VertexPointMap; @@ -849,18 +873,23 @@ compute_polylines_polylines_intersection(const PolylineRange& polylines1, std::vector boxes1; std::vector boxes2; std::size_t polylines_size = 0; + CGAL::Bbox_3 b1, b2; BOOST_FOREACH(Polyline poly, polylines1) { polylines_size += std::distance( boost::begin(poly), boost::end(poly) ) -1; + b1 += CGAL::bbox_3(poly.begin(), poly.end()); } boxes1.reserve( polylines_size ); polylines_size = 0; BOOST_FOREACH(Polyline poly, polylines2) { polylines_size += std::distance( boost::begin(poly), boost::end(poly) ) -1; + b2 += CGAL::bbox_3(poly.begin(), poly.end()); } boxes2.reserve(polylines_size); - + + if(!CGAL::do_overlap(b1,b2)) + return out; std::size_t range_size = std::distance( boost::begin(polylines1), boost::end(polylines1) ); for(std::size_t j = 0; j < range_size; ++j) { @@ -1207,7 +1236,6 @@ bool do_intersect(const TriangleMesh& tm1, { using boost::choose_param; using boost::get_param; - bool test_overlap = choose_param(get_param(np1, internal_np::overlap_test),false) || choose_param(get_param(np2, internal_np::overlap_test),false); @@ -1298,7 +1326,6 @@ bool do_intersect(const TriangleMesh& tm, ) { CGAL_precondition(CGAL::is_triangle_mesh(tm)); - try { typedef boost::function_output_iterator OutputIterator; @@ -1354,7 +1381,6 @@ bool do_intersect(const TriangleMesh& tm, ) { CGAL_precondition(CGAL::is_triangle_mesh(tm)); - try { typedef boost::function_output_iterator OutputIterator; @@ -1381,7 +1407,6 @@ bool do_intersect(const TriangleMesh& tm, >::type* = 0) { CGAL_precondition(CGAL::is_triangle_mesh(tm)); - return CGAL::Polygon_mesh_processing::do_intersect(tm, polylines, parameters::all_default()); } @@ -1404,7 +1429,6 @@ bool do_intersect(const TriangleMesh& tm, >::type* = 0) { CGAL_precondition(CGAL::is_triangle_mesh(tm)); - return CGAL::Polygon_mesh_processing::do_intersect(tm, polyline, parameters::all_default()); } diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/repair.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/repair.h index 0005edca6ac..a28f70960ce 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/repair.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/repair.h @@ -324,12 +324,12 @@ OutputIterator degenerate_faces(const TriangleMesh& tm, OutputIterator out) } // this function remove a border edge even if it does not satisfy the link condition. -// The only limitation is that the length connected component of the boundary this edge -// is strictly greater than 3 -template +// null_vertex() is returned if the removal changes the topology of the input +template typename boost::graph_traits::vertex_descriptor remove_a_border_edge(typename boost::graph_traits::edge_descriptor ed, - TriangleMesh& tm) + TriangleMesh& tm, + EdgeSet& edge_set) { typedef boost::graph_traits GT; typedef typename GT::edge_descriptor edge_descriptor; @@ -349,7 +349,13 @@ remove_a_border_edge(typename boost::graph_traits::edge_descriptor CGAL_assertion(next(next(next(opp_h, tm), tm), tm) !=opp_h); // not working for a hole make of 3 edges if (CGAL::Euler::does_satisfy_link_condition(edge(h,tm),tm)) + { + edge_set.erase(ed); + halfedge_descriptor h=halfedge(ed, tm); + if ( is_border(h, tm) ) h = opposite(h, tm); + edge_set.erase(edge(prev(h, tm), tm)); return CGAL::Euler::collapse_edge(ed, tm); + } // collect edges that have one vertex in the link of // the vertices of h and one of the vertex of h as other vertex @@ -387,7 +393,7 @@ remove_a_border_edge(typename boost::graph_traits::edge_descriptor boundary.push_back(back); continue; } - if ( !marked_faces.insert(fback).second ) + if ( fback==GT::null_face() || !marked_faces.insert(fback).second ) continue; queue.push_back( opposite(next(back,tm), tm) ); queue.push_back( opposite(prev(back,tm), tm) ); @@ -395,9 +401,10 @@ remove_a_border_edge(typename boost::graph_traits::edge_descriptor CGAL_assertion( boundary.size() == 2 ); common_incident_edges.erase( edge(boundary[0], tm) ); common_incident_edges.erase( edge(boundary[1], tm) ); - - queue.push_back(boundary[0]); - queue.push_back(boundary[1]); + if (!is_border(boundary[0], tm) || common_incident_edges.empty()) + queue.push_back(boundary[0]); + if (!is_border(boundary[1], tm) || common_incident_edges.empty()) + queue.push_back(boundary[1]); } while(!common_incident_edges.empty()); @@ -413,7 +420,22 @@ remove_a_border_edge(typename boost::graph_traits::edge_descriptor CGAL_assertion( source(hk1,tm)==source(h,tm) ); CGAL_assertion( target(hk2,tm)==target(h,tm) ); + CGAL_assertion(is_valid_polygon_mesh(tm)); + if (!is_selection_a_topological_disk(marked_faces, tm)) + { + #ifdef CGAL_PMP_REMOVE_DEGENERATE_FACES_DEBUG + std::cout << "The region to be removed is not a topological disk, not handled for now.\n"; + #endif + return GT::null_vertex(); + } + if (is_border(hk1, tm) && is_border(hk2, tm)) + { + #ifdef CGAL_PMP_REMOVE_DEGENERATE_FACES_DEBUG + std::cout << "The region to be removed is an isolated region, not handled for now.\n"; + #endif + return GT::null_vertex(); + } // collect vertices and edges to remove and do remove faces std::set edges_to_remove; std::set vertices_to_remove; @@ -430,7 +452,7 @@ remove_a_border_edge(typename boost::graph_traits::edge_descriptor vertex_descriptor vkept=source(hk1,tm); - //back-up next, prev halfedge to be restore pointers after removal + //back-up next, prev halfedge pointers to be restored after removal halfedge_descriptor hp=prev(opp_h, tm); halfedge_descriptor hn=next(opp_h, tm); halfedge_descriptor hk1_opp_next = next(hk2, tm); @@ -479,7 +501,10 @@ remove_a_border_edge(typename boost::graph_traits::edge_descriptor remove_vertex(vd, tm); // remove edges BOOST_FOREACH(edge_descriptor ed, edges_to_remove) + { + edge_set.erase(ed); remove_edge(ed, tm); + } // remove faces BOOST_FOREACH(face_descriptor fd, marked_faces) remove_face(fd, tm); @@ -498,15 +523,26 @@ remove_a_border_edge(typename boost::graph_traits::edge_descriptor set_next(hk1_opp_prev, opposite(hk1, tm), tm); set_next(opposite(hk1, tm), hn, tm); } + CGAL_assertion(is_valid_polygon_mesh(tm)); return vkept; } +template +typename boost::graph_traits::vertex_descriptor +remove_a_border_edge(typename boost::graph_traits::edge_descriptor ed, + TriangleMesh& tm) +{ + std::set::edge_descriptor> edge_set; + return remove_a_border_edge(ed, tm, edge_set); +} + template bool remove_degenerate_edges(const EdgeRange& edge_range, TriangleMesh& tmesh, const NamedParameters& np) { CGAL_assertion(CGAL::is_triangle_mesh(tmesh)); + CGAL_assertion(CGAL::is_valid_polygon_mesh(tmesh)); using boost::get_param; using boost::choose_param; @@ -540,6 +576,42 @@ bool remove_degenerate_edges(const EdgeRange& edge_range, std::cout << "Found " << degenerate_edges_to_remove.size() << " null edges.\n"; #endif + // first try to remove all collapsable edges + typename std::set::iterator it = degenerate_edges_to_remove.begin(); + while (it!=degenerate_edges_to_remove.end()) + { + if (CGAL::Euler::does_satisfy_link_condition(*it,tmesh)) + { + halfedge_descriptor h = halfedge(*it, tmesh); + degenerate_edges_to_remove.erase(it); + + // remove edges that could also be set for removal + if ( face(h, tmesh)!=GT::null_face() ) + { + ++nb_deg_faces; + degenerate_edges_to_remove.erase(edge(prev(h, tmesh), tmesh)); + } + if (face(opposite(h, tmesh), tmesh)!=GT::null_face()) + { + ++nb_deg_faces; + degenerate_edges_to_remove.erase(edge(prev(opposite(h, tmesh), tmesh), tmesh)); + } + //now remove the edge + CGAL::Euler::collapse_edge(edge(h, tmesh), tmesh); + // some_removed is not updated on purpose because if nothing + // happens below then nothing can be done + it = degenerate_edges_to_remove.begin(); + } + else + ++it; + } + + CGAL_assertion( is_valid_polygon_mesh(tmesh) ); + + #ifdef CGAL_PMP_REMOVE_DEGENERATE_FACES_DEBUG + std::cout << "Remaining " << degenerate_edges_to_remove.size() << " null edges to be handled.\n"; + #endif + while (!degenerate_edges_to_remove.empty()) { edge_descriptor ed = *degenerate_edges_to_remove.begin(); @@ -577,6 +649,15 @@ bool remove_degenerate_edges(const EdgeRange& edge_range, degenerate_edges_to_remove.insert(ed); continue; } + #ifdef CGAL_PMP_REMOVE_DEGENERATE_FACES_DEBUG + std::cout << "Calling remove_a_border_edge\n"; + #endif + vertex_descriptor vd = remove_a_border_edge(ed, tmesh, degenerate_edges_to_remove); + if (vd == GT::null_vertex()) + all_removed=false; + else + some_removed=true; + continue; } else { @@ -593,6 +674,7 @@ bool remove_degenerate_edges(const EdgeRange& edge_range, } if (impossible) { + impossible=false; BOOST_FOREACH(halfedge_descriptor h, halfedges_around_source(hd, tmesh)) { if (is_border(h, tmesh)) @@ -610,8 +692,9 @@ bool remove_degenerate_edges(const EdgeRange& edge_range, } // When the edge does not satisfy the link condition, it means that it cannot be - // collapsed as is. In the following we assume that there is no topological issue - // with contracting the edge (no volume will disappear). + // collapsed as is. In the following if there is a topological issue + // with contracting the edge (component or geometric feature that disappears), + // nothing is done. // We start by marking the faces that are incident to an edge endpoint. // If the set of marked faces is a topologically disk, then we simply remove all the simplicies // inside the disk and star the hole with the edge vertex kept. @@ -619,8 +702,7 @@ bool remove_degenerate_edges(const EdgeRange& edge_range, // on its boundary. We need to mark additional faces to make it a topological disk. // We can then apply the star hole procedure. // Right now we additionally mark the smallest connected components of non-marked faces - // (using the numnber of faces) - some_removed = true; + // (using the number of faces) //backup central point typename Traits::Point_3 pt = get(vpmap, source(ed, tmesh)); @@ -641,13 +723,20 @@ bool remove_degenerate_edges(const EdgeRange& edge_range, { halfedge_descriptor hd_opp = opposite(hd, tmesh); if ( is_border(hd_opp, tmesh) || - marked_faces.count( face(hd, tmesh) )!= - marked_faces.count( face(hd_opp, tmesh) ) ) + marked_faces.count( face(hd_opp, tmesh) ) == 0 ) { border.push_back( hd ); } } - CGAL_assertion( !border.empty() ); // a whole connected component got selected and will disappear (not handled for now) + if (border.empty() ) + { + // a whole connected component (without boundary) got selected and will disappear (not handled for now) + #ifdef CGAL_PMP_REMOVE_DEGENERATE_FACES_DEBUG + std::cout << "Trying to remove a whole connected component, not handled yet\n"; + #endif + all_removed=false; + continue; + } // define cc of border halfedges: two halfedges are in the same cc // if they are on the border of the cc of non-marked faces. typedef CGAL::Union_find UF_ds; @@ -706,6 +795,15 @@ bool remove_degenerate_edges(const EdgeRange& edge_range, faces_per_cc[ insert_res.first->second ].insert( face(opp_hedge, tmesh) ); } + if (index != nb_cc) + { + // most probably, one cc is a cycle of border edges + #ifdef CGAL_PMP_REMOVE_DEGENERATE_FACES_DEBUG + std::cout << "Trying to remove a component with a cycle of halfedges (nested hole or whole component), not handled yet.\n"; + #endif + all_removed=false; + continue; + } std::size_t nb_ccs_to_be_explored = nb_cc; index=0; //explore the cc's @@ -713,6 +811,8 @@ bool remove_degenerate_edges(const EdgeRange& edge_range, // try to extract one more face for a given cc do{ CGAL_assertion( !exploration_finished[index] ); + CGAL_assertion( !stacks_per_cc.empty() ); + CGAL_assertion( !stacks_per_cc[index].empty() ); halfedge_descriptor hd = stacks_per_cc[index].back(); stacks_per_cc[index].pop_back(); hd = opposite(hd, tmesh); @@ -746,6 +846,17 @@ bool remove_degenerate_edges(const EdgeRange& edge_range, } } + // make sure the selection is a topological disk (otherwise we need another treatment) + if (!is_selection_a_topological_disk(marked_faces, tmesh)) + { + #ifdef CGAL_PMP_REMOVE_DEGENERATE_FACES_DEBUG + std::cout << "Trying to handle a non-topological disk, do nothing\n"; + #endif + all_removed=false; + continue; + } + + some_removed = true; // collect simplices to be removed std::set vertices_to_keep; std::set halfedges_to_keep; @@ -906,6 +1017,7 @@ bool remove_degenerate_faces( TriangleMesh& tmesh, degenerate_faces(tmesh, std::inserter(degenerate_face_set, degenerate_face_set.begin()), np); // start by filtering out border faces +// TODO: shall we avoid doing that in case a non-manifold vertex on the boundary or if a whole component disappear? std::set border_deg_faces; BOOST_FOREACH(face_descriptor f, degenerate_face_set) { @@ -929,9 +1041,9 @@ bool remove_degenerate_faces( TriangleMesh& tmesh, halfedge_descriptor h = halfedge(f_to_rm, tmesh); for (int i=0; i<3; ++i) { - if (is_border(h, tmesh) ) + face_descriptor f = face(opposite(h, tmesh), tmesh); + if ( f!=GT::null_face() ) { - face_descriptor f = face(opposite(h, tmesh), tmesh); if (is_degenerate_triangle_face(f, tmesh, np) ) border_deg_faces.insert(f); } @@ -1013,8 +1125,7 @@ bool remove_degenerate_faces( TriangleMesh& tmesh, CGAL::read_OFF(in, points, triangles); if (!CGAL::Polygon_mesh_processing::is_polygon_soup_a_polygon_mesh(triangles)) { - std::cerr << "ERROR: got a polygon soup!\n"; - exit(EXIT_FAILURE); + std::cerr << "Warning: got a polygon soup (may simply be a non-manifold vertex)!\n"; } } #endif @@ -1228,15 +1339,30 @@ bool remove_degenerate_faces( TriangleMesh& tmesh, } CGAL_assertion(side_one.size()==1); + bool non_monotone_border = false; + while( get(vpmap, target(side_one.back(), tmesh)) != xtrm2 ) { vertex_descriptor prev_vertex = target(side_one.back(), tmesh); BOOST_FOREACH(halfedge_descriptor hd, boundary_hedges) if ( source(hd, tmesh) == prev_vertex ) { + if ( get(vpmap, target(hd, tmesh)) < get(vpmap, prev_vertex) ) + non_monotone_border = true; side_one.push_back(hd); break; } + if (non_monotone_border) break; + } + + if (non_monotone_border) + { + #ifdef CGAL_PMP_REMOVE_DEGENERATE_FACES_DEBUG + std::cout << " WARNING: Cannot remove the component of degenerate faces: border not a monotonic cycle.\n"; + #endif + BOOST_FOREACH(face_descriptor f, cc_faces) + degenerate_face_set.erase(f); + continue; } // look for the outgoing border halfedge of second extreme vertex @@ -1254,9 +1380,22 @@ bool remove_degenerate_faces( TriangleMesh& tmesh, BOOST_FOREACH(halfedge_descriptor hd, boundary_hedges) if ( source(hd, tmesh) == prev_vertex ) { + if ( get(vpmap, target(hd, tmesh)) > get(vpmap, prev_vertex) ) + non_monotone_border = true; side_two.push_back(hd); break; } + if (non_monotone_border) break; + } + + if (non_monotone_border) + { + #ifdef CGAL_PMP_REMOVE_DEGENERATE_FACES_DEBUG + std::cout << " WARNING: Cannot remove the component of degenerate faces: border not a monotonic cycle.\n"; + #endif + BOOST_FOREACH(face_descriptor f, cc_faces) + degenerate_face_set.erase(f); + continue; } CGAL_assertion( side_one.size()+side_two.size()==boundary_hedges.size() ); @@ -1510,7 +1649,7 @@ bool remove_degenerate_faces( TriangleMesh& tmesh, } template -std::size_t remove_degenerate_faces(TriangleMesh& tmesh) +bool remove_degenerate_faces(TriangleMesh& tmesh) { return remove_degenerate_faces(tmesh, CGAL::Polygon_mesh_processing::parameters::all_default()); @@ -1787,8 +1926,8 @@ remove_self_intersections_one_step(TriangleMesh& tm, // indicates if a removal was not possible because the region handle has // some boundary cycle of halfedges bool topology_issue = false; - if (verbose) + if (verbose) { std::cout << " DEBUG: is_valid in one_step(tm)? "; std::cout.flush(); @@ -1875,6 +2014,7 @@ remove_self_intersections_one_step(TriangleMesh& tm, // visited more than once along a hole border (pinched surface) // We save the size of boundary_hedges to make sur halfedges added // from non_filled_hole are not removed. + bool non_manifold_vertex_remaining_in_selection = false; do{ bool non_manifold_vertex_removed = false; //here non-manifold is for the 1D polyline std::vector boundary_hedges; @@ -1903,24 +2043,39 @@ remove_self_intersections_one_step(TriangleMesh& tm, BOOST_FOREACH(halfedge_descriptor h, boundary_hedges) { if (!border_vertices.insert(target(h,tm)).second){ + bool any_face_added = false; BOOST_FOREACH(halfedge_descriptor hh, halfedges_around_target(h,tm)){ if (!is_border(hh, tm)) { - cc_faces.insert(face(hh, tm)); // add the face to the current selection + any_face_added |= cc_faces.insert(face(hh, tm)).second; // add the face to the current selection faces_to_remove.erase(face(hh, tm)); } } - non_manifold_vertex_removed=true; + if (any_face_added) + non_manifold_vertex_removed=true; + else + non_manifold_vertex_remaining_in_selection=true; } } if (!non_manifold_vertex_removed) - { break; - } } while(true); + if (preserve_genus && non_manifold_vertex_remaining_in_selection) + { + topology_issue = true; + if(verbose) + std::cout << " DEBUG: CC not handled due to the presence at least one non-manifold vertex\n"; + continue; // cannot replace a patch containing a nm vertex by a disk + } + + // before running this function if preserve_genus=false, we duplicated + // all of them + CGAL_assertion( !non_manifold_vertex_remaining_in_selection ); + + // Collect halfedges on the boundary of the region to be selected // (pointing inside the domain to be remeshed) std::vector cc_border_hedges; @@ -2018,7 +2173,7 @@ remove_self_intersections_one_step(TriangleMesh& tm, if (nbc!=1){ if(verbose) std::cout << " DEBUG: CC not handled because it is not a topological disk(" - << nbc << " boundary cycles)<<\n"; + << nbc << " boundary cycles)\n"; all_fixed = false; continue; } @@ -2273,6 +2428,9 @@ bool remove_self_intersections(TriangleMesh& tm, const NamedParameters& np) // first handle the removal of degenerate faces remove_degenerate_faces(tm, np); + if (!preserve_genus) + duplicate_non_manifold_vertices(tm, np); + if (verbose) std::cout << "DEBUG: After degenerate faces removal, is_valid(tm)? " << is_valid_polygon_mesh(tm) << "\n"; diff --git a/Polyhedron/demo/Polyhedron/MainWindow.cpp b/Polyhedron/demo/Polyhedron/MainWindow.cpp index b45aca5ac1b..87b373c8b3f 100644 --- a/Polyhedron/demo/Polyhedron/MainWindow.cpp +++ b/Polyhedron/demo/Polyhedron/MainWindow.cpp @@ -402,45 +402,70 @@ MainWindow::MainWindow(const QStringList &keywords, bool verbose, QWidget* paren } //Recursive function that do a pass over a menu and its sub-menus(etc.) and hide them when they are empty -void filterMenuOperations(QMenu* menu, bool showFullMenu) +void filterMenuOperations(QMenu* menu, QString filter, bool keep_from_here) { - Q_FOREACH(QAction* action, menu->actions()) { - if(QMenu* menu = action->menu()) - { - filterMenuOperations(menu, showFullMenu); - action->setVisible(showFullMenu && !(menu->isEmpty())); + QList buffer; + Q_FOREACH(QAction* action, menu->actions()) + buffer.append(action); + while(!buffer.isEmpty()){ + + Q_FOREACH(QAction* action, buffer) { + if(QMenu* submenu = action->menu()) + { + bool keep = true; + if(!keep_from_here){ + keep = submenu->menuAction()->text().contains(filter, Qt::CaseInsensitive); + if(!keep) + { + Q_FOREACH(QAction* subaction, submenu->actions()) + { + submenu->removeAction(subaction); + buffer.append(subaction); + } + } + else + { + menu->addAction(submenu->menuAction()); + } + } + filterMenuOperations(submenu, filter, keep); + action->setVisible(!(submenu->isEmpty())); + } + else if(action->text().contains(filter, Qt::CaseInsensitive)){ + menu->addAction(action); + } + buffer.removeAll(action); } } - } void MainWindow::filterOperations() { - static QVector to_remove; - Q_FOREACH(QAction* action, to_remove) - ui->menuOperations->removeAction(action); - QString filter=operationSearchBar.text(); - if(!filter.isEmpty()) - Q_FOREACH(const PluginNamePair& p, plugins) { - Q_FOREACH(QAction* action, p.first->actions()) { - action->setVisible( p.first->applicable(action) - && action->text().contains(filter, Qt::CaseInsensitive)); - if(action->menu() != ui->menuOperations){ - ui->menuOperations->addAction(action); - to_remove.push_back(action); - } - } + //return actions to their true menu + Q_FOREACH(QMenu* menu, action_menu_map.values()) + { + Q_FOREACH(QAction* action, menu->actions()) + { + if(action != searchAction) + menu->removeAction(action); } - else{ - Q_FOREACH(const PluginNamePair& p, plugins) { - Q_FOREACH(QAction* action, p.first->actions()) { - action->setVisible( p.first->applicable(action) - && action->text().contains(filter, Qt::CaseInsensitive)); - } - } - // do a pass over all menus in Operations and their sub-menus(etc.) and hide them when they are empty } - filterMenuOperations(ui->menuOperations, filter.isEmpty()); + Q_FOREACH(QAction* action, action_menu_map.keys()) + { + action_menu_map[action]->addAction(action); + } + QString filter=operationSearchBar.text(); + Q_FOREACH(const PluginNamePair& p, plugins) { + Q_FOREACH(QAction* action, p.first->actions()) { + action->setVisible( p.first->applicable(action) + && (action->text().contains(filter, Qt::CaseInsensitive) + || action->property("subMenuName") + .toString().contains(filter, Qt::CaseInsensitive))); + } + } + // do a pass over all menus in Operations and their sub-menus(etc.) and hide them when they are empty + filterMenuOperations(ui->menuOperations, filter, false); + operationSearchBar.setFocus(); } #include @@ -549,12 +574,14 @@ void MainWindow::setMenus(QString name, QString parentName, QAction* a ) menu_map[parentName] = new QMenu(parentName, this); // add the submenu in the menu menu_map[parentName]->addMenu(menu_map[menuName]); + action_menu_map[menu_map[menuName]->menuAction()] = menu_map[parentName]; // only add the action in the last submenu if(slash_index==-1) { ui->menuOperations->removeAction(a); menu_map[menuName]->addAction(a); + action_menu_map[a] = menu_map[menuName]; } } @@ -765,6 +792,7 @@ bool MainWindow::initPlugin(QObject* obj) // If action does not belong to the menus, add it to "Operations" menu if(!childs.contains(action)) { ui->menuOperations->addAction(action); + action_menu_map[action] = ui->menuOperations; } // Show and enable menu item addAction(action); @@ -893,17 +921,17 @@ void MainWindow::message(QString message, QString colorName, QString font) { ui->consoleTextEdit->verticalScrollBar()->setValue(ui->consoleTextEdit->verticalScrollBar()->maximum()); } -void MainWindow::information(QString text) { +void MainWindow::message_information(QString text) { statusBar()->setStyleSheet("color: blue"); this->message("INFO: " + text, "blue"); } -void MainWindow::warning(QString text) { +void MainWindow::message_warning(QString text) { statusBar()->setStyleSheet("color: orange"); this->message("WARNING: " + text, "orange"); } -void MainWindow::error(QString text) { +void MainWindow::message_error(QString text) { statusBar()->setStyleSheet("color: red"); this->message("ERROR: " + text, "red"); } @@ -968,6 +996,8 @@ void MainWindow::reloadItem() { Q_FOREACH(Scene::Item_id id, scene->selectionIndices()) { item = scene->item(id); + if(!item)//secure items like selection items that get deleted when their "parent" item is reloaded. + continue; QString filename = item->property("source filename").toString(); QString loader_name = item->property("loader_name").toString(); if(filename.isEmpty() || loader_name.isEmpty()) { @@ -986,9 +1016,9 @@ void MainWindow::reloadItem() { new_item->setRenderingMode(item->renderingMode()); new_item->setVisible(item->visible()); Scene_item_with_properties *property_item = dynamic_cast(new_item); + scene->replaceItem(scene->item_id(item), new_item, true); if(property_item) property_item->copyProperties(item); - scene->replaceItem(scene->item_id(item), new_item, true); new_item->invalidateOpenGLBuffers(); item->deleteLater(); } @@ -1169,22 +1199,19 @@ bool MainWindow::open(QString filename, QString loader_name) { CGAL::Three::Scene_item* MainWindow::loadItem(QFileInfo fileinfo, CGAL::Three::Polyhedron_demo_io_plugin_interface* loader) { CGAL::Three::Scene_item* item = NULL; if(!fileinfo.isFile() || !fileinfo.isReadable()) { - throw std::invalid_argument(QString("File %1 is not a readable file.") - .arg(fileinfo.absoluteFilePath()).toStdString()); - } - //test if the file is empty. - if(fileinfo.size() == 0) { QMessageBox::warning(this, tr("Error"), - tr("The file you are trying to load is empty.\n")); - return 0; + QString("File %1 is not a readable file.") + .arg(fileinfo.absoluteFilePath())); } QApplication::setOverrideCursor(Qt::WaitCursor); item = loader->load(fileinfo); QApplication::restoreOverrideCursor(); if(!item) { - throw std::logic_error(QString("Could not load item from file %1 using plugin %2") - .arg(fileinfo.absoluteFilePath()).arg(loader->name()).toStdString()); + QMessageBox::warning(this, tr("Error"), + QString("Could not load item from file %1 using plugin %2") + .arg(fileinfo.absoluteFilePath()).arg(loader->name())); + return 0; } item->setProperty("source filename", fileinfo.absoluteFilePath()); @@ -1207,11 +1234,13 @@ void MainWindow::selectSceneItem(int i) } else { QItemSelection s = - proxyModel->mapSelectionFromSource(scene->createSelection(i)); - + proxyModel->mapSelectionFromSource(scene->createSelection(i)); + QModelIndex mi = proxyModel->mapFromSource(scene->getModelIndexFromId(i).first()); + sceneView->setCurrentIndex(mi); sceneView->selectionModel()->select(s, QItemSelectionModel::ClearAndSelect); sceneView->scrollTo(s.indexes().first()); + sceneView->setCurrentIndex(sceneView->selectionModel()->selectedIndexes().first()); } } @@ -1226,6 +1255,8 @@ void MainWindow::selectSceneItems(QList is) QItemSelection s = proxyModel->mapSelectionFromSource(scene->createSelection(is)); + QModelIndex i = proxyModel->mapFromSource(scene->getModelIndexFromId(is.first()).first()); + sceneView->setCurrentIndex(i); sceneView->selectionModel()->select(s, QItemSelectionModel::ClearAndSelect); sceneView->scrollTo(s.indexes().first()); @@ -1409,6 +1440,15 @@ void MainWindow::showSceneContextMenu(const QPoint& p) { QMap menu_actions; QVector slider_menus; bool has_stats = false; + bool has_reload = false; + Q_FOREACH(Scene::Item_id id, scene->selectionIndices()) + { + if(!scene->item(id)->property("source filename").toString().isEmpty()) + { + has_reload = true; + break; + } + } Q_FOREACH(QAction* action, scene->item(main_index)->contextMenu()->actions()) { if(action->property("is_groupable").toBool()) @@ -1571,10 +1611,13 @@ void MainWindow::showSceneContextMenu(const QPoint& p) { connect(actionStatistics, SIGNAL(triggered()), this, SLOT(statisticsOnItem())); } + if(has_reload) + { QAction* reload = menu.addAction(tr("&Reload Item from File")); reload->setProperty("is_groupable", true); connect(reload, SIGNAL(triggered()), this, SLOT(reloadItem())); + } QAction* saveas = menu.addAction(tr("&Save as...")); connect(saveas, SIGNAL(triggered()), this, SLOT(on_actionSaveAs_triggered())); @@ -2202,6 +2245,8 @@ void MainWindow::on_actionLookAt_triggered() if( i == QDialog::Accepted && dialog.has_correct_coordinates() ) { + if(viewer->camera()->frame()->isSpinning()) + viewer->camera()->frame()->stopSpinning(); viewerShow((float)dialog.get_x()+viewer->offset().x, (float)dialog.get_y()+viewer->offset().y, (float)dialog.get_z()+viewer->offset().z); diff --git a/Polyhedron/demo/Polyhedron/MainWindow.h b/Polyhedron/demo/Polyhedron/MainWindow.h index 7a23e664b61..e13f316ed8c 100644 --- a/Polyhedron/demo/Polyhedron/MainWindow.h +++ b/Polyhedron/demo/Polyhedron/MainWindow.h @@ -102,7 +102,7 @@ public Q_SLOTS: //! If `b` is true, recenters the scene. void updateViewerBBox(bool b); //! Opens a script or a file with the default loader if there is. - void open(QString); + void open(QString) Q_DECL_OVERRIDE; //! Is called when the up button is pressed. void on_upButton_pressed(); //! Is called when the down button is pressed. @@ -220,15 +220,15 @@ public Q_SLOTS: /*! * Displays a text preceded by the mention "INFO :". */ - void information(QString); + void message_information(QString) Q_DECL_OVERRIDE; /*! * Displays a blue text preceded by the mention "WARNING :". */ - void warning(QString); + void message_warning(QString) Q_DECL_OVERRIDE; /*! * Displays a red text preceded by the mention "ERROR :". */ - void error(QString); + void message_error(QString) Q_DECL_OVERRIDE; //!Displays a text in the chosen html color with the chosen html font. @@ -384,7 +384,7 @@ protected: * Calls writeSettings() and set the flag accepted for the event. * @see writeSettings() */ - void closeEvent(QCloseEvent *event); + void closeEvent(QCloseEvent *event)Q_DECL_OVERRIDE; /*! Returns the currently selected item in the Geometric Objects view. Returns -1 * if none is selected. */ @@ -418,7 +418,7 @@ private: QAction* actionAddToGroup; QAction* actionResetDefaultLoaders; CGAL::Three::Three* three; - void print_message(QString message) { messages->information(message); } + void print_message(QString message) { messages->message_information(message); } Messages_interface* messages; QDialog *statistics_dlg; @@ -453,6 +453,9 @@ private: QMap >plugin_metadata_map; QMap ignored_map; const QStringList& accepted_keywords; + +private: + QMap action_menu_map; }; #endif // ifndef MAINWINDOW_H diff --git a/Polyhedron/demo/Polyhedron/Messages_interface.h b/Polyhedron/demo/Polyhedron/Messages_interface.h index 3c8e8dc51e9..cec5ef3f655 100644 --- a/Polyhedron/demo/Polyhedron/Messages_interface.h +++ b/Polyhedron/demo/Polyhedron/Messages_interface.h @@ -7,9 +7,9 @@ class Messages_interface { public: virtual ~Messages_interface() {} - virtual void warning(QString) = 0; - virtual void error(QString) = 0; - virtual void information(QString) = 0; + virtual void message_warning(QString) = 0; + virtual void message_error(QString) = 0; + virtual void message_information(QString) = 0; }; Q_DECLARE_INTERFACE(Messages_interface, diff --git a/Polyhedron/demo/Polyhedron/Plugins/AABB_tree/Cut_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/AABB_tree/Cut_plugin.cpp index 71dd2874115..7b46387398b 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/AABB_tree/Cut_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/AABB_tree/Cut_plugin.cpp @@ -47,7 +47,7 @@ std::size_t last; }; #endif // CGAL_LINKED_WITH_TBB - +#include typedef CGAL::Simple_cartesian Simple_kernel; typedef Simple_kernel::FT FT; typedef Simple_kernel::Point_3 Point; @@ -253,7 +253,7 @@ public: { } - bool isFinite() const { return true; } + bool isFinite() const { return false; } bool isEmpty() const { return is_tree_empty; } //computed in constructor void compute_bbox() const {} @@ -1193,12 +1193,12 @@ void Polyhedron_demo_cut_plugin::apply(Item* item, QMap< QObject*, Facets_tree*> const Mesh& mesh = *item->polyhedron(); if(!CGAL::is_triangle_mesh(mesh)) { - messages->warning(QString("%1 ignored (not a triangulated mesh)").arg(item->name())); + CGAL::Three::Three::warning(QString("%1 ignored (not a triangulated mesh)").arg(item->name())); return; } if(!CGAL::is_closed(mesh)) { - messages->warning(QString("%1 is not closed. Signed function will not be displayed.").arg(item->name())); + CGAL::Three::Three::warning(QString("%1 is not closed. Signed function will not be displayed.").arg(item->name())); } if(f_trees.find(item) == f_trees.end()) { PPMAP pmap(item->polyhedron()); @@ -1392,7 +1392,7 @@ void Polyhedron_demo_cut_plugin::computeIntersection() } } if(does_intersect) - messages->information(QString("cut (%1 ms). %2 edges.").arg(time.elapsed()).arg(edges_item->edges.size())); + CGAL::Three::Three::information(QString("cut (%1 ms). %2 edges.").arg(time.elapsed()).arg(edges_item->edges.size())); edges_item->invalidateOpenGLBuffers(); edges_item->itemChanged(); ready_to_cut = false; diff --git a/Polyhedron/demo/Polyhedron/Plugins/AABB_tree/Do_trees_intersect_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/AABB_tree/Do_trees_intersect_plugin.cpp index 91cef460b95..cae964740a6 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/AABB_tree/Do_trees_intersect_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/AABB_tree/Do_trees_intersect_plugin.cpp @@ -140,7 +140,7 @@ private Q_SLOTS: static_cast( CGAL::QGLViewer::QGLViewerPool().first())->installEventFilter(this); QApplication::restoreOverrideCursor(); - messageInterface->information("Press `W` to switch between Wireframe and Transparency mode."); + CGAL::Three::Three::information("Press `W` to switch between Wireframe and Transparency mode."); } public Q_SLOTS: diff --git a/Polyhedron/demo/Polyhedron/Plugins/Classification/Classification_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Classification/Classification_plugin.cpp index 45e5fdfaf87..2d3edcb1796 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Classification/Classification_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Classification/Classification_plugin.cpp @@ -19,6 +19,7 @@ #include #include +#include #include #include @@ -129,7 +130,7 @@ public: qobject_cast(scene->item(scene->mainSelectionIndex())) || qobject_cast(scene->item(scene->mainSelectionIndex())); } - void print_message(QString message) { messages->information(message); } + void print_message(QString message) { CGAL::Three::Three::information(message); } QList actions() const { return QList() << actionClassification; } using Polyhedron_demo_plugin_helper::init; diff --git a/Polyhedron/demo/Polyhedron/Plugins/Display/CMakeLists.txt b/Polyhedron/demo/Polyhedron/Plugins/Display/CMakeLists.txt index 37d87fc5580..88145266135 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Display/CMakeLists.txt +++ b/Polyhedron/demo/Polyhedron/Plugins/Display/CMakeLists.txt @@ -1,5 +1,6 @@ include( polyhedron_demo_macros ) - -qt5_wrap_ui( display_propertyUI_FILES Display_property.ui ) -polyhedron_demo_plugin(display_property_plugin Display_property_plugin ${display_propertyUI_FILES}) -target_link_libraries(display_property_plugin PUBLIC scene_surface_mesh_item scene_color_ramp) +if(EIGEN3_FOUND) + qt5_wrap_ui( display_propertyUI_FILES Display_property.ui ) + polyhedron_demo_plugin(display_property_plugin Display_property_plugin ${display_propertyUI_FILES}) + target_link_libraries(display_property_plugin PUBLIC scene_surface_mesh_item scene_points_with_normal_item scene_color_ramp) +endif(EIGEN3_FOUND) diff --git a/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property.ui b/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property.ui index 5d3db16b4a0..3b69d4d9f09 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property.ui +++ b/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property.ui @@ -6,8 +6,8 @@ 0 0 - 269 - 434 + 292 + 489 @@ -142,6 +142,16 @@ + + + + Select Source Points + + + true + + + @@ -173,6 +183,16 @@ Scaled Jacobian + + + Heat Intensity + + + + + Heat Intensity (Intrinsic Delaunay) + + diff --git a/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp index 93112e11f06..8e8cc92994c 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp @@ -8,18 +8,282 @@ #include #include #include + +#include +#include +#include + +#include "Scene_points_with_normal_item.h" + #include "Messages_interface.h" #include "Scene_surface_mesh_item.h" #include "Color_ramp.h" -#include -#include +#include #include "ui_Display_property.h" #include "id_printing.h" #include "Scene.h" +#include "triangulate_primitive.h" +#include +#include #define ARBITRARY_DBL_MIN 1.0E-30 #define ARBITRARY_DBL_MAX 1.0E+30 + +//Item for heat values +typedef CGAL::Three::Triangle_container Tri; +typedef CGAL::Three::Viewer_interface VI; +class Scene_heat_item + : public CGAL::Three::Scene_item_rendering_helper +{ + Q_OBJECT + +public: + Scene_heat_item(Scene_surface_mesh_item* item) + :sm(item->face_graph()), parent(item) + { + setTriangleContainer(0, new Triangle_container(VI::PROGRAM_HEAT_INTENSITY, + true)); + setRenderingMode(Gouraud); + } + Scene_item* clone() const{return nullptr;} + QString toolTip() const{return QString(); }\ + void select(double orig_x, + double orig_y, + double orig_z, + double dir_x, + double dir_y, + double dir_z) + { + parent->select( orig_x, orig_y, orig_z, + dir_x, dir_y, dir_z); + } + void initialize_buffers(CGAL::Three::Viewer_interface *viewer) const + { + getTriangleContainer(0)->initializeBuffers(viewer); + getTriangleContainer(0)->setIdxSize(idx.size()); + verts.resize(0); + normals .resize(0); + colors.resize(0); + idx.clear(); + idx.shrink_to_fit(); + colors.shrink_to_fit(); + verts.shrink_to_fit(); + normals.shrink_to_fit(); + + are_buffers_filled = true; + } + + void draw(CGAL::Three::Viewer_interface *viewer) const + { + + if(!isInit() && viewer->context()->isValid()) + initGL(); + if(!are_buffers_filled) + initialize_buffers(viewer); + getTriangleContainer(0)->setAlpha(1.0f); + getTriangleContainer(0)->draw( viewer, false); + } + void compute_bbox() const + { + SMesh::Property_map pprop = sm->points(); + CGAL::Bbox_3 bbox ; + + BOOST_FOREACH(vertex_descriptor vd,vertices(*sm)) + { + bbox = bbox + pprop[vd].bbox(); + } + _bbox = Bbox(bbox.xmin(),bbox.ymin(),bbox.zmin(), + bbox.xmax(),bbox.ymax(),bbox.zmax()); + is_bbox_computed = true; + } + Scene_item::Bbox bbox() const { + if(!is_bbox_computed) + compute_bbox(); + is_bbox_computed = true; + return _bbox; + } + + ~Scene_heat_item(){} + virtual bool supportsRenderingMode(RenderingMode m) const { return m==Gouraud; } + virtual void invalidateOpenGLBuffers() + { + computeElements(); + is_bbox_computed = false; + are_buffers_filled = false; + } + void triangulate_convex_facet(face_descriptor fd, + boost::property_map< SMesh, boost::vertex_index_t >::type *im) const + { + const CGAL::qglviewer::Vec v_offset = static_cast(CGAL::QGLViewer::QGLViewerPool().first())->offset(); + EPICK::Vector_3 offset = EPICK::Vector_3(v_offset.x, v_offset.y, v_offset.z); + + EPICK::Point_3 p0,p1,p2; + SMesh::Halfedge_around_face_circulator he(halfedge(fd, *sm), *sm); + SMesh::Halfedge_around_face_circulator he_end = he; + + while(next(*he, *sm) != prev(*he_end, *sm)) + { + ++he; + vertex_descriptor v0(target(*he_end, *sm)), + v1(target(*he, *sm)), + v2(target(next(*he, *sm), *sm)); + p0 = sm->point(v0) + offset; + p1 = sm->point(v1) + offset; + p2 = sm->point(v2) + offset; + idx.push_back((*im)[v0]); + idx.push_back((*im)[v1]); + idx.push_back((*im)[v2]); + } + } + void triangulate_facet(face_descriptor fd, + SMesh::Property_map *fnormals, + boost::property_map< SMesh, boost::vertex_index_t >::type *im) const + { + //Computes the normal of the facet + EPICK::Vector_3 normal = get(*fnormals, fd); + + //check if normal contains NaN values + if (normal.x() != normal.x() || normal.y() != normal.y() || normal.z() != normal.z()) + { + qDebug()<<"Warning : normal is not valid. Facet not displayed"; + return; + } + + typedef FacetTriangulator::vertex_descriptor> FT; + const CGAL::qglviewer::Vec off = static_cast(CGAL::QGLViewer::QGLViewerPool().first())->offset(); + EPICK::Vector_3 offset(off.x,off.y,off.z); + FT triangulation(fd,normal,sm, offset); + //iterates on the internal faces + for(FT::CDT::Finite_faces_iterator + ffit = triangulation.cdt->finite_faces_begin(), + end = triangulation.cdt->finite_faces_end(); + ffit != end; ++ffit) + { + if(ffit->info().is_external) + continue; + //add the vertices to the positions + //adds the vertices, normals and colors to the appropriate vectors + //adds the indices to the appropriate vector + idx.push_back((*im)[triangulation.v2v[ffit->vertex(0)]]); + idx.push_back((*im)[triangulation.v2v[ffit->vertex(1)]]); + idx.push_back((*im)[triangulation.v2v[ffit->vertex(2)]]); + } + } + + void computeElements() const + { + typedef EPICK::Point_3 Point; + QApplication::setOverrideCursor(Qt::WaitCursor); + const CGAL::qglviewer::Vec o = static_cast(CGAL::QGLViewer::QGLViewerPool().first())->offset(); + EPICK::Vector_3 offset(o.x, o.y, o.z); + SMesh::Property_map positions = + sm->points(); + SMesh::Property_map vnormals = + sm->property_map("v:normal").first; + SMesh::Property_map fnormals = + sm->property_map("f:normal").first; + typedef boost::graph_traits::face_descriptor face_descriptor; + typedef boost::graph_traits::halfedge_descriptor halfedge_descriptor; + typedef boost::graph_traits::vertex_descriptor vertex_descriptor; + SMesh::Property_map vcolors = + sm->property_map("v:color").first; + SMesh::Property_map vdist= + sm->property_map("v:dist").first; + typedef CGAL::Buffer_for_vao CPF; + verts.clear(); + normals.clear(); + idx.clear(); + colors.clear(); + boost::property_map< SMesh, boost::vertex_index_t >::type + im = get(boost::vertex_index, *sm); + + idx.reserve(num_faces(*sm) * 3); + BOOST_FOREACH(face_descriptor fd, faces(*sm)) + { + if(is_triangle(halfedge(fd,*sm),*sm)) + { + BOOST_FOREACH(halfedge_descriptor hd, halfedges_around_face(halfedge(fd, *sm),*sm)) + { + idx.push_back(source(hd, *sm)); + } + } + else + { + std::vector facet_points; + BOOST_FOREACH(halfedge_descriptor hd, halfedges_around_face(halfedge(fd, *sm),*sm)) + { + facet_points.push_back(positions[target(hd, *sm)]); + } + bool is_convex = CPF::is_facet_convex(facet_points, fnormals[fd]); + + if(is_convex && is_quad(halfedge(fd,*sm),*sm) ) + { + halfedge_descriptor hd = halfedge(fd,*sm); + //1st half + idx.push_back(source(hd, *sm)); + idx.push_back(source(next(hd, *sm), *sm)); + idx.push_back(source(next(next(hd, *sm), *sm), *sm)); + + //2nd half + idx.push_back(source(hd, *sm)); + idx.push_back(source(next(next(hd, *sm), *sm), *sm)); + idx.push_back(source(prev(hd, *sm), *sm)); + } + else if(is_convex) + { + triangulate_convex_facet(fd, &im); + } + else + { + triangulate_facet(fd, &fnormals, &im); + } + } + } + BOOST_FOREACH(vertex_descriptor vd, vertices(*sm)) + { + CGAL::Color c = vcolors[vd]; + colors.push_back((float)c.red()/255); + colors.push_back((float)c.green()/255); + colors.push_back((float)c.blue()/255); + + + Point p = positions[vd] + offset; + CPF::add_point_in_buffer(p, verts); + EPICK::Vector_3 n = vnormals[vd]; + CPF::add_normal_in_buffer(n, normals); + heat_values.push_back(vdist[vd]); + } + + getTriangleContainer(0)->allocate(Tri::Vertex_indices, idx.data(), + static_cast(idx.size()*sizeof(unsigned int))); + getTriangleContainer(0)->allocate(Tri::Smooth_vertices, verts.data(), + static_cast(num_vertices(*sm)*3*sizeof(float))); + + getTriangleContainer(0)->allocate(Tri::Smooth_normals, normals.data(), + static_cast(num_vertices(*sm)*3*sizeof(float))); + getTriangleContainer(0)->allocate(Tri::VColors, colors.data(), + static_cast(colors.size()*sizeof(float))); + getTriangleContainer(0)->allocate(Tri::Distances, heat_values.data(), + static_cast(heat_values.size()*sizeof(float))); + compute_bbox(); + QApplication::restoreOverrideCursor(); + } + + bool isEmpty() const {return false;} + SMesh *face_graph() { return sm;} + Scene_surface_mesh_item* getParent() { return parent; } + +private: + SMesh* sm; + Scene_surface_mesh_item* parent; + mutable std::vector normals; + mutable std::vector idx; + mutable std::vector verts; + mutable std::vector colors; + mutable std::vector heat_values; +}; // end class Scene_heat_item + class DockWidget : public QDockWidget, public Ui::DisplayPropertyWidget @@ -42,6 +306,10 @@ class DisplayPropertyPlugin : Q_OBJECT Q_INTERFACES(CGAL::Three::Polyhedron_demo_plugin_interface) Q_PLUGIN_METADATA(IID "com.geometryfactory.PolyhedronDemo.PluginInterface/1.0") + typedef SMesh::Property_map::vertex_descriptor, double> Vertex_distance_map; + typedef CGAL::Heat_method_3::Surface_mesh_geodesic_distances_3 Heat_method; + typedef CGAL::Heat_method_3::Surface_mesh_geodesic_distances_3 Heat_method_idt; + public: bool applicable(QAction*) const Q_DECL_OVERRIDE @@ -67,6 +335,7 @@ public: { this->scene = sc; this->mw = mw; + this->current_item = NULL; QAction *actionDisplayAngles= new QAction(QString("Display Properties"), mw); @@ -133,8 +402,13 @@ public: dock_widget->maxColorButton->setPalette(palette); dock_widget->maxColorButton->update(); }); + + connect(dock_widget->sourcePointsButton, SIGNAL(toggled(bool)), + this, SLOT(on_sourcePointsButton_toggled(bool))); + connect(dock_widget->resetButton, &QPushButton::pressed, this, &DisplayPropertyPlugin::resetRampExtremas); + dock_widget->zoomToMaxButton->setEnabled(false); dock_widget->zoomToMinButton->setEnabled(false); Scene* scene_obj =static_cast(scene); @@ -178,22 +452,41 @@ private Q_SLOTS: void colorize() { + Scene_heat_item* h_item = nullptr; Scene_surface_mesh_item* item = qobject_cast(scene->item(scene->mainSelectionIndex())); if(!item) - return; + { + h_item = qobject_cast(scene->item(scene->mainSelectionIndex())); + if(!h_item) + return; + item = h_item->getParent(); + } QApplication::setOverrideCursor(Qt::WaitCursor); + replaceRamp(); item->face_graph()->collect_garbage(); - switch(dock_widget->propertyBox->currentIndex()) - { + + item->face_graph()->collect_garbage(); + switch(dock_widget->propertyBox->currentIndex()){ case 0: displayAngles(item); break; - default: - displayScaledJacobian(item); + case 1: + displayScaledJacobian(item); + break; + case 2: + if(!displayHeatIntensity(item)) + return; + item->setRenderingMode(Gouraud); + break; + default: // Heat Method (Intrinsic Delaunay) + if(!displayHeatIntensity(item, true)) + return; + item->setRenderingMode(Gouraud); break; } + connect(item, &Scene_surface_mesh_item::itemChanged, this, [item](){ bool does_exist; @@ -210,8 +503,9 @@ private Q_SLOTS: QApplication::restoreOverrideCursor(); item->invalidateOpenGLBuffers(); item->redraw(); - dock_widget->zoomToMinButton->setEnabled(true); - dock_widget->zoomToMaxButton->setEnabled(true); + if(dock_widget->propertyBox->currentIndex() != 2){ + dock_widget->zoomToMinButton->setEnabled(true); + dock_widget->zoomToMaxButton->setEnabled(true);} } void enableButtons() @@ -259,6 +553,12 @@ private Q_SLOTS: { smesh.remove_property_map(angles); } + SMesh::Property_map is_source; + boost::tie(is_source, found) = smesh.property_map("v:heat_source"); + if(found) + { + smesh.remove_property_map(is_source); + } } void displayScaledJacobian(Scene_surface_mesh_item* item) @@ -472,6 +772,148 @@ private Q_SLOTS: dock_widget->maxBox->setValue(angles_max[item].first); return true; } + + // AF: This function gets called when we click on the button "Colorize" + bool displayHeatIntensity(Scene_surface_mesh_item* item, bool iDT = false) + { + SMesh& mesh = *item->face_graph(); + bool found = false; + SMesh::Property_map is_source ; + boost::tie(is_source, found)= + mesh.property_map("v:heat_source"); + if(!found + || ! source_points + || source_points->point_set()->is_empty()) + { + QApplication::restoreOverrideCursor(); + QMessageBox::warning(mw, "Warning","Source vertices are needed for this property."); + return false; + } + if(!is_triangle_mesh(mesh)) + { + QApplication::restoreOverrideCursor(); + QMessageBox::warning(mw,"Error","The mesh must be triangulated."); + return false; + } + Heat_method * hm = NULL; + Heat_method_idt * hm_idt = NULL; + SMesh::Property_map heat_intensity = + mesh.add_property_map("v:heat_intensity", 0).first; + if(! iDT){ + if(mesh_heat_method_map.find(item) != mesh_heat_method_map.end()){ + hm = mesh_heat_method_map[item]; + }else { + hm = new Heat_method(mesh); + mesh_heat_method_map[item] = hm; + } + connect(item, &Scene_surface_mesh_item::aboutToBeDestroyed, + [this,item](){ + auto it = mesh_heat_method_map.find(item); + delete it->second; + mesh_heat_method_map.erase(it); + } + ); + } else { + if(mesh_heat_method_idt_map.find(item) != mesh_heat_method_idt_map.end()){ + hm_idt = mesh_heat_method_idt_map[item]; + }else { + hm_idt = new Heat_method_idt(mesh); + mesh_heat_method_idt_map[item] = hm_idt; + } + connect(item, &Scene_surface_mesh_item::aboutToBeDestroyed, + [this,item](){ + auto it = mesh_heat_method_idt_map.find(item); + if(it == mesh_heat_method_idt_map.end()) + return; + Heat_method_idt *hm_idt = it->second; + delete hm_idt; + mesh_heat_method_idt_map.erase(it); + } + ); + } + + // AF: So far we only deal with adding sources + BOOST_FOREACH(vertex_descriptor vd, vertices(mesh)){ + if(is_source[vd]){ + if(iDT){ + hm_idt->add_source(vd); + } else + hm->add_source(vd); + } + else + { + if(iDT){ + hm_idt->remove_source(vd); + } else + hm->remove_source(vd); + } + } + + if(iDT){ + hm_idt->estimate_geodesic_distances(heat_intensity); + }else{ + hm->estimate_geodesic_distances(heat_intensity); + } + + double max = 0; + double min = (std::numeric_limits::max)(); + + BOOST_FOREACH(vertex_descriptor vd, vertices(mesh)){ + double hi = heat_intensity[vd]; + if(hi < min) + min = hi; + if(hi > max) + max = hi; + } + color_ramp = Color_ramp(rm, rM, gm, gM, bm, bM); + dock_widget->minBox->setValue(min); + dock_widget->maxBox->setValue(max); + + //} + SMesh::Property_map vcolors = + mesh.add_property_map("v:color", CGAL::Color()).first; + SMesh::Property_map vdist= + mesh.add_property_map("v:dist", 0.0).first; + for(boost::graph_traits::vertex_iterator vit = vertices(mesh).begin(); + vit != vertices(mesh).end(); + ++vit) + { + double h =(heat_intensity[*vit]-min)/(max-min); + CGAL::Color color( + 255*color_ramp.r(h), + 255*color_ramp.g(h), + 255*color_ramp.b(h)); + vcolors[*vit] = color; + vdist[*vit]=h; + } + Scene_group_item* group; + if(mesh_heat_item_map.find(item) != mesh_heat_item_map.end()) + { + group = mesh_heat_item_map[item]->parentGroup(); + group->unlockChild(mesh_heat_item_map[item]); + scene->erase(scene->item_id(mesh_heat_item_map[item])); + } + else + { + group = new Scene_group_item("Heat Visualization"); + scene->addItem(group); + scene->changeGroup(item, group); + scene->changeGroup(source_points, group); + group->lockChild(item); + group->lockChild(source_points); + } + mesh_heat_item_map[item] = new Scene_heat_item(item); + mesh_heat_item_map[item]->setName(tr("%1 heat").arg(item->name())); + scene->addItem(mesh_heat_item_map[item]); + scene->changeGroup(mesh_heat_item_map[item], group); + group->lockChild(mesh_heat_item_map[item]); + item->setVisible(false); + displayLegend(); + if(dock_widget->sourcePointsButton->isChecked()) + dock_widget->sourcePointsButton->toggle(); + return true; + } + void replaceRamp() { color_ramp = Color_ramp(rm, rM, gm, gM, bm, bM); @@ -486,6 +928,11 @@ private Q_SLOTS: { case 0: { + dock_widget->groupBox-> setEnabled(true); + dock_widget->groupBox_3->setEnabled(true); + + dock_widget->sourcePointsButton->setEnabled(false); + dock_widget->minBox->setMinimum(0); dock_widget->minBox->setMaximum(360); dock_widget->minBox->setValue(0); @@ -502,7 +949,11 @@ private Q_SLOTS: dock_widget->maxBox->setValue(90); break; } - default: + case 1: + dock_widget->groupBox-> setEnabled(true); + dock_widget->groupBox_3->setEnabled(true); + dock_widget->sourcePointsButton->setEnabled(false); + dock_widget->minBox->setMinimum(-1000); dock_widget->minBox->setMaximum(1000); dock_widget->minBox->setValue(0); @@ -511,6 +962,13 @@ private Q_SLOTS: dock_widget->maxBox->setMaximum(1000); dock_widget->maxBox->setValue(2); break; + default: + dock_widget->maxBox->setMinimum(0); + dock_widget->maxBox->setMaximum(99999999); + dock_widget->groupBox-> setEnabled(false); + dock_widget->groupBox_3->setEnabled(false); + dock_widget->sourcePointsButton->setEnabled(true); + } replaceRamp(); enableButtons(); @@ -587,6 +1045,109 @@ private Q_SLOTS: } } + void on_sourcePointsButton_toggled(bool b) + { + if(b) + { + Scene_heat_item* h_item = nullptr; + Scene_surface_mesh_item* item = + qobject_cast(scene->item(scene->mainSelectionIndex())); + if(!item) + { + h_item = qobject_cast(scene->item(scene->mainSelectionIndex())); + if(h_item) + item = h_item->getParent(); + } + if(!item) + { + QMessageBox::warning(mw, "Warning", "You must select a Surface_mesh_item to make this work. Aborting."); + dock_widget->sourcePointsButton->setChecked(false); + return; + } + current_item = item; + connect(current_item, &Scene_surface_mesh_item::aboutToBeDestroyed, + this, [this]() + { + dock_widget->sourcePointsButton->setChecked(false); + }); + if(mesh_sources_map.find(item) == mesh_sources_map.end()) + { + source_points = new Scene_points_with_normal_item(); + source_points->setName(QString("Source vertices for %1").arg(current_item->name())); + source_points->setColor(QColor(Qt::red)); + source_points->setPointSize(5); + scene->addItem(source_points); + connect(source_points, &Scene_points_with_normal_item::aboutToBeDestroyed, + [this](){ + boost::unordered_map::iterator it; + for(it = mesh_sources_map.begin(); + it != mesh_sources_map.end(); + ++it) + { + if(it->second == source_points) + { + mesh_sources_map.erase(it); + break; + } + } + }); + mesh_sources_map[current_item] = source_points; + } + else + { + source_points=mesh_sources_map[current_item]; + } + connect(item, SIGNAL(selected_vertex(void*)), this, SLOT(on_vertex_selected(void*))); + bool non_init; + SMesh::Property_map is_source; + boost::tie(is_source, non_init) = current_item->face_graph()->add_property_map("v:heat_source", false); + if(non_init) + { + connect(item, &Scene_surface_mesh_item::itemChanged, + this, &DisplayPropertyPlugin::resetProperty); + } + } + else + { + if(!current_item) + return; + disconnect(current_item, SIGNAL(selected_vertex(void*)), this, SLOT(on_vertex_selected(void*))); + current_item = NULL; + } + } + + void on_vertex_selected(void* void_ptr) + { + typedef boost::graph_traits::vertices_size_type size_type; + size_type h = static_cast(reinterpret_cast(void_ptr)); + vertex_descriptor vd = static_cast(h) ; + bool found; + SMesh::Property_map is_source; + boost::tie(is_source, found) = current_item->face_graph()->property_map("v:heat_source"); + if(found) + { + if(!is_source[vd]) + { + is_source[vd]=true; + source_points->point_set()->insert(current_item->face_graph()->point(vd)); + } + else + { + is_source[vd]=false; + Point_set::iterator it; + for(it = source_points->point_set()->begin(); it != source_points->point_set()->end(); ++it) + if(source_points->point_set()->point(*it) == current_item->face_graph()->point(vd)) + { + source_points->point_set()->remove(it); + source_points->point_set()->collect_garbage(); + break; + } + } + } + + source_points->invalidateOpenGLBuffers(); + source_points->itemChanged(); + } private: void displayLegend() { @@ -658,15 +1219,24 @@ private: double gM; double bm; double bM; - std::map > jacobian_min; - std::map > jacobian_max; + boost::unordered_map > jacobian_min; + boost::unordered_map > jacobian_max; + + boost::unordered_map > angles_min; + boost::unordered_map > angles_max; - std::map > angles_min; - std::map > angles_max; double minBox; double maxBox; QPixmap legend_; + + Scene_surface_mesh_item* current_item; + Scene_points_with_normal_item* source_points; + boost::unordered_map mesh_sources_map; + boost::unordered_map mesh_heat_item_map; + + boost::unordered_map mesh_heat_method_map; + boost::unordered_map mesh_heat_method_idt_map; }; /// Code based on the verdict module of vtk diff --git a/Polyhedron/demo/Polyhedron/Plugins/IO/GOCAD_io_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/IO/GOCAD_io_plugin.cpp index d5316ad04f6..caae0705b5c 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/IO/GOCAD_io_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/IO/GOCAD_io_plugin.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include @@ -57,19 +58,24 @@ bool Polyhedron_demo_gocad_plugin::canLoad() const { CGAL::Three::Scene_item* Polyhedron_demo_gocad_plugin::load(QFileInfo fileinfo) { - + // Open file std::ifstream in(fileinfo.filePath().toUtf8()); if(!in) { std::cerr << "Error! Cannot open file " << (const char*)fileinfo.filePath().toUtf8() << std::endl; return NULL; } - - + + CGAL::Timer t; t.start(); // Try to read GOCAD file in a surface_mesh Scene_surface_mesh_item* item = new Scene_surface_mesh_item(new SMesh()); + if(fileinfo.size() == 0) + { + CGAL::Three::Three::warning( tr("The file you are trying to load is empty.")); + return item; + } SMesh& P = * const_cast(item->polyhedron()); std::string name, color; @@ -90,11 +96,9 @@ Polyhedron_demo_gocad_plugin::load(QFileInfo fileinfo) { if(qcolor.isValid()) { item->setColor(qcolor); - item->invalidateOpenGLBuffers(); } + item->invalidateOpenGLBuffers(); return item; - -return NULL; } bool Polyhedron_demo_gocad_plugin::canSave(const CGAL::Three::Scene_item* item) diff --git a/Polyhedron/demo/Polyhedron/Plugins/IO/Nef_io_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/IO/Nef_io_plugin.cpp index 499b2f7db4b..11265427374 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/IO/Nef_io_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/IO/Nef_io_plugin.cpp @@ -1,6 +1,7 @@ #include "Scene_nef_polyhedron_item.h" #include +#include #include #include @@ -47,6 +48,11 @@ Polyhedron_demo_io_nef_plugin::load(QFileInfo fileinfo) { // Try to read .nef3 in a polyhedron Scene_nef_polyhedron_item* item = new Scene_nef_polyhedron_item(); item->setName(fileinfo.baseName()); + if(fileinfo.size() == 0) + { + CGAL::Three::Three::warning( tr("The file you are trying to load is empty.")); + return item; + } if(!item->load(in)) { delete item; diff --git a/Polyhedron/demo/Polyhedron/Plugins/IO/OFF_io_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/IO/OFF_io_plugin.cpp index c2cbb3c5684..c0e57fe50e2 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/IO/OFF_io_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/IO/OFF_io_plugin.cpp @@ -7,6 +7,7 @@ #include #include +#include #include #include @@ -49,6 +50,15 @@ bool Polyhedron_demo_off_plugin::canLoad() const { CGAL::Three::Scene_item* Polyhedron_demo_off_plugin::load(QFileInfo fileinfo) { + + if(fileinfo.size() == 0) + { + CGAL::Three::Three::warning( tr("The file you are trying to load is empty.")); + Scene_surface_mesh_item* item = + new Scene_surface_mesh_item(SMesh()); + item->setName(fileinfo.completeBaseName()); + return item; + } if(fileinfo.suffix().toLower() == "off"){ return load_off(fileinfo); } else if(fileinfo.suffix().toLower() == "obj"){ diff --git a/Polyhedron/demo/Polyhedron/Plugins/IO/OFF_to_nef_io_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/IO/OFF_to_nef_io_plugin.cpp index cd557823bd8..5d142129b4c 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/IO/OFF_to_nef_io_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/IO/OFF_to_nef_io_plugin.cpp @@ -2,6 +2,7 @@ #include "Nef_type.h" #include +#include #include using namespace CGAL::Three; class Polyhedron_demo_off_to_nef_plugin : @@ -33,7 +34,12 @@ Polyhedron_demo_off_to_nef_plugin::load(QFileInfo fileinfo) { if(!in) std::cerr << "Error!\n"; Scene_nef_polyhedron_item* item = new Scene_nef_polyhedron_item(); - + if(fileinfo.size() == 0) + { + CGAL::Three::Three::warning( tr("The file you are trying to load is empty.")); + item->setName(fileinfo.completeBaseName()); + return item; + } if(!item->load_from_off(in)) { delete item; diff --git a/Polyhedron/demo/Polyhedron/Plugins/IO/PLY_io_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/IO/PLY_io_plugin.cpp index 0a57fac8fee..3725e3e93df 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/IO/PLY_io_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/IO/PLY_io_plugin.cpp @@ -79,6 +79,12 @@ Polyhedron_demo_ply_plugin::load(QFileInfo fileinfo) { QApplication::setOverrideCursor(Qt::WaitCursor); + if(fileinfo.size() == 0) + { + CGAL::Three::Three::warning( tr("The file you are trying to load is empty.")); + return 0; + } + // Test if input is mesh or point set bool input_is_mesh = false; std::string line; diff --git a/Polyhedron/demo/Polyhedron/Plugins/IO/Polylines_io_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/IO/Polylines_io_plugin.cpp index 0c4a3308503..6cd47d92aa8 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/IO/Polylines_io_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/IO/Polylines_io_plugin.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include @@ -100,6 +101,14 @@ Polyhedron_demo_polylines_io_plugin::load(QFileInfo fileinfo) { return NULL; } + if(fileinfo.size() == 0) + { + CGAL::Three::Three::warning( tr("The file you are trying to load is empty.")); + Scene_polylines_item* item = new Scene_polylines_item; + item->setName(fileinfo.completeBaseName()); + return item; + } + std::list > polylines; QStringList polylines_metadata; diff --git a/Polyhedron/demo/Polyhedron/Plugins/IO/STL_io_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/IO/STL_io_plugin.cpp index 4591567722f..18749766763 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/IO/STL_io_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/IO/STL_io_plugin.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include @@ -71,7 +72,13 @@ Polyhedron_demo_stl_plugin::load(QFileInfo fileinfo) { std::cerr << "Error! Cannot open file " << (const char*)fileinfo.filePath().toUtf8() << std::endl; return NULL; } - + if(fileinfo.size() == 0) + { + CGAL::Three::Three::warning( tr("The file you are trying to load is empty.")); + Scene_surface_mesh_item* item = new Scene_surface_mesh_item(); + item->setName(fileinfo.completeBaseName()); + return item; + } std::vector > points; std::vector > triangles; if (!CGAL::read_STL(in, points, triangles)) diff --git a/Polyhedron/demo/Polyhedron/Plugins/IO/Surf_io_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/IO/Surf_io_plugin.cpp index 87b7e5c5a4e..2302cfe4182 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/IO/Surf_io_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/IO/Surf_io_plugin.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include @@ -69,6 +70,13 @@ CGAL::Three::Scene_item* Surf_io_plugin::actual_load(QFileInfo fileinfo) return NULL; } + if(fileinfo.size() == 0) + { + CGAL::Three::Three::warning( tr("The file you are trying to load is empty.")); + Scene_group_item* item = + new Scene_group_item(fileinfo.completeBaseName()); + return item; + } std::vector patches; std::vector material_data; CGAL::Bbox_3 grid_box; diff --git a/Polyhedron/demo/Polyhedron/Plugins/IO/VTK_io_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/IO/VTK_io_plugin.cpp index 2cc6a37fdb7..c5cbd68a15e 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/IO/VTK_io_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/IO/VTK_io_plugin.cpp @@ -28,6 +28,7 @@ #include #include +#include #include #include @@ -349,6 +350,15 @@ public: FaceGraph* poly = new FaceGraph(); // Try to read .vtk in a facegraph + + if(fileinfo.size() == 0) + { + CGAL::Three::Three::warning( tr("The file you are trying to load is empty.")); + Scene_facegraph_item* item = + new Scene_facegraph_item(poly); + item->setName(fileinfo.completeBaseName()); + return item; + } vtkSmartPointer data; vtkSmartPointer obs = vtkSmartPointer::New(); diff --git a/Polyhedron/demo/Polyhedron/Plugins/IO/XYZ_io_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/IO/XYZ_io_plugin.cpp index 17873a0081f..7bed8af9e55 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/IO/XYZ_io_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/IO/XYZ_io_plugin.cpp @@ -43,6 +43,15 @@ Polyhedron_demo_xyz_plugin::load(QFileInfo fileinfo) return NULL; } + + if(fileinfo.size() == 0) + { + CGAL::Three::Three::warning( tr("The file you are trying to load is empty.")); + Scene_points_with_normal_item* item = + new Scene_points_with_normal_item(); + item->setName(fileinfo.completeBaseName()); + return item; + } // Read .xyz in a point set Scene_points_with_normal_item* point_set_item = new Scene_points_with_normal_item; point_set_item->setName(fileinfo.completeBaseName()); diff --git a/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/C3t3_io_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/C3t3_io_plugin.cpp index b3009ddef89..29aa230dfd9 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/C3t3_io_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/C3t3_io_plugin.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include #include @@ -66,6 +67,13 @@ Polyhedron_demo_c3t3_binary_io_plugin::load(QFileInfo fileinfo) { return NULL; } Scene_c3t3_item* item = new Scene_c3t3_item(); + + if(fileinfo.size() == 0) + { + CGAL::Three::Three::warning( tr("The file you are trying to load is empty.")); + item->setName(fileinfo.completeBaseName()); + return item; + } if(fileinfo.suffix().toLower() == "cgal") { item->setName(fileinfo.baseName()); diff --git a/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Io_image_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Io_image_plugin.cpp index dfac33c6d67..907085acdd0 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Io_image_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Io_image_plugin.cpp @@ -58,12 +58,14 @@ #ifdef CGAL_USE_VTK #include +#include #include #include #include #include #include #endif +#include // Covariant return types don't work for scalar types and we cannot // have templates here, hence this unfortunate hack. @@ -365,7 +367,7 @@ public Q_SLOTS: } } if(group_map.keys().contains(seg_img)) - this->message_interface->warning("This item already has volume planes."); + CGAL::Three::Three::warning("This item already has volume planes."); else { // Opens a modal Dialog to prevent the user from manipulating things that could mess with the planes creation and cause a segfault. @@ -489,12 +491,6 @@ public Q_SLOTS: } private: CGAL::qglviewer::Vec first_offset; -#ifdef CGAL_USE_VTK - vtkImageData* vtk_image; - vtkDICOMImageReader* dicom_reader; - vtkDemandDrivenPipeline* executive; - vtkImageGaussianSmooth* smoother; -#endif // CGAL_USE_VTK bool is_gray; Messages_interface* message_interface; QMessageBox msgBox; @@ -1153,7 +1149,7 @@ bool Io_image_plugin::loadDCM(QString dirname) { QMessageBox::warning(mw, mw->windowTitle(), tr("Cannot read directory %1!").arg(dirname)); - message_interface->warning(tr("Opening of directory %1 failed!").arg(dirname)); + CGAL::Three::Three::warning(tr("Opening of directory %1 failed!").arg(dirname)); result = false; } else @@ -1204,12 +1200,12 @@ bool Io_image_plugin::loadDCM(QString dirname) { QMessageBox::warning(mw, mw->windowTitle(), tr("Error with file %1/:\nunknown file format!").arg(dirname)); - message_interface->warning(tr("Opening of file %1/ failed!").arg(dirname)); + CGAL::Three::Three::warning(tr("Opening of file %1/ failed!").arg(dirname)); result = false; } else { - message_interface->information(tr("File %1/ successfully opened.").arg(dirname)); + CGAL::Three::Three::information(tr("File %1/ successfully opened.").arg(dirname)); } if(result) { @@ -1230,12 +1226,12 @@ bool Io_image_plugin::loadDCM(QString dirname) { QMessageBox::warning(mw, mw->windowTitle(), tr("Error with file %1/:\nunknown file format!").arg(dirname)); - message_interface->warning(tr("Opening of file %1/ failed!").arg(dirname)); + CGAL::Three::Three::warning(tr("Opening of file %1/ failed!").arg(dirname)); result = false; } else { - message_interface->information(tr("File %1/ successfully opened.").arg(dirname)); + CGAL::Three::Three::information(tr("File %1/ successfully opened.").arg(dirname)); } if(result) { @@ -1247,7 +1243,7 @@ bool Io_image_plugin::loadDCM(QString dirname) } return result; #else - message_interface->warning("You need VTK to read a DCM file"); + CGAL::Three::Three::warning("You need VTK to read a DCM file"); CGAL_USE(dirname); return false; #endif @@ -1256,26 +1252,26 @@ Image* Io_image_plugin::createDCMImage(QString dirname) { Image* image = NULL; #ifdef CGAL_USE_VTK - dicom_reader = vtkDICOMImageReader::New(); + vtkNew dicom_reader; dicom_reader->SetDirectoryName(dirname.toUtf8()); - executive = + auto executive = vtkDemandDrivenPipeline::SafeDownCast(dicom_reader->GetExecutive()); if (executive) { executive->SetReleaseDataFlag(0, 0); // where 0 is the port index } - smoother = vtkImageGaussianSmooth::New(); + vtkNew smoother; smoother->SetStandardDeviations(1., 1., 1.); smoother->SetInputConnection(dicom_reader->GetOutputPort()); smoother->Update(); - vtk_image = smoother->GetOutput(); + auto vtk_image = smoother->GetOutput(); vtk_image->Print(std::cerr); image = new Image; - *image = CGAL::read_vtk_image_data(vtk_image); + *image = CGAL::read_vtk_image_data(vtk_image); // copy the image data #else - message_interface->warning("You need VTK to read a DCM file"); + CGAL::Three::Three::warning("You need VTK to read a DCM file"); CGAL_USE(dirname); #endif return image; diff --git a/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Mesh_3_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Mesh_3_plugin.cpp index c4320a49e8d..ecf2f4bc889 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Mesh_3_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Mesh_3_plugin.cpp @@ -3,6 +3,7 @@ #ifdef CGAL_POLYHEDRON_DEMO_USE_SURFACE_MESHER #include +#include #include "Messages_interface.h" #include @@ -623,7 +624,7 @@ meshing_done(Meshing_thread* thread) .arg(bbox.zmin()) .arg(bbox.zmax())); - msg->information(qPrintable(str)); + CGAL::Three::Three::information(qPrintable(str)); // Treat new c3t3 item treat_result(*source_item_, result_item); diff --git a/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Optimization_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Optimization_plugin.cpp index 344ab89ad0d..303e38fd5cc 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Optimization_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Optimization_plugin.cpp @@ -9,6 +9,7 @@ #ifdef CGAL_POLYHEDRON_DEMO_USE_SURFACE_MESHER #include +#include #include "Messages_interface.h" #include "ui_Smoother_dialog.h" @@ -562,7 +563,7 @@ optimization_done(Optimizer_thread* thread) str.append(QString("( %1 )
").arg(param)); } - msg->information(qPrintable(str)); + CGAL::Three::Three::information(qPrintable(str)); // Treat new c3t3 item Scene_c3t3_item* result_item = thread->item(); diff --git a/Polyhedron/demo/Polyhedron/Plugins/Operations_on_polyhedra/Clip_polyhedron_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Operations_on_polyhedra/Clip_polyhedron_plugin.cpp index ea133fe6bdf..d6cf4c57458 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Operations_on_polyhedra/Clip_polyhedron_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Operations_on_polyhedra/Clip_polyhedron_plugin.cpp @@ -7,6 +7,7 @@ #include "Scene_plane_item.h" #include #include +#include #include #include "ui_Clip_polyhedron_plugin.h" @@ -168,7 +169,7 @@ public : } catch(CGAL::Polygon_mesh_processing::Corefinement::Self_intersection_exception) { - messages->warning(tr("The requested operation is not possible due to the presence of self-intersections in the region handled.")); + CGAL::Three::Three::warning(tr("The requested operation is not possible due to the presence of self-intersections in the region handled.")); } } public Q_SLOTS: @@ -242,7 +243,7 @@ public Q_SLOTS: } catch(CGAL::Polygon_mesh_processing::Corefinement::Self_intersection_exception) { - messages->warning(tr("The requested operation is not possible due to the presence of self-intersections in the region handled.")); + CGAL::Three::Three::warning(tr("The requested operation is not possible due to the presence of self-intersections in the region handled.")); } item->invalidateOpenGLBuffers(); viewer->update(); diff --git a/Polyhedron/demo/Polyhedron/Plugins/PCA/Pca_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/PCA/Pca_plugin.cpp index e56af0979ad..9f3ea5b8477 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PCA/Pca_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PCA/Pca_plugin.cpp @@ -13,6 +13,7 @@ #include #include "Kernel_type.h" +#include typedef Kernel::Plane_3 Plane; typedef Kernel::Iso_cuboid_3 Iso_cuboid; typedef Kernel::Triangle_3 Triangle; @@ -99,148 +100,150 @@ void Polyhedron_demo_pca_plugin::on_actionFitPlane_triggered() Scene_surface_mesh_item* sm_item = qobject_cast(scene->item(index)); - QApplication::setOverrideCursor(Qt::WaitCursor); - - std::list triangles; - - SMesh* pMesh = sm_item->polyhedron(); - ::triangles(*pMesh,std::back_inserter(triangles)); - - if(! triangles.empty()){ - QString item_name = sm_item->name(); - // fit plane to triangles - Plane plane; - std::cout << "Fit plane..."; - CGAL::linear_least_squares_fitting_3(triangles.begin(),triangles.end(),plane,CGAL::Dimension_tag<2>()); - std::cout << "ok" << std::endl; - - // compute centroid - Point center_of_mass = CGAL::centroid(triangles.begin(),triangles.end()); - Scene_plane_item* new_item = new Scene_plane_item(this->scene); - new_item->setPosition(center_of_mass.x(), - center_of_mass.y(), - center_of_mass.z()); - const Vector& normal = plane.orthogonal_vector(); - new_item->setNormal(normal.x(), normal.y(), normal.z()); - new_item->setName(tr("%1 (plane fit)").arg(item_name)); - new_item->setColor(Qt::magenta); - new_item->setRenderingMode(sm_item->renderingMode()); - scene->addItem(new_item); - - } - else - { - Scene_points_with_normal_item* item = - qobject_cast(scene->item(index)); - - if (item) - { - Point_set* points = item->point_set(); - - // fit plane to triangles - Plane plane; - Point center_of_mass; - std::cout << "Fit plane..."; - CGAL::linear_least_squares_fitting_3 - (points->points().begin(),points->points().end(),plane, center_of_mass, - CGAL::Dimension_tag<0>()); - std::cout << "ok" << std::endl; - - // compute centroid - Scene_plane_item* new_item = new Scene_plane_item(this->scene); - new_item->setPosition(center_of_mass.x(), - center_of_mass.y(), - center_of_mass.z()); - const Vector& normal = plane.orthogonal_vector(); - new_item->setNormal(normal.x(), normal.y(), normal.z()); - new_item->setName(tr("%1 (plane fit)").arg(item->name())); - new_item->setColor(Qt::magenta); - new_item->setRenderingMode(item->renderingMode()); - scene->addItem(new_item); - - } + Three::CursorScopeGuard scope(Qt::WaitCursor); + if(sm_item){ + std::list triangles; + + SMesh* pMesh = sm_item->polyhedron(); + ::triangles(*pMesh,std::back_inserter(triangles)); + + if(! triangles.empty()){ + QString item_name = sm_item->name(); + // fit plane to triangles + Plane plane; + std::cout << "Fit plane..."; + CGAL::linear_least_squares_fitting_3(triangles.begin(),triangles.end(),plane,CGAL::Dimension_tag<2>()); + std::cout << "ok" << std::endl; + + // compute centroid + Point center_of_mass = CGAL::centroid(triangles.begin(),triangles.end()); + Scene_plane_item* new_item = new Scene_plane_item(this->scene); + new_item->setPosition(center_of_mass.x(), + center_of_mass.y(), + center_of_mass.z()); + const Vector& normal = plane.orthogonal_vector(); + new_item->setNormal(normal.x(), normal.y(), normal.z()); + new_item->setName(tr("%1 (plane fit)").arg(item_name)); + new_item->setColor(Qt::magenta); + new_item->setRenderingMode(sm_item->renderingMode()); + scene->addItem(new_item); + return; + } + } + Scene_points_with_normal_item* item = + qobject_cast(scene->item(index)); + + if (item) + { + Point_set* points = item->point_set(); + + // fit plane to triangles + Plane plane; + Point center_of_mass; + std::cout << "Fit plane..."; + CGAL::linear_least_squares_fitting_3 + (points->points().begin(),points->points().end(),plane, center_of_mass, + CGAL::Dimension_tag<0>()); + std::cout << "ok" << std::endl; + + // compute centroid + Scene_plane_item* new_item = new Scene_plane_item(this->scene); + new_item->setPosition(center_of_mass.x(), + center_of_mass.y(), + center_of_mass.z()); + const Vector& normal = plane.orthogonal_vector(); + new_item->setNormal(normal.x(), normal.y(), normal.z()); + new_item->setName(tr("%1 (plane fit)").arg(item->name())); + new_item->setColor(Qt::magenta); + new_item->setRenderingMode(item->renderingMode()); + scene->addItem(new_item); } - QApplication::restoreOverrideCursor(); } void Polyhedron_demo_pca_plugin::on_actionFitLine_triggered() { const CGAL::Three::Scene_interface::Item_id index = scene->mainSelectionIndex(); + Three::CursorScopeGuard sg(Qt::WaitCursor); + Scene_surface_mesh_item* sm_item = - qobject_cast(scene->item(index)); - - QApplication::setOverrideCursor(Qt::WaitCursor); - - CGAL::Bbox_3 bb; + qobject_cast(scene->item(index)); - std::list triangles; - SMesh* pMesh = sm_item->polyhedron(); - bb = ::triangles(*pMesh,std::back_inserter(triangles)); - - if(! triangles.empty()){ - QString item_name = sm_item->name(); - // fit line to triangles - Line line; - std::cout << "Fit line..."; - CGAL::linear_least_squares_fitting_3(triangles.begin(),triangles.end(),line,CGAL::Dimension_tag<2>()); - std::cout << "ok" << std::endl; - - // compute centroid - Point center_of_mass = CGAL::centroid(triangles.begin(),triangles.end()); - - // compute bounding box diagonal - Iso_cuboid bbox(bb); - - // compute scale for rendering using diagonal of bbox - Point cmin = (bbox.min)(); - Point cmax = (bbox.max)(); - FT diag = std::sqrt(CGAL::squared_distance(cmin,cmax)); - - // construct a 3D bar - Vector u = line.to_vector(); - u = u / std::sqrt(u*u); - - Point a = center_of_mass + u * diag; - Point b = center_of_mass - u * diag; - - Plane plane_a = line.perpendicular_plane(a); - - Vector u1 = plane_a.base1(); - u1 = u1 / std::sqrt(u1*u1); - u1 = u1 * 0.01 * diag; - Vector u2 = plane_a.base2(); - u2 = u2 / std::sqrt(u2*u2); - u2 = u2 * 0.01 * diag; - - Point points[8]; - - points[0] = a + u1; - points[1] = a + u2; - points[2] = a - u1; - points[3] = a - u2; - - points[4] = b + u1; - points[5] = b + u2; - points[6] = b - u1; - points[7] = b - u2; - - // add best fit line as new polyhedron bar - SMesh* pFit = new SMesh; - CGAL::make_hexahedron(points[0], - points[1], - points[2], - points[3], - points[4], - points[5], - points[6], - points[7], - *pFit); - Scene_surface_mesh_item* new_item = new Scene_surface_mesh_item(pFit); - new_item->setName(tr("%1 (line fit)").arg(item_name)); - new_item->setColor(Qt::magenta); - new_item->setRenderingMode( sm_item->renderingMode()); - scene->addItem(new_item); + if(sm_item) + { + CGAL::Bbox_3 bb; + + SMesh* pMesh = sm_item->polyhedron(); + std::list triangles; + + bb = ::triangles(*pMesh,std::back_inserter(triangles)); + + if(! triangles.empty()){ + QString item_name = sm_item->name(); + // fit line to triangles + Line line; + std::cout << "Fit line..."; + CGAL::linear_least_squares_fitting_3(triangles.begin(),triangles.end(),line,CGAL::Dimension_tag<2>()); + std::cout << "ok" << std::endl; + + // compute centroid + Point center_of_mass = CGAL::centroid(triangles.begin(),triangles.end()); + + // compute bounding box diagonal + Iso_cuboid bbox(bb); + + // compute scale for rendering using diagonal of bbox + Point cmin = (bbox.min)(); + Point cmax = (bbox.max)(); + FT diag = std::sqrt(CGAL::squared_distance(cmin,cmax)); + + // construct a 3D bar + Vector u = line.to_vector(); + u = u / std::sqrt(u*u); + + Point a = center_of_mass + u * diag; + Point b = center_of_mass - u * diag; + + Plane plane_a = line.perpendicular_plane(a); + + Vector u1 = plane_a.base1(); + u1 = u1 / std::sqrt(u1*u1); + u1 = u1 * 0.01 * diag; + Vector u2 = plane_a.base2(); + u2 = u2 / std::sqrt(u2*u2); + u2 = u2 * 0.01 * diag; + + Point points[8]; + + points[0] = a + u1; + points[1] = a + u2; + points[2] = a - u1; + points[3] = a - u2; + + points[4] = b + u1; + points[5] = b + u2; + points[6] = b - u1; + points[7] = b - u2; + + // add best fit line as new polyhedron bar + SMesh* pFit = new SMesh; + CGAL::make_hexahedron( + points[0], + points[3], + points[2], + points[1], + points[5], + points[4], + points[7], + points[6], + *pFit); + Scene_surface_mesh_item* new_item = new Scene_surface_mesh_item(pFit); + new_item->setName(tr("%1 (line fit)").arg(item_name)); + new_item->setColor(Qt::magenta); + new_item->setRenderingMode( sm_item->renderingMode()); + scene->addItem(new_item); + } + return; } else { @@ -297,15 +300,16 @@ void Polyhedron_demo_pca_plugin::on_actionFitLine_triggered() points[7] = b - u2; SMesh* pFit = new SMesh; - CGAL::make_hexahedron(points[0], - points[1], - points[2], - points[3], - points[4], - points[5], - points[6], - points[7], - *pFit); + CGAL::make_hexahedron( + points[0], + points[3], + points[2], + points[1], + points[5], + points[4], + points[7], + points[6], + *pFit); Scene_surface_mesh_item* new_item = new Scene_surface_mesh_item(pFit); new_item->setName(tr("%1 (line fit)").arg(item->name())); new_item->setColor(Qt::magenta); @@ -313,8 +317,6 @@ void Polyhedron_demo_pca_plugin::on_actionFitLine_triggered() scene->addItem(new_item); } } - - QApplication::restoreOverrideCursor(); } #include "Pca_plugin.moc" diff --git a/Polyhedron/demo/Polyhedron/Plugins/PMP/Corefinement_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/PMP/Corefinement_plugin.cpp index ce83faa6f5b..bb6c5ece3fd 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PMP/Corefinement_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PMP/Corefinement_plugin.cpp @@ -3,6 +3,7 @@ #include #include "Messages_interface.h" #include +#include #include "Scene_surface_mesh_item.h" #include @@ -138,12 +139,12 @@ private: void apply_corefine(Item* item1, Item* item2) { if(! CGAL::is_triangle_mesh(*item1->face_graph())) { - messages->warning(tr("The face graph \"%1\" is not triangulated.") + CGAL::Three::Three::warning(tr("The face graph \"%1\" is not triangulated.") .arg(item1->name())); return; } if(! CGAL::is_triangle_mesh(*item2->face_graph())) { - messages->warning(tr("The face graph \"%1\" is not triangulated.") + CGAL::Three::Three::warning(tr("The face graph \"%1\" is not triangulated.") .arg(item2->name())); return; } @@ -151,6 +152,8 @@ private: QApplication::setOverrideCursor(Qt::WaitCursor); try{ PMP::corefine(*item1->face_graph(), *item2->face_graph(), params::throw_on_self_intersection(true)); + item1->resetColors(); + item2->resetColors(); item1->invalidateOpenGLBuffers(); item2->invalidateOpenGLBuffers(); scene->itemChanged(item2); @@ -158,7 +161,7 @@ private: } catch(CGAL::Polygon_mesh_processing::Corefinement::Self_intersection_exception) { - messages->warning(tr("The requested operation is not possible due to the presence of self-intersections in the neighborhood of the intersection.")); + CGAL::Three::Three::warning(tr("The requested operation is not possible due to the presence of self-intersections in the neighborhood of the intersection.")); } // default cursor QApplication::restoreOverrideCursor(); @@ -169,12 +172,12 @@ private: { typedef typename Item::Face_graph FaceGraph; if(! CGAL::is_triangle_mesh(*first_item->face_graph())) { - messages->warning(tr("The polyhedron \"%1\" is not triangulated.") + CGAL::Three::Three::warning(tr("The polyhedron \"%1\" is not triangulated.") .arg(first_item->name())); return; } if(! CGAL::is_triangle_mesh(*item->face_graph())) { - messages->warning(tr("The polyhedron \"%1\" is not triangulated.") + CGAL::Three::Three::warning(tr("The polyhedron \"%1\" is not triangulated.") .arg(item->name())); return; } @@ -191,7 +194,7 @@ private: if (! PMP::corefine_and_compute_union(P, Q, *new_poly, params::throw_on_self_intersection(true)) ) { delete new_poly; - messages->warning(tr("The result of the requested operation is not manifold and has not been computed.")); + CGAL::Three::Three::warning(tr("The result of the requested operation is not manifold and has not been computed.")); // default cursor QApplication::restoreOverrideCursor(); return; @@ -203,7 +206,7 @@ private: if (! PMP::corefine_and_compute_intersection(P, Q, *new_poly, params::throw_on_self_intersection(true)) ) { delete new_poly; - messages->warning(tr("The result of the requested operation is not manifold and has not been computed.")); + CGAL::Three::Three::warning(tr("The result of the requested operation is not manifold and has not been computed.")); // default cursor QApplication::restoreOverrideCursor(); return; @@ -218,7 +221,7 @@ private: if (! PMP::corefine_and_compute_difference(P, Q, *new_poly, params::throw_on_self_intersection(true)) ) { delete new_poly; - messages->warning(tr("The result of the requested operation is not manifold and has not been computed.")); + CGAL::Three::Three::warning(tr("The result of the requested operation is not manifold and has not been computed.")); // default cursor QApplication::restoreOverrideCursor(); return; @@ -228,7 +231,7 @@ private: } catch(CGAL::Polygon_mesh_processing::Corefinement::Self_intersection_exception) { - messages->warning(tr("The requested operation is not possible due to the presence of self-intersections in the neighborhood of the intersection.")); + CGAL::Three::Three::warning(tr("The requested operation is not possible due to the presence of self-intersections in the neighborhood of the intersection.")); QApplication::restoreOverrideCursor(); } diff --git a/Polyhedron/demo/Polyhedron/Plugins/PMP/Distance_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/PMP/Distance_plugin.cpp index 2765e8993d2..48e8f51e082 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PMP/Distance_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PMP/Distance_plugin.cpp @@ -1,5 +1,6 @@ #include #include +#include #include #include #include @@ -211,12 +212,7 @@ private: BOOST_FOREACH(boost::graph_traits::face_descriptor f, faces(*poly)) { Vector nf = get(nf_pmap, f); typedef FacetTriangulator::vertex_descriptor> FT; - double diagonal; - if(this->diagonalBbox() != std::numeric_limits::infinity()) - diagonal = this->diagonalBbox(); - else - diagonal = 0.0; - + //compute distance with other polyhedron //sample facet std::vector sampled_points; @@ -232,7 +228,7 @@ private: sampled_points.push_back(r); //triangle facets with sample points for color display - FT triangulation(f,sampled_points,nf,poly,diagonal); + FT triangulation(f,sampled_points,nf,poly); if(triangulation.cdt->dimension() != 2 ) { @@ -431,7 +427,7 @@ public Q_SLOTS: Scene_face_graph_item* itemB = qobject_cast(scene->item(scene->selectionIndices().last())); if(! CGAL::is_triangle_mesh(*itemA->polyhedron()) || !CGAL::is_triangle_mesh(*itemB->polyhedron()) ){ - messageInterface->error(QString("Distance not computed. (Both polyhedra must be triangulated)")); + CGAL::Three::Three::error(QString("Distance not computed. (Both polyhedra must be triangulated)")); return; } QApplication::setOverrideCursor(Qt::WaitCursor); diff --git a/Polyhedron/demo/Polyhedron/Plugins/PMP/Engrave_text_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/PMP/Engrave_text_plugin.cpp index 6cad4ed03c9..e48566c3383 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PMP/Engrave_text_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PMP/Engrave_text_plugin.cpp @@ -302,7 +302,11 @@ private: Messages_interface* messages; public : - + ~Engrave_text_plugin() + { + delete graphics_scene; + delete navigation; + } void init(QMainWindow*, CGAL::Three::Scene_interface*, Messages_interface* m) Q_DECL_OVERRIDE{ @@ -734,7 +738,7 @@ public Q_SLOTS: if (PMP::does_self_intersect(text_mesh_complete)) { QApplication::restoreOverrideCursor(); - messages->information("Error: text mesh self-intersects!"); + CGAL::Three::Three::information("Error: text mesh self-intersects!"); return; } @@ -745,7 +749,7 @@ public Q_SLOTS: if (!OK) { QApplication::restoreOverrideCursor(); - messages->information("Error: the output mesh is not manifold!"); + CGAL::Three::Three::information("Error: the output mesh is not manifold!"); return; } diff --git a/Polyhedron/demo/Polyhedron/Plugins/PMP/Extrude_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/PMP/Extrude_plugin.cpp index 8c968b5e323..1a6a6dcc2d1 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PMP/Extrude_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PMP/Extrude_plugin.cpp @@ -1,4 +1,5 @@ #include +#include #include #include #include @@ -370,7 +371,7 @@ private Q_SLOTS: pMesh = new Face_graph(); if(!sel_item->export_selected_facets_as_polyhedron(pMesh)) { - messageInterface->error("Face selection is not valid. Aborting."); + CGAL::Three::Three::error("Face selection is not valid. Aborting."); return; } @@ -386,7 +387,7 @@ private Q_SLOTS: return; if(CGAL::is_closed(*pMesh)) { - messageInterface->error("The face graph must be open. Aborting."); + CGAL::Three::Three::error("The face graph must be open. Aborting."); return; } std::vector triangles; @@ -448,6 +449,7 @@ private Q_SLOTS: Kernel::Vector_3(dir.x(), dir.y(), dir.z())); scene->erase(scene->item_id(oliver_queen)); oliver_queen = NULL; + target->resetColors(); target->invalidateOpenGLBuffers(); target->itemChanged(); target = NULL; diff --git a/Polyhedron/demo/Polyhedron/Plugins/PMP/Fairing_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/PMP/Fairing_plugin.cpp index 98cf548d126..d54a23fb011 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PMP/Fairing_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PMP/Fairing_plugin.cpp @@ -3,6 +3,7 @@ #include "Messages_interface.h" #include +#include #include "Scene_polyhedron_selection_item.h" #include "ui_Fairing_widget.h" @@ -42,7 +43,7 @@ public: return qobject_cast(scene->item(scene->mainSelectionIndex())) || qobject_cast(scene->item(scene->mainSelectionIndex())); } - void print_message(QString message) { messages->information(message);} + void print_message(QString message) { CGAL::Three::Three::information(message);} QList actions() const { return QList() << actionFairing; } @@ -102,6 +103,7 @@ public Q_SLOTS: CGAL::Polygon_mesh_processing::fair(*selection_item->polyhedron(), selection_item->selected_vertices, CGAL::Polygon_mesh_processing::parameters::fairing_continuity(continuity)); + selection_item->polyhedron_item()->resetColors(); selection_item->changed_with_poly_item(); selection_item->invalidateOpenGLBuffers(); QApplication::restoreOverrideCursor(); @@ -127,6 +129,7 @@ public Q_SLOTS: for(std::vector::face_descriptor>::iterator it = new_facets.begin(); it != new_facets.end(); ++it) { selection_item->selected_facets.insert(*it); } + selection_item->polyhedron_item()->resetColors(); selection_item->changed_with_poly_item(); selection_item->invalidateOpenGLBuffers(); QApplication::restoreOverrideCursor(); diff --git a/Polyhedron/demo/Polyhedron/Plugins/PMP/Hole_filling_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/PMP/Hole_filling_plugin.cpp index 88523da2286..76764b80c23 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PMP/Hole_filling_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PMP/Hole_filling_plugin.cpp @@ -9,6 +9,7 @@ #include "Scene.h" #include +#include #include "ui_Hole_filling_widget.h" #include @@ -323,7 +324,7 @@ class Polyhedron_demo_hole_filling_plugin : public: bool applicable(QAction*) const { return qobject_cast(scene->item(scene->mainSelectionIndex())) || qobject_cast(scene->item(scene->mainSelectionIndex())); } - void print_message(QString message) { messages->information(message); } + void print_message(QString message) { CGAL::Three::Three::information(message); } QList actions() const { return QList() << actionHoleFilling; } @@ -365,6 +366,7 @@ protected: void change_poly_item_by_blocking(Scene_face_graph_item* poly_item, Scene_hole_visualizer* collection) { if(collection) collection->block_poly_item_changed = true; + poly_item->resetColors(); poly_item->invalidateOpenGLBuffers(); poly_item->redraw(); if(collection) collection->block_poly_item_changed = false; @@ -859,7 +861,7 @@ void Polyhedron_demo_hole_filling_plugin::on_Fill_from_selection_button() { last_active_item = edge_selection->polyhedron_item(); accept_reject_toggle(true); } - + edge_selection->polyhedron_item()->resetColors(); edge_selection->polyhedron_item()->invalidateOpenGLBuffers(); edge_selection->polyhedron_item()->itemChanged(); } diff --git a/Polyhedron/demo/Polyhedron/Plugins/PMP/Hole_filling_polyline_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/PMP/Hole_filling_polyline_plugin.cpp index 605703178bc..9d90ffda2fd 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PMP/Hole_filling_polyline_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PMP/Hole_filling_polyline_plugin.cpp @@ -25,6 +25,7 @@ #include #include +#include struct Face : public CGAL::cpp11::array @@ -48,7 +49,7 @@ class Polyhedron_demo_hole_filling_polyline_plugin : Q_PLUGIN_METADATA(IID "com.geometryfactory.PolyhedronDemo.PluginInterface/1.0") public: bool applicable(QAction *) const { return qobject_cast(scene->item(scene->mainSelectionIndex())); } - void print_message(QString message) { messages->information(message); } + void print_message(QString message) { CGAL::Three::Three::information(message); } QList actions() const { return QList() << actionHoleFillingPolyline; } void init(QMainWindow* mainWindow, CGAL::Three::Scene_interface* scene_interface, Messages_interface* m){ diff --git a/Polyhedron/demo/Polyhedron/Plugins/PMP/Join_and_split_polyhedra_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/PMP/Join_and_split_polyhedra_plugin.cpp index fc681f37cde..7fa8a640351 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PMP/Join_and_split_polyhedra_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PMP/Join_and_split_polyhedra_plugin.cpp @@ -10,6 +10,7 @@ #include #include +#include #include #include @@ -168,7 +169,7 @@ void Polyhedron_demo_join_and_split_polyhedra_plugin::on_actionSplitPolyhedra_tr if (new_polyhedra.size()==1) { delete new_polyhedra.front(); - msg_interface->information( tr("%1 has only one connected component").arg(item->name()) ); + CGAL::Three::Three::information( tr("%1 has only one connected component").arg(item->name()) ); QApplication::restoreOverrideCursor(); continue; } diff --git a/Polyhedron/demo/Polyhedron/Plugins/PMP/Mean_curvature_flow_skeleton_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/PMP/Mean_curvature_flow_skeleton_plugin.cpp index 940fe1144d9..3e72878e7ea 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PMP/Mean_curvature_flow_skeleton_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PMP/Mean_curvature_flow_skeleton_plugin.cpp @@ -98,6 +98,11 @@ class Polyhedron_demo_mean_curvature_flow_skeleton_plugin : public: + ~Polyhedron_demo_mean_curvature_flow_skeleton_plugin() + { + delete ui; + } + void init(QMainWindow* mainWindow, CGAL::Three::Scene_interface* scene_interface, Messages_interface*) { this->mw = mainWindow; diff --git a/Polyhedron/demo/Polyhedron/Plugins/PMP/Orient_soup_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/PMP/Orient_soup_plugin.cpp index d70f953d9a5..1ae9edc3f74 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PMP/Orient_soup_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PMP/Orient_soup_plugin.cpp @@ -14,6 +14,7 @@ #include #include #include +#include #include "Messages_interface.h" using namespace CGAL::Three; class Polyhedron_demo_orient_soup_plugin : @@ -174,7 +175,7 @@ void Polyhedron_demo_orient_soup_plugin::orientSM() QApplication::restoreOverrideCursor(); } else{ - messages->warning(tr("This function is only applicable on polygon soups.")); + CGAL::Three::Three::warning(tr("This function is only applicable on polygon soups.")); } } } @@ -251,7 +252,7 @@ void Polyhedron_demo_orient_soup_plugin::createPointsAndPolyline() if(nm_vertices.empty()) { delete points; - messages->information(tr("There is no non-manifold vertex in this soup.")); + CGAL::Three::Three::information(tr("There is no non-manifold vertex in this soup.")); } else { @@ -286,7 +287,7 @@ void Polyhedron_demo_orient_soup_plugin::createPointsAndPolyline() } else { - messages->information(tr("There is no non-manifold edge in this soup.")); + CGAL::Three::Three::information(tr("There is no non-manifold edge in this soup.")); } QApplication::restoreOverrideCursor(); if(!items_created) diff --git a/Polyhedron/demo/Polyhedron/Plugins/PMP/Point_inside_polyhedron_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/PMP/Point_inside_polyhedron_plugin.cpp index 9625fc02fc4..ff19d4af3bb 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PMP/Point_inside_polyhedron_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PMP/Point_inside_polyhedron_plugin.cpp @@ -5,7 +5,7 @@ #include "Scene_surface_mesh_item.h" #include "Scene_points_with_normal_item.h" #include - +#include #include #include @@ -52,7 +52,7 @@ public: //if the loop ends without returning true, return false return false; } - void print_message(QString message) { messages->information(message); } + void print_message(QString message) { CGAL::Three::Three::information(message); } QList actions() const { return QList() << actionPointInsidePolyhedron; } diff --git a/Polyhedron/demo/Polyhedron/Plugins/PMP/Polyhedron_slicer_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/PMP/Polyhedron_slicer_plugin.cpp index 8209f04fe71..dea7f885bb3 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PMP/Polyhedron_slicer_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PMP/Polyhedron_slicer_plugin.cpp @@ -9,6 +9,7 @@ #include "Scene.h" #include +#include #include "ui_Polyhedron_slicer_widget.h" #include @@ -40,7 +41,7 @@ public: return qobject_cast(scene->item(scene->mainSelectionIndex())); } - void print_message(QString message) { messages->information(message);} + void print_message(QString message) { CGAL::Three::Three::information(message);} void init(QMainWindow* mainWindow, CGAL::Three::Scene_interface* scene_interface, Messages_interface* m); virtual void closure() diff --git a/Polyhedron/demo/Polyhedron/Plugins/PMP/Repair_polyhedron_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/PMP/Repair_polyhedron_plugin.cpp index 548cc110464..2367e703df9 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PMP/Repair_polyhedron_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PMP/Repair_polyhedron_plugin.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include "Messages_interface.h" #include @@ -125,7 +126,7 @@ void Polyhedron_demo_repair_polyhedron_plugin::on_actionRemoveIsolatedVertices_t std::size_t nbv = CGAL::Polygon_mesh_processing::remove_isolated_vertices( *poly_item->polyhedron()); - messages->information(tr(" %1 isolated vertices have been removed.") + CGAL::Three::Three::information(tr(" %1 isolated vertices have been removed.") .arg(nbv)); poly_item->invalidateOpenGLBuffers(); Q_EMIT poly_item->itemChanged(); @@ -147,10 +148,11 @@ void Polyhedron_demo_repair_polyhedron_plugin::on_actionRemoveDegenerateFaces_tr qobject_cast(scene->item(index)); if (poly_item) { - std::size_t nbv = + std::size_t nbv = num_faces(*poly_item->polyhedron()); CGAL::Polygon_mesh_processing::remove_degenerate_faces( *poly_item->polyhedron()); - messages->information(tr(" %1 degenerate faces have been removed.") + nbv -= num_faces(*poly_item->polyhedron()); + CGAL::Three::Three::information(tr(" %1 degenerate faces have been removed.") .arg(nbv)); poly_item->invalidateOpenGLBuffers(); Q_EMIT poly_item->itemChanged(); @@ -176,7 +178,7 @@ void Polyhedron_demo_repair_polyhedron_plugin::on_actionRemoveSelfIntersections_ CGAL::Polygon_mesh_processing::remove_self_intersections( *poly_item->polyhedron()); if (!solved) - messages->information(tr("Some self-intersection could not be fixed")); + CGAL::Three::Three::information(tr("Some self-intersection could not be fixed")); poly_item->invalidateOpenGLBuffers(); Q_EMIT poly_item->itemChanged(); } @@ -202,7 +204,7 @@ void Polyhedron_demo_repair_polyhedron_plugin::on_actionAutorefine_triggered(Sce } catch(CGAL::Polygon_mesh_processing::Corefinement::Triple_intersection_exception) { - messages->warning(tr("The result of the requested operation is not handled (triple intersection).")); + CGAL::Three::Three::warning(tr("The result of the requested operation is not handled (triple intersection).")); } poly_item->invalidateOpenGLBuffers(); Q_EMIT poly_item->itemChanged(); @@ -229,11 +231,11 @@ void Polyhedron_demo_repair_polyhedron_plugin::on_actionAutorefineAndRMSelfInter CGAL::Polygon_mesh_processing::experimental:: autorefine_and_remove_self_intersections(*poly_item->polyhedron()); if (!solved) - messages->information(tr("Self-intersection could not be removed due to non-manifold edges in the output")); + CGAL::Three::Three::information(tr("Self-intersection could not be removed due to non-manifold edges in the output")); } catch(CGAL::Polygon_mesh_processing::Corefinement::Triple_intersection_exception) { - messages->warning(tr("The result of the requested operation is not handled (triple intersection).")); + CGAL::Three::Three::warning(tr("The result of the requested operation is not handled (triple intersection).")); } poly_item->invalidateOpenGLBuffers(); Q_EMIT poly_item->itemChanged(); @@ -268,7 +270,7 @@ void Polyhedron_demo_repair_polyhedron_plugin::on_actionStitchCloseBorderHalfedg get(boost::vertex_point, *poly_item->polyhedron()), halfedges_to_stitch); PMP::stitch_borders(*poly_item->polyhedron(), halfedges_to_stitch); - messages->information(tr(" %1 pairs of halfedges stitched.").arg(halfedges_to_stitch.size())); + CGAL::Three::Three::information(tr(" %1 pairs of halfedges stitched.").arg(halfedges_to_stitch.size())); poly_item->invalidateOpenGLBuffers(); Q_EMIT poly_item->itemChanged(); } @@ -290,7 +292,7 @@ void Polyhedron_demo_repair_polyhedron_plugin::on_actionDuplicateNMVertices_trig if (Item* poly_item = qobject_cast(scene->item(index))) { std::size_t nb_vd = PMP::duplicate_non_manifold_vertices(*poly_item->polyhedron()); - messages->information(tr(" %1 vertices created").arg(nb_vd)); + CGAL::Three::Three::information(tr(" %1 vertices created").arg(nb_vd)); if (nb_vd) { poly_item->invalidateOpenGLBuffers(); diff --git a/Polyhedron/demo/Polyhedron/Plugins/PMP/Scene_facegraph_item_k_ring_selection.h b/Polyhedron/demo/Polyhedron/Plugins/PMP/Scene_facegraph_item_k_ring_selection.h index 318663f2e65..86747634b0f 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PMP/Scene_facegraph_item_k_ring_selection.h +++ b/Polyhedron/demo/Polyhedron/Plugins/PMP/Scene_facegraph_item_k_ring_selection.h @@ -134,6 +134,8 @@ public Q_SLOTS: // slots are called by signals of polyhedron_item void vertex_has_been_selected(void* void_ptr) { + if((*CGAL::QGLViewer::QGLViewerPool().begin())->property("performing_selection").toBool()) + return; is_active=true; if(active_handle_type == Active_handle::VERTEX || active_handle_type == Active_handle::PATH) { @@ -145,6 +147,8 @@ public Q_SLOTS: } void facet_has_been_selected(void* void_ptr) { + if((*CGAL::QGLViewer::QGLViewerPool().begin())->property("performing_selection").toBool()) + return; is_active=true; if (active_handle_type == Active_handle::FACET || active_handle_type == Active_handle::CONNECTED_COMPONENT) @@ -157,6 +161,8 @@ public Q_SLOTS: } void edge_has_been_selected(void* void_ptr) { + if((*CGAL::QGLViewer::QGLViewerPool().begin())->property("performing_selection").toBool()) + return; is_active=true; if(active_handle_type == Active_handle::EDGE) { diff --git a/Polyhedron/demo/Polyhedron/Plugins/PMP/Selection_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/PMP/Selection_plugin.cpp index baf70e4deed..2e989a8054c 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PMP/Selection_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PMP/Selection_plugin.cpp @@ -1,8 +1,6 @@ #include #include - -#include "Messages_interface.h" #include "Kernel_type.h" #include "Scene_surface_mesh_item.h" #include "Scene_polyhedron_selection_item.h" @@ -10,6 +8,7 @@ #include "Scene_polylines_item.h" #include +#include #include #include #include @@ -118,7 +117,7 @@ public: return qobject_cast(scene->item(scene->mainSelectionIndex())) || qobject_cast(scene->item(scene->mainSelectionIndex())); } - void print_message(QString message) { messages->information(message); } + void print_message(QString message) { CGAL::Three::Three::information(message); } QList actions() const { return QList() << actionSelection; } void init(QMainWindow* mainWindow, CGAL::Three::Scene_interface* scene_interface, Messages_interface* m) { @@ -138,6 +137,11 @@ public: dock_widget->setWindowTitle(tr( "Surface Mesh Selection" )); + connect(dock_widget, &QDockWidget::visibilityChanged, + this, [this](bool b){ + if(!b) + this->set_operation_mode(-1); + }); addDockWidget(dock_widget); @@ -772,7 +776,8 @@ public Q_SLOTS: bool is_valid = true; BOOST_FOREACH(boost::graph_traits::face_descriptor fd, faces(*selection_item->polyhedron())) { - if (CGAL::Polygon_mesh_processing::is_degenerate_triangle_face(fd, *selection_item->polyhedron())) + if (is_triangle(halfedge(fd, *selection_item->polyhedron()), *selection_item->polyhedron()) + && CGAL::Polygon_mesh_processing::is_degenerate_triangle_face(fd, *selection_item->polyhedron())) { is_valid = false; break; diff --git a/Polyhedron/demo/Polyhedron/Plugins/PMP/Selection_widget.ui b/Polyhedron/demo/Polyhedron/Plugins/PMP/Selection_widget.ui index 6cb5504b0c3..22d3ed83b49 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PMP/Selection_widget.ui +++ b/Polyhedron/demo/Polyhedron/Plugins/PMP/Selection_widget.ui @@ -551,7 +551,7 @@ - Split edges + Split edge diff --git a/Polyhedron/demo/Polyhedron/Plugins/PMP/Surface_intersection_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/PMP/Surface_intersection_plugin.cpp index 0bc18398d00..f437347ab0d 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PMP/Surface_intersection_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PMP/Surface_intersection_plugin.cpp @@ -4,6 +4,7 @@ #include "Kernel_type.h" #include "Scene_surface_mesh_item.h" #include +#include #include "Scene_polylines_item.h" #include "Scene_points_with_normal_item.h" @@ -124,7 +125,7 @@ void Polyhedron_demo_intersection_plugin::intersectionSurfaces() if(!is_triangle_mesh(*itemA->face_graph()) || !is_triangle_mesh(*itemB->face_graph())) { - mi->error("The two meshes must be triangle meshes."); + CGAL::Three::Three::error("The two meshes must be triangle meshes."); } QApplication::setOverrideCursor(Qt::WaitCursor); @@ -282,7 +283,7 @@ void Polyhedron_demo_intersection_plugin::intersectionSurfacePolyline() if(!is_triangle_mesh(*itemA->face_graph())) { - mi->error("The mesh must be a triangle mesh."); + CGAL::Three::Three::error("The mesh must be a triangle mesh."); } QApplication::setOverrideCursor(Qt::WaitCursor); diff --git a/Polyhedron/demo/Polyhedron/Plugins/PMP/Triangulate_facets_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/PMP/Triangulate_facets_plugin.cpp index acf5bf53abe..041a9efb815 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PMP/Triangulate_facets_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PMP/Triangulate_facets_plugin.cpp @@ -3,6 +3,7 @@ #include #include "Messages_interface.h" #include +#include #include "Scene_surface_mesh_item.h" #include @@ -53,13 +54,14 @@ public Q_SLOTS: SMesh* pMesh = sm_item->polyhedron(); if(!pMesh) continue; if(is_triangle_mesh(*pMesh)) { - messages->warning(tr("The polyhedron \"%1\" is already triangulated.") + CGAL::Three::Three::warning(tr("The polyhedron \"%1\" is already triangulated.") .arg(sm_item->name()) ); continue; } if(!CGAL::Polygon_mesh_processing::triangulate_faces(*pMesh)) - messages->warning(tr("Some facets could not be triangulated.")); - + CGAL::Three::Three::warning(tr("Some facets could not be triangulated.")); + + sm_item->resetColors(); sm_item->invalidateOpenGLBuffers(); scene->itemChanged(sm_item); } // end of the loop on the selected items diff --git a/Polyhedron/demo/Polyhedron/Plugins/Point_set/Point_set_normal_estimation_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Point_set/Point_set_normal_estimation_plugin.cpp index 5193fec725f..d0b4bf7bcac 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Point_set/Point_set_normal_estimation_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Point_set/Point_set_normal_estimation_plugin.cpp @@ -254,7 +254,7 @@ void Polyhedron_demo_point_set_normal_estimation_plugin::on_actionNormalEstimati std::cerr << "Estimates normal direction by Jet Fitting (k=" << dialog.jet_neighbors() <<")...\n"; // Estimates normals direction. - Jet_estimate_normals_functor functor (points, dialog.pca_neighbors()); + Jet_estimate_normals_functor functor (points, dialog.jet_neighbors()); run_with_qprogressdialog (functor, "Estimating normals by jet fitting...", mw); std::size_t memory = CGAL::Memory_sizer().virtual_size(); diff --git a/Polyhedron/demo/Polyhedron/Plugins/Point_set/Point_set_selection_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Point_set/Point_set_selection_plugin.cpp index 9b9c5853770..ef3e69879f1 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Point_set/Point_set_selection_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Point_set/Point_set_selection_plugin.cpp @@ -16,6 +16,7 @@ #include #include +#include #include "ui_Point_set_selection_widget.h" #include #include "Point_set_3.h" @@ -415,7 +416,7 @@ public: bool applicable(QAction*) const { return qobject_cast(scene->item(scene->mainSelectionIndex())); } - void print_message(QString message) { messages->information(message); } + void print_message(QString message) { CGAL::Three::Three::information(message); } QList actions() const { return QList() << actionPointSetSelection; } void init(QMainWindow* mainWindow, CGAL::Three::Scene_interface* scene_interface, Messages_interface* m) { @@ -615,7 +616,7 @@ protected: Neighbor_search search(tree, Point(point.x, point.y, point.z), 1); Point res = search.begin()->first; - messages->information(QString("Selected point : (%1, %2, %3)").arg(res.x()).arg(res.y()).arg(res.z())); + CGAL::Three::Three::information(QString("Selected point : (%1, %2, %3)").arg(res.x()).arg(res.y()).arg(res.z())); } return false; } diff --git a/Polyhedron/demo/Polyhedron/Plugins/Point_set/Point_set_to_mesh_distance_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Point_set/Point_set_to_mesh_distance_plugin.cpp index 582335319fd..9ea6404172d 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Point_set/Point_set_to_mesh_distance_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Point_set/Point_set_to_mesh_distance_plugin.cpp @@ -1,5 +1,6 @@ #include #include +#include #include #include #include @@ -184,7 +185,7 @@ private Q_SLOTS: if(!item || !item->point_set()->has_property_map("distance")) { - messageInterface->warning("You must select the resulting point set."); + CGAL::Three::Three::warning("You must select the resulting point set."); return; } PMap distance_map; diff --git a/Polyhedron/demo/Polyhedron/Plugins/Point_set/Point_set_upsampling_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Point_set/Point_set_upsampling_plugin.cpp index ad3e5642578..2fba3abfcb8 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Point_set/Point_set_upsampling_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Point_set/Point_set_upsampling_plugin.cpp @@ -3,6 +3,7 @@ #include "Messages_interface.h" #include #include +#include #include #include @@ -86,7 +87,7 @@ void Polyhedron_demo_point_set_upsampling_plugin::on_actionEdgeAwareUpsampling_t { if (!(item->has_normals ())) { - message_interface->error("Error: upsampling algorithm requires point set with normals."); + CGAL::Three::Three::error("Error: upsampling algorithm requires point set with normals."); return; } diff --git a/Polyhedron/demo/Polyhedron/Plugins/Subdivision_methods/Subdivision_methods_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Subdivision_methods/Subdivision_methods_plugin.cpp index 2b54e27cf3e..0d00de8eb16 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Subdivision_methods/Subdivision_methods_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Subdivision_methods/Subdivision_methods_plugin.cpp @@ -6,6 +6,7 @@ #include #include +#include #include "Messages_interface.h" #include "Scene_surface_mesh_item.h" @@ -82,10 +83,10 @@ void Polyhedron_demo_subdivision_methods_plugin::apply_loop(FaceGraphItem* item, typename FaceGraphItem::Face_graph* graph = item->face_graph(); QTime time; time.start(); - messages->information("Loop subdivision..."); + CGAL::Three::Three::information("Loop subdivision..."); QApplication::setOverrideCursor(Qt::WaitCursor); CGAL::Subdivision_method_3::Loop_subdivision(*graph, params::number_of_iterations(nb_steps)); - messages->information(QString("ok (%1 ms)").arg(time.elapsed())); + CGAL::Three::Three::information(QString("ok (%1 ms)").arg(time.elapsed())); QApplication::restoreOverrideCursor(); item->invalidateOpenGLBuffers(); scene->itemChanged(item); @@ -114,10 +115,10 @@ void Polyhedron_demo_subdivision_methods_plugin::apply_catmullclark(FaceGraphIte if(!graph) return; QTime time; time.start(); - messages->information("Catmull-Clark subdivision..."); + CGAL::Three::Three::information("Catmull-Clark subdivision..."); QApplication::setOverrideCursor(Qt::WaitCursor); CGAL::Subdivision_method_3::CatmullClark_subdivision(*graph, params::number_of_iterations(nb_steps)); - messages->information(QString("ok (%1 ms)").arg(time.elapsed())); + CGAL::Three::Three::information(QString("ok (%1 ms)").arg(time.elapsed())); QApplication::restoreOverrideCursor(); item->invalidateOpenGLBuffers(); scene->itemChanged(item); @@ -144,10 +145,10 @@ void Polyhedron_demo_subdivision_methods_plugin::apply_sqrt3(FaceGraphItem* item if(!graph) return; QTime time; time.start(); - messages->information("Sqrt-3 subdivision..."); + CGAL::Three::Three::information("Sqrt-3 subdivision..."); QApplication::setOverrideCursor(Qt::WaitCursor); CGAL::Subdivision_method_3::Sqrt3_subdivision(*graph, params::number_of_iterations(nb_steps)); - messages->information(QString("ok (%1 ms)").arg(time.elapsed())); + CGAL::Three::Three::information(QString("ok (%1 ms)").arg(time.elapsed())); QApplication::restoreOverrideCursor(); item->invalidateOpenGLBuffers(); scene->itemChanged(item); @@ -176,10 +177,10 @@ void Polyhedron_demo_subdivision_methods_plugin::apply_doosabin(FaceGraphItem* i if(!graph) return; QTime time; time.start(); - messages->information("Doo-Sabin subdivision..."); + CGAL::Three::Three::information("Doo-Sabin subdivision..."); QApplication::setOverrideCursor(Qt::WaitCursor); CGAL::Subdivision_method_3::DooSabin_subdivision(*graph, params::number_of_iterations(nb_steps)); - messages->information(QString("ok (%1 ms)").arg(time.elapsed())); + CGAL::Three::Three::information(QString("ok (%1 ms)").arg(time.elapsed())); QApplication::restoreOverrideCursor(); item->invalidateOpenGLBuffers(); scene->itemChanged(item); diff --git a/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/Parameterization_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/Parameterization_plugin.cpp index 06a7f88598b..bfd1c597ff7 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/Parameterization_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/Parameterization_plugin.cpp @@ -9,6 +9,7 @@ #include "SMesh_type.h" #include #include +#include #include "Scene.h" #include #include @@ -316,6 +317,10 @@ public: return _actions; } + ~Polyhedron_demo_parameterization_plugin() + { + delete navigation; + } void init(QMainWindow* mainWindow, Scene_interface* scene_interface, Messages_interface* msg) @@ -540,14 +545,14 @@ void Polyhedron_demo_parameterization_plugin::parameterize(const Parameterizatio if(!poly_item) { - messages->error("Selected item is not of the right type."); + CGAL::Three::Three::error("Selected item is not of the right type."); return; } Face_graph* pMesh = poly_item->face_graph(); if(!pMesh) { - messages->error("Selected item has no valid polyhedron."); + CGAL::Three::Three::error("Selected item has no valid polyhedron."); return; } Scene_polyhedron_selection_item* sel_item = NULL; @@ -579,7 +584,7 @@ void Polyhedron_demo_parameterization_plugin::parameterize(const Parameterizatio if(!is_seamed && is_closed(*pMesh)) { - messages->error("The selected mesh has no (real or virtual) border."); + CGAL::Three::Three::error("The selected mesh has no (real or virtual) border."); return; } @@ -824,6 +829,7 @@ void Polyhedron_demo_parameterization_plugin::parameterize(const Parameterizatio if (i == QDialog::Rejected) { std::cout << "Aborting parameterization" << std::endl; + QApplication::restoreOverrideCursor(); return; } @@ -836,6 +842,7 @@ void Polyhedron_demo_parameterization_plugin::parameterize(const Parameterizatio std::cerr << "Error: incompatible orbifold type and number of cones" << std::endl; std::cerr << "Types I, II & III require 3 selected vertices" << std::endl; std::cerr << "Type IV requires 4 selected vertices" << std::endl; + QApplication::restoreOverrideCursor(); return; } @@ -847,6 +854,7 @@ void Polyhedron_demo_parameterization_plugin::parameterize(const Parameterizatio if(!SMP::locate_unordered_cones(sMesh, unordered_cones.begin(), unordered_cones.end(), cmap)) { std::cerr << "Error: invalid cone or seam selection" << std::endl; + QApplication::restoreOverrideCursor(); return; } @@ -881,6 +889,7 @@ void Polyhedron_demo_parameterization_plugin::parameterize(const Parameterizatio std::cout << "success (in " << time.elapsed() << " ms)" << std::endl; } else { std::cerr << "failure: " << SMP::get_error_message(status) << std::endl; + QApplication::restoreOverrideCursor(); return; } diff --git a/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/Scene_polyhedron_shortest_path_item.cpp b/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/Scene_polyhedron_shortest_path_item.cpp index c397aa48ebe..9df5eec30ac 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/Scene_polyhedron_shortest_path_item.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/Scene_polyhedron_shortest_path_item.cpp @@ -9,6 +9,7 @@ #include #include +#include #include typedef Scene_polyhedron_shortest_path_item It; @@ -242,9 +243,9 @@ void Scene_polyhedron_shortest_path_item_priv::ensure_shortest_paths_tree() { if (!m_shortestPaths->changed_since_last_build()) { - m_messages->information("Recomputing shortest paths tree..."); + CGAL::Three::Three::information("Recomputing shortest paths tree..."); m_shortestPaths->build_sequence_tree(); - m_messages->information("Done."); + CGAL::Three::Three::information("Done."); } } @@ -387,7 +388,7 @@ bool Scene_polyhedron_shortest_path_item_priv::run_point_select(const Ray_3& ray if (faceLocation.first == GraphTraits::null_face()) { - m_messages->information(QObject::tr("Shortest Paths: No face under cursor.")); + CGAL::Three::Three::information(QObject::tr("Shortest Paths: No face under cursor.")); QApplication::restoreOverrideCursor(); return false; } @@ -395,7 +396,7 @@ bool Scene_polyhedron_shortest_path_item_priv::run_point_select(const Ray_3& ray { boost::property_map::type fimap = get(CGAL::face_index, *item->polyhedron()); - m_messages->information(QObject::tr("Shortest Paths: Selected Face: %1; Barycentric coordinates: %2 %3 %4") + CGAL::Three::Three::information(QObject::tr("Shortest Paths: Selected Face: %1; Barycentric coordinates: %2 %3 %4") .arg(get(fimap, faceLocation.first)) .arg(double(faceLocation.second[0])) .arg(double(faceLocation.second[1])) @@ -442,7 +443,7 @@ bool Scene_polyhedron_shortest_path_item_priv::run_point_select(const Ray_3& ray polylines->polylines.push_back(Scene_polylines_item::Polyline()); - m_messages->information(QObject::tr("Computing shortest path polyline...")); + CGAL::Three::Three::information(QObject::tr("Computing shortest path polyline...")); QTime time; time.start(); @@ -462,7 +463,7 @@ bool Scene_polyhedron_shortest_path_item_priv::run_point_select(const Ray_3& ray } else { - m_messages->warning(QObject::tr("No source points to compute shortest paths from.")); + CGAL::Three::Three::warning(QObject::tr("No source points to compute shortest paths from.")); } break; } diff --git a/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/Shortest_path_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/Shortest_path_plugin.cpp index b9995cba4f1..b411c8c6a17 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/Shortest_path_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/Shortest_path_plugin.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include "Scene_surface_mesh_item.h" #include "Scene_polyhedron_shortest_path_item.h" @@ -192,14 +193,14 @@ void Polyhedron_demo_shortest_path_plugin::new_item(int itemIndex) if(!polyhedronItem) { CGAL_assertion(item->polyhedron_item() == NULL); // which means it is coming from selection_io loader - this->m_messages->information(tr("Error: please select corresponding polyhedron item from Geometric Objects list.")); + CGAL::Three::Three::information(tr("Error: please select corresponding polyhedron item from Geometric Objects list.")); scene->erase(itemIndex); return; } if(!item->deferred_load(polyhedronItem, this->scene, this->m_messages, this->mw)) { - this->m_messages->information("Error: loading selection item is not successful!"); + CGAL::Three::Three::information("Error: loading selection item is not successful!"); scene->erase(itemIndex); return; } @@ -248,12 +249,12 @@ void Polyhedron_demo_shortest_path_plugin::on_actionMakeShortestPaths_triggered( } else { - this->m_messages->warning(tr("A shortest path item for this polyhedron already exists (only one allowed per for now)")); + CGAL::Three::Three::warning(tr("A shortest path item for this polyhedron already exists (only one allowed per for now)")); } } else { - this->m_messages->warning("No polyhedron selected."); + CGAL::Three::Three::warning("No polyhedron selected."); } } diff --git a/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/Surface_mesh_approximation_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/Surface_mesh_approximation_plugin.cpp index 0a9c67c2e5d..68c11cca37c 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/Surface_mesh_approximation_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/Surface_mesh_approximation_plugin.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #include #include @@ -276,7 +277,7 @@ void Polyhedron_demo_surface_mesh_approximation_plugin::on_buttonSeeding_clicked Scene_surface_mesh_item *sm_item = qobject_cast( scene->item(sm_id)); if (!sm_item) { - mi->information(QString("No surface mesh item selected.")); + CGAL::Three::Three::information(QString("No surface mesh item selected.")); return; } @@ -324,7 +325,7 @@ void Polyhedron_demo_surface_mesh_approximation_plugin::on_buttonSeeding_clicked update_seeds_item(approx, pmesh); - mi->information(QString("Done, #proxies = %1. (%2 ms)").arg( + CGAL::Three::Three::information(QString("Done, #proxies = %1. (%2 ms)").arg( approx.number_of_proxies()).arg(time.elapsed())); sm_item->color_vector() = approx.proxy_colors(); sm_item->setItemIsMulticolor(true); @@ -345,12 +346,12 @@ void Polyhedron_demo_surface_mesh_approximation_plugin::on_buttonFit_clicked() { Scene_surface_mesh_item *sm_item = qobject_cast( scene->item(scene->mainSelectionIndex())); if (!sm_item) { - mi->information(QString("No surface mesh item selected.")); + CGAL::Three::Three::information(QString("No surface mesh item selected.")); return; } SM_wrapper_map::iterator search = m_sm_wrapper_map.find(sm_item); if (search == m_sm_wrapper_map.end() || !search->second->initialized()) { - mi->information(QString("Please initialize seeds first.")); + CGAL::Three::Three::information(QString("Please initialize seeds first.")); return; } SMesh *pmesh = search->first->face_graph(); @@ -363,7 +364,7 @@ void Polyhedron_demo_surface_mesh_approximation_plugin::on_buttonFit_clicked() { approx.output(CGAL::parameters::face_proxy_map(pidmap)); update_seeds_item(approx, pmesh); - mi->information(QString("Fit one iteration, #proxies = %1.").arg(approx.number_of_proxies())); + CGAL::Three::Three::information(QString("Fit one iteration, #proxies = %1.").arg(approx.number_of_proxies())); sm_item->color_vector() = approx.proxy_colors(); sm_item->setItemIsMulticolor(true); @@ -392,12 +393,12 @@ void Polyhedron_demo_surface_mesh_approximation_plugin::on_buttonAdd_clicked() { Scene_surface_mesh_item *sm_item = qobject_cast( scene->item(scene->mainSelectionIndex())); if (!sm_item) { - mi->information(QString("No surface mesh item selected.")); + CGAL::Three::Three::information(QString("No surface mesh item selected.")); return; } SM_wrapper_map::iterator search = m_sm_wrapper_map.find(sm_item); if (search == m_sm_wrapper_map.end() || !search->second->initialized()) { - mi->information(QString("Please initialize seeds first.")); + CGAL::Three::Three::information(QString("Please initialize seeds first.")); return; } SMesh *pmesh = search->first->face_graph(); @@ -406,11 +407,11 @@ void Polyhedron_demo_surface_mesh_approximation_plugin::on_buttonAdd_clicked() { QApplication::setOverrideCursor(Qt::WaitCursor); if (approx.add_one_proxy() == 0) { - mi->information(QString("No proxy added, #proxies = %1.").arg(approx.number_of_proxies())); + CGAL::Three::Three::information(QString("No proxy added, #proxies = %1.").arg(approx.number_of_proxies())); QApplication::restoreOverrideCursor(); return; } - mi->information(QString("One proxy added, #proxies = %1.").arg(approx.number_of_proxies())); + CGAL::Three::Three::information(QString("One proxy added, #proxies = %1.").arg(approx.number_of_proxies())); Patch_id_pmap pidmap(get(CGAL::face_patch_id_t(), *pmesh)); approx.output(CGAL::parameters::face_proxy_map(pidmap)); @@ -443,12 +444,12 @@ void Polyhedron_demo_surface_mesh_approximation_plugin::on_buttonTeleport_clicke Scene_surface_mesh_item *sm_item = qobject_cast( scene->item(scene->mainSelectionIndex())); if (!sm_item) { - mi->information(QString("No surface mesh item selected.")); + CGAL::Three::Three::information(QString("No surface mesh item selected.")); return; } SM_wrapper_map::iterator search = m_sm_wrapper_map.find(sm_item); if (search == m_sm_wrapper_map.end() || !search->second->initialized()) { - mi->information(QString("Please initialize seeds first.")); + CGAL::Three::Three::information(QString("Please initialize seeds first.")); return; } SMesh *pmesh = search->first->face_graph(); @@ -457,7 +458,7 @@ void Polyhedron_demo_surface_mesh_approximation_plugin::on_buttonTeleport_clicke QApplication::setOverrideCursor(Qt::WaitCursor); if (approx.teleport_one_proxy() == 0) { - mi->information(QString("No proxy teleported, #proxies = %1.").arg(approx.number_of_proxies())); + CGAL::Three::Three::information(QString("No proxy teleported, #proxies = %1.").arg(approx.number_of_proxies())); QApplication::restoreOverrideCursor(); return; } @@ -465,7 +466,7 @@ void Polyhedron_demo_surface_mesh_approximation_plugin::on_buttonTeleport_clicke approx.output(CGAL::parameters::face_proxy_map(pidmap)); update_seeds_item(approx, pmesh); - mi->information(QString("One proxy teleported, #proxies = %1.").arg(approx.number_of_proxies())); + CGAL::Three::Three::information(QString("One proxy teleported, #proxies = %1.").arg(approx.number_of_proxies())); sm_item->color_vector() = approx.proxy_colors(); sm_item->setItemIsMulticolor(true); @@ -494,12 +495,12 @@ void Polyhedron_demo_surface_mesh_approximation_plugin::on_buttonSplit_clicked() Scene_surface_mesh_item *sm_item = qobject_cast( scene->item(scene->mainSelectionIndex())); if (!sm_item) { - mi->information(QString("No surface mesh item selected.")); + CGAL::Three::Three::information(QString("No surface mesh item selected.")); return; } SM_wrapper_map::iterator search = m_sm_wrapper_map.find(sm_item); if (search == m_sm_wrapper_map.end() || !search->second->initialized()) { - mi->information(QString("Please initialize seeds first.")); + CGAL::Three::Three::information(QString("Please initialize seeds first.")); return; } SMesh *pmesh = search->first->face_graph(); @@ -510,11 +511,11 @@ void Polyhedron_demo_surface_mesh_approximation_plugin::on_buttonSplit_clicked() if (!approx.split(ui_widget.split_proxy_idx->value(), ui_widget.split_nb_sections->value(), ui_widget.split_nb_relaxations->value())) { - mi->information(QString("No proxy splitted, #proxies = %1.").arg(approx.number_of_proxies())); + CGAL::Three::Three::information(QString("No proxy splitted, #proxies = %1.").arg(approx.number_of_proxies())); QApplication::restoreOverrideCursor(); return; } - mi->information(QString("One proxy splitted, #proxies = %1.").arg(approx.number_of_proxies())); + CGAL::Three::Three::information(QString("One proxy splitted, #proxies = %1.").arg(approx.number_of_proxies())); Patch_id_pmap pidmap(get(CGAL::face_patch_id_t(), *pmesh)); approx.output(CGAL::parameters::face_proxy_map(pidmap)); @@ -547,12 +548,12 @@ void Polyhedron_demo_surface_mesh_approximation_plugin::on_buttonMeshing_clicked Scene_surface_mesh_item *sm_item = qobject_cast( scene->item(scene->mainSelectionIndex())); if (!sm_item) { - mi->information(QString("No surface mesh item selected.")); + CGAL::Three::Three::information(QString("No surface mesh item selected.")); return; } SM_wrapper_map::iterator search = m_sm_wrapper_map.find(sm_item); if (search == m_sm_wrapper_map.end() || !search->second->initialized()) { - mi->information(QString("Please initialize seeds first.")); + CGAL::Three::Three::information(QString("Please initialize seeds first.")); return; } SMesh *pmesh = search->first->face_graph(); @@ -607,7 +608,7 @@ void Polyhedron_demo_surface_mesh_approximation_plugin::on_buttonMeshing_clicked sm_item->setVisible(false); - mi->information(QString("Meshing done.")); + CGAL::Three::Three::information(QString("Meshing done.")); QApplication::restoreOverrideCursor(); } @@ -616,7 +617,7 @@ void Polyhedron_demo_surface_mesh_approximation_plugin::on_comboMetric_currentIn Scene_surface_mesh_item *sm_item = qobject_cast( scene->item(scene->mainSelectionIndex())); if (!sm_item) { - mi->information(QString("No surface mesh item selected.")); + CGAL::Three::Three::information(QString("No surface mesh item selected.")); return; } SM_wrapper_map::iterator search = m_sm_wrapper_map.find(sm_item); diff --git a/Polyhedron/demo/Polyhedron/Polyhedron_3.qrc b/Polyhedron/demo/Polyhedron/Polyhedron_3.qrc index 1a5085550c0..ddfef37241e 100644 --- a/Polyhedron/demo/Polyhedron/Polyhedron_3.qrc +++ b/Polyhedron/demo/Polyhedron/Polyhedron_3.qrc @@ -94,6 +94,10 @@ resources/compatibility_shaders/shader_with_textured_edges.v resources/compatibility_shaders/shader_without_light.f resources/compatibility_shaders/shader_without_light.v + resources/heat_intensity_shader.f + resources/heat_intensity_shader.v + resources/compatibility_shaders/heat_intensity_shader.f + resources/compatibility_shaders/heat_intensity_shader.v resources/rotate_around_cursor.png diff --git a/Polyhedron/demo/Polyhedron/Preferences.ui b/Polyhedron/demo/Polyhedron/Preferences.ui index 596e8cf2513..34613871e8d 100644 --- a/Polyhedron/demo/Polyhedron/Preferences.ui +++ b/Polyhedron/demo/Polyhedron/Preferences.ui @@ -60,7 +60,7 @@ 0 0 278 - 432 + 499 @@ -118,6 +118,9 @@ Transparency Pass Number: + + 4 + 4 @@ -311,7 +314,7 @@ - Tick plugins you don't want to load at start up + Tick plugins you want to load at start up diff --git a/Polyhedron/demo/Polyhedron/Scene.cpp b/Polyhedron/demo/Polyhedron/Scene.cpp index 890940606fe..38956320395 100644 --- a/Polyhedron/demo/Polyhedron/Scene.cpp +++ b/Polyhedron/demo/Polyhedron/Scene.cpp @@ -181,9 +181,9 @@ Scene::erase(Scene::Item_id index) item->deleteLater(); selected_item = -1; //re-creates the Scene_view - Q_FOREACH(Scene_item* item, m_entries) + Q_FOREACH(Item_id id, children) { - organize_items(item, invisibleRootItem(), 0); + organize_items(this->item(id), invisibleRootItem(), 0); } QStandardItemModel::beginResetModel(); Q_EMIT updated(); @@ -233,9 +233,9 @@ Scene::erase(QList indices) continue; if(item->parentGroup()) item->parentGroup()->removeChild(item); - children.removeAll(removed_item); - indexErased(removed_item); - m_entries.removeAll(item); + children.removeAll(removed_item); + indexErased(removed_item); + m_entries.removeAll(item); Q_EMIT itemAboutToBeDestroyed(item); item->aboutToBeDestroyed(); @@ -244,9 +244,9 @@ Scene::erase(QList indices) clear(); index_map.clear(); selected_item = -1; - Q_FOREACH(Scene_item* item, m_entries) + Q_FOREACH(Item_id id, children) { - organize_items(item, invisibleRootItem(), 0); + organize_items(item(id), invisibleRootItem(), 0); } QStandardItemModel::beginResetModel(); Q_EMIT updated(); @@ -276,12 +276,13 @@ void Scene::remove_item_from_groups(Scene_item* item) } Scene::~Scene() { - Q_FOREACH(CGAL::Three::Scene_item* item_ptr, m_entries) - { - item_ptr->deleteLater(); - } - m_entries.clear(); - + vao->destroy(); + delete vao; + Q_FOREACH(CGAL::Three::Scene_item* item_ptr, m_entries) + { + item_ptr->deleteLater(); + } + m_entries.clear(); } CGAL::Three::Scene_item* @@ -535,7 +536,7 @@ void Scene::renderScene(const QList &items, viewer->glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); } item.draw(viewer); - + if(with_names) { // read depth buffer at pick location; @@ -683,6 +684,34 @@ Scene::draw_aux(bool with_names, CGAL::Three::Viewer_interface* viewer) transparent_items.push_back(id); } renderScene(children, viewer, picked_item_IDs, with_names, -1, false, NULL); + if(with_names) + { + //here we get the selected point, before erasing the depth buffer. We store it + //in a dynamic property as a QList. If there is some alpha, the + //depth buffer is altered, and the picking will return true even when it is + // performed in the background, when it should return false. To avoid that, + // we distinguish the case were there is no alpha, to let the viewer + //perform it, and the case where the pixel is not found. In the first case, + //we erase the property, in the latter we return an empty list. + //According ot that, in the viewer, either we perform the picking, either we do nothing. + if(has_alpha()) { + bool found = false; + CGAL::qglviewer::Vec point = viewer->camera()->pointUnderPixel(picked_pixel, found) - viewer->offset(); + if(found){ + QList picked_point; + picked_point <setProperty("picked_point", picked_point); + } + else{ + viewer->setProperty("picked_point", QList()); + } + } + else { + viewer->setProperty("picked_point", {}); + } + } if(!with_names && has_alpha()) { std::vector fbos; @@ -1188,8 +1217,9 @@ void Scene::moveRowUp() } } } - if(!to_select.isEmpty()) + if(!to_select.isEmpty()){ selectionChanged(to_select); + } } void Scene::moveRowDown() { @@ -1544,7 +1574,6 @@ void Scene::redraw_model() index_map.clear(); //fills the model Q_FOREACH(Item_id id, children) - { organize_items(m_entries[id], invisibleRootItem(), 0); } diff --git a/Polyhedron/demo/Polyhedron/Scene_c3t3_item.cpp b/Polyhedron/demo/Polyhedron/Scene_c3t3_item.cpp index 8abcf815820..0e9eb038efc 100644 --- a/Polyhedron/demo/Polyhedron/Scene_c3t3_item.cpp +++ b/Polyhedron/demo/Polyhedron/Scene_c3t3_item.cpp @@ -1304,7 +1304,7 @@ QMenu* Scene_c3t3_item::contextMenu() QMenu *container = new QMenu(tr("Alpha value")); container->menuAction()->setProperty("is_groupable", true); QWidgetAction *sliderAction = new QWidgetAction(0); - sliderAction->setDefaultWidget(d->alphaSlider); + sliderAction->setDefaultWidget(alphaSlider()); connect(d->alphaSlider, &QSlider::valueChanged, [this]() { diff --git a/Polyhedron/demo/Polyhedron/Scene_points_with_normal_item.cpp b/Polyhedron/demo/Polyhedron/Scene_points_with_normal_item.cpp index 1bdc1b7058e..f3d9aff906f 100644 --- a/Polyhedron/demo/Polyhedron/Scene_points_with_normal_item.cpp +++ b/Polyhedron/demo/Polyhedron/Scene_points_with_normal_item.cpp @@ -185,7 +185,8 @@ public: if(has_normals) { const Kernel::Vector_3& n = point_set->normal(*it); - Point_set_3::Point q = p + length * n; + Kernel::FT normalizer = 1.0/CGAL::sqrt(n.squared_length()); + Point_set_3::Point q = p + length * n * normalizer; positions_lines[i * size_p + 3] = q.x() + offset.x; positions_lines[i * size_p + 4] = q.y() + offset.y; positions_lines[i * size_p + 5] = q.z() + offset.z; @@ -432,7 +433,7 @@ void Scene_points_with_normal_item_priv::compute_normals_and_vertices() const // we can't afford computing real average spacing just for display, 0.5% of bbox will do average_spacing = 0.005 * item->diagonalBbox(); normal_length = (std::min)(average_spacing, std::sqrt(region_of_interest.squared_radius() / 1000.)); - length_factor = 5.0/100*normal_Slider->value(); + length_factor = 10.0/100*normal_Slider->value(); } else { diff --git a/Polyhedron/demo/Polyhedron/Scene_polygon_soup_item.cpp b/Polyhedron/demo/Polyhedron/Scene_polygon_soup_item.cpp index dd0fadf86e0..3c313bc301b 100644 --- a/Polyhedron/demo/Polyhedron/Scene_polygon_soup_item.cpp +++ b/Polyhedron/demo/Polyhedron/Scene_polygon_soup_item.cpp @@ -210,48 +210,20 @@ Scene_polygon_soup_item_priv::triangulate_polygon(Polygons_iterator pit, int pol //Computes the normal of the facet Traits::Vector_3 normal = CGAL::NULL_VECTOR; - // The three first vertices may be aligned, we need to test other - // combinations - Point_3 pa, pb, pc; - for (std::size_t i = 0; i < pit->size() - 2; ++ i) - { - pa = soup->points[pit->at(i)]; - pb = soup->points[pit->at(i+1)]; - pc = soup->points[pit->at(i+2)]; - if (!CGAL::collinear (pa, pb, pc)) - { - normal = CGAL::cross_product(pb-pa, pc -pa); - break; - } + //Newell's method + for (std::size_t i = 0; i < pit->size() ; ++ i){ + const Point_3& pa = soup->points[pit->at(i)]; + const Point_3& pb = soup->points[pit->at((i+1)%pit->size())]; + double x = normal.x() + (pa.y()-pb.y())*(pa.z()+pb.z()); + double y = normal.y() + (pa.z()-pb.z())*(pa.x()+pb.x()); + double z = normal.z() + (pa.x()-pb.x())*(pa.y()+pb.y()); + normal = Traits::Vector_3(x,y,z); } - if (normal == CGAL::NULL_VECTOR) // No normal could be computed, return return; - - normal = normal / std::sqrt (normal * normal); - - // If the 3 points used to estimate the normal form a concavity, - // then the normal is wrongly oriented. To address this, we - // compute the resulting projected 2D polygon and check if it - // correctly oriented (counterclockwise). If it's not, we invert - // the normal. - { - EPICK::Plane_3 plane (pa, normal); - CGAL::Polygon_2 poly; - for (std::size_t i = 0; i < pit->size(); ++ i) - poly.push_back (plane.to_2d(soup->points[pit->at(i)])); - - if (poly.is_simple() && poly.is_clockwise_oriented()) - normal = -normal; - } - + typedef FacetTriangulator FT; - double diagonal; - if(item->diagonalBbox() != std::numeric_limits::infinity()) - diagonal = item->diagonalBbox(); - else - diagonal = 0.0; std::size_t it = 0; std::size_t it_end =pit->size(); std::vector pointIds; @@ -276,7 +248,7 @@ Scene_polygon_soup_item_priv::triangulate_polygon(Polygons_iterator pit, int pol } } } - FT triangulation(pointIds,normal,diagonal); + FT triangulation(pointIds,normal); //iterates on the internal faces to add the vertices to the positions //and the normals to the appropriate vectors for(FT::CDT::Finite_faces_iterator diff --git a/Polyhedron/demo/Polyhedron/Scene_polyhedron_item_decorator.cpp b/Polyhedron/demo/Polyhedron/Scene_polyhedron_item_decorator.cpp index b756c37ea46..aec0f873302 100644 --- a/Polyhedron/demo/Polyhedron/Scene_polyhedron_item_decorator.cpp +++ b/Polyhedron/demo/Polyhedron/Scene_polyhedron_item_decorator.cpp @@ -70,18 +70,12 @@ Scene_polyhedron_item_decorator::select(double orig_x, double dir_y, double dir_z) { - Scene_item::select(orig_x, - orig_y, - orig_z, - dir_x, - dir_y, - dir_z); poly_item->select(orig_x, - orig_y, - orig_z, - dir_x, - dir_y, - dir_z); + orig_y, + orig_z, + dir_x, + dir_y, + dir_z); } Scene_face_graph_item* Scene_polyhedron_item_decorator::polyhedron_item() const { diff --git a/Polyhedron/demo/Polyhedron/Scene_polyhedron_selection_item.cpp b/Polyhedron/demo/Polyhedron/Scene_polyhedron_selection_item.cpp index 775b3daf1eb..0216c02db64 100644 --- a/Polyhedron/demo/Polyhedron/Scene_polyhedron_selection_item.cpp +++ b/Polyhedron/demo/Polyhedron/Scene_polyhedron_selection_item.cpp @@ -433,12 +433,7 @@ Scene_polyhedron_selection_item_priv::triangulate_facet(fg_face_descriptor fit,c EPICK::Vector_3 offset(off.x,off.y,off.z); typedef FacetTriangulator FT; - double diagonal; - if(item->poly_item->diagonalBbox() != std::numeric_limits::infinity()) - diagonal = item->poly_item->diagonalBbox(); - else - diagonal = 0.0; - FT triangulation(fit,normal,poly,diagonal, offset); + FT triangulation(fit,normal,poly, offset); //iterates on the internal faces to add the vertices to the positions //and the normals to the appropriate vectors for(FT::CDT::Finite_faces_iterator @@ -1117,6 +1112,7 @@ bool Scene_polyhedron_selection_item::treat_selection(const std::set(1)); d->tempInstructions("Face split.", "Select a facet (1/3)."); + polyhedron_item()->resetColors(); polyhedron_item()->invalidateOpenGLBuffers(); } } @@ -1342,6 +1338,7 @@ bool Scene_polyhedron_selection_item:: treat_selection(const std::setresetColors(); invalidateOpenGLBuffers(); polyhedron_item()->invalidateOpenGLBuffers(); d->tempInstructions("Face and vertex added.", @@ -1392,6 +1389,7 @@ bool Scene_polyhedron_selection_item:: treat_selection(const std::setresetColors(); invalidateOpenGLBuffers(); polyhedron_item()->invalidateOpenGLBuffers(); d->tempInstructions("Face added.", @@ -1490,6 +1488,7 @@ bool Scene_polyhedron_selection_item::treat_selection(const std::set(0)); + poly_item->resetColors(); poly_item->invalidateOpenGLBuffers(); d->tempInstructions("Vertex splitted.", "Select the vertex you want splitted. (1/3)"); } @@ -1545,6 +1544,7 @@ bool Scene_polyhedron_selection_item::treat_selection(const std::setresetColors(); poly_item->invalidateOpenGLBuffers(); } diff --git a/Polyhedron/demo/Polyhedron/Scene_surface_mesh_item.cpp b/Polyhedron/demo/Polyhedron/Scene_surface_mesh_item.cpp index 0013b1e4313..b3b517b254c 100644 --- a/Polyhedron/demo/Polyhedron/Scene_surface_mesh_item.cpp +++ b/Polyhedron/demo/Polyhedron/Scene_surface_mesh_item.cpp @@ -895,11 +895,10 @@ Scene_surface_mesh_item_priv::triangulate_facet(face_descriptor fd, if(normal == CGAL::NULL_VECTOR) { boost::graph_traits::halfedge_descriptor start = prev(halfedge(fd, *smesh_), *smesh_); - boost::graph_traits::halfedge_descriptor next_; + boost::graph_traits::halfedge_descriptor hd = halfedge(fd, *smesh_); + boost::graph_traits::halfedge_descriptor next_=next(hd, *smesh_); do { - boost::graph_traits::halfedge_descriptor hd = halfedge(fd, *smesh_); - next_ =next(hd, *smesh_); const Point_3& pa = smesh_->point(target(hd, *smesh_)); const Point_3& pb = smesh_->point(target(next_, *smesh_)); const Point_3& pc = smesh_->point(target(prev(hd, *smesh_), *smesh_)); @@ -908,6 +907,7 @@ Scene_surface_mesh_item_priv::triangulate_facet(face_descriptor fd, normal = CGAL::cross_product(pb-pa, pc -pa); break; } + next_ =next(next_, *smesh_); }while(next_ != start); if (normal == CGAL::NULL_VECTOR) // No normal could be computed, return @@ -924,14 +924,9 @@ Scene_surface_mesh_item_priv::triangulate_facet(face_descriptor fd, } typedef FacetTriangulator::vertex_descriptor> FT; - double diagonal; - if(item->diagonalBbox() != std::numeric_limits::infinity()) - diagonal = item->diagonalBbox(); - else - diagonal = 0.0; const CGAL::qglviewer::Vec off = static_cast(CGAL::QGLViewer::QGLViewerPool().first())->offset(); EPICK::Vector_3 offset(off.x,off.y,off.z); - FT triangulation(fd,normal,smesh_,diagonal, offset); + FT triangulation(fd,normal,smesh_, offset); //iterates on the internal faces for(FT::CDT::Finite_faces_iterator ffit = triangulation.cdt->finite_faces_begin(), @@ -1074,7 +1069,8 @@ void* Scene_surface_mesh_item_priv::get_aabb_tree() BOOST_FOREACH( face_descriptor f, faces(*sm)) { //if face is degenerate, skip it - if (CGAL::is_triangle(halfedge(f, *sm), *sm) && CGAL::Polygon_mesh_processing::is_degenerate_triangle_face(f, *sm)) + if (CGAL::is_triangle(halfedge(f, *sm), *sm) + && CGAL::Polygon_mesh_processing::is_degenerate_triangle_face(f, *sm)) continue; //if face not triangle, triangulate corresponding primitive before adding it to the tree if(!CGAL::is_triangle(halfedge(f, *sm), *sm)) @@ -1296,12 +1292,7 @@ QList Scene_surface_mesh_item_priv::triangulate_primitive(fac qDebug()<<"Warning in triangulation of the selection item: normal contains NaN values and is not valid."; return QList(); } - double diagonal; - if(item->diagonalBbox() != std::numeric_limits::infinity()) - diagonal = item->diagonalBbox(); - else - diagonal = 0.0; - FT triangulation(fit,normal,smesh_,diagonal); + FT triangulation(fit,normal,smesh_); //iterates on the internal faces to add the vertices to the positions //and the normals to the appropriate vectors for( FT::CDT::Finite_faces_iterator diff --git a/Polyhedron/demo/Polyhedron/Three.cpp b/Polyhedron/demo/Polyhedron/Three.cpp index b29abaa2e6e..07feeb0b7ac 100644 --- a/Polyhedron/demo/Polyhedron/Three.cpp +++ b/Polyhedron/demo/Polyhedron/Three.cpp @@ -3,6 +3,8 @@ #include #include #include +#include "Messages_interface.h" + using namespace CGAL::Three; QMainWindow* Three::s_mainwindow = NULL; @@ -30,10 +32,6 @@ QObject* Three::connectableScene() return s_connectable_scene; } -Three* Three::messages() -{ - return s_three; -} Three::Three() { @@ -136,6 +134,18 @@ void Three::autoConnectActions(Polyhedron_demo_plugin_interface *plugin) } // end foreach action of actions() } +void Three::information(QString s) +{ + qobject_cast(mainWindow())->message_information(s); +} +void Three::warning(QString s) +{ + qobject_cast(mainWindow())->message_warning(s); +} +void Three::error(QString s) +{ + qobject_cast(mainWindow())->message_error(s); +} RenderingMode Three::defaultSurfaceMeshRenderingMode() { return s_defaultSMRM; diff --git a/Polyhedron/demo/Polyhedron/Travel_isolated_components.h b/Polyhedron/demo/Polyhedron/Travel_isolated_components.h index 64bff2a2b9e..9c23e00de6a 100644 --- a/Polyhedron/demo/Polyhedron/Travel_isolated_components.h +++ b/Polyhedron/demo/Polyhedron/Travel_isolated_components.h @@ -65,13 +65,16 @@ public: // to be used in get_minimum_isolated_component function struct Minimum_visitor { + Minimum_visitor() + : minimum(-1) + {} template - void operator()(const std::vector& C) { - if(!minimum) { minimum = C.size(); } - else { minimum = (std::min)(*minimum, C.size()); } + void operator()(const std::vector& C) + { + minimum = (std::min)(minimum, C.size()); } - boost::optional minimum; + std::size_t minimum; }; // to be used in select_isolated_components function diff --git a/Polyhedron/demo/Polyhedron/Triangle_container.cpp b/Polyhedron/demo/Polyhedron/Triangle_container.cpp index b7ce71308b1..d67279a06fa 100644 --- a/Polyhedron/demo/Polyhedron/Triangle_container.cpp +++ b/Polyhedron/demo/Polyhedron/Triangle_container.cpp @@ -57,8 +57,17 @@ void Triangle_container::initGL( Viewer_interface* viewer) setVbo(VColors, new Vbo("colors", Vbo::COLORS, - QOpenGLBuffer::VertexBuffer, GL_FLOAT, 0, 4)); + QOpenGLBuffer::VertexBuffer, GL_FLOAT, 0, 3)); getVao(viewer)->addVbo(getVbo(VColors)); + if(viewer->getShaderProgram(getProgram())->property("hasDistanceValues").toBool()) + { + if(!getVbo(Distances)) + setVbo(Distances, + new Vbo("distance", + Vbo::COLORS, + QOpenGLBuffer::VertexBuffer, GL_FLOAT, 0, 1)); + getVao(viewer)->addVbo(getVbo(Distances)); + } } else { diff --git a/Polyhedron/demo/Polyhedron/Viewer.cpp b/Polyhedron/demo/Polyhedron/Viewer.cpp index 05343dde80a..729063418c3 100644 --- a/Polyhedron/demo/Polyhedron/Viewer.cpp +++ b/Polyhedron/demo/Polyhedron/Viewer.cpp @@ -331,7 +331,14 @@ Viewer::~Viewer() .arg(d->specular.z())); viewer_settings.setValue("spec_power", d->spec_power); + if(d->_recentFunctions) + delete d->_recentFunctions; + if(d->painter) + delete d->painter; + if(d->textRenderer) + d->textRenderer->deleteLater(); delete d; + } void Viewer::setScene(CGAL::Three::Scene_draw_interface* scene) @@ -708,12 +715,27 @@ void Viewer::drawWithNames() void Viewer::postSelection(const QPoint& pixel) { Q_EMIT selected(this->selectedName()); - bool found = false; - CGAL::qglviewer::Vec point = camera()->pointUnderPixel(pixel, found) - offset(); + CGAL::qglviewer::Vec point; + bool found = true; + if(property("picked_point").isValid()) { + if(!property("picked_point").toList().isEmpty()) + { + QList picked_point = property("picked_point").toList(); + point = CGAL::qglviewer::Vec (picked_point[0].toDouble(), + picked_point[1].toDouble(), + picked_point[2].toDouble()); + } + else{ + found = false; + } + } + else{ + point = camera()->pointUnderPixel(pixel, found) - offset(); + } if(found) { Q_EMIT selectedPoint(point.x, - point.y, - point.z); + point.y, + point.z); CGAL::qglviewer::Vec dir; CGAL::qglviewer::Vec orig; if(d->projection_is_ortho) @@ -725,8 +747,10 @@ void Viewer::postSelection(const QPoint& pixel) orig = camera()->position() - offset(); dir = point - orig; } + this->setProperty("performing_selection", true); Q_EMIT selectionRay(orig.x, orig.y, orig.z, - dir.x, dir.y, dir.z); + dir.x, dir.y, dir.z); + this->setProperty("performing_selection", false); } } bool CGAL::Three::Viewer_interface::readFrame(QString s, CGAL::qglviewer::Frame& frame) @@ -839,6 +863,7 @@ void Viewer::attribBuffers(int program_name) const { case PROGRAM_WITH_LIGHT: case PROGRAM_SPHERES: case PROGRAM_CUTPLANE_SPHERES: + case PROGRAM_HEAT_INTENSITY: program->setUniformValue("alpha", 1.0f); //overriden in item draw() if necessary } @@ -854,6 +879,7 @@ void Viewer::attribBuffers(int program_name) const { case PROGRAM_SPHERES: case PROGRAM_OLD_FLAT: case PROGRAM_FLAT: + case PROGRAM_HEAT_INTENSITY: program->setUniformValue("light_pos", light_pos); program->setUniformValue("light_diff",d->diffuse); program->setUniformValue("light_spec", d->specular); @@ -872,6 +898,7 @@ void Viewer::attribBuffers(int program_name) const { case PROGRAM_SPHERES: case PROGRAM_OLD_FLAT: case PROGRAM_FLAT: + case PROGRAM_HEAT_INTENSITY: program->setUniformValue("mv_matrix", mv_mat); break; case PROGRAM_WITHOUT_LIGHT: @@ -987,6 +1014,7 @@ void Viewer::drawVisualHints() if (d->_displayMessage) d->textRenderer->removeText(message_text); + delete message_text; } QOpenGLShaderProgram* Viewer::declare_program(int name, @@ -1073,6 +1101,18 @@ QOpenGLShaderProgram* Viewer::getShaderProgram(int name) const program->setProperty("hasFMatrix", true); return program; } + case PROGRAM_HEAT_INTENSITY: + { + QOpenGLShaderProgram* program = isOpenGL_4_3() + ? declare_program(name, ":/cgal/Polyhedron_3/resources/heat_intensity_shader.v" , ":/cgal/Polyhedron_3/resources/heat_intensity_shader.f") + : declare_program(name, ":/cgal/Polyhedron_3/resources/compatibility_shaders/heat_intensity_shader.v" , + ":/cgal/Polyhedron_3/resources/compatibility_shaders/heat_intensity_shader.f"); + program->setProperty("hasLight", true); + program->setProperty("hasNormals", true); + program->setProperty("hasTransparency", true); + program->setProperty("hasDistanceValues", true); + return program; + } case PROGRAM_WITHOUT_LIGHT: { QOpenGLShaderProgram* program = isOpenGL_4_3() diff --git a/Polyhedron/demo/Polyhedron/resources/compatibility_shaders/heat_intensity_shader.f b/Polyhedron/demo/Polyhedron/resources/compatibility_shaders/heat_intensity_shader.f new file mode 100644 index 00000000000..fc327feaca6 --- /dev/null +++ b/Polyhedron/demo/Polyhedron/resources/compatibility_shaders/heat_intensity_shader.f @@ -0,0 +1,16 @@ +#version 120 +varying highp vec4 color; +varying highp float out_dist; +void main(void) { + vec3 c = color.xyz; + float h = out_dist; + h = h * 20.; + h = h - floor(h); + h = (1./(1.+exp(-100.*(h-.55)))) + (1./(1.+exp(-100.*(-h+.45)))); + h = 1.-h; + + c = h*vec3(1.,1.,1.) + (1.-h)*c; + + gl_FragColor.rgb = c; + gl_FragColor.a = 1.; +} diff --git a/Polyhedron/demo/Polyhedron/resources/compatibility_shaders/heat_intensity_shader.v b/Polyhedron/demo/Polyhedron/resources/compatibility_shaders/heat_intensity_shader.v new file mode 100644 index 00000000000..732caf2c58c --- /dev/null +++ b/Polyhedron/demo/Polyhedron/resources/compatibility_shaders/heat_intensity_shader.v @@ -0,0 +1,51 @@ +#version 120 +attribute highp vec4 vertex; +attribute highp vec3 normals; +attribute highp vec3 colors; +attribute highp float vdist; +uniform highp mat4 mvp_matrix; +uniform highp mat4 mv_matrix; +varying highp vec4 fP; +varying highp vec3 fN; +varying highp vec4 color; +varying highp float dist[6]; +varying highp float out_dist; +uniform bool is_clipbox_on; +uniform mat4 clipbox1; +uniform mat4 clipbox2; +uniform float point_size; + +void compute_distances(void) +{ + for(int i=0; i<3; ++i) + { + dist[i]= + clipbox1[i][0]*vertex.x+ + clipbox1[i][1]*vertex.y+ + clipbox1[i][2]*vertex.z + + clipbox1[i][3]; + dist[i+3]= + clipbox2[i][0]*vertex.x+ + clipbox2[i][1]*vertex.y+ + clipbox2[i][2]*vertex.z + + clipbox2[i][3]; + } +} + + +void main(void) +{ + gl_PointSize = point_size; + color = colors; + // + if(is_clipbox_on) + compute_distances(); + out_dist = vdist; + fP = mv_matrix * vertex; + mat3 mv_matrix_3; + mv_matrix_3[0] = mv_matrix[0].xyz; + mv_matrix_3[1] = mv_matrix[1].xyz; + mv_matrix_3[2] = mv_matrix[2].xyz; + fN = mv_matrix_3* normals; + gl_Position = mvp_matrix * vertex; +} diff --git a/Polyhedron/demo/Polyhedron/resources/heat_intensity_shader.f b/Polyhedron/demo/Polyhedron/resources/heat_intensity_shader.f new file mode 100644 index 00000000000..90f0bcc072b --- /dev/null +++ b/Polyhedron/demo/Polyhedron/resources/heat_intensity_shader.f @@ -0,0 +1,91 @@ +#version 150 +in vec4 color; +in vec4 fP; +in vec3 fN; +in float dist[6]; +in float out_distance; +uniform highp vec4 light_pos; +uniform highp vec4 light_diff; +uniform highp vec4 light_spec; +uniform highp vec4 light_amb; +uniform highp float spec_power; +uniform int is_two_side; +uniform bool is_selected; +uniform bool is_clipbox_on; +uniform highp float near; +uniform highp float far; +uniform highp float width; +uniform highp float height; +uniform bool comparing; +uniform bool writing; +uniform sampler2D sampler; +uniform highp float alpha; +out vec4 out_color; + +// Define this and resources/heat_intensity_shader.f will draw black instead of white lines. +// #define HEAT_METHOD_BLACK_LINES + + +float depth(float z) +{ + return (2 * near) / (far + near - z * (far - near)); +} + +void main(void) { + + if(is_clipbox_on) + if(dist[0]>0.0 || + dist[1]>0.0 || + dist[2]>0.0 || + dist[3]>0.0 || + dist[4]>0.0 || + dist[5]>0.0) + discard; + + float d = depth(gl_FragCoord.z); + float test = texture(sampler, vec2(gl_FragCoord.x/width, gl_FragCoord.y/height)).r; + if(comparing && d <= test) + discard; + vec4 temp_color; + if(writing) + temp_color = vec4(d,d,d,1.0); + else + { + vec4 my_color = vec4(color.xyz, 1.0); + vec3 L = light_pos.xyz - fP.xyz; + vec3 V = -fP.xyz; + vec3 N; + if(fN == highp vec3(0.0,0.0,0.0)) + N = highp vec3(0.0,0.0,0.0); + else + N = normalize(fN); + L = normalize(L); + V = normalize(V); + vec3 R = reflect(-L, N); + vec4 diffuse; + if(is_two_side == 1) + diffuse = abs(dot(N,L)) * light_diff * color; + else + diffuse = max(dot(N,L), 0.0) * light_diff * my_color; + vec4 specular = pow(max(dot(R,V), 0.0), spec_power) * light_spec; + vec4 ret_color = vec4((my_color*light_amb).xyz + diffuse.xyz + specular.xyz,1); + if(is_selected) + temp_color = vec4(ret_color.r+70.0/255.0, ret_color.g+70.0/255.0, ret_color.b+70.0/255.0, alpha); + else + temp_color = vec4(ret_color.xyz, alpha); + + vec3 c = temp_color.xyz; + float h = out_distance; + h = h * 20.; + h = h - floor(h); + h = (1./(1.+exp(-100.*(h-.55)))) + (1./(1.+exp(-100.*(-h+.45)))); + h = 1.-h; +#ifdef HEAT_METHOD_BLACK_LINES + c = h*vec3(0.,0.,0.) + (1.-h)*c; +#else + c = h*vec3(1.,1.,1.) + (1.-h)*c; +#endif + out_color.rgb = c; + out_color.a = alpha; + } +} diff --git a/Polyhedron/demo/Polyhedron/resources/heat_intensity_shader.v b/Polyhedron/demo/Polyhedron/resources/heat_intensity_shader.v new file mode 100644 index 00000000000..c49cf68cbe5 --- /dev/null +++ b/Polyhedron/demo/Polyhedron/resources/heat_intensity_shader.v @@ -0,0 +1,52 @@ +#version 150 +in vec4 vertex; +in vec3 normals; +in vec4 colors; +in float distance; +uniform mat4 mvp_matrix; +uniform mat4 mv_matrix; +out vec4 fP; +out vec3 fN; +out vec4 color; +out float dist[6]; +out float out_distance; + +uniform bool is_clipbox_on; +uniform mat4 clipbox1; +uniform mat4 clipbox2; +uniform float point_size; + +void compute_distances(void) +{ + for(int i=0; i<3; ++i) + { + dist[i]= + clipbox1[i][0]*vertex.x+ + clipbox1[i][1]*vertex.y+ + clipbox1[i][2]*vertex.z + + clipbox1[i][3]; + dist[i+3]= + clipbox2[i][0]*vertex.x+ + clipbox2[i][1]*vertex.y+ + clipbox2[i][2]*vertex.z + + clipbox2[i][3]; + } +} + + +void main(void) +{ + gl_PointSize = point_size; + color = colors; + // + if(is_clipbox_on) + compute_distances(); + fP = mv_matrix * vertex; + mat3 mv_matrix_3; + mv_matrix_3[0] = mv_matrix[0].xyz; + mv_matrix_3[1] = mv_matrix[1].xyz; + mv_matrix_3[2] = mv_matrix[2].xyz; + fN = mv_matrix_3* normals; + out_distance = distance; + gl_Position = mvp_matrix * vertex; +} diff --git a/Polyhedron/demo/Polyhedron/triangulate_primitive.h b/Polyhedron/demo/Polyhedron/triangulate_primitive.h index 3aef6f90499..84cd4e1eaf2 100644 --- a/Polyhedron/demo/Polyhedron/triangulate_primitive.h +++ b/Polyhedron/demo/Polyhedron/triangulate_primitive.h @@ -52,7 +52,6 @@ public: FacetTriangulator(typename boost::graph_traits::face_descriptor fd, const Vector& normal, Mesh *poly, - const double item_diag, Vector offset = Vector(0,0,0)) { std::vector idPoints; @@ -64,14 +63,13 @@ public: idPoints.push_back(idPoint); } - if(!triangulate(idPoints, normal, item_diag)) + if(!triangulate(idPoints, normal)) std::cerr<<"Facet not displayed"<::face_descriptor fd, const std::vector& more_points, const Vector& normal, Mesh *poly, - const double item_diag, Vector offset = Vector(0,0,0)) { std::vector idPoints; @@ -83,23 +81,21 @@ public: idPoints.push_back(idPoint); } - if(!triangulate_with_points(idPoints,more_points, normal, item_diag)) + if(!triangulate_with_points(idPoints,more_points, normal)) std::cerr<<"Facet not displayed"< &idPoints, - const Vector& normal, - const double item_diag) + const Vector& normal) { - if(!triangulate(idPoints, normal, item_diag)) + if(!triangulate(idPoints, normal)) std::cerr<<"Facet not displayed"< &idPoints, const std::vector& more_points, - const Vector& normal, - const double item_diag) + const Vector& normal) { - if(!triangulate_with_points(idPoints, more_points, normal, item_diag)) + if(!triangulate_with_points(idPoints, more_points, normal)) std::cerr<<"Facet not displayed"< &idPoints, - const Vector& normal, - const double item_diag ) + const Vector& normal ) { P_traits cdt_traits(normal); cdt = new CDT(cdt_traits); typename CDT::Vertex_handle previous, first, last_inserted; - //Compute a reasonable precision level used to decide - //if two consecutive points in a facet can be estimated - //equal. - - double min_sq_dist = CGAL::square(0.0001*item_diag); + // Iterate the points of the facet and decide if they must be inserted in the CDT typename Kernel::FT x(0), y(0), z(0); @@ -134,7 +125,7 @@ private: typename CDT::Vertex_handle vh; //Always insert the first point, then only insert // if the distance with the previous is reasonable. - if(first == typename CDT::Vertex_handle() || CGAL::squared_distance(idPoint.point, previous->point()) > min_sq_dist) + if(first == typename CDT::Vertex_handle() || idPoint.point != previous->point()) { vh = cdt->insert(idPoint.point); v2v[vh] = idPoint.id; @@ -142,32 +133,16 @@ private: first = vh; } if(previous != 0 && previous != vh) { - double sq_dist = CGAL::squared_distance(previous->point(), vh->point()); - if(sq_dist > min_sq_dist) - { - cdt->insert_constraint(previous, vh); - sq_dist = CGAL::squared_distance(previous->point(), first->point()); - if(sq_dist > min_sq_dist) - { - last_inserted = previous; - } - } + cdt->insert_constraint(previous, vh); + last_inserted = previous; } - previous = vh; + previous = vh; } } if(last_inserted == typename CDT::Vertex_handle()) return false; - double sq_dist = CGAL::squared_distance(previous->point(), first->point()); - - if(sq_dist > min_sq_dist) - { - cdt->insert_constraint(previous, first); - } - else - { - cdt->insert_constraint(last_inserted, first); - } + + cdt->insert_constraint(previous, first); // sets mark is_external for(typename CDT::All_faces_iterator fit2 = cdt->all_faces_begin(), @@ -196,24 +171,18 @@ private: bool triangulate_with_points( std::vector &idPoints, const std::vector& more_points, - const Vector& normal, - const double item_diag ) + const Vector& normal) { P_traits cdt_traits(normal); cdt = new CDT(cdt_traits); typename CDT::Vertex_handle previous, first, last_inserted; - //Compute a reasonable precision level used to decide - //if two consecutive points in a facet can be estimated - //equal. - - double min_sq_dist = CGAL::square(0.0001*item_diag); // Iterate the points of the facet and decide if they must be inserted in the CDT BOOST_FOREACH(PointAndId idPoint, idPoints) { typename CDT::Vertex_handle vh; //Always insert the first point, then only insert // if the distance with the previous is reasonable. - if(first == typename CDT::Vertex_handle() || CGAL::squared_distance(idPoint.point, previous->point()) > min_sq_dist) + if(first == typename CDT::Vertex_handle() || idPoint.point != previous->point()) { vh = cdt->insert(idPoint.point); v2v[vh] = idPoint.id; @@ -221,32 +190,15 @@ private: first = vh; } if(previous != 0 && previous != vh) { - double sq_dist = CGAL::squared_distance(previous->point(), vh->point()); - if(sq_dist > min_sq_dist) - { - cdt->insert_constraint(previous, vh); - sq_dist = CGAL::squared_distance(previous->point(), first->point()); - if(sq_dist > min_sq_dist) - { - last_inserted = previous; - } - } + cdt->insert_constraint(previous, vh); + last_inserted = previous; } previous = vh; } } if(last_inserted == typename CDT::Vertex_handle()) return false; - double sq_dist = CGAL::squared_distance(previous->point(), first->point()); - - if(sq_dist > min_sq_dist) - { - cdt->insert_constraint(previous, first); - } - else - { - cdt->insert_constraint(last_inserted, first); - } + cdt->insert_constraint(previous, first); BOOST_FOREACH(typename Kernel::Point_3 point, more_points) { cdt->insert(point); diff --git a/Polyhedron/include/CGAL/boost/graph/properties_Polyhedron_3.h b/Polyhedron/include/CGAL/boost/graph/properties_Polyhedron_3.h index 573f1817171..27a6193071f 100644 --- a/Polyhedron/include/CGAL/boost/graph/properties_Polyhedron_3.h +++ b/Polyhedron/include/CGAL/boost/graph/properties_Polyhedron_3.h @@ -137,6 +137,24 @@ get(PropertyTag p, CGAL::Polyhedron_3 const& g, const Key& key) +#define CGAL_POLYHEDRON_DYNAMIC_PM(TAG, DESCRIPTOR) \ +template \ +typename boost::property_map, TAG >::const_type \ +get(const TAG&, const Polyhedron_3&) \ +{ \ + typedef typename boost::graph_traits< Polyhedron_3 >::DESCRIPTOR descriptor; \ + return internal::Dynamic_property_map(); \ +} + +CGAL_POLYHEDRON_DYNAMIC_PM(dynamic_vertex_property_t, vertex_descriptor) +CGAL_POLYHEDRON_DYNAMIC_PM(dynamic_halfedge_property_t, halfedge_descriptor) +CGAL_POLYHEDRON_DYNAMIC_PM(dynamic_edge_property_t, edge_descriptor) +CGAL_POLYHEDRON_DYNAMIC_PM(dynamic_face_property_t, face_descriptor) + + +#undef CGAL_POLYHEDRON_DYNAMIC_PM + + // generalized put template void put(PropertyTag p, CGAL::Polyhedron_3& g, const Key& key, const Value& value) diff --git a/Polyhedron/package_info/Polyhedron/dependencies b/Polyhedron/package_info/Polyhedron/dependencies index 70c007e409d..b810ef1e411 100644 --- a/Polyhedron/package_info/Polyhedron/dependencies +++ b/Polyhedron/package_info/Polyhedron/dependencies @@ -19,3 +19,4 @@ Profiling_tools Property_map STL_Extension Stream_support +Distance_3 diff --git a/Polynomial/doc/Polynomial/Concepts/PolynomialTraits_d--PolynomialSubresultants.h b/Polynomial/doc/Polynomial/Concepts/PolynomialTraits_d--PolynomialSubresultants.h index 87cdc87ecc6..026c76a8848 100644 --- a/Polynomial/doc/Polynomial/Concepts/PolynomialTraits_d--PolynomialSubresultants.h +++ b/Polynomial/doc/Polynomial/Concepts/PolynomialTraits_d--PolynomialSubresultants.h @@ -3,8 +3,6 @@ \ingroup PkgPolynomialConcepts \cgalConcept -Note: This functor is optional! - Computes the polynomial subresultant of two polynomials \f$ p\f$ and \f$ q\f$ of type `PolynomialTraits_d::Polynomial_d` with respect to outermost variable. Let @@ -23,6 +21,8 @@ The result is written in an output range, starting with the \f$ 0\f$-th subresul \f$ \mathrm{Sres}_0(p,q)\f$ (aka as the resultant of \f$ p\f$ and \f$ q\f$). +\note This functor is optional. + \cgalRefines `AdaptableBinaryFunction` \cgalRefines `CopyConstructible` \cgalRefines `DefaultConstructible` diff --git a/Polynomial/doc/Polynomial/Concepts/PolynomialTraits_d--PolynomialSubresultantsWithCofactors.h b/Polynomial/doc/Polynomial/Concepts/PolynomialTraits_d--PolynomialSubresultantsWithCofactors.h index b1981463df7..56c1e14f641 100644 --- a/Polynomial/doc/Polynomial/Concepts/PolynomialTraits_d--PolynomialSubresultantsWithCofactors.h +++ b/Polynomial/doc/Polynomial/Concepts/PolynomialTraits_d--PolynomialSubresultantsWithCofactors.h @@ -3,8 +3,6 @@ \ingroup PkgPolynomialConcepts \cgalConcept -Note: This functor is optional! - Computes the polynomial subresultant of two polynomials \f$ p\f$ and \f$ q\f$ of degree \f$ n\f$ and \f$ m\f$, respectively, as defined in the documentation of `PolynomialTraits_d::PolynomialSubresultants`. @@ -16,6 +14,8 @@ the cofactors of \f$ \mathrm{Sres}_i(p,q)\f$. The result is written in three output ranges, each of length \f$ \min\{n,m\}+1\f$, starting with the \f$ 0\f$-th subresultant and the corresponding cofactors. +\note This functor is optional. + \cgalRefines `AdaptableBinaryFunction` \cgalRefines `CopyConstructible` \cgalRefines `DefaultConstructible` diff --git a/Polynomial/doc/Polynomial/Concepts/PolynomialTraits_d--PrincipalSturmHabichtSequence.h b/Polynomial/doc/Polynomial/Concepts/PolynomialTraits_d--PrincipalSturmHabichtSequence.h index bd4bd491935..376a3e279ef 100644 --- a/Polynomial/doc/Polynomial/Concepts/PolynomialTraits_d--PrincipalSturmHabichtSequence.h +++ b/Polynomial/doc/Polynomial/Concepts/PolynomialTraits_d--PrincipalSturmHabichtSequence.h @@ -3,8 +3,6 @@ \ingroup PkgPolynomialConcepts \cgalConcept -Note: This functor is optional! - Computes the principal leading coefficients of the Sturm-Habicht sequence of a polynomials \f$ f\f$ of type `PolynomialTraits_d::Polynomial_d` with respect a certain variable \f$ x_i\f$. @@ -19,6 +17,8 @@ In case that `PolynomialTraits_d::Coefficient_type` is `RealEmbeddable`, the fun on the resulting sequence to count the number of distinct real roots of the polynomial \f$ f\f$. +\note This functor is optional. + \cgalRefines `AdaptableBinaryFunction` \cgalRefines `CopyConstructible` \cgalRefines `DefaultConstructible` diff --git a/Polynomial/doc/Polynomial/Concepts/PolynomialTraits_d--PrincipalSubresultants.h b/Polynomial/doc/Polynomial/Concepts/PolynomialTraits_d--PrincipalSubresultants.h index 2cddb81e1ed..3a63bc6f76d 100644 --- a/Polynomial/doc/Polynomial/Concepts/PolynomialTraits_d--PrincipalSubresultants.h +++ b/Polynomial/doc/Polynomial/Concepts/PolynomialTraits_d--PrincipalSubresultants.h @@ -3,8 +3,6 @@ \ingroup PkgPolynomialConcepts \cgalConcept -Note: This functor is optional! - Computes the principal subresultant of two polynomials \f$ p\f$ and \f$ q\f$ of type `PolynomialTraits_d::Coefficient_type` with respect to the outermost variable. @@ -19,6 +17,8 @@ principal subresultant \f$ \mathrm{sres}_0(p,q)\f$ ,aka as the resultant of \f$ p\f$ and \f$ q\f$. (Note that \f$ \mathrm{sres}_0(p,q)=\mathrm{Sres}_0(p,q)\f$ by definition) +\note This functor is optional. + \cgalRefines `AdaptableBinaryFunction` \cgalRefines `CopyConstructible` \cgalRefines `DefaultConstructible` diff --git a/Polynomial/doc/Polynomial/Concepts/PolynomialTraits_d--SturmHabichtSequence.h b/Polynomial/doc/Polynomial/Concepts/PolynomialTraits_d--SturmHabichtSequence.h index f6a4676dfc3..32478346def 100644 --- a/Polynomial/doc/Polynomial/Concepts/PolynomialTraits_d--SturmHabichtSequence.h +++ b/Polynomial/doc/Polynomial/Concepts/PolynomialTraits_d--SturmHabichtSequence.h @@ -3,8 +3,6 @@ \ingroup PkgPolynomialConcepts \cgalConcept -Note: This functor is optional! - Computes the Sturm-Habicht sequence (aka the signed subresultant sequence) of a polynomial \f$ f\f$ of type @@ -27,6 +25,8 @@ The result is written in an output range, starting with the \f$ 0\f$-th Sturm-Habicht polynomial (which is equal to the discriminant of \f$ f\f$ up to a multiple of the leading coefficient). +\note This functor is optional. + \cgalRefines `AdaptableBinaryFunction` \cgalRefines `CopyConstructible` \cgalRefines `DefaultConstructible` diff --git a/Polynomial/doc/Polynomial/Concepts/PolynomialTraits_d--SturmHabichtSequenceWithCofactors.h b/Polynomial/doc/Polynomial/Concepts/PolynomialTraits_d--SturmHabichtSequenceWithCofactors.h index e77f9b78cd2..85efdb9edf9 100644 --- a/Polynomial/doc/Polynomial/Concepts/PolynomialTraits_d--SturmHabichtSequenceWithCofactors.h +++ b/Polynomial/doc/Polynomial/Concepts/PolynomialTraits_d--SturmHabichtSequenceWithCofactors.h @@ -3,8 +3,6 @@ \ingroup PkgPolynomialConcepts \cgalConcept -Note: This functor is optional! - Computes the Sturm-Habicht polynomials of a polynomial \f$ f\f$ of degree \f$ n\f$, as defined in the documentation of `PolynomialTraits_d::SturmHabichtSequence`. Moreover, for \f$ \mathrm{Stha}_i(f)\f$, polynomials \f$ u_i\f$ and \f$ v_i\f$ @@ -16,6 +14,8 @@ The result is written in three output ranges, each of length \f$ \min\{n,m\}+1\f starting with the \f$ 0\f$-th Sturm-Habicht polynomial \f$ \mathrm{Stha_0(f)}\f$ and the corresponding cofactors. +\note This functor is optional. + \cgalRefines `AdaptableBinaryFunction` \cgalRefines `CopyConstructible` \cgalRefines `DefaultConstructible` diff --git a/Property_map/include/CGAL/Dynamic_property_map.h b/Property_map/include/CGAL/Dynamic_property_map.h index 514ae5d4593..24532c41e55 100644 --- a/Property_map/include/CGAL/Dynamic_property_map.h +++ b/Property_map/include/CGAL/Dynamic_property_map.h @@ -125,10 +125,38 @@ struct Dynamic { boost::shared_ptr map_; }; - + +template +struct Dynamic_with_index +{ + typedef Key key_type; + typedef Value value_type; + typedef value_type& reference; + typedef boost::lvalue_property_map_tag category; + + Dynamic_with_index() + : m_values() + {} + + Dynamic_with_index(std::size_t num_features) + : m_values( new std::vector(num_features) ) + {} + + friend reference get(const Dynamic_with_index& m, const key_type& k) + { + return (*m.m_values)[k.idx()]; + } + + friend void put(const Dynamic_with_index& m, const key_type& k, const value_type& v) + { + (*m.m_values)[k.idx()]=v; + } + + boost::shared_ptr > m_values; +}; + } // namespace internal - template struct dynamic_vertex_property_t { diff --git a/Property_map/test/Property_map/dynamic_properties_test.cpp b/Property_map/test/Property_map/dynamic_properties_test.cpp index f32ce5d1d00..ccb79d94ff9 100644 --- a/Property_map/test/Property_map/dynamic_properties_test.cpp +++ b/Property_map/test/Property_map/dynamic_properties_test.cpp @@ -19,31 +19,56 @@ test() Mesh m; CGAL::make_triangle(Point_3(0,0,0),Point_3(1,0,0),Point_3(1,1,0),m); - typedef typename boost::property_map >::type VIM; - VIM vim = get(CGAL::dynamic_vertex_property_t(), m); - put(vim, *(vertices(m).first), 7812); - std::cout << get(vim, *(vertices(m).first)) << std::endl; - + { + typedef typename boost::property_map >::type VIM; + VIM vim = get(CGAL::dynamic_vertex_property_t(), m); + put(vim, *(vertices(m).first), 7812); + assert(get(vim, *(vertices(m).first)) == 7812); + } { typedef typename boost::property_map >::type VIM; VIM vim = get(CGAL::dynamic_halfedge_property_t(), m); put(vim, *(halfedges(m).first), 7812); - - std::cout << get(vim, *(halfedges(m).first)) << std::endl; + assert(get(vim, *(halfedges(m).first)) == 7812); } { typedef typename boost::property_map >::type VIM; VIM vim = get(CGAL::dynamic_edge_property_t(), m); put(vim, *(edges(m).first), 7812); - - std::cout << get(vim, *(edges(m).first)) << std::endl; + assert(get(vim, *(edges(m).first)) == 7812); } { typedef typename boost::property_map >::type VIM; VIM vim = get(CGAL::dynamic_face_property_t(), m); put(vim, *(faces(m).first), 7812); - - std::cout << get(vim, *(faces(m).first)) << std::endl; + assert(get(vim, *(faces(m).first)) == 7812); + } + + const Mesh& m2(m); + + { + typedef typename boost::property_map >::const_type VIM; + VIM vim = get(CGAL::dynamic_vertex_property_t(), m2); + put(vim, *(vertices(m).first), 7812); + assert(get(vim, *(vertices(m).first)) == 7812); + } + { + typedef typename boost::property_map >::const_type VIM; + VIM vim = get(CGAL::dynamic_halfedge_property_t(), m2); + put(vim, *(halfedges(m).first), 7812); + assert(get(vim, *(halfedges(m).first)) == 7812); + } + { + typedef typename boost::property_map >::const_type VIM; + VIM vim = get(CGAL::dynamic_edge_property_t(), m2); + put(vim, *(edges(m).first), 7812); + assert(get(vim, *(edges(m).first)) == 7812); + } + { + typedef typename boost::property_map >::const_type VIM; + VIM vim = get(CGAL::dynamic_face_property_t(), m2); + put(vim, *(faces(m).first), 7812); + assert(get(vim, *(faces(m).first)) == 7812); } } diff --git a/QP_solver/include/CGAL/QP_solver/Initialization.h b/QP_solver/include/CGAL/QP_solver/Initialization.h index 12e94dbd1b5..e52761d1ba3 100644 --- a/QP_solver/include/CGAL/QP_solver/Initialization.h +++ b/QP_solver/include/CGAL/QP_solver/Initialization.h @@ -23,6 +23,7 @@ // Kaspar Fischer #include +#include namespace CGAL { @@ -549,7 +550,8 @@ void QP_solver:: init_solution__b_C(Tag_true) { b_C.reserve(qp_m); - std::copy(qp_b, qp_b+qp_m, std::back_inserter(b_C)); + std::transform(qp_b, qp_b+qp_m, std::back_inserter(b_C), + NT_converter()); } template < typename Q, typename ET, typename Tags > inline // has ineq. @@ -559,9 +561,11 @@ init_solution__b_C(Tag_false) b_C.insert(b_C.end(), l, et0); B_by_index_accessor b_accessor(qp_b); // todo kf: is there some boost // replacement for this accessor? - std::copy(B_by_index_iterator(C.begin(), b_accessor), - B_by_index_iterator(C.end (), b_accessor), - b_C.begin()); + typedef typename std::iterator_traits::value_type RT; + std::transform(B_by_index_iterator(C.begin(), b_accessor), + B_by_index_iterator(C.end (), b_accessor), + b_C.begin(), + NT_converter()); } // initial solution diff --git a/QP_solver/include/CGAL/QP_solver/QP_solver.h b/QP_solver/include/CGAL/QP_solver/QP_solver.h index 92c86ffd260..f4c54c833b2 100644 --- a/QP_solver/include/CGAL/QP_solver/QP_solver.h +++ b/QP_solver/include/CGAL/QP_solver/QP_solver.h @@ -43,6 +43,7 @@ #include #include +#include #include @@ -1599,14 +1600,18 @@ ratio_test_1__q_x_S( Tag_false) // ( A_S_BxB_O * q_x_O) - A_S_Bxj if ( j < qp_n) { + typedef typename std::iterator_traits::value_type RT; std::transform( q_x_S.begin(), q_x_S.begin()+S_B.size(), A_by_index_iterator( S_B.begin(), A_by_index_accessor( *(qp_A + j))), q_x_S.begin(), - compose2_2( std::minus(), - Identity(), - boost::bind1st( std::multiplies(), d))); + boost::bind(std::minus(), + _1, + boost::bind(std::multiplies(), d, + boost::bind( + NT_converter(), + _2)))); } // q_x_S = -+ ( A_S_BxB_O * q_x_O - A_S_Bxj) @@ -1888,9 +1893,11 @@ basis_matrix_stays_regular() new_row = slack_A[ i-qp_n].first; A_row_by_index_accessor a_accessor = boost::bind (A_accessor( qp_A, 0, qp_n), _1, new_row); - std::copy( A_row_by_index_iterator( B_O.begin(), a_accessor), - A_row_by_index_iterator( B_O.end (), a_accessor), - tmp_x.begin()); + typedef typename std::iterator_traits::value_type RT; + std::transform(A_row_by_index_iterator( B_O.begin(), a_accessor), + A_row_by_index_iterator( B_O.end (), a_accessor), + tmp_x.begin(), + NT_converter()); inv_M_B.multiply( tmp_x.begin(), // dummy (not used) tmp_x.begin(), tmp_l_2.begin(), tmp_x_2.begin(), Tag_false(), // QP @@ -1963,7 +1970,18 @@ compute__x_B_S( Tag_false /*has_equalities_only_and_full_rank*/, } - +namespace QP_solver_impl { +// Writing it with 5 boost::bind was becoming unreadable. +template +struct submul { + ET const& d; + submul(ET const&d):d(d) {} + ET operator()(RT const&x, ET const&y) const { + NT_converter cast; + return cast(x) * d - y; + } +}; +} template < typename Q, typename ET, typename Tags > inline // has inequalities, standard form void QP_solver:: @@ -1975,13 +1993,12 @@ compute__x_B_S( Tag_false /*has_equalities_only_and_full_rank*/, // b_S_B - ( A_S_BxB_O * x_B_O) B_by_index_accessor b_accessor( qp_b); + typedef typename std::iterator_traits::value_type RT; std::transform( B_by_index_iterator( S_B.begin(), b_accessor), B_by_index_iterator( S_B.end (), b_accessor), x_B_S.begin(), x_B_S.begin(), - compose2_2( std::minus(), - boost::bind1st( std::multiplies(), d), - Identity())); + QP_solver_impl::submul(d)); // x_B_S = +- ( b_S_B - A_S_BxB_O * x_B_O) Value_iterator x_it = x_B_S.begin(); diff --git a/QP_solver/include/CGAL/QP_solver/QP_solver_impl.h b/QP_solver/include/CGAL/QP_solver/QP_solver_impl.h index 8009b26fa76..f5ad5e3b512 100644 --- a/QP_solver/include/CGAL/QP_solver/QP_solver_impl.h +++ b/QP_solver/include/CGAL/QP_solver/QP_solver_impl.h @@ -23,6 +23,8 @@ // Kaspar Fischer #include +#include +#include namespace CGAL { @@ -67,9 +69,13 @@ transition( ) // initialize exact version of `-qp_c' (implicit conversion to ET) C_by_index_accessor c_accessor( qp_c); + typedef typename std::iterator_traits::value_type RT; std::transform( C_by_index_iterator( B_O.begin(), c_accessor), C_by_index_iterator( B_O.end (), c_accessor), - minus_c_B.begin(), std::negate()); + minus_c_B.begin(), + boost::bind( + NT_converter(), + boost::bind(std::negate(), _1))); // compute initial solution of phase II compute_solution(Is_nonnegative()); @@ -419,7 +425,8 @@ ratio_test_init__A_Cj( Value_iterator A_Cj_it, int j_, Tag_true) // store exact version of `A_Cj' (implicit conversion) if ( j_ < qp_n) { // original variable - CGAL::cpp11::copy_n( *(qp_A + j_), qp_m, A_Cj_it); + CGAL::transform_n( *(qp_A + j_), qp_m, A_Cj_it, + NT_converter()); } else { // artificial variable @@ -437,9 +444,11 @@ ratio_test_init__A_Cj( Value_iterator A_Cj_it, int j_, Tag_false) // store exact version of `A_Cj' (implicit conversion) if ( j_ < qp_n) { // original variable A_by_index_accessor a_accessor( *(qp_A + j_)); - std::copy( A_by_index_iterator( C.begin(), a_accessor), - A_by_index_iterator( C.end (), a_accessor), - A_Cj_it); + typedef typename std::iterator_traits::value_type RT; + std::transform(A_by_index_iterator( C.begin(), a_accessor), + A_by_index_iterator( C.end (), a_accessor), + A_Cj_it, + NT_converter()); } else { unsigned int k = j_; @@ -461,9 +470,11 @@ ratio_test_init__A_Cj( Value_iterator A_Cj_it, int j_, Tag_false) } else { // special art. S_by_index_accessor s_accessor( art_s.begin()); - std::copy( S_by_index_iterator( C.begin(), s_accessor), - S_by_index_iterator( C.end (), s_accessor), - A_Cj_it); + typedef typename std::iterator_traits::value_type RT; + std::transform(S_by_index_iterator( C.begin(), s_accessor), + S_by_index_iterator( C.end (), s_accessor), + A_Cj_it, + NT_converter()); } } } @@ -1347,7 +1358,7 @@ replace_variable_original_original( ) minus_c_B[ k] = ( is_phaseI ? - ( j < qp_n ? et0 : -aux_c[j-qp_n-slack_A.size()]) : -ET( *(qp_c+ j))); + ( j < qp_n ? et0 : ET(-aux_c[j-qp_n-slack_A.size()])) : -ET( *(qp_c+ j))); if ( is_phaseI) { if ( j >= qp_n) ++art_basic; @@ -1437,9 +1448,11 @@ replace_variable_slack_slack( ) // update basis inverse A_row_by_index_accessor a_accessor = boost::bind( A_accessor( qp_A, 0, qp_n), _1, new_row); - std::copy( A_row_by_index_iterator( B_O.begin(), a_accessor), - A_row_by_index_iterator( B_O.end (), a_accessor), - tmp_x.begin()); + typedef typename std::iterator_traits::value_type RT; + std::transform(A_row_by_index_iterator( B_O.begin(), a_accessor), + A_row_by_index_iterator( B_O.end (), a_accessor), + tmp_x.begin(), + NT_converter()); if ( art_s_i > 0) { // special artificial tmp_x[ in_B[ art_s_i]] = ET( art_s[ new_row]); } @@ -1557,7 +1570,7 @@ replace_variable_original_slack( ) minus_c_B[ B_O.size()] = ( is_phaseI ? - ( j < qp_n ? et0 : -aux_c[j-qp_n-slack_A.size()]) + ( j < qp_n ? et0 : ET(-aux_c[j-qp_n-slack_A.size()])) : -ET( *(qp_c+ j))); @@ -1588,9 +1601,11 @@ replace_variable_original_slack( ) // update basis inverse A_row_by_index_accessor a_accessor = boost::bind (A_accessor( qp_A, 0, qp_n), _1, new_row); - std::copy( A_row_by_index_iterator( B_O.begin(), a_accessor), - A_row_by_index_iterator( B_O.end (), a_accessor), - tmp_x.begin()); + typedef typename std::iterator_traits::value_type RT; + std::transform(A_row_by_index_iterator( B_O.begin(), a_accessor), + A_row_by_index_iterator( B_O.end (), a_accessor), + tmp_x.begin(), + NT_converter()); if ( art_s_i > 0) { // special art. tmp_x[ in_B[ art_s_i]] = ET( art_s[ new_row]); } @@ -2618,7 +2633,8 @@ multiply__A_S_BxB_O(Value_iterator in, Value_iterator out) const // foreach row of A in S_B for ( row_it = S_B.begin(); row_it != S_B.end(); ++row_it, ++out_it) { - *out_it += ET( a_col[ *row_it]) * in_value; + A_entry x = a_col[*row_it]; + *out_it += ET(x) * in_value; } } else { if ( *col_it == art_s_i) { // special artificial diff --git a/QP_solver/include/CGAL/QP_solver/functors.h b/QP_solver/include/CGAL/QP_solver/functors.h index e9cb5fbcabb..9ab6c97e8b5 100644 --- a/QP_solver/include/CGAL/QP_solver/functors.h +++ b/QP_solver/include/CGAL/QP_solver/functors.h @@ -262,6 +262,15 @@ public: Map_with_default (const Map* m, const mapped_type& v = mapped_type()) : map(m), d(v) {} + + // Added as workaround for VC2017 with /arch:AVX to fix + // https://cgal.geometryfactory.com/CGAL/testsuite/CGAL-4.14-I-95/QP_solver/TestReport_afabri_x64_Cygwin-Windows10_MSVC2017-Release-64bits.gz + Map_with_default& operator=(const Map_with_default& other) + { + map = other.map; + d = other.d; + return *this; + } // operator() const mapped_type& operator() (key_type n) const { diff --git a/QP_solver/test/QP_solver/master_mps_to_derivatives.cpp b/QP_solver/test/QP_solver/master_mps_to_derivatives.cpp index 6bebf123b03..22ea86ccecd 100644 --- a/QP_solver/test/QP_solver/master_mps_to_derivatives.cpp +++ b/QP_solver/test/QP_solver/master_mps_to_derivatives.cpp @@ -41,6 +41,16 @@ #include #include +#include +//Currently already included in boost_mp.h +//#ifdef CGAL_USE_BOOST_MP +//# include +//// After some CGAL includes so we get a chance to define CGAL_USE_GMP. +//# ifdef CGAL_USE_GMP +//# include +//# endif +//#endif + // Routines to output to MPS format: namespace QP_from_mps_detail { @@ -58,6 +68,20 @@ namespace QP_from_mps_detail { struct MPS_type_name { static const char *name() { return "integer"; } }; +#ifdef CGAL_USE_BOOST_MP + template + struct MPS_type_name > { + typedef boost::multiprecision::number NT; + static const char *name() { + if (boost::multiprecision::number_category::value == boost::multiprecision::number_kind_integer) + return "integer"; + else if (boost::multiprecision::number_category::value == boost::multiprecision::number_kind_rational) + return "rational"; + else + return 0; + } + }; +#endif #ifdef CGAL_USE_GMPXX template<> struct MPS_type_name { @@ -80,7 +104,9 @@ namespace QP_from_mps_detail { template<> struct MPS_type_name > { static const char *name() { return "rational"; } - }; template + }; + + template struct IT_to_ET { }; @@ -88,6 +114,12 @@ namespace QP_from_mps_detail { struct IT_to_ET { typedef CGAL::MP_Float ET; }; +#ifdef CGAL_USE_BOOST_MP + template<> + struct IT_to_ET { + typedef boost::multiprecision::cpp_rational ET; + }; +#endif #ifdef CGAL_USE_GMP #ifdef CGAL_USE_GMPXX @@ -100,6 +132,16 @@ namespace QP_from_mps_detail { struct IT_to_ET { typedef mpq_class ET; }; +#elif defined CGAL_USE_BOOST_MP + template<> + struct IT_to_ET { + typedef boost::multiprecision::mpz_int ET; + }; + + template<> + struct IT_to_ET { + typedef boost::multiprecision::mpq_rational ET; + }; #else template<> struct IT_to_ET { @@ -114,10 +156,13 @@ namespace QP_from_mps_detail { #endif #ifdef CGAL_USE_LEDA +// Pick one arbitrarily if we have both LEDA and GMP +#ifndef CGAL_USE_GMP template<> struct IT_to_ET { typedef leda::integer ET; }; +#endif template<> struct IT_to_ET { @@ -129,6 +174,13 @@ namespace QP_from_mps_detail { typedef CGAL::Quotient ET; }; +#if defined CGAL_USE_BOOST_MP && !defined CGAL_USE_GMP && !defined CGAL_USE_LEDA + // Last chance for int + template<> + struct IT_to_ET { + typedef boost::multiprecision::cpp_int ET; + }; +#endif } // QP_from_mps_detail template diff --git a/Random_numbers/test/Random_numbers/test_Random-CGAL_TEST_SUITE.cpp b/Random_numbers/test/Random_numbers/test_Random-CGAL_TEST_SUITE.cpp index e5c134e2fe7..1d1aa04d64e 100644 --- a/Random_numbers/test/Random_numbers/test_Random-CGAL_TEST_SUITE.cpp +++ b/Random_numbers/test/Random_numbers/test_Random-CGAL_TEST_SUITE.cpp @@ -7,7 +7,7 @@ int main() { int u = CGAL::get_default_random().get_int( 0, 1000); - if(u >= 0 || u <= 1000) + if(u >= 0 && u < 1000) return 0; else return 1; diff --git a/Random_numbers/test/Random_numbers/test_Random-no-CGAL_TEST_SUITE.cpp b/Random_numbers/test/Random_numbers/test_Random-no-CGAL_TEST_SUITE.cpp index 0ad755b7500..907ccb8e30b 100644 --- a/Random_numbers/test/Random_numbers/test_Random-no-CGAL_TEST_SUITE.cpp +++ b/Random_numbers/test/Random_numbers/test_Random-no-CGAL_TEST_SUITE.cpp @@ -7,7 +7,7 @@ int main() { int u = CGAL::get_default_random().get_int( 0, 1000); - if(u >= 0 || u <= 1000) + if(u >= 0 && u < 1000) return 0; else return 1; diff --git a/STL_Extension/include/CGAL/algorithm.h b/STL_Extension/include/CGAL/algorithm.h index bebcd41bc72..717593a22e0 100644 --- a/STL_Extension/include/CGAL/algorithm.h +++ b/STL_Extension/include/CGAL/algorithm.h @@ -455,6 +455,19 @@ void nth_element(RandomAccessIterator left, } // end while(true) } +// Not a standard function, but close enough +template +OutputIterator transform_n( InputIterator first, Size n, OutputIterator result, UnaryFun fun) +{ + // copies the first `n' transformed items from `first' to `result'. + // Returns the value of `result' after inserting the `n' items. + while( n--) { + *result = fun(*first); + first++; + result++; + } + return result; +} } //namespace CGAL #endif // CGAL_ALGORITHM_H diff --git a/STL_Extension/include/CGAL/function_objects.h b/STL_Extension/include/CGAL/function_objects.h index 1218df36c7e..e459e9dbe3e 100644 --- a/STL_Extension/include/CGAL/function_objects.h +++ b/STL_Extension/include/CGAL/function_objects.h @@ -451,6 +451,19 @@ public: Binary_compose_2(const Op1& x, const Op2& y, const Op3& z) : op1(x), op2(y), op3(z) {} + // Added as workaround for VC2017 with /arch:AVX to fix + // https://cgal.geometryfactory.com/CGAL/testsuite/CGAL-4.14-I-95/Polytope_distance_d/TestReport_afabri_x64_Cygwin-Windows10_MSVC2017-Release-64bits.gz + Binary_compose_2(const Binary_compose_2& other) + : op1(other.op1), op2(other.op2), op3(other.op3) {} + + Binary_compose_2& operator=(const Binary_compose_2& other) + { + op1 = other.op1; + op2 = other.op2; + op3 = other.op3; + return *this; + } + result_type operator()(const first_argument_type& x, const second_argument_type& y) const diff --git a/Scripts/developer_scripts/cgal_create_release_with_cmake.cmake b/Scripts/developer_scripts/cgal_create_release_with_cmake.cmake index b9c40f0ebc6..fb190b50401 100644 --- a/Scripts/developer_scripts/cgal_create_release_with_cmake.cmake +++ b/Scripts/developer_scripts/cgal_create_release_with_cmake.cmake @@ -7,6 +7,67 @@ # Must be followed by -beta if the release is a beta. # CGAL_VERSION_NR=release string used to update version.h. Must be something like 1041200033 , or 104120090 # TESTSUITE=indicate if the release is meant to be used by the testsuite, default if OFF +# GPL_PACKAGE_LIST=path to a file containing the list of GPL packages to include in the release. If not provided all of them are. + +cmake_minimum_required(VERSION 3.1) + +function(process_package pkg) + if(VERBOSE) + message(STATUS "handling ${pkg}") + endif() + + # gather all files from this package + set(all_files) + file(GLOB_RECURSE pkg_files RELATIVE ${pkg_dir} ${pkg_dir}/*) + # append the prefix + foreach(f ${pkg_files}) + get_filename_component(fname ${f} NAME) + if (NOT "${fname}" STREQUAL "TODO") # skip TODO files + #make sure the target destination dir exists + set(afile ${pkg_dir}/${f}) + get_filename_component(afile_dir_tmp ${afile} PATH) + string(REPLACE "${pkg_dir}" "" afile_dir ${afile_dir_tmp}) + # skip test files not shipped with a release + if (NOT TESTSUITE AND ("${afile_dir}" STREQUAL "/include/CGAL/Test" OR "${afile_dir}" STREQUAL "/include/CGAL/Testsuite") ) + continue() + endif() + if(NOT IS_DIRECTORY ${release_dir}/${afile_dir}) + file(MAKE_DIRECTORY ${release_dir}/${afile_dir}) + endif() + + #copy the file (replace $URL$ and $ID$ for *.h and *.hpp) + get_filename_component(fext ${fname} EXT) + if ("${fext}" STREQUAL ".h" OR "${fext}" STREQUAL ".hpp") + file(READ "${pkg_dir}/${f}" file_content) + string(REPLACE "$URL$" "$URL: ${GITHUB_PREFIX}/${pkg}/${f} $" file_content "${file_content}") + if(EXISTS ${GIT_REPO}/.git) + execute_process( + COMMAND git --git-dir=${GIT_REPO}/.git --work-tree=${GIT_REPO} log -n1 "--format=format:%h %aI %an" -- "${pkg}/${f}" + RESULT_VARIABLE RESULT_VAR + OUTPUT_VARIABLE OUT_VAR + ) + string(REPLACE "$Id$" "$Id: ${fname} ${OUT_VAR}" file_content "${file_content}") + else() + string(REPLACE "$Id$" "This file is from the release ${CGAL_VERSION} of CGAL" file_content "${file_content}") + endif() + file(WRITE ${release_dir}/${afile_dir}/${fname} "${file_content}") + else() + file(COPY ${afile} DESTINATION ${release_dir}/${afile_dir}) + endif() + endif() + endforeach() + if (EXISTS "${release_dir}/doc/${pkg}") + #generate filelist.txt used by doxygen ran on a release + file(GLOB_RECURSE includes LIST_DIRECTORIES false RELATIVE "${GIT_REPO}/${pkg}/include" "${GIT_REPO}/${pkg}/include/CGAL/*.h") + foreach(f ${includes}) + file(APPEND "${release_dir}/doc/${pkg}/filelist.txt" "${f}\n") + endforeach() + #remove fig_src directory + if (IS_DIRECTORY "${release_dir}/doc/${pkg}/fig_src") + file(REMOVE_RECURSE "${release_dir}/doc/${pkg}/fig_src") + endif() + endif() +endfunction() if (NOT GIT_REPO) set(GIT_REPO ${CMAKE_BINARY_DIR}) @@ -29,6 +90,13 @@ else() message(FATAL_ERROR "Cannot extract CGAL version number.") endif() +set(FILTER_GPL_PACKAGES False) +if (DEFINED GPL_PACKAGE_LIST) + set(FILTER_GPL_PACKAGES True) + if(NOT EXISTS ${GPL_PACKAGE_LIST}) + message(FATAL_ERROR "File ${GPL_PACKAGE_LIST} does not exist.") + endif() +endif() if (NOT DEFINED DESTINATION) SET(DESTINATION "/tmp") @@ -45,6 +113,26 @@ else() message(STATUS "Creating an internal release ${CGAL_VERSION} in ${release_dir}") endif() +if(FILTER_GPL_PACKAGES) + if (VERBOSE) + message("Copying only GPL packages from a provided list.") + endif() + file(READ ${GPL_PACKAGE_LIST} pkgs) + string(REPLACE " " ";" pkgs "${pkgs}") + string(REPLACE "\n" ";" pkgs "${pkgs}") + foreach(pkg ${pkgs}) + set(pkg_dir ${GIT_REPO}/${pkg}) + if(IS_DIRECTORY ${pkg_dir}) + process_package(${pkg}) + else() + message(FATAL_ERROR "${pkg} CGAL package cannot be found.") + endif() + endforeach() + if (VERBOSE) + message("Now handling non-GPL packages.") + endif() +endif() + file(MAKE_DIRECTORY "${release_dir}") file(GLOB files RELATIVE ${GIT_REPO} ${GIT_REPO}/*) @@ -54,57 +142,15 @@ foreach(pkg ${files}) AND (EXISTS ${pkg_dir}/package_info OR "${pkg}" STREQUAL "Documentation" OR "${pkg}" STREQUAL "Miscellany" ) ) # only consider packages - if(VERBOSE) - message(STATUS "handling ${pkg}") - endif() - - # gather all files from this package - set(all_files) - file(GLOB_RECURSE pkg_files RELATIVE ${pkg_dir} ${pkg_dir}/*) - # append the prefix - foreach(f ${pkg_files}) - get_filename_component(fname ${f} NAME) - if (NOT "${fname}" STREQUAL "TODO") # skip TODO files - #make sure the target destination dir exists - set(afile ${pkg_dir}/${f}) - get_filename_component(afile_dir_tmp ${afile} PATH) - string(REPLACE "${pkg_dir}" "" afile_dir ${afile_dir_tmp}) - if(NOT IS_DIRECTORY ${release_dir}/${afile_dir}) - file(MAKE_DIRECTORY ${release_dir}/${afile_dir}) - endif() - - #copy the file (replace $URL$ and $ID$ for *.h and *.hpp) - get_filename_component(fext ${fname} EXT) - if ("${fext}" STREQUAL ".h" OR "${fext}" STREQUAL ".hpp") - file(READ "${pkg_dir}/${f}" file_content) - string(REPLACE "$URL$" "$URL: ${GITHUB_PREFIX}/${pkg}/${f} $" file_content "${file_content}") - if(EXISTS ${GIT_REPO}/.git) - execute_process( - COMMAND git --git-dir=${GIT_REPO}/.git --work-tree=${GIT_REPO} log -n1 "--format=format:%h %aI %an" -- "${pkg}/${f}" - RESULT_VARIABLE RESULT_VAR - OUTPUT_VARIABLE OUT_VAR - ) - string(REPLACE "$Id$" "$Id: ${fname} ${OUT_VAR}" file_content "${file_content}") - else() - string(REPLACE "$Id$" "This file is from the release ${CGAL_VERSION} of CGAL" file_content "${file_content}") - endif() - file(WRITE ${release_dir}/${afile_dir}/${fname} "${file_content}") - else() - file(COPY ${afile} DESTINATION ${release_dir}/${afile_dir}) - endif() - endif() - endforeach() - if (EXISTS "${release_dir}/doc/${pkg}") - #generate filelist.txt used by doxygen ran on a release - file(GLOB_RECURSE includes LIST_DIRECTORIES false RELATIVE "${GIT_REPO}/${pkg}/include" "${GIT_REPO}/${pkg}/include/CGAL/*.h") - foreach(f ${includes}) - file(APPEND "${release_dir}/doc/${pkg}/filelist.txt" "${f}\n") - endforeach() - #remove fig_src directory - if (IS_DIRECTORY "${release_dir}/doc/${pkg}/fig_src") - file(REMOVE_RECURSE "${release_dir}/doc/${pkg}/fig_src") + if(FILTER_GPL_PACKAGES AND EXISTS ${pkg_dir}/package_info/${pkg}/license.txt) + file(READ "${pkg_dir}/package_info/${pkg}/license.txt" license_file_content) + string(REGEX MATCH "^GPL" GPL_PACKAGE "${license_file_content}") + if (GPL_PACKAGE) + continue() endif() endif() + + process_package(${pkg}) endif() endforeach() @@ -220,6 +266,7 @@ if (TESTSUITE) endif() #TESTSUITE # removal of extra directories and files +file(REMOVE_RECURSE ${release_dir}/applications) file(REMOVE_RECURSE ${release_dir}/benchmark) file(REMOVE_RECURSE ${release_dir}/archive) file(REMOVE ${release_dir}/include/CGAL/license/generate_files.cmake) diff --git a/Segment_Delaunay_graph_2/include/CGAL/Segment_Delaunay_graph_site_2.h b/Segment_Delaunay_graph_2/include/CGAL/Segment_Delaunay_graph_site_2.h index 3cab50112f5..4c6a337f8a0 100644 --- a/Segment_Delaunay_graph_2/include/CGAL/Segment_Delaunay_graph_site_2.h +++ b/Segment_Delaunay_graph_2/include/CGAL/Segment_Delaunay_graph_site_2.h @@ -289,8 +289,8 @@ protected: RT x3 = p3.x(), y3 = p3.y(); RT x4 = p4.x(), y4 = p4.y(); - RT D = determinant(x2 - x1, x4 - x3, y2 - y1, y4 - y3); - RT Dt = determinant(x3 - x1, x4 - x3, y3 - y1, y4 - y3); + RT D = determinant(x2 - x1, x4 - x3, y2 - y1, y4 - y3); + RT Dt = determinant(x3 - x1, x4 - x3, y3 - y1, y4 - y3); RT t = Dt / D; diff --git a/Segment_Delaunay_graph_Linf_2/include/CGAL/Segment_Delaunay_graph_Linf_2/Basic_predicates_C2.h b/Segment_Delaunay_graph_Linf_2/include/CGAL/Segment_Delaunay_graph_Linf_2/Basic_predicates_C2.h index 1dba3771d57..43c87519e10 100644 --- a/Segment_Delaunay_graph_Linf_2/include/CGAL/Segment_Delaunay_graph_Linf_2/Basic_predicates_C2.h +++ b/Segment_Delaunay_graph_Linf_2/include/CGAL/Segment_Delaunay_graph_Linf_2/Basic_predicates_C2.h @@ -332,8 +332,8 @@ public: // compute_supporting_line(q.supporting_segment(), a1, b1, c1); Line_2 compute_linf_perpendicular(const Line_2& l, const Point_2& p) { RT a, b, c; - a = RT( - CGAL::sign(l.b()) ); - b = RT( CGAL::sign(l.a()) ); + a = RT( - (int) CGAL::sign(l.b()) ); + b = RT( (int) CGAL::sign(l.a()) ); c = - a * p.x() - b * p.y(); return Line_2(a, b, c); } @@ -810,8 +810,8 @@ public: const RT one(1); - const Point_2 displaced ( corner.x() + (-cmpypq)*one , - corner.y() + cmpxpq * one ); + const Point_2 displaced ( corner.x() + (-(int)cmpypq)*one , + corner.y() + (int)cmpxpq * one ); const Line_2 l = compute_line_from_to(corner, displaced); @@ -928,8 +928,8 @@ public: RT one(1); - Point_2 displaced ( corner.x() + (-cmpypq)*one , - corner.y() + cmpxpq * one ); + Point_2 displaced ( corner.x() + (-(int)cmpypq)*one , + corner.y() + (int)cmpxpq * one ); Line_2 l = compute_line_from_to(corner, displaced); @@ -1808,9 +1808,9 @@ public: { CGAL_precondition(bside % 2 == 1); const FT ax = (bside % 4 == 1) ? - RT(2)*c.x() + c.y() - d.y() : c.x() + d.x(); + FT(RT(2)*c.x() + c.y() - d.y()) : FT(c.x() + d.x()); const FT ay = (bside % 4 == 1) ? - c.y() + d.y() : RT(2)*c.y() + d.x() - c.y(); + FT(c.y() + d.y()) : FT(RT(2)*c.y() + d.x() - c.y()); return Point_2(ax, ay, RT(2)); } diff --git a/Segment_Delaunay_graph_Linf_2/include/CGAL/Segment_Delaunay_graph_Linf_2/Voronoi_vertex_ring_C2.h b/Segment_Delaunay_graph_Linf_2/include/CGAL/Segment_Delaunay_graph_Linf_2/Voronoi_vertex_ring_C2.h index 12ec56b21fa..2a9051028e2 100644 --- a/Segment_Delaunay_graph_Linf_2/include/CGAL/Segment_Delaunay_graph_Linf_2/Voronoi_vertex_ring_C2.h +++ b/Segment_Delaunay_graph_Linf_2/include/CGAL/Segment_Delaunay_graph_Linf_2/Voronoi_vertex_ring_C2.h @@ -644,8 +644,13 @@ private: const FT sidelen = CGAL::abs(qcoord-rcoord); const int sgn = (bside < 4) ? -1 : +1; const RT two(2); - ux_ = side_ver ? (two*pcoord + sgn*sidelen) : (qcoord+rcoord); - uy_ = side_ver ? (qcoord+rcoord) : (two*pcoord + sgn*sidelen); + if(side_ver) { + ux_ = two*pcoord + sgn*sidelen; + uy_ = qcoord+rcoord; + } else { + ux_ = qcoord+rcoord; + uy_ = two*pcoord + sgn*sidelen; + } uz_ = two; } @@ -977,12 +982,12 @@ private: const Comparison_result cmp = CGAL::compare(dx, dy); if (cmp == LARGER) { ux_ = is_q_hor ? (r_coord + p_coord_r) : (q_coord + p_coord_q); - uy_ = is_q_hor ? (RT(2)*q_coord + CGAL::sign(sdistq)*dx) : - (RT(2)*r_coord + CGAL::sign(sdistr)*dx) ; + uy_ = is_q_hor ? (RT(2)*q_coord + (int)CGAL::sign(sdistq)*dx) : + (RT(2)*r_coord + (int)CGAL::sign(sdistr)*dx) ; } else if (cmp == SMALLER) { uy_ = is_r_hor ? (r_coord + p_coord_r) : (q_coord + p_coord_q); - ux_ = is_r_hor ? (RT(2)*q_coord + CGAL::sign(sdistq)*dy) : - (RT(2)*r_coord + CGAL::sign(sdistr)*dy) ; + ux_ = is_r_hor ? (RT(2)*q_coord + (int)CGAL::sign(sdistq)*dy) : + (RT(2)*r_coord + (int)CGAL::sign(sdistr)*dy) ; } else { ux_ = is_q_hor ? (r_coord + p_coord_r) : (q_coord + p_coord_q); uy_ = is_q_hor ? (q_coord + p_coord_q) : (r_coord + p_coord_r); @@ -1056,7 +1061,7 @@ private: uz_ = RT(2); } else { upar = Apar; - uort = Aort - CGAL::sign(dort)*absdpar; + uort = Aort - (int)CGAL::sign(dort)*absdpar; uz_ = RT(1); } } @@ -1124,7 +1129,7 @@ private: Comparison_result comp = CGAL::compare(pqdist, CGAL::abs(signrdist)); upar = is_r_horizontal ? pp.x() + qq.x() : pp.y() + qq.y(); if (comp == LARGER) { - uort = RT(2)*coordr + CGAL::sign(signrdist)*pqdist; + uort = RT(2)*coordr + (int)CGAL::sign(signrdist)*pqdist; } else { uort = coordr + (is_r_horizontal ? pp.y() : pp.x()); } @@ -1156,7 +1161,7 @@ private: uort = RT(2)*coordr + sdistf; } else { upar = is_r_horizontal ? pp.x() + qq.x() : pp.y() + qq.y(); - uort = RT(2)*coordr + CGAL::sign(sdistf)*pqdist; + uort = RT(2)*coordr + (int)CGAL::sign(sdistf)*pqdist; } uz_ = RT(2); return; @@ -1240,8 +1245,8 @@ private: Point_2(pcoord, lineval) : Point_2(lineval, pcoord); const RT sidelen = (CGAL::max)(CGAL::abs(corner.x() - q.point().x()), CGAL::abs(corner.y() - q.point().y())); - ux_ = RT(2)*corner.x() + signla*sidelen; - uy_ = RT(2)*corner.y() + signlb*sidelen; + ux_ = RT(2)*corner.x() + (int)signla*sidelen; + uy_ = RT(2)*corner.y() + (int)signlb*sidelen; uz_ = RT(2); return; } @@ -1252,8 +1257,8 @@ private: Point_2(lineval, qcoord) : Point_2(qcoord, lineval); const RT sidelen = (CGAL::max)(CGAL::abs(corner.x() - p.point().x()), CGAL::abs(corner.y() - p.point().y())); - ux_ = RT(2)*corner.x() + signla*sidelen; - uy_ = RT(2)*corner.y() + signlb*sidelen; + ux_ = RT(2)*corner.x() + (int)signla*sidelen; + uy_ = RT(2)*corner.y() + (int)signlb*sidelen; uz_ = RT(2); return; } @@ -1281,8 +1286,8 @@ private: // is shorter than Linf p, q distance const Point_2 corner = pos_slope? Point_2(pcoord, plineval) : Point_2(plineval, pcoord); - ux_ = RT(2)*corner.x() + signla*pqdist; - uy_ = RT(2)*corner.y() + signlb*pqdist; + ux_ = RT(2)*corner.x() + (int)signla*pqdist; + uy_ = RT(2)*corner.y() + (int)signlb*pqdist; uz_ = RT(2); return; } @@ -1298,8 +1303,8 @@ private: // is shorter than Linf p, q distance const Point_2 corner = pos_slope? Point_2(qlineval, qcoord) : Point_2(qcoord, qlineval); - ux_ = RT(2)*corner.x() + signla*pqdist; - uy_ = RT(2)*corner.y() + signlb*pqdist; + ux_ = RT(2)*corner.x() + (int)signla*pqdist; + uy_ = RT(2)*corner.y() + (int)signlb*pqdist; uz_ = RT(2); return; } diff --git a/Segment_Delaunay_graph_Linf_2/include/CGAL/Segment_Delaunay_graph_Linf_filtered_traits_2.h b/Segment_Delaunay_graph_Linf_2/include/CGAL/Segment_Delaunay_graph_Linf_filtered_traits_2.h index 4f9c4a31648..5335a26b209 100644 --- a/Segment_Delaunay_graph_Linf_2/include/CGAL/Segment_Delaunay_graph_Linf_filtered_traits_2.h +++ b/Segment_Delaunay_graph_Linf_2/include/CGAL/Segment_Delaunay_graph_Linf_filtered_traits_2.h @@ -221,7 +221,7 @@ template, #else - class EK = Simple_cartesian< MP_Float >, + class EK = Simple_cartesian< CGAL::Quotient >, #endif class EK_MTag = Integral_domain_without_division_tag, class FK = Simple_cartesian< Interval_nt >, diff --git a/Segment_Delaunay_graph_Linf_2/include/CGAL/Side_of_bounded_square_2.h b/Segment_Delaunay_graph_Linf_2/include/CGAL/Side_of_bounded_square_2.h index 17cfb236743..37f205cf6c4 100644 --- a/Segment_Delaunay_graph_Linf_2/include/CGAL/Side_of_bounded_square_2.h +++ b/Segment_Delaunay_graph_Linf_2/include/CGAL/Side_of_bounded_square_2.h @@ -70,7 +70,7 @@ namespace CGAL { bool samepq = false; bool samepr = false; bool sameqr = false; - const Comparison_result cmppq = compare(p, q); + const Comparison_result cmppq = CGAL::compare(p, q); switch(cmppq) { case SMALLER: min_p = &p; @@ -86,7 +86,7 @@ namespace CGAL { samepq = true; break; } - const Comparison_result cmppr = compare(p, r); + const Comparison_result cmppr = CGAL::compare(p, r); Comparison_result cmpqr; if (samepq) { cmpqr = cmppr; @@ -105,7 +105,7 @@ namespace CGAL { if (min_p == &p) { switch(cmppr) { case SMALLER: - cmpqr = compare(q, r); + cmpqr = CGAL::compare(q, r); switch(cmpqr) { case SMALLER: max_p = &r; @@ -135,7 +135,7 @@ namespace CGAL { max_p = &r; break; case LARGER: - cmpqr = compare(q, r); + cmpqr = CGAL::compare(q, r); switch(cmpqr) { case SMALLER: break; diff --git a/Segment_Delaunay_graph_Linf_2/test/Segment_Delaunay_graph_Linf_2/include/test_info.h b/Segment_Delaunay_graph_Linf_2/test/Segment_Delaunay_graph_Linf_2/include/test_info.h index 3db6956d14b..7c0a45a5e00 100644 --- a/Segment_Delaunay_graph_Linf_2/test/Segment_Delaunay_graph_Linf_2/include/test_info.h +++ b/Segment_Delaunay_graph_Linf_2/test/Segment_Delaunay_graph_Linf_2/include/test_info.h @@ -17,7 +17,7 @@ bool test_info(SDG& sdg, const char* fname) assert( ifs ); sdg.clear(); - typename SDG::Site_2 site; + typename SDG::Site_2 site = SDG::Site_2::construct_site_2(CGAL::ORIGIN); // read the sites and insert them in the segment Delaunay graph int info_id = 1; diff --git a/Segment_Delaunay_graph_Linf_2/test/Segment_Delaunay_graph_Linf_2/test_sdg_linf_2_et.cpp b/Segment_Delaunay_graph_Linf_2/test/Segment_Delaunay_graph_Linf_2/test_sdg_linf_2_et.cpp index eca8eee9727..43c4de102d9 100644 --- a/Segment_Delaunay_graph_Linf_2/test/Segment_Delaunay_graph_Linf_2/test_sdg_linf_2_et.cpp +++ b/Segment_Delaunay_graph_Linf_2/test/Segment_Delaunay_graph_Linf_2/test_sdg_linf_2_et.cpp @@ -10,28 +10,18 @@ #include #include -// choose number type -#ifdef CGAL_USE_GMP +#include -# include -typedef CGAL::Gmpq exact_ring_t; -typedef CGAL::Gmpq exact_field_t; +// choose number type +typedef CGAL::Exact_rational exact_ring_t; +typedef CGAL::Exact_rational exact_field_t; namespace CGAL { // needed for the drawing methods -Gmpq sqrt(const Gmpq& x) { - return Gmpq( CGAL::sqrt( CGAL::to_double(x) ) ); +exact_ring_t sqrt(const exact_ring_t& x) { + return exact_ring_t( sqrt( to_double(x) ) ); +} } - -} //namespace CGAL -#else - -# include -# include -typedef CGAL::MP_Float exact_ring_t; -typedef CGAL::Quotient exact_field_t; - -#endif typedef exact_ring_t ring_number_t; typedef exact_field_t field_number_t; diff --git a/Segment_Delaunay_graph_Linf_2/test/Segment_Delaunay_graph_Linf_2/test_sdg_linf_2_ft.cpp b/Segment_Delaunay_graph_Linf_2/test/Segment_Delaunay_graph_Linf_2/test_sdg_linf_2_ft.cpp index 91e5edbe13c..961eaa43605 100644 --- a/Segment_Delaunay_graph_Linf_2/test/Segment_Delaunay_graph_Linf_2/test_sdg_linf_2_ft.cpp +++ b/Segment_Delaunay_graph_Linf_2/test/Segment_Delaunay_graph_Linf_2/test_sdg_linf_2_ft.cpp @@ -10,17 +10,11 @@ #include #include +#include + // choose number type -#ifdef CGAL_USE_GMP -# include -typedef CGAL::Gmpq exact_ring_t; -typedef CGAL::Gmpq exact_field_t; -#else -# include -# include -typedef CGAL::MP_Float exact_ring_t; -typedef CGAL::Quotient exact_field_t; -#endif +typedef CGAL::Exact_rational exact_ring_t; +typedef CGAL::Exact_rational exact_field_t; #include diff --git a/Segment_Delaunay_graph_Linf_2/test/Segment_Delaunay_graph_Linf_2/test_sdg_linf_hierarchy_2_et.cpp b/Segment_Delaunay_graph_Linf_2/test/Segment_Delaunay_graph_Linf_2/test_sdg_linf_hierarchy_2_et.cpp index 2f05e01dac2..8b9733164a2 100644 --- a/Segment_Delaunay_graph_Linf_2/test/Segment_Delaunay_graph_Linf_2/test_sdg_linf_hierarchy_2_et.cpp +++ b/Segment_Delaunay_graph_Linf_2/test/Segment_Delaunay_graph_Linf_2/test_sdg_linf_hierarchy_2_et.cpp @@ -10,28 +10,18 @@ #include #include -// choose number type -#ifdef CGAL_USE_GMP +#include -# include -typedef CGAL::Gmpq exact_ring_t; -typedef CGAL::Gmpq exact_field_t; +// choose number type +typedef CGAL::Exact_rational exact_ring_t; +typedef CGAL::Exact_rational exact_field_t; namespace CGAL { // needed for the drawing methods -Gmpq sqrt(const Gmpq& x) { - return Gmpq( sqrt( to_double(x) ) ); +exact_ring_t sqrt(const exact_ring_t& x) { + return exact_ring_t( sqrt( to_double(x) ) ); +} } - -} //namespace CGAL -#else - -# include -# include -typedef CGAL::MP_Float exact_ring_t; -typedef CGAL::Quotient exact_field_t; - -#endif typedef exact_ring_t ring_number_t; typedef exact_field_t field_number_t; diff --git a/Segment_Delaunay_graph_Linf_2/test/Segment_Delaunay_graph_Linf_2/test_sdg_linf_hierarchy_2_ft.cpp b/Segment_Delaunay_graph_Linf_2/test/Segment_Delaunay_graph_Linf_2/test_sdg_linf_hierarchy_2_ft.cpp index 458a3a81c31..ed6565c1997 100644 --- a/Segment_Delaunay_graph_Linf_2/test/Segment_Delaunay_graph_Linf_2/test_sdg_linf_hierarchy_2_ft.cpp +++ b/Segment_Delaunay_graph_Linf_2/test/Segment_Delaunay_graph_Linf_2/test_sdg_linf_hierarchy_2_ft.cpp @@ -10,17 +10,11 @@ #include #include +#include + // choose number type -#ifdef CGAL_USE_GMP -# include -typedef CGAL::Gmpq exact_ring_t; -typedef CGAL::Gmpq exact_field_t; -#else -# include -# include -typedef CGAL::MP_Float exact_ring_t; -typedef CGAL::Quotient exact_field_t; -#endif +typedef CGAL::Exact_rational exact_ring_t; +typedef CGAL::Exact_rational exact_field_t; #include diff --git a/Segment_Delaunay_graph_Linf_2/test/Segment_Delaunay_graph_Linf_2/test_sdg_linf_new_range_api.cpp b/Segment_Delaunay_graph_Linf_2/test/Segment_Delaunay_graph_Linf_2/test_sdg_linf_new_range_api.cpp index 791a866fb99..8b5124e1c6c 100644 --- a/Segment_Delaunay_graph_Linf_2/test/Segment_Delaunay_graph_Linf_2/test_sdg_linf_new_range_api.cpp +++ b/Segment_Delaunay_graph_Linf_2/test/Segment_Delaunay_graph_Linf_2/test_sdg_linf_new_range_api.cpp @@ -7,12 +7,14 @@ #include #include #include -#include +#include typedef CGAL::Exact_predicates_inexact_constructions_kernel K; typedef CGAL::Field_with_sqrt_tag MTag; typedef CGAL::Integral_domain_without_division_tag EMTag; -typedef CGAL::Simple_cartesian EK; +typedef CGAL::Exact_rational Number_type; + +typedef CGAL::Simple_cartesian EK; typedef CGAL::Segment_Delaunay_graph_Linf_filtered_traits_without_intersections_2 Gt; typedef CGAL::Segment_Delaunay_graph_Linf_2 SDG; diff --git a/Solver_interface/doc/Solver_interface/Concepts/DiagonalizeTraits.h b/Solver_interface/doc/Solver_interface/Concepts/DiagonalizeTraits.h index f982dfc50ad..b29e95b7237 100644 --- a/Solver_interface/doc/Solver_interface/Concepts/DiagonalizeTraits.h +++ b/Solver_interface/doc/Solver_interface/Concepts/DiagonalizeTraits.h @@ -4,7 +4,9 @@ Concept providing functions to extract eigenvectors and eigenvalues from covariance matrices represented by an array `a`, using symmetric -diagonalization. For example, a matrix of dimension 3 is defined as +diagonalization. + +For example, a matrix of dimension 3 is defined as follows:

\f$ \begin{bmatrix} diff --git a/Solver_interface/doc/Solver_interface/Concepts/SparseLinearAlgebraTraits_d.h b/Solver_interface/doc/Solver_interface/Concepts/SparseLinearAlgebraTraits_d.h index 8d8c480670f..b178c9e5e16 100644 --- a/Solver_interface/doc/Solver_interface/Concepts/SparseLinearAlgebraTraits_d.h +++ b/Solver_interface/doc/Solver_interface/Concepts/SparseLinearAlgebraTraits_d.h @@ -62,6 +62,8 @@ bool linear_solver(const Matrix& A, const Vector& B, Vector& X, NT& D); `SparseLinearAlgebraTraits_d::Vector` is a concept of a vector that can be multiplied by a sparse matrix. +\cgalRefines DefaultConstructible + \cgalHasModel `CGAL::Eigen_vector` \sa `SparseLinearAlgebraTraits_d` @@ -79,15 +81,20 @@ public: */ typedef unspecified_type NT; +/*! +Index type +*/ +typedef unspecified_type Index; + /// @} -/// \name Creation +/// \name Creation /// @{ /*! Create a vector initialized with zeros. */ -Vector(int rows); +Vector(Index rows); /*! Copy constructor. @@ -95,24 +102,24 @@ Copy constructor. Vector(const Vector& toCopy); /// @} -/// \name Operations +/// \name Operations /// @{ /*! Return the vector's number of coefficients. */ -int dimension() const; +Index dimension() const; /*! Read/write access to a vector coefficient. \pre `0 <= row < dimension()`. */ -NT operator[](int row) const; +NT operator[](Index row) const; /*! */ -NT& operator[](int row); +NT& operator[](Index row); /// @} @@ -124,6 +131,8 @@ NT& operator[](int row); `SparseLinearAlgebraTraits_d::Matrix` is a concept of a sparse matrix class. +\cgalRefines DefaultConstructible + \cgalHasModel `CGAL::Eigen_sparse_matrix` \cgalHasModel `CGAL::Eigen_sparse_symmetric_matrix` @@ -136,6 +145,12 @@ public: /// \name Types /// @{ +/*! +Index type +*/ +typedef unspecified_type Index; + + /*! */ @@ -143,18 +158,18 @@ typedef unspecified_type NT; /// @} -/// \name Creation +/// \name Creation /// @{ /*! Create a square matrix initialized with zeros. */ -Matrix(int dimension); +Matrix(Index dimension); /*! Create a rectangular matrix initialized with zeros. */ -Matrix(int rows, int columns); +Matrix(Index rows, Index columns); /// @} @@ -164,12 +179,12 @@ Matrix(int rows, int columns); /*! Return the matrix number of rows. */ -int row_dimension() const; +Index row_dimension() const; /*! Return the matrix number of columns. */ -int column_dimension() const; +Index column_dimension() const; /*! Read access to a matrix coefficient. @@ -177,7 +192,7 @@ Read access to a matrix coefficient. \pre `0 <= row < row_dimension()` \pre `0 <= column < column_dimension()` */ -NT get_coef(int row, int column) const; +NT get_coef(Index row, Index column) const; /*! Write access to a matrix coefficient: `a_ij = a_ij + val`. @@ -185,10 +200,10 @@ Write access to a matrix coefficient: `a_ij = a_ij + val`. \pre `0 <= row < row_dimension()` \pre `0 <= column < column_dimension()` */ -void add_coef(int row, int column, NT value); +void add_coef(Index row, Index column, NT value); /*! -Write access to a matrix coefficient: `a_ij = val`. +Write access to a matrix coefficient: `a_ij = val`. Optimization: Users can indicate that the coefficient does not already exist in the matrix by setting `new_coef` to `true`. @@ -196,7 +211,20 @@ in the matrix by setting `new_coef` to `true`. \pre `0 <= i < row_dimension()` \pre `0 <= j < column_dimension()` */ -void set_coef(int row, int column, NT value, bool new_coef = false); +void set_coef(Index row, Index column, NT value, bool new_coef = false); + +/*! +swaps the content of `*this` and `m` + */ +void swap(Matrix& m); + +/// Multiplication with a scalar. +friend Matrix +operator*(const NT& c, const Matrix& M); + +/// Sum of two matrices. +friend Matrix +operator+(const Matrix& M0, const Matrix& M1); /// @} diff --git a/Solver_interface/doc/Solver_interface/Concepts/SparseLinearAlgebraWithFactorTraits_d.h b/Solver_interface/doc/Solver_interface/Concepts/SparseLinearAlgebraWithFactorTraits_d.h index 9adf9c35a6d..b7cbed1fee4 100644 --- a/Solver_interface/doc/Solver_interface/Concepts/SparseLinearAlgebraWithFactorTraits_d.h +++ b/Solver_interface/doc/Solver_interface/Concepts/SparseLinearAlgebraWithFactorTraits_d.h @@ -40,6 +40,11 @@ bool factor(const Matrix& A, NT& D); /// \return `true` if the solver is successful and `false` otherwise. bool linear_solver(const Vector& B, Vector& X); +/// Solve the sparse linear system \f$ A \times X = B\f$, with \f$ A \f$ being the matrix +/// provided in `SparseLinearAlgebraWithFactorTraits_d::factor()`. +/// \return `true` if the solver is successful and `false` otherwise. +bool linear_solver(const Matrix& B, Vector& X); + /// @} }; /* end SparseLinearAlgebraWithFactorTraits_d */ diff --git a/Solver_interface/include/CGAL/Eigen_matrix.h b/Solver_interface/include/CGAL/Eigen_matrix.h index 2af306046ee..1c54a8b758d 100644 --- a/Solver_interface/include/CGAL/Eigen_matrix.h +++ b/Solver_interface/include/CGAL/Eigen_matrix.h @@ -55,8 +55,16 @@ public: typedef T NT; /// @} + Eigen_sparse_matrix(const EigenType& et) + : m_is_already_built(true), m_matrix(et), m_is_symmetric(false) + {} + // Public operations public: + Eigen_sparse_matrix() : + m_is_already_built(false) + {} + /// Create a square matrix initialized with zeros. Eigen_sparse_matrix(std::size_t dim, ///< Matrix dimension. bool is_symmetric = false) ///< Symmetric/hermitian? @@ -104,6 +112,15 @@ public: m_triplets.reserve(rows); } + void swap(Eigen_sparse_matrix& other) + { + std::swap(m_is_already_built, other.m_is_already_built); + std::swap(m_is_symmetric, other.m_is_symmetric); + m_matrix.swap(other.m_matrix); + m_triplets.swap(other.m_triplets); + } + + /// Delete this object and the wrapped matrix. ~Eigen_sparse_matrix() { } @@ -178,18 +195,20 @@ public: /// /// \pre 0 <= i < row_dimension(). /// \pre 0 <= j < column_dimension(). - void add_coef(int i, int j, T val) + void add_coef(std::size_t i_, std::size_t j_, T val) { - CGAL_precondition(i < row_dimension()); - CGAL_precondition(j < column_dimension()); - + int i = static_cast(i_); + int j = static_cast(j_); if(m_is_symmetric && (j > i)) return; - if(m_is_already_built) + if(m_is_already_built){ + CGAL_precondition(i < row_dimension()); + CGAL_precondition(j < column_dimension()); m_matrix.coeffRef(i,j) += val; - else + }else{ m_triplets.push_back(Triplet(i,j,val)); + } } /// Read access to a matrix coefficient. @@ -201,8 +220,10 @@ public: /// /// \pre 0 <= i < row_dimension(). /// \pre 0 <= j < column_dimension(). - NT get_coef (unsigned int i, unsigned int j) const + NT get_coef (std::size_t i_, std::size_t j_) const { + int i = static_cast(i_); + int j = static_cast(j_); CGAL_precondition(i < row_dimension()); CGAL_precondition(j < column_dimension()); @@ -246,11 +267,38 @@ public: return m_matrix; } -private: - /// Eigen_sparse_matrix cannot be copied (yet) - Eigen_sparse_matrix(const Eigen_sparse_matrix& rhs); - Eigen_sparse_matrix& operator=(const Eigen_sparse_matrix& rhs); + /// Return the internal matrix, with type `EigenType`. + EigenType& eigen_object() + { + if(!m_is_already_built) + assemble_matrix(); + // turns the matrix into compressed mode: + // -> release some memory + // -> required for some external solvers + m_matrix.makeCompressed(); + return m_matrix; + } + + +public: + + /// \cond SKIP_IN_MANUAL + friend Eigen_sparse_matrix + operator*(const T& c, const Eigen_sparse_matrix& M) + { + return Eigen_sparse_matrix(c* M.eigen_object()); + } + + + friend Eigen_sparse_matrix + operator+(const Eigen_sparse_matrix& M0, const Eigen_sparse_matrix& M1) + { + return Eigen_sparse_matrix(M0.eigen_object()+ M1.eigen_object()); + } + /// \endcond + + // Fields private: mutable bool m_is_already_built; @@ -264,6 +312,7 @@ private: bool m_is_symmetric; }; // Eigen_sparse_matrix + /*! \ingroup PkgSolverInterfaceRef diff --git a/Solver_interface/include/CGAL/Eigen_solver_traits.h b/Solver_interface/include/CGAL/Eigen_solver_traits.h index 0fe107f371b..19cc8b940c7 100644 --- a/Solver_interface/include/CGAL/Eigen_solver_traits.h +++ b/Solver_interface/include/CGAL/Eigen_solver_traits.h @@ -61,6 +61,7 @@ struct Get_eigen_matrix< ::Eigen::SimplicialCholesky, FT> typedef Eigen_sparse_symmetric_matrix type; }; + #if EIGEN_VERSION_AT_LEAST(3, 1, 91) template struct Get_eigen_matrix< ::Eigen::SparseLU, FT> @@ -118,7 +119,11 @@ public: typedef EigenSolverT Solver; typedef Scalar NT; typedef CGAL::Eigen_vector Vector; - +#if EIGEN_VERSION_AT_LEAST(3, 3, 0) + typedef Eigen::Index Index; +#else + typedef Eigen::DenseIndex Index; +#endif /// If `T` is `Eigen::ConjugateGradient` or `Eigen::SimplicialCholesky`, /// `Matrix` is `CGAL::Eigen_sparse_symmetric_matrix`, and `CGAL::Eigen_sparse_matrix` otherwise. #ifdef DOXYGEN_RUNNING @@ -184,6 +189,16 @@ public: X = solver().solve(B); return solver().info() == Eigen::Success; } + + /// Solve the sparse linear system \f$ A \times X = B\f$, with \f$ A \f$ being the matrix + /// provided in `factor()`. + /// \return `true` if the solver is successful and `false` otherwise. + bool linear_solver(const Matrix& B, Vector& X) + { + CGAL_precondition(m_mat != NULL); // factor should have been called first + X = solver().solve(B.eigen_object()); + return solver().info() == Eigen::Success; + } /// Factorize the sparse matrix \f$ A^t \times A\f$, where \f$ A^t \f$ is the /// transpose matrix of \f$ A \f$. diff --git a/Solver_interface/include/CGAL/Eigen_vector.h b/Solver_interface/include/CGAL/Eigen_vector.h index b52f2e757f4..e26e5e7253f 100644 --- a/Solver_interface/include/CGAL/Eigen_vector.h +++ b/Solver_interface/include/CGAL/Eigen_vector.h @@ -67,7 +67,10 @@ public: { return static_cast&>(static_cast(*this) = other); } - + Eigen_vector() + : EigenType() + {} + /// Create a vector initialized with zeros. Eigen_vector(std::size_t dimension) : EigenType(static_cast(dimension)) diff --git a/Spatial_searching/include/CGAL/Plane_separator.h b/Spatial_searching/include/CGAL/Plane_separator.h index a831e6174df..8ee7d1db526 100644 --- a/Spatial_searching/include/CGAL/Plane_separator.h +++ b/Spatial_searching/include/CGAL/Plane_separator.h @@ -53,9 +53,21 @@ template < class FT> class Plane_separator { Plane_separator(const int d, const FT& v) : cutting_dim(d), cutting_val(v) {} + explicit Plane_separator() : cutting_dim(0), cutting_val(0) {} + + // Added as workaround for VC2017 with /arch:AVX to fix + // https://cgal.geometryfactory.com/CGAL/testsuite/CGAL-4.14-I-95/Spatial_searching/TestReport_afabri_x64_Cygwin-Windows10_MSVC2017-Release-64bits.gz + Plane_separator& operator=(const Plane_separator& ps) + { + cutting_dim = ps.cutting_dim; + cutting_val = ps.cutting_val; + return *this; + } + }; + template < class FT> std::ostream& operator<< (std::ostream& s, Plane_separator& x) { s << "\n Separator coordinate: " << x.cutting_dimension() << diff --git a/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/VertexContainer_2.h b/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/VertexContainer_2.h index 15dfdf25092..b35ba7ee047 100644 --- a/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/VertexContainer_2.h +++ b/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/VertexContainer_2.h @@ -2,8 +2,6 @@ \ingroup PkgStraightSkeleton2Concepts \cgalConcept -\cgalHeading{Introduction} - A model for the `VertexContainer_2` concept defines the requirements for a resizable container of 2D points. It is used to output the offset polygons generated by the `Polygon_offset_builder_2` class. \cgalHasModel CGAL::Polygon_2 diff --git a/Subdivision_method_3/include/CGAL/Subdivision_method_3/subdivision_masks_3.h b/Subdivision_method_3/include/CGAL/Subdivision_method_3/subdivision_masks_3.h index 527b79c21ef..877411cf398 100644 --- a/Subdivision_method_3/include/CGAL/Subdivision_method_3/subdivision_masks_3.h +++ b/Subdivision_method_3/include/CGAL/Subdivision_method_3/subdivision_masks_3.h @@ -215,13 +215,13 @@ public: /// computes the Catmull-Clark vertex-point `pt` of the vertex `vertex`. void vertex_node(vertex_descriptor vertex, Point& pt) { Halfedge_around_target_circulator vcir(vertex, *(this->pmesh)); - typename boost::graph_traits::degree_size_type n = degree(vertex, *(this->pmesh)); + int n = static_cast(degree(vertex, *(this->pmesh))); FT Q[] = {0.0, 0.0, 0.0}, R[] = {0.0, 0.0, 0.0}; Point_ref S = get(this->vpmap,vertex); Point q; - for (typename boost::graph_traits::degree_size_type i = 0; i < n; i++, ++vcir) { + for (int i = 0; i < n; i++, ++vcir) { Point_ref p2 = get(this->vpmap, target(opposite(*vcir, *(this->pmesh)), *(this->pmesh))); R[0] += (S[0] + p2[0]) / 2; R[1] += (S[1] + p2[1]) / 2; diff --git a/Surface_mesh/include/CGAL/Surface_mesh/Surface_mesh.h b/Surface_mesh/include/CGAL/Surface_mesh/Surface_mesh.h index e6cee1568a3..f702688ff08 100644 --- a/Surface_mesh/include/CGAL/Surface_mesh/Surface_mesh.h +++ b/Surface_mesh/include/CGAL/Surface_mesh/Surface_mesh.h @@ -105,6 +105,11 @@ namespace CGAL { return idx_ < _rhs.idx_; } + // Compatibility with OpenMesh handle + size_type idx() const { + return idx_; + } + /// increments the internal index. This operation does not /// guarantee that the index is valid or undeleted after the /// increment. @@ -214,6 +219,9 @@ namespace CGAL { // returns the underlying index of this index. operator size_type() const { return (size_type)halfedge_ / 2; } + // compatibility with OpenMesh handles + size_type idx() const { return (size_type)halfedge_ / 2; } + // resets index to be invalid (index=std::numeric_limits::max()) void reset() { halfedge_.reset(); } diff --git a/Surface_mesh/include/CGAL/boost/graph/properties_Surface_mesh.h b/Surface_mesh/include/CGAL/boost/graph/properties_Surface_mesh.h index 7a2921c5c54..4b73a354c1d 100644 --- a/Surface_mesh/include/CGAL/boost/graph/properties_Surface_mesh.h +++ b/Surface_mesh/include/CGAL/boost/graph/properties_Surface_mesh.h @@ -304,18 +304,17 @@ struct graph_has_property, boost::edge_weight_t> : CGAL::Tag_true {}; } // CGAL +// dynamic properties namespace boost { - - template struct property_map, CGAL::dynamic_vertex_property_t > { typedef CGAL::Surface_mesh SM; typedef typename SM:: template Property_map SMPM; typedef CGAL::internal::Dynamic type; - typedef type const_type; + typedef CGAL::internal::Dynamic_with_index const_type; }; template @@ -324,7 +323,7 @@ struct property_map, CGAL::dynamic_face_property_t typedef CGAL::Surface_mesh SM; typedef typename SM:: template Property_map SMPM; typedef CGAL::internal::Dynamic type; - typedef type const_type; + typedef CGAL::internal::Dynamic_with_index const_type; }; template @@ -333,7 +332,7 @@ struct property_map, CGAL::dynamic_halfedge_property_t typedef CGAL::Surface_mesh SM; typedef typename SM:: template Property_map SMPM; typedef CGAL::internal::Dynamic type; - typedef type const_type; + typedef CGAL::internal::Dynamic_with_index const_type; }; template @@ -342,49 +341,79 @@ struct property_map, CGAL::dynamic_edge_property_t typedef CGAL::Surface_mesh SM; typedef typename SM:: template Property_map SMPM; typedef CGAL::internal::Dynamic type; - typedef type const_type; + typedef CGAL::internal::Dynamic_with_index const_type; }; } // nmamespace boost namespace CGAL { +// get functions for dynamic properties of mutable Surface_mesh template -typename boost::property_map, dynamic_vertex_property_t >::const_type +typename boost::property_map, dynamic_vertex_property_t >::type get(dynamic_vertex_property_t, Surface_mesh& sm) { typedef typename boost::property_map, dynamic_vertex_property_t >::SMPM SMPM; - typedef typename boost::property_map, dynamic_vertex_property_t >::const_type DPM; + typedef typename boost::property_map, dynamic_vertex_property_t >::type DPM; return DPM(sm, new SMPM(sm.template add_property_map::Vertex_index, T>(std::string()).first)); } template -typename boost::property_map, dynamic_face_property_t >::const_type +typename boost::property_map, dynamic_face_property_t >::type get(dynamic_face_property_t, Surface_mesh& sm) { typedef typename boost::property_map, dynamic_face_property_t >::SMPM SMPM; - typedef typename boost::property_map, dynamic_face_property_t >::const_type DPM; + typedef typename boost::property_map, dynamic_face_property_t >::type DPM; return DPM(sm, new SMPM(sm.template add_property_map::Face_index, T>(std::string()).first)); } template -typename boost::property_map, dynamic_edge_property_t >::const_type +typename boost::property_map, dynamic_edge_property_t >::type get(dynamic_edge_property_t, Surface_mesh& sm) { typedef typename boost::property_map, dynamic_edge_property_t >::SMPM SMPM; - typedef typename boost::property_map, dynamic_edge_property_t >::const_type DPM; + typedef typename boost::property_map, dynamic_edge_property_t >::type DPM; return DPM(sm, new SMPM(sm.template add_property_map::Edge_index, T>(std::string()).first)); } template -typename boost::property_map, dynamic_halfedge_property_t >::const_type +typename boost::property_map, dynamic_halfedge_property_t >::type get(dynamic_halfedge_property_t, Surface_mesh& sm) { typedef typename boost::property_map, dynamic_halfedge_property_t >::SMPM SMPM; - typedef typename boost::property_map, dynamic_halfedge_property_t >::const_type DPM; + typedef typename boost::property_map, dynamic_halfedge_property_t >::type DPM; return DPM(sm, new SMPM(sm.template add_property_map::Halfedge_index, T>(std::string()).first)); } +// get functions for dynamic properties of const Surface_mesh +template +typename boost::property_map, dynamic_vertex_property_t >::const_type +get(dynamic_vertex_property_t, const Surface_mesh& sm) +{ + return CGAL::internal::Dynamic_with_index::Vertex_index, T>(num_vertices(sm)); +} + +template +typename boost::property_map, dynamic_face_property_t >::const_type +get(dynamic_face_property_t, const Surface_mesh& sm) +{ + return CGAL::internal::Dynamic_with_index::Face_index, T>(num_faces(sm)); +} + +template +typename boost::property_map, dynamic_halfedge_property_t >::const_type +get(dynamic_halfedge_property_t, const Surface_mesh& sm) +{ + return CGAL::internal::Dynamic_with_index::Halfedge_index, T>(num_halfedges(sm)); +} + +template +typename boost::property_map, dynamic_edge_property_t >::const_type +get(dynamic_edge_property_t, const Surface_mesh& sm) +{ + return CGAL::internal::Dynamic_with_index::Edge_index, T>(num_edges(sm)); +} + // implementation detail: required by Dynamic_property_map_deleter template void @@ -393,7 +422,6 @@ remove_property(Pmap pm, CGAL::Surface_mesh

& sm) return sm.remove_property_map(pm); } - template struct Get_pmap_of_surface_mesh { typedef typename boost::property_map, Property_tag >::type type; diff --git a/Surface_mesh_parameterization/package_info/Surface_mesh_parameterization/dependencies b/Surface_mesh_parameterization/package_info/Surface_mesh_parameterization/dependencies index 3ea7153c7fe..9dbfd435104 100644 --- a/Surface_mesh_parameterization/package_info/Surface_mesh_parameterization/dependencies +++ b/Surface_mesh_parameterization/package_info/Surface_mesh_parameterization/dependencies @@ -24,3 +24,4 @@ Stream_support Surface_mesh_parameterization TDS_2 Triangulation_2 +Distance_3 diff --git a/Surface_mesh_segmentation/include/CGAL/internal/Surface_mesh_segmentation/AABB_traits.h b/Surface_mesh_segmentation/include/CGAL/internal/Surface_mesh_segmentation/AABB_traits.h index 5a01a8b5375..674af767ad4 100644 --- a/Surface_mesh_segmentation/include/CGAL/internal/Surface_mesh_segmentation/AABB_traits.h +++ b/Surface_mesh_segmentation/include/CGAL/internal/Surface_mesh_segmentation/AABB_traits.h @@ -61,7 +61,7 @@ public: const Point_3& p = segment.source(); const Point_3& q = segment.target(); - return internal::do_intersect_bbox_segment_aux + return Intersections::internal::do_intersect_bbox_segment_aux #include #include +#include #ifdef three_EXPORTS # define THREE_EXPORT Q_DECL_EXPORT @@ -47,7 +48,6 @@ public: static QMainWindow* mainWindow(); static Scene_interface* scene(); static QObject* connectableScene(); - static Three* messages(); static RenderingMode defaultSurfaceMeshRenderingMode(); static RenderingMode defaultPointSetRenderingMode(); static QString modeName(RenderingMode mode); @@ -77,6 +77,15 @@ public: * in the plugin. */ static void autoConnectActions(CGAL::Three::Polyhedron_demo_plugin_interface* plugin); + static void information(QString); + /*! + * Displays a blue text preceded by the mention "WARNING :". + */ + static void warning(QString); + /*! + * Displays a red text preceded by the mention "ERROR :". + */ + static void error(QString); protected: static QMainWindow* s_mainwindow; static Scene_interface* s_scene; @@ -88,6 +97,18 @@ protected: static int default_normal_length; static int default_lines_width; +public: + struct CursorScopeGuard + { + CursorScopeGuard(QCursor cursor) + { + QApplication::setOverrideCursor(cursor); + } + ~CursorScopeGuard() + { + QApplication::restoreOverrideCursor(); + } + }; }; } } diff --git a/Three/include/CGAL/Three/Triangle_container.h b/Three/include/CGAL/Three/Triangle_container.h index 6e59506392e..76da4e72acd 100644 --- a/Three/include/CGAL/Three/Triangle_container.h +++ b/Three/include/CGAL/Three/Triangle_container.h @@ -57,6 +57,7 @@ struct DEMO_FRAMEWORK_EXPORT Triangle_container :public Primitive_container Radius, //!< Designates the buffer that contains the radius of the spheres. VColors, //!< Designates the buffer that contains the colors of the smooth vertices. FColors, //!< Designates the buffer that contains the colors of the flat vertices. + Distances, NbOfVbos //!< Designates the size of the VBOs vector for `Triangle_container`s }; diff --git a/Three/include/CGAL/Three/Viewer_interface.h b/Three/include/CGAL/Three/Viewer_interface.h index 5dddd1ae5d2..84a65fb7617 100644 --- a/Three/include/CGAL/Three/Viewer_interface.h +++ b/Three/include/CGAL/Three/Viewer_interface.h @@ -77,6 +77,7 @@ public: PROGRAM_FLAT, /** Used to render flat shading without pre computing normals*/ PROGRAM_OLD_FLAT, /** Used to render flat shading without pre computing normals without geometry shader*/ PROGRAM_SOLID_WIREFRAME, //! Used to render edges with width superior to 1. + PROGRAM_HEAT_INTENSITY, //! Used to render special item in Display_property_plugin NB_OF_PROGRAMS //! Holds the number of different programs in this enum. }; diff --git a/Triangulation_2/include/CGAL/Delaunay_triangulation_2.h b/Triangulation_2/include/CGAL/Delaunay_triangulation_2.h index 4e127cfc2ba..7540cf54b61 100644 --- a/Triangulation_2/include/CGAL/Delaunay_triangulation_2.h +++ b/Triangulation_2/include/CGAL/Delaunay_triangulation_2.h @@ -504,8 +504,11 @@ private: } else { *(pit.first)++ = fn; int j = fn->index(fh); - stack.push(std::make_pair(fn,ccw(j))); + + // In the non-recursive version, we walk via 'ccw(j)' first. Here, we are filling the stack + // and the order is thus the opposite (we want the top element of the stack to be 'ccw(j)') stack.push(std::make_pair(fn,cw(j))); + stack.push(std::make_pair(fn,ccw(j))); } } return pit; diff --git a/Triangulation_2/include/CGAL/Triangulation_euclidean_traits_2.h b/Triangulation_2/include/CGAL/Triangulation_euclidean_traits_2.h index 9507fe94c04..70e81bd11f0 100644 --- a/Triangulation_2/include/CGAL/Triangulation_euclidean_traits_2.h +++ b/Triangulation_2/include/CGAL/Triangulation_euclidean_traits_2.h @@ -38,7 +38,7 @@ #include #include -#include +#include namespace CGAL { diff --git a/Triangulation_2/test/Triangulation_2/data/layers.xy b/Triangulation_2/test/Triangulation_2/data/layers.xy new file mode 100644 index 00000000000..1207d7eeb95 --- /dev/null +++ b/Triangulation_2/test/Triangulation_2/data/layers.xy @@ -0,0 +1,502 @@ +10 0 +10 0.01 +10 0.02 +10 0.029999999999999999 +10 0.040000000000000001 +10 0.050000000000000003 +10 0.059999999999999998 +10 0.070000000000000007 +10 0.080000000000000002 +10 0.089999999999999997 +10 0.10000000000000001 +10 0.11 +10 0.12 +10 0.13 +10 0.14000000000000001 +10 0.14999999999999999 +10 0.16 +10 0.17000000000000001 +10 0.17999999999999999 +10 0.19 +10 0.20000000000000001 +10 0.20999999999999999 +10 0.22 +10 0.23000000000000001 +10 0.23999999999999999 +10 0.25 +10 0.26000000000000001 +10 0.27000000000000002 +10 0.28000000000000003 +10 0.28999999999999998 +10 0.29999999999999999 +10 0.31 +10 0.32000000000000001 +10 0.33000000000000002 +10 0.34000000000000002 +10 0.34999999999999998 +10 0.35999999999999999 +10 0.37 +10 0.38 +10 0.39000000000000001 +10 0.40000000000000002 +10 0.40999999999999998 +10 0.41999999999999998 +10 0.42999999999999999 +10 0.44 +10 0.45000000000000001 +10 0.46000000000000002 +10 0.46999999999999997 +10 0.47999999999999998 +10 0.48999999999999999 +10 0.5 +10 0.51000000000000001 +10 0.52000000000000002 +10 0.53000000000000003 +10 0.54000000000000004 +10 0.55000000000000004 +10 0.56000000000000005 +10 0.56999999999999995 +10 0.57999999999999996 +10 0.58999999999999997 +10 0.59999999999999998 +10 0.60999999999999999 +10 0.62 +10 0.63 +10 0.64000000000000001 +10 0.65000000000000002 +10 0.66000000000000003 +10 0.67000000000000004 +10 0.68000000000000005 +10 0.68999999999999995 +10 0.69999999999999996 +10 0.70999999999999996 +10 0.71999999999999997 +10 0.72999999999999998 +10 0.73999999999999999 +10 0.75 +10 0.76000000000000001 +10 0.77000000000000002 +10 0.78000000000000003 +10 0.79000000000000004 +10 0.80000000000000004 +10 0.81000000000000005 +10 0.81999999999999995 +10 0.82999999999999996 +10 0.83999999999999997 +10 0.84999999999999998 +10 0.85999999999999999 +10 0.87 +10 0.88 +10 0.89000000000000001 +10 0.90000000000000002 +10 0.91000000000000003 +10 0.92000000000000004 +10 0.93000000000000005 +10 0.93999999999999995 +10 0.94999999999999996 +10 0.95999999999999996 +10 0.96999999999999997 +10 0.97999999999999998 +10 0.98999999999999999 +10 1 +10 1.01 +10 1.02 +10 1.03 +10 1.04 +10 1.05 +10 1.0600000000000001 +10 1.0700000000000001 +10 1.0800000000000001 +10 1.0900000000000001 +10 1.1000000000000001 +10 1.1100000000000001 +10 1.1200000000000001 +10 1.1299999999999999 +10 1.1399999999999999 +10 1.1499999999999999 +10 1.1599999999999999 +10 1.1699999999999999 +10 1.1799999999999999 +10 1.1899999999999999 +10 1.2 +10 1.21 +10 1.22 +10 1.23 +10 1.24 +10 1.25 +10 1.26 +10 1.27 +10 1.28 +10 1.29 +10 1.3 +10 1.3100000000000001 +10 1.3200000000000001 +10 1.3300000000000001 +10 1.3400000000000001 +10 1.3500000000000001 +10 1.3600000000000001 +10 1.3700000000000001 +10 1.3799999999999999 +10 1.3899999999999999 +10 1.3999999999999999 +10 1.4099999999999999 +10 1.4199999999999999 +10 1.4299999999999999 +10 1.4399999999999999 +10 1.45 +10 1.46 +10 1.47 +10 1.48 +10 1.49 +10 1.5 +10 1.51 +10 1.52 +10 1.53 +10 1.54 +10 1.55 +10 1.5600000000000001 +10 1.5700000000000001 +10 1.5800000000000001 +10 1.5900000000000001 +10 1.6000000000000001 +10 1.6100000000000001 +10 1.6200000000000001 +10 1.6299999999999999 +10 1.6399999999999999 +10 1.6499999999999999 +10 1.6599999999999999 +10 1.6699999999999999 +10 1.6799999999999999 +10 1.6899999999999999 +10 1.7 +10 1.71 +10 1.72 +10 1.73 +10 1.74 +10 1.75 +10 1.76 +10 1.77 +10 1.78 +10 1.79 +10 1.8 +10 1.8100000000000001 +10 1.8200000000000001 +10 1.8300000000000001 +10 1.8400000000000001 +10 1.8500000000000001 +10 1.8600000000000001 +10 1.8700000000000001 +10 1.8799999999999999 +10 1.8899999999999999 +10 1.8999999999999999 +10 1.9099999999999999 +10 1.9199999999999999 +10 1.9299999999999999 +10 1.9399999999999999 +10 1.95 +10 1.96 +10 1.97 +10 1.98 +10 1.99 +10 2 +10 2.0099999999999998 +10 2.02 +10 2.0299999999999998 +10 2.04 +10 2.0499999999999998 +10 2.0600000000000001 +10 2.0699999999999998 +10 2.0800000000000001 +10 2.0899999999999999 +10 2.1000000000000001 +10 2.1099999999999999 +10 2.1200000000000001 +10 2.1299999999999999 +10 2.1400000000000001 +10 2.1499999999999999 +10 2.1600000000000001 +10 2.1699999999999999 +10 2.1800000000000002 +10 2.1899999999999999 +10 2.2000000000000002 +10 2.21 +10 2.2200000000000002 +10 2.23 +10 2.2400000000000002 +10 2.25 +10 2.2599999999999998 +10 2.27 +10 2.2799999999999998 +10 2.29 +10 2.2999999999999998 +10 2.3100000000000001 +10 2.3199999999999998 +10 2.3300000000000001 +10 2.3399999999999999 +10 2.3500000000000001 +10 2.3599999999999999 +10 2.3700000000000001 +10 2.3799999999999999 +10 2.3900000000000001 +10 2.3999999999999999 +10 2.4100000000000001 +10 2.4199999999999999 +10 2.4300000000000002 +10 2.4399999999999999 +10 2.4500000000000002 +10 2.46 +10 2.4700000000000002 +10 2.48 +10 2.4900000000000002 +10 2.5 +20 0 +20 0.01 +20 0.02 +20 0.029999999999999999 +20 0.040000000000000001 +20 0.050000000000000003 +20 0.059999999999999998 +20 0.070000000000000007 +20 0.080000000000000002 +20 0.089999999999999997 +20 0.10000000000000001 +20 0.11 +20 0.12 +20 0.13 +20 0.14000000000000001 +20 0.14999999999999999 +20 0.16 +20 0.17000000000000001 +20 0.17999999999999999 +20 0.19 +20 0.20000000000000001 +20 0.20999999999999999 +20 0.22 +20 0.23000000000000001 +20 0.23999999999999999 +20 0.25 +20 0.26000000000000001 +20 0.27000000000000002 +20 0.28000000000000003 +20 0.28999999999999998 +20 0.29999999999999999 +20 0.31 +20 0.32000000000000001 +20 0.33000000000000002 +20 0.34000000000000002 +20 0.34999999999999998 +20 0.35999999999999999 +20 0.37 +20 0.38 +20 0.39000000000000001 +20 0.40000000000000002 +20 0.40999999999999998 +20 0.41999999999999998 +20 0.42999999999999999 +20 0.44 +20 0.45000000000000001 +20 0.46000000000000002 +20 0.46999999999999997 +20 0.47999999999999998 +20 0.48999999999999999 +20 0.5 +20 0.51000000000000001 +20 0.52000000000000002 +20 0.53000000000000003 +20 0.54000000000000004 +20 0.55000000000000004 +20 0.56000000000000005 +20 0.56999999999999995 +20 0.57999999999999996 +20 0.58999999999999997 +20 0.59999999999999998 +20 0.60999999999999999 +20 0.62 +20 0.63 +20 0.64000000000000001 +20 0.65000000000000002 +20 0.66000000000000003 +20 0.67000000000000004 +20 0.68000000000000005 +20 0.68999999999999995 +20 0.69999999999999996 +20 0.70999999999999996 +20 0.71999999999999997 +20 0.72999999999999998 +20 0.73999999999999999 +20 0.75 +20 0.76000000000000001 +20 0.77000000000000002 +20 0.78000000000000003 +20 0.79000000000000004 +20 0.80000000000000004 +20 0.81000000000000005 +20 0.81999999999999995 +20 0.82999999999999996 +20 0.83999999999999997 +20 0.84999999999999998 +20 0.85999999999999999 +20 0.87 +20 0.88 +20 0.89000000000000001 +20 0.90000000000000002 +20 0.91000000000000003 +20 0.92000000000000004 +20 0.93000000000000005 +20 0.93999999999999995 +20 0.94999999999999996 +20 0.95999999999999996 +20 0.96999999999999997 +20 0.97999999999999998 +20 0.98999999999999999 +20 1 +20 1.01 +20 1.02 +20 1.03 +20 1.04 +20 1.05 +20 1.0600000000000001 +20 1.0700000000000001 +20 1.0800000000000001 +20 1.0900000000000001 +20 1.1000000000000001 +20 1.1100000000000001 +20 1.1200000000000001 +20 1.1299999999999999 +20 1.1399999999999999 +20 1.1499999999999999 +20 1.1599999999999999 +20 1.1699999999999999 +20 1.1799999999999999 +20 1.1899999999999999 +20 1.2 +20 1.21 +20 1.22 +20 1.23 +20 1.24 +20 1.25 +20 1.26 +20 1.27 +20 1.28 +20 1.29 +20 1.3 +20 1.3100000000000001 +20 1.3200000000000001 +20 1.3300000000000001 +20 1.3400000000000001 +20 1.3500000000000001 +20 1.3600000000000001 +20 1.3700000000000001 +20 1.3799999999999999 +20 1.3899999999999999 +20 1.3999999999999999 +20 1.4099999999999999 +20 1.4199999999999999 +20 1.4299999999999999 +20 1.4399999999999999 +20 1.45 +20 1.46 +20 1.47 +20 1.48 +20 1.49 +20 1.5 +20 1.51 +20 1.52 +20 1.53 +20 1.54 +20 1.55 +20 1.5600000000000001 +20 1.5700000000000001 +20 1.5800000000000001 +20 1.5900000000000001 +20 1.6000000000000001 +20 1.6100000000000001 +20 1.6200000000000001 +20 1.6299999999999999 +20 1.6399999999999999 +20 1.6499999999999999 +20 1.6599999999999999 +20 1.6699999999999999 +20 1.6799999999999999 +20 1.6899999999999999 +20 1.7 +20 1.71 +20 1.72 +20 1.73 +20 1.74 +20 1.75 +20 1.76 +20 1.77 +20 1.78 +20 1.79 +20 1.8 +20 1.8100000000000001 +20 1.8200000000000001 +20 1.8300000000000001 +20 1.8400000000000001 +20 1.8500000000000001 +20 1.8600000000000001 +20 1.8700000000000001 +20 1.8799999999999999 +20 1.8899999999999999 +20 1.8999999999999999 +20 1.9099999999999999 +20 1.9199999999999999 +20 1.9299999999999999 +20 1.9399999999999999 +20 1.95 +20 1.96 +20 1.97 +20 1.98 +20 1.99 +20 2 +20 2.0099999999999998 +20 2.02 +20 2.0299999999999998 +20 2.04 +20 2.0499999999999998 +20 2.0600000000000001 +20 2.0699999999999998 +20 2.0800000000000001 +20 2.0899999999999999 +20 2.1000000000000001 +20 2.1099999999999999 +20 2.1200000000000001 +20 2.1299999999999999 +20 2.1400000000000001 +20 2.1499999999999999 +20 2.1600000000000001 +20 2.1699999999999999 +20 2.1800000000000002 +20 2.1899999999999999 +20 2.2000000000000002 +20 2.21 +20 2.2200000000000002 +20 2.23 +20 2.2400000000000002 +20 2.25 +20 2.2599999999999998 +20 2.27 +20 2.2799999999999998 +20 2.29 +20 2.2999999999999998 +20 2.3100000000000001 +20 2.3199999999999998 +20 2.3300000000000001 +20 2.3399999999999999 +20 2.3500000000000001 +20 2.3599999999999999 +20 2.3700000000000001 +20 2.3799999999999999 +20 2.3900000000000001 +20 2.3999999999999999 +20 2.4100000000000001 +20 2.4199999999999999 +20 2.4300000000000002 +20 2.4399999999999999 +20 2.4500000000000002 +20 2.46 +20 2.4700000000000002 +20 2.48 +20 2.4900000000000002 +20 2.5 diff --git a/Triangulation_2/test/Triangulation_2/include/CGAL/_test_cls_delaunay_triangulation_2.h b/Triangulation_2/test/Triangulation_2/include/CGAL/_test_cls_delaunay_triangulation_2.h index 97419a8cc71..2204331cfe8 100644 --- a/Triangulation_2/test/Triangulation_2/include/CGAL/_test_cls_delaunay_triangulation_2.h +++ b/Triangulation_2/test/Triangulation_2/include/CGAL/_test_cls_delaunay_triangulation_2.h @@ -20,20 +20,21 @@ // coordinator : INRIA Sophia-Antipolis // ============================================================================ -#include -#include -//#include #include +#include +#include +#include +#include +#include #include -using std::rand; +using std::rand; template void _test_delaunay_duality( const Del &T ); - template void _test_cls_delaunay_triangulation_2( const Del & ) @@ -136,14 +137,58 @@ _test_cls_delaunay_triangulation_2( const Del & ) // test insertion through get_conflicts + star_hole conflicts.clear(); hole_bd.clear(); - T2.get_conflicts_and_boundary(Point(1,1,2), - std::back_inserter(conflicts), - std::back_inserter(hole_bd)); + Point query(1,1,2); + T2.get_conflicts_and_boundary(query, + std::back_inserter(conflicts), + std::back_inserter(hole_bd)); + + // check the sanity of the boundary (faces are not in conflict && edges are ccw ordered) + typename std::list::iterator curr = hole_bd.begin(), last = --(hole_bd.end()); + Vertex_handle prev_vh = last->first->vertex(T2.ccw(last->second)); + do + { + assert(curr->first->vertex(T2.cw(curr->second)) == prev_vh); + assert(!T2.test_conflict(query, curr->first)); + prev_vh = curr->first->vertex(T2.ccw(curr->second)); + ++curr; + } + while(curr != hole_bd.end()); + T2.star_hole (Point(1,1,2), hole_bd.begin(), hole_bd.end(), conflicts.begin(), conflicts.end() ); assert(T2.is_valid()); - + + // check get_conflict for a large enough point set (to use the non-recursive function) + double x, y; + std::vector layer_pts; + + std::ifstream in("data/layers.xy"); + assert(in); + while(in >> x >> y) + layer_pts.push_back(Point(x, y)); + + Del T2b(layer_pts.begin(), layer_pts.end()); + + conflicts.clear(); + hole_bd.clear(); + + query = Point(12.25, 0.031250); + T2b.get_conflicts_and_boundary(query, + std::back_inserter(conflicts), + std::back_inserter(hole_bd)); + + // check the sanity of the boundary (faces are not in conflict && edges are ccw ordered) + curr = hole_bd.begin(), last = --(hole_bd.end()); + prev_vh = last->first->vertex(T2b.ccw(last->second)); + do + { + assert(curr->first->vertex(T2b.cw(curr->second)) == prev_vh); + assert(!T2b.test_conflict(query, curr->first)); + prev_vh = curr->first->vertex(T2b.ccw(curr->second)); + ++curr; + } + while(curr != hole_bd.end()); /********************/ /***** Duality ******/ diff --git a/Visibility_2/package_info/Visibility_2/dependencies b/Visibility_2/package_info/Visibility_2/dependencies index c4a79a1d03c..df17db35a32 100644 --- a/Visibility_2/package_info/Visibility_2/dependencies +++ b/Visibility_2/package_info/Visibility_2/dependencies @@ -23,3 +23,4 @@ Surface_sweep_2 TDS_2 Triangulation_2 Visibility_2 +Distance_3