diff --git a/.github/workflows/list_workflow_last_run.css b/.github/workflows/list_workflow_last_run.css new file mode 100644 index 00000000000..a3955383311 --- /dev/null +++ b/.github/workflows/list_workflow_last_run.css @@ -0,0 +1,30 @@ +table { + margin-left: auto; + margin-right: auto; + margin-bottom: 24px; + border-spacing: 0; + border-bottom: 2px solid black; + border-top: 2px solid black; +} +table th { + padding: 3px 10px; + background-color: white; + border-top: none; + border-left: none; + border-right: none; + border-bottom: 1px solid black; +} +table td { + padding: 3px 10px; + border-top: none; + border-left: none; + border-bottom: none; + border-right: none; +} + +table tr.odd { + background-color: #f0f0f0; +} +table tr.even { + background-color: #e0e0e0; +} diff --git a/.github/workflows/list_workflow_last_run.yml b/.github/workflows/list_workflow_last_run.yml new file mode 100644 index 00000000000..79b1d2c0634 --- /dev/null +++ b/.github/workflows/list_workflow_last_run.yml @@ -0,0 +1,43 @@ + name: List workflow last run + on: + workflow_dispatch: + schedule: + - cron: "0 10 * * 1" + env: + GH_TOKEN: ${{ github.token }} + jobs: + list_workflow: + runs-on: ubuntu-latest + outputs: + messages: ${{ steps.cat_output.outputs.message }} + steps: + - name: checkout + uses: actions/checkout@v3 + - name: run script + run: | + chmod +x ./Scripts/developer_scripts/list_cgal_workflows_last_run.sh + ./Scripts/developer_scripts/list_cgal_workflows_last_run.sh > output.md + - name: convert markdown to html + run: | + sudo apt-get update && sudo apt-get install -y pandoc + pandoc -f markdown -t html --self-contained --css=.github/workflows/list_workflow_last_run.css -o output.html output.md + - name: set_output + id: cat_output + run: | + delimiter="$(openssl rand -hex 8)" + echo "message<<${delimiter}" >> "${GITHUB_OUTPUT}" + echo "Subject:List workflow run \nContent-Type: text/html; charset=\"UTF-8\"\n" >> "${GITHUB_OUTPUT}" + echo "" >> "${GITHUB_OUTPUT}" + cat output.html >> "${GITHUB_OUTPUT}" + echo "" >> "${GITHUB_OUTPUT}" + echo "${delimiter}" >> "${GITHUB_OUTPUT}" + call_send_email: + needs: list_workflow + uses: ./.github/workflows/send_email.yml + with: + message: ${{needs.list_workflow.outputs.messages}} + secrets: + email: ${{ secrets.CGAL_SEND_WORKFLOW_LIST_EMAIL_TO }} + private_key: ${{ secrets.CGAL_SEND_WORKFLOW_LIST_EMAIL_SSH_PRIVATE_KEY }} + user: ${{ secrets.CGAL_SEND_WORKFLOW_LIST_EMAIL_SSH_USER }} + host: ${{ secrets.CGAL_SEND_WORKFLOW_LIST_EMAIL_SSH_HOST }} diff --git a/.github/workflows/send_email.yml b/.github/workflows/send_email.yml index 11acfa9878a..cb990eca146 100644 --- a/.github/workflows/send_email.yml +++ b/.github/workflows/send_email.yml @@ -28,4 +28,4 @@ jobs: ssh-keyscan -H ${{ secrets.host }} > ~/.ssh/known_hosts - name: send email via ssh run: | - echo "${{ inputs.message }}" | ssh ${{ secrets.user }}@${{ secrets.host }} "/sbin/sendmail -t ${{ secrets.email }}" + echo -e '${{ inputs.message }}' | ssh ${{ secrets.user }}@${{ secrets.host }} "/sbin/sendmail -t ${{ secrets.email }}" diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_counting_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_counting_traits_2.h index 173e56ee601..4707748fff6 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_counting_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_counting_traits_2.h @@ -85,18 +85,17 @@ public: typedef Arr_counting_traits_2 Self; /*! Construct default */ - Arr_counting_traits_2() : Base() + template + Arr_counting_traits_2(Args ... args) : + Base(args...) { clear_counters(); increment(); } - /*! Construct copy */ - Arr_counting_traits_2(const Arr_counting_traits_2& other) : Base(other) - { - clear_counters(); - increment(); - } + /*! Disable copy constructor. + */ + Arr_counting_traits_2(const Arr_counting_traits_2&) = delete; /*! Obtain the counter of the given operation */ size_t count(Operation_id id) const diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_topology_traits/Arr_unb_planar_construction_helper.h b/Arrangement_on_surface_2/include/CGAL/Arr_topology_traits/Arr_unb_planar_construction_helper.h index 6f7aa9d607b..4c408625e0c 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_topology_traits/Arr_unb_planar_construction_helper.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_topology_traits/Arr_unb_planar_construction_helper.h @@ -272,6 +272,21 @@ before_handle_event(Event* event) if (m_prev_minus_inf_x_event != nullptr) m_prev_minus_inf_x_event->set_halfedge_handle(m_lh->next()); m_prev_minus_inf_x_event = event; + + // If the event lies also on the top boundary, associate all curve indices + // of subcurves that "see" m_th from below with the top fictitious halfedge + // (m_th->next()). + if (ps_y == ARR_TOP_BOUNDARY) { + if (m_he_ind_map_p != nullptr) { + Indices_list& list_ref = (*m_he_ind_map_p)[m_th]; + list_ref.clear(); + list_ref.splice(list_ref.end(), m_subcurves_at_ubf); + } + else { + m_subcurves_at_ubf.clear(); + } + CGAL_assertion(m_subcurves_at_ubf.empty()); + } return; case ARR_RIGHT_BOUNDARY: diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_tracing_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_tracing_traits_2.h index a9d3ba2c19d..f631bef376a 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_tracing_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_tracing_traits_2.h @@ -162,13 +162,18 @@ private: { return m_flags & (0x1 << COMPARE_X_NEAR_BOUNDARY_OP); } public: - /*! Default constructor */ - Arr_tracing_traits_2() : - Base() + /*! Construct default */ + template + Arr_tracing_traits_2(Args ... args) : + Base(args...) { enable_all_traces(); } + /*! Disable copy constructor. + */ + Arr_tracing_traits_2(const Arr_tracing_traits_2&) = delete; + /*! Enable the trace of a traits operation * \param id the operation identifier */ @@ -650,13 +655,13 @@ public: /*! A functor that tests whether two x-monotone curves can be merged. */ class Are_mergeable_2 { private: - typename Base::Are_mergeable_2 m_object; + const Base& m_base_traits; bool m_enabled; public: /*! Construct */ - Are_mergeable_2(const Base* base, bool enabled = true) : - m_object(base->are_mergeable_2_object()), m_enabled(enabled) {} + Are_mergeable_2(const Base& base, bool enabled = true) : + m_base_traits(base), m_enabled(enabled) {} /*! Operate * \param xcv1 the first curve @@ -667,14 +672,32 @@ public: */ bool operator()(const X_monotone_curve_2& xcv1, const X_monotone_curve_2& xcv2) const - { - if (!m_enabled) return m_object(xcv1, xcv2); + { return are_mergable_2_impl(xcv1, xcv2, 0); } + + private: + /*! The base does not have Are_mergable_2 + */ + template + bool are_mergable_2_impl(const X_monotone_curve_2& /* xcv1 */, + const X_monotone_curve_2& /* xcv2 */, long) const { + CGAL_error(); + return false; + } + + /*! The base does have Are_mergable_2 + */ + template + auto are_mergable_2_impl(const X_monotone_curve_2& xcv1, + const X_monotone_curve_2& xcv2, int) const -> + decltype(m_base_traits.are_mergeable_2_object().operator()(xcv1, xcv2)) { + auto are_mergeable = m_base_traits.are_mergeable_2_object(); + if (! m_enabled) return are_mergeable(xcv1, xcv2); std::cout << "are_mergeable" << std::endl << " xcv1: " << xcv1 << std::endl << " xcv2: " << xcv2 << std::endl; - bool are_mergeable = m_object(xcv1, xcv2); - std::cout << " result: " << are_mergeable << std::endl; - return are_mergeable; + bool mergeable = are_mergeable(xcv1, xcv2); + std::cout << " result: " << mergeable << std::endl; + return mergeable; } }; diff --git a/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arr_traits_adaptor_2.h b/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arr_traits_adaptor_2.h index 54c2d0aad44..d98f1c1307c 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arr_traits_adaptor_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arr_traits_adaptor_2.h @@ -3387,7 +3387,7 @@ public: */ Comparison_result operator()(const Point_2& p1, const Point_2& p2) const { - Base base(m_self); + const Base& base = m_self; return base.compare_xy_2_object()(p1, p2); } diff --git a/Arrangement_on_surface_2/include/CGAL/IO/Arr_text_formatter.h b/Arrangement_on_surface_2/include/CGAL/IO/Arr_text_formatter.h index d9d4e4b84b2..34cb310fd07 100644 --- a/Arrangement_on_surface_2/include/CGAL/IO/Arr_text_formatter.h +++ b/Arrangement_on_surface_2/include/CGAL/IO/Arr_text_formatter.h @@ -549,56 +549,56 @@ public: typedef typename Base::Face_const_handle Face_const_handle; /*! Default constructor.*/ - Arr_extended_dcel_text_formatter() : - Base() - {} + Arr_extended_dcel_text_formatter() : Base() {} /*! Construct an output formatter. */ - Arr_extended_dcel_text_formatter(std::ostream& os) : - Base(os) - {} + Arr_extended_dcel_text_formatter(std::ostream& os) : Base(os) {} /*! Construct an input formatter. */ - Arr_extended_dcel_text_formatter(std::istream& is) : - Base(is) - {} + Arr_extended_dcel_text_formatter(std::istream& is) : Base(is) {} /*! Write the auxiliary data associated with the given vertex. */ virtual void write_vertex_data(Vertex_const_handle v) - { - this->out() << '\n' << v->data(); - } + { this->out() << '\n' << v->data(); } /*! Read a vertex-data object and attach it to the given vertex. */ - virtual void read_vertex_data(Vertex_handle v) - { - this->in() >> v->data(); + virtual void read_vertex_data(Vertex_handle v) { + using Vertex = typename Arrangement_2::Vertex; + using Type = decltype(std::declval().data()); + using Data_type = typename std::remove_reference::type; + Data_type data; + this->in() >> data; + v->set_data(data); this->_skip_until_EOL(); } /*! Write the auxiliary data associated with the given halfedge. */ virtual void write_halfedge_data(Halfedge_const_handle he) - { - this->out() << '\n' << he->data(); - } + { this->out() << '\n' << he->data(); } /*! Read a halfedge-data object and attach it to the given halfedge. */ - virtual void read_halfedge_data(Halfedge_handle he) - { - this->in() >> he->data(); + virtual void read_halfedge_data(Halfedge_handle he) { + using Halfedge = typename Arrangement_2::Halfedge; + using Type = decltype(std::declval().data()); + using Data_type = typename std::remove_reference::type; + Data_type data; + this->in() >> data; + he->set_data(data); this->_skip_until_EOL(); } /*! Write the auxiliary data associated with the given face. */ virtual void write_face_data(Face_const_handle f) - { - this->out() << f->data() << '\n'; - } + { this->out() << f->data() << '\n'; } /*! Read a face-data object and attach it to the given face. */ - virtual void read_face_data(Face_handle f) - { - this->in() >> f->data(); + virtual void read_face_data(Face_handle f) { + using Face = typename Arrangement_2::Face; + using Type = decltype(std::declval().data()); + using Data_type = typename std::remove_reference::type; + Data_type data; + this->in() >> data; + f->set_data(data); this->_skip_until_EOL(); } }; diff --git a/BGL/doc/BGL/PackageDescription.txt b/BGL/doc/BGL/PackageDescription.txt index bab95d719ab..6032e29a6c9 100644 --- a/BGL/doc/BGL/PackageDescription.txt +++ b/BGL/doc/BGL/PackageDescription.txt @@ -706,6 +706,7 @@ user might encounter. - `CGAL::Halfedge_around_target_circulator` - `CGAL::Halfedge_around_face_circulator` - `CGAL::Vertex_around_target_circulator` +- `CGAL::Vertex_around_face_circulator` - `CGAL::Face_around_target_circulator` - `CGAL::Face_around_face_circulator` diff --git a/BGL/include/CGAL/boost/graph/IO/polygon_mesh_io.h b/BGL/include/CGAL/boost/graph/IO/polygon_mesh_io.h index 6c156266172..d60af3c9949 100644 --- a/BGL/include/CGAL/boost/graph/IO/polygon_mesh_io.h +++ b/BGL/include/CGAL/boost/graph/IO/polygon_mesh_io.h @@ -201,6 +201,13 @@ bool read_polygon_mesh(const std::string& fname, * \cgalParamExtra{This parameter is only meaningful while using \ascii encoding.} * \cgalParamNEnd * + * \cgalParamNBegin{use_binary_mode} + * \cgalParamDescription{indicates whether data should be written in binary (`true`) or in \ascii (`false`)} + * \cgalParamType{Boolean} + * \cgalParamDefault{`true`} + * \cgalParamExtra{This parameter is only meaningful for formats that support binary encoding.} + * \cgalParamNEnd + * * \cgalParamNBegin{verbose} * \cgalParamDescription{whether extra information is printed when an incident occurs during reading} * \cgalParamType{Boolean} diff --git a/BGL/include/CGAL/boost/graph/iterator.h b/BGL/include/CGAL/boost/graph/iterator.h index 1fed18a2278..59473fce693 100644 --- a/BGL/include/CGAL/boost/graph/iterator.h +++ b/BGL/include/CGAL/boost/graph/iterator.h @@ -980,6 +980,12 @@ faces_around_face(typename boost::graph_traits::halfedge_descriptor h, co return make_range(I(h,g), I(h,g,1)); } +/** + * \ingroup PkgBGLIterators + * A bidirectional circulator with value type `boost::graph_traits::%vertex_descriptor` over all vertices incident to the same face or border. + * \tparam Graph must be a model of the concept `HalfedgeGraph` + * \cgalModels `BidirectionalIterator` + */ template class Vertex_around_face_circulator #ifndef DOXYGEN_RUNNING diff --git a/Bounding_volumes/package_info/Bounding_volumes/copyright b/Bounding_volumes/package_info/Bounding_volumes/copyright index 32607a12d14..b37116dc505 100644 --- a/Bounding_volumes/package_info/Bounding_volumes/copyright +++ b/Bounding_volumes/package_info/Bounding_volumes/copyright @@ -1,17 +1 @@ - ETH Zurich (Switzerland). -Min_quadrilateral_2 -Min_sphere_of_spheres_d -Matrix_search -Approximate_min_ellipsoid_d -Min_ellipse_2 -Min_circle_2 -Min_sphere_d -Min_annulus_d -Min_quadrilateral_2 -Min_sphere_of_spheres_d -Matrix_search -Approximate_min_ellipsoid_d -Min_ellipse_2 -Min_circle_2 -Min_sphere_d -Min_annulus_d +ETH Zurich (Switzerland). diff --git a/CGAL_ImageIO/include/CGAL/ImageIO.h b/CGAL_ImageIO/include/CGAL/ImageIO.h index 45e82f5b38e..9e86bcea315 100644 --- a/CGAL_ImageIO/include/CGAL/ImageIO.h +++ b/CGAL_ImageIO/include/CGAL/ImageIO.h @@ -20,7 +20,7 @@ #include #include -#include // for uint32_t, etc. +#include // for uint32_t, etc. #ifdef CGAL_USE_ZLIB #include @@ -562,38 +562,50 @@ struct Word_type_generator template <> struct Word_type_generator { -// typedef boost::int8_t type; +// typedef std::int8_t type; typedef char type; }; template <> struct Word_type_generator { - typedef boost::uint8_t type; + typedef std::uint8_t type; }; template <> struct Word_type_generator { - typedef boost::int16_t type; + typedef std::int16_t type; }; template <> struct Word_type_generator { - typedef boost::uint16_t type; + typedef std::uint16_t type; }; template <> struct Word_type_generator { - typedef boost::int32_t type; + typedef std::int32_t type; }; template <> struct Word_type_generator { - typedef boost::uint32_t type; + typedef std::uint32_t type; +}; + +template <> +struct Word_type_generator +{ + typedef std::int64_t type; +}; + +template <> +struct Word_type_generator +{ + typedef std::uint64_t type; }; template diff --git a/Classification/package_info/Classification/copyright b/Classification/package_info/Classification/copyright index e69de29bb2d..b9a65603a2e 100644 --- a/Classification/package_info/Classification/copyright +++ b/Classification/package_info/Classification/copyright @@ -0,0 +1 @@ +GeometryFactory (France) diff --git a/Combinatorial_map/include/CGAL/Combinatorial_map/internal/Combinatorial_map_group_functors.h b/Combinatorial_map/include/CGAL/Combinatorial_map/internal/Combinatorial_map_group_functors.h index 1db4ec2cbda..06f3c4f4dc3 100644 --- a/Combinatorial_map/include/CGAL/Combinatorial_map/internal/Combinatorial_map_group_functors.h +++ b/Combinatorial_map/include/CGAL/Combinatorial_map/internal/Combinatorial_map_group_functors.h @@ -566,6 +566,15 @@ void test_split_attribute_functor_one_dart Attribute_descriptor_i a1 = amap.template attribute(adart); if ( found_attributes.is_defined(a1) ) { // Here the attribute was already present in the hash_map + + // We need to call reserve for the cc with index case. Indeed, if the vector + // is reallocated, the reference returned by get_attribute(a1) will be + // invalidated, and the copy will be wrong. Note that there is no overhead + // since the creation of the attribute need one allocation. + amap.template attributes().reserve(amap.template attributes().size()+1); + + // Now we are sure that the creation of a new attribute will not imply + // a realloc. Attribute_descriptor_i a2 = amap.template create_attribute(amap.template get_attribute(a1)); diff --git a/Combinatorial_map/include/CGAL/Combinatorial_map_storages_with_index.h b/Combinatorial_map/include/CGAL/Combinatorial_map_storages_with_index.h index aad7d643787..584442412c5 100644 --- a/Combinatorial_map/include/CGAL/Combinatorial_map_storages_with_index.h +++ b/Combinatorial_map/include/CGAL/Combinatorial_map_storages_with_index.h @@ -146,6 +146,8 @@ namespace CGAL { { return cit; } bool is_used(size_type i) const { return mmap.mdarts.is_used(i); } + bool owns(size_type i) const + { return mmap.mdarts.owns(i); } private: Self & mmap; }; @@ -286,6 +288,13 @@ namespace CGAL { { CGAL_static_assertion_msg(Helper::template Dimension_index::value>=0, "copy_attribute called but i-attributes are disabled."); + // We need to do a reserve before the emplace in order to avoid a bug of + // invalid reference when the container is reallocated. + std::get::value> + (mattribute_containers).reserve + (std::get::value> + (mattribute_containers).size()+1); + typename Attribute_descriptor::type res= std::get::value> (mattribute_containers).emplace(get_attribute(ah)); diff --git a/Combinatorial_map/include/CGAL/Compact_container_with_index.h b/Combinatorial_map/include/CGAL/Compact_container_with_index.h index a87122500fc..044db27dc87 100644 --- a/Combinatorial_map/include/CGAL/Compact_container_with_index.h +++ b/Combinatorial_map/include/CGAL/Compact_container_with_index.h @@ -752,6 +752,9 @@ public: return false; } + bool owns(size_type i) const + { return i=n) return; - capacity_=n; increase_size(); } diff --git a/Combinatorial_map/package_info/Combinatorial_map/copyright b/Combinatorial_map/package_info/Combinatorial_map/copyright new file mode 100644 index 00000000000..3c616b4b377 --- /dev/null +++ b/Combinatorial_map/package_info/Combinatorial_map/copyright @@ -0,0 +1 @@ +CNRS and LIRIS' Establishments (France) diff --git a/Combinatorial_map/test/Combinatorial_map/CMakeLists.txt b/Combinatorial_map/test/Combinatorial_map/CMakeLists.txt index f38888d60e5..6357af2198d 100644 --- a/Combinatorial_map/test/Combinatorial_map/CMakeLists.txt +++ b/Combinatorial_map/test/Combinatorial_map/CMakeLists.txt @@ -24,6 +24,8 @@ target_compile_definitions(Combinatorial_map_copy_test_index PUBLIC USE_COMPACT_ target_link_libraries(Combinatorial_map_copy_test_index PUBLIC CGAL CGAL::Data) cgal_add_compilation_test(Combinatorial_map_copy_test_index) +create_single_source_cgal_program(cmap_test_split_attribute.cpp) + # Link with OpenMesh if possible find_package(OpenMesh QUIET) if(TARGET OpenMesh::OpenMesh) diff --git a/Combinatorial_map/test/Combinatorial_map/cmap_test_split_attribute.cpp b/Combinatorial_map/test/Combinatorial_map/cmap_test_split_attribute.cpp new file mode 100644 index 00000000000..49e8795eef7 --- /dev/null +++ b/Combinatorial_map/test/Combinatorial_map/cmap_test_split_attribute.cpp @@ -0,0 +1,92 @@ +#include +#include +#include +#include +#include +#include + +struct MyInfo +{ + MyInfo() :data(1) + {} + + MyInfo(int i) :data(i) + {} + + int data; +}; + +struct Myitem1 +{ + using Use_index=CGAL::Tag_true; // use indices + using Index_type=std::uint16_t; // 16 bits + template + struct Dart_wrapper + { + typedef CGAL::Cell_attribute attrib; + typedef std::tuple Attributes; + }; +}; + +struct Myitem2 +{ + template + struct Dart_wrapper + { + typedef CGAL::Cell_attribute attrib; + typedef std::tuple Attributes; + }; +}; + +using CMap1=CGAL::Combinatorial_map<3,Myitem1>; +using CMap2=CGAL::Combinatorial_map<3,Myitem2>; + +#define NB 1000 +template +bool test(const std::string& s) +{ + bool res=true; + CMap m; + // 1) create a face and one attribute. + typename CMap::Dart_descriptor dd=m.make_combinatorial_polygon(4); + m.template set_attribute<2>(dd, m.template create_attribute<2>(2)); + // 2) Split this face NB times => will create new 2-attributes for new faces + for(std::size_t i=0; i(newd)==CMap::null_descriptor) + { + std::cout<<"ERROR1: "<(newd)==CMap::null_descriptor"<(newd).data!=2) + { + std::cout<<"ERROR2: "<(newd).data<(newd); + if(m.template attribute<2>(newd)==CMap::null_descriptor) + { + std::cout<<"ERROR3: "<(newd)==CMap::null_descriptor"<(newd).data!=2) + { + std::cout<<"ERROR4: "<(newd).data<("CMap1") || !test("CMap2")) + { return EXIT_FAILURE; } + + return EXIT_SUCCESS; +} diff --git a/Documentation/doc/biblio/cgal_manual.bib b/Documentation/doc/biblio/cgal_manual.bib index c16f83d01f6..89d062ddddf 100644 --- a/Documentation/doc/biblio/cgal_manual.bib +++ b/Documentation/doc/biblio/cgal_manual.bib @@ -3270,6 +3270,14 @@ pages = "207--221" year={1998} } + +@techreport{cgal:hssz-gmcabonbc-97, + title={A generalized marching cubes algorithm based on non-binary classifications}, + author={H-C. Hege and M. Seebass and D. Stalling and M. Zöckler}, + number={SC 97-05}, + year={1997} +} + % ---------------------------------------------------------------------------- % END OF BIBFILE % ---------------------------------------------------------------------------- diff --git a/Generalized_map/include/CGAL/Generalized_map/internal/Generalized_map_group_functors.h b/Generalized_map/include/CGAL/Generalized_map/internal/Generalized_map_group_functors.h index cbde9898096..4a15c8ea733 100644 --- a/Generalized_map/include/CGAL/Generalized_map/internal/Generalized_map_group_functors.h +++ b/Generalized_map/include/CGAL/Generalized_map/internal/Generalized_map_group_functors.h @@ -293,6 +293,13 @@ void GMap_test_split_attribute_functor_one_dart Attribute_descriptor_i a1 = amap.template attribute(adart); if ( found_attributes.is_defined(a1) ) { // Here the attribute was already present in the hash_map + + // We need to call reserve for the cc with index case. Indeed, if the vector + // is reallocated, the reference returned by get_attribute(a1) will be + // invalidated, and the copy will be wrong. Note that there is no overhead + // since the creation of the attribute need one allocation. + amap.template attributes().reserve(amap.template attributes().size()+1); + Attribute_descriptor_i a2 = amap.template create_attribute(amap.template get_attribute(a1)); diff --git a/Generalized_map/include/CGAL/Generalized_map_storages_with_index.h b/Generalized_map/include/CGAL/Generalized_map_storages_with_index.h index 80044bdc7d3..828004b8416 100644 --- a/Generalized_map/include/CGAL/Generalized_map_storages_with_index.h +++ b/Generalized_map/include/CGAL/Generalized_map_storages_with_index.h @@ -242,6 +242,13 @@ namespace CGAL { { CGAL_static_assertion_msg(Helper::template Dimension_index::value>=0, "copy_attribute called but i-attributes are disabled."); + // We need to do a reserve before the emplace in order to avoid a bug of + // invalid reference when the container is reallocated. + std::get::value> + (mattribute_containers).reserve + (std::get::value> + (mattribute_containers).size()+1); + typename Attribute_descriptor::type res= std::get::value> (mattribute_containers).emplace(get_attribute(ah)); diff --git a/Generalized_map/package_info/Generalized_map/copyright b/Generalized_map/package_info/Generalized_map/copyright new file mode 100644 index 00000000000..3c616b4b377 --- /dev/null +++ b/Generalized_map/package_info/Generalized_map/copyright @@ -0,0 +1 @@ +CNRS and LIRIS' Establishments (France) diff --git a/Generalized_map/test/Generalized_map/CMakeLists.txt b/Generalized_map/test/Generalized_map/CMakeLists.txt index 642815d6c08..e773e5c3218 100644 --- a/Generalized_map/test/Generalized_map/CMakeLists.txt +++ b/Generalized_map/test/Generalized_map/CMakeLists.txt @@ -18,3 +18,5 @@ add_executable(Generalized_map_test_index Generalized_map_test.cpp ${hfiles}) target_compile_definitions(Generalized_map_test_index PUBLIC USE_COMPACT_CONTAINER_WITH_INDEX) target_link_libraries(Generalized_map_test_index PUBLIC CGAL CGAL::Data) cgal_add_compilation_test(Generalized_map_test_index) + +create_single_source_cgal_program("gmap_test_split_attribute.cpp") diff --git a/Generalized_map/test/Generalized_map/gmap_test_split_attribute.cpp b/Generalized_map/test/Generalized_map/gmap_test_split_attribute.cpp new file mode 100644 index 00000000000..51e5618ce9c --- /dev/null +++ b/Generalized_map/test/Generalized_map/gmap_test_split_attribute.cpp @@ -0,0 +1,92 @@ +#include +#include +#include +#include +#include +#include + +struct MyInfo +{ + MyInfo() :data(1) + {} + + MyInfo(int i) :data(i) + {} + + int data; +}; + +struct Myitem1 +{ + using Use_index=CGAL::Tag_true; // use indices + using Index_type=std::uint16_t; // 16 bits + template + struct Dart_wrapper + { + typedef CGAL::Cell_attribute attrib; + typedef std::tuple Attributes; + }; +}; + +struct Myitem2 +{ + template + struct Dart_wrapper + { + typedef CGAL::Cell_attribute attrib; + typedef std::tuple Attributes; + }; +}; + +using GMap1=CGAL::Generalized_map<3,Myitem1>; +using GMap2=CGAL::Generalized_map<3,Myitem2>; + +#define NB 1000 +template +bool test(const std::string& s) +{ + bool res=true; + GMap m; + // 1) create a face and one attribute. + typename GMap::Dart_descriptor dd=m.make_combinatorial_polygon(4); + m.template set_attribute<2>(dd, m.template create_attribute<2>(2)); + // 2) Split this face NB times => will create new 2-attributes for new faces + for(std::size_t i=0; i(dd)); + if(m.template attribute<2>(newd)==GMap::null_descriptor) + { + std::cout<<"ERROR1: "<(newd)==GMap::null_descriptor"<(newd).data!=2) + { + std::cout<<"ERROR2: "<(newd).data<(newd); + if(m.template attribute<2>(newd)==GMap::null_descriptor) + { + std::cout<<"ERROR3: "<(newd)==GMap::null_descriptor"<(newd).data!=2) + { + std::cout<<"ERROR4: "<(newd).data<("GMap1") || !test("GMap2")) + { return EXIT_FAILURE; } + + return EXIT_SUCCESS; +} diff --git a/Generator/test/Generator/test_generators.cpp b/Generator/test/Generator/test_generators.cpp index 4019b0de9f8..f4324f4be5a 100644 --- a/Generator/test/Generator/test_generators.cpp +++ b/Generator/test/Generator/test_generators.cpp @@ -189,8 +189,12 @@ void test_point_generators_d() if (points[i][0] >0) g = g + (points[i] - o3); } - assert( std::fabs( g[0]/nb_g - 3.0/16.0) < 0.01 ); - std::cout<<" center of mass 3/16~="<::value>=0, "copy_attribute called but i-attributes are disabled."); + // We need to do a reserve before the emplace in order to avoid a bug of + // invalid reference when the container is reallocated. + std::get::value> + (mattribute_containers).reserve + (std::get::value> + (mattribute_containers).size()+1); + typename Attribute_descriptor::type res= std::get::value> (mattribute_containers).emplace(get_attribute(ah)); diff --git a/Linear_cell_complex/include/CGAL/GMap_linear_cell_complex_storages_with_index.h b/Linear_cell_complex/include/CGAL/GMap_linear_cell_complex_storages_with_index.h index a2a58088828..27d58a7651a 100644 --- a/Linear_cell_complex/include/CGAL/GMap_linear_cell_complex_storages_with_index.h +++ b/Linear_cell_complex/include/CGAL/GMap_linear_cell_complex_storages_with_index.h @@ -261,6 +261,13 @@ namespace CGAL { { CGAL_static_assertion_msg(Helper::template Dimension_index::value>=0, "copy_attribute called but i-attributes are disabled."); + // We need to do a reserve before the emplace in order to avoid a bug of + // invalid reference when the container is reallocated. + std::get::value> + (mattribute_containers).reserve + (std::get::value> + (mattribute_containers).size()+1); + typename Attribute_descriptor::type res= std::get::value> (mattribute_containers).emplace(get_attribute(ah)); diff --git a/Linear_cell_complex/package_info/Linear_cell_complex/copyright b/Linear_cell_complex/package_info/Linear_cell_complex/copyright new file mode 100644 index 00000000000..3c616b4b377 --- /dev/null +++ b/Linear_cell_complex/package_info/Linear_cell_complex/copyright @@ -0,0 +1 @@ +CNRS and LIRIS' Establishments (France) diff --git a/Maintenance/test_handling/testresult.css b/Maintenance/test_handling/testresult.css index a39871c9528..c44cba095ce 100644 --- a/Maintenance/test_handling/testresult.css +++ b/Maintenance/test_handling/testresult.css @@ -32,7 +32,7 @@ TD.error {background-color: rgb(100%,50%,50%)} TD.na {background-color: white;} TD.requirements { background-color: rgb(65%,65%,100%) } -TD.ok {background-color: rgb(44%,88%,44%)} +TH.ok {background-color: rgb(44%,88%,44%)} TH.warning {background-color: rgb(100%,100%,50%)} TH.third_party_warning {background-color: rgb(75%,100%,50%)} TH.error {background-color: rgb(100%,50%,50%)} diff --git a/Mesh_3/doc/Mesh_3/Doxyfile.in b/Mesh_3/doc/Mesh_3/Doxyfile.in index 13f34ec4653..d3608c7b5a0 100644 --- a/Mesh_3/doc/Mesh_3/Doxyfile.in +++ b/Mesh_3/doc/Mesh_3/Doxyfile.in @@ -18,7 +18,9 @@ INPUT += \ ${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/Mesh_facet_topology.h \ ${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/Mesh_vertex_base_3.h \ ${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/Mesh_cell_base_3.h \ - ${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/Compact_mesh_cell_base_3.h + ${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/Compact_mesh_cell_base_3.h \ + ${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/Mesh_3/Detect_features_in_image.h \ + ${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/Mesh_3/Detect_features_on_image_bbox.h PROJECT_NAME = "CGAL ${CGAL_DOC_VERSION} - 3D Mesh Generation" HTML_EXTRA_FILES = ${CGAL_PACKAGE_DOC_DIR}/fig/implicit_domain_3.jpg \ diff --git a/Mesh_3/doc/Mesh_3/Mesh_3.txt b/Mesh_3/doc/Mesh_3/Mesh_3.txt index 29ba32bd500..bdcfd189db7 100644 --- a/Mesh_3/doc/Mesh_3/Mesh_3.txt +++ b/Mesh_3/doc/Mesh_3/Mesh_3.txt @@ -735,7 +735,6 @@ Surface of the output mesh generated with a very small `facet_distance` without the weights (left, 25563 vertices) and with the weights (right, 19936 vertices). \cgalFigureEnd - \subsubsection Mesh_3DomainsFrom3DImagesWithCustomInitialization Domains From 3D Images, with a Custom Initialization The example \ref Mesh_3/mesh_3D_image_with_custom_initialization.cpp is a modification @@ -926,23 +925,27 @@ The first modification is the type of the mesh domain. Instead of being \snippet Mesh_3/mesh_3D_image_with_features.cpp Domain definition -Then, in the function `%main()`, after the `%domain` object has been created, -a dedicated function computes the 1D-features, and adds them to the domain. +In the %main() function, the domain is created with an additional argument - a +dedicated functor that computes the one-dimensional features, which are then +added to the domain. -\snippet Mesh_3/mesh_3D_image_with_features.cpp Call add_1D_features +\snippet Mesh_3/mesh_3D_image_with_detection_of_features.cpp Domain creation -The function template `%add_1D_features()` is defined in the example -file. It uses non-documented code from \cgal, that should be copy-pasted in -any user-code willing to use similar code. It uses the undocumented -function template `%CGAL::polylines_to_protect` that computes the -1D-features that correspond to the intersection of the bounding box of the -image with the surfaces defined by the image. At the same time, a few other -polylines are added as 1D-features, to protect 1D curves in the interior of -the image. Then, the method -`CGAL::Mesh_domain_with_polyline_features_3::add_features` is called twice -to add the computed 1D-features to the mesh domain. +The `CGAL::Mesh_3::Detect_features_in_image` functor is defined in its own +header file. It computes the one-dimensional features that correspond to the +intersections of the bounding box of the image with the surfaces defined by the +image, as well as polylines that lie at the intersection of three or more +subdomains (including the outside). It then constructs a graph of these polyline +features. The named constructor adds this feature graph to the domain for later +feature protection. The original feature detection algorithm was described in +\cgalCite{cgal:hssz-gmcabonbc-97}, which provides a list of possible voxel +configurations. The feature detection implemented in \cgal generalizes this +description. -\snippet Mesh_3/mesh_3D_image_with_features.cpp Add 1D features +The example \ref Mesh_3/mesh_3D_image_with_features.cpp shows how +user-specified input polylines can further be added as 1D features to the mesh domain. + +\snippet Mesh_3/mesh_3D_image_with_features.cpp Domain creation In the meshing criteria, if 1D features are added to the domain, the user can define the parameter `edge_size` of the criteria class @@ -970,7 +973,7 @@ protection of the 1D-features. Left: the mesh without any call to `%add_features()`. Middle: the mesh with only the 1D-features computed by -`%CGAL::polylines_to_protect()`. +`CGAL::Mesh_3::Detect_features_on_image_bbox()`. Right: the mesh with added 1D-features in the interior of the bounding box of the image. diff --git a/Mesh_3/doc/Mesh_3/PackageDescription.txt b/Mesh_3/doc/Mesh_3/PackageDescription.txt index 8cf21dda78d..df967f98afd 100644 --- a/Mesh_3/doc/Mesh_3/PackageDescription.txt +++ b/Mesh_3/doc/Mesh_3/PackageDescription.txt @@ -16,6 +16,10 @@ /// \ingroup PkgMesh3Ref /// The classes in this group are models of domain concepts and their associated classes. +/// \defgroup PkgMesh3FeatureDetection Feature Detection +/// \ingroup PkgMesh3Ref +/// The functors in this group perform polyline features detection in input domains. + /// \defgroup PkgMesh3Functions Mesh Generation Functions /// \ingroup PkgMesh3Ref /// The two main functions to generate a mesh are `make_mesh_3()` and `refine_mesh_3()`. @@ -103,6 +107,11 @@ and their associated classes: - `CGAL::Labeled_image_mesh_domain_3` (deprecated) - `CGAL::Gray_image_mesh_domain_3` (deprecated) +The following functors are available for feature detection: + +- `CGAL::Mesh_3::Detect_features_in_image` +- `CGAL::Mesh_3::Detect_features_on_image_bbox` + \cgalCRPSection{Function Templates} - `CGAL::make_mesh_3()` diff --git a/Mesh_3/doc/Mesh_3/examples.txt b/Mesh_3/doc/Mesh_3/examples.txt index aa44908504c..748bc156d00 100644 --- a/Mesh_3/doc/Mesh_3/examples.txt +++ b/Mesh_3/doc/Mesh_3/examples.txt @@ -4,6 +4,8 @@ \example Mesh_3/mesh_3D_gray_image_with_custom_initialization.cpp \example Mesh_3/mesh_3D_image_with_features.cpp \example Mesh_3/mesh_3D_image_with_custom_initialization.cpp +\example Mesh_3/mesh_3D_image_with_detection_of_features.cpp +\example Mesh_3/mesh_3D_image_with_input_features.cpp \example Mesh_3/mesh_3D_weighted_image.cpp \example Mesh_3/random_labeled_image.h \example CGAL/Mesh_3/initialize_triangulation_from_gray_image.h diff --git a/Mesh_3/examples/Mesh_3/CMakeLists.txt b/Mesh_3/examples/Mesh_3/CMakeLists.txt index 335e98aa0de..3e00317b782 100644 --- a/Mesh_3/examples/Mesh_3/CMakeLists.txt +++ b/Mesh_3/examples/Mesh_3/CMakeLists.txt @@ -133,6 +133,12 @@ if(TARGET CGAL::CGAL_ImageIO) create_single_source_cgal_program("mesh_3D_image_with_features.cpp") target_link_libraries(mesh_3D_image_with_features PUBLIC CGAL::Eigen3_support) + create_single_source_cgal_program("mesh_3D_image_with_input_features.cpp") + target_link_libraries(mesh_3D_image_with_input_features PUBLIC CGAL::Eigen3_support) + + create_single_source_cgal_program("mesh_3D_image_with_detection_of_features.cpp") + target_link_libraries(mesh_3D_image_with_detection_of_features PUBLIC CGAL::Eigen3_support) + if(CGAL_ImageIO_USE_ZLIB) create_single_source_cgal_program("mesh_optimization_example.cpp") target_link_libraries(mesh_optimization_example PUBLIC CGAL::Eigen3_support) @@ -185,6 +191,8 @@ if(CGAL_ACTIVATE_CONCURRENT_MESH_3 AND TARGET CGAL::TBB_support) mesh_3D_image_with_custom_initialization mesh_3D_gray_image_with_custom_initialization mesh_3D_image_with_features + mesh_3D_image_with_detection_of_features + mesh_3D_image_with_input_features mesh_implicit_domains mesh_implicit_sphere mesh_implicit_sphere_variable_size diff --git a/Mesh_3/examples/Mesh_3/mesh_3D_image_variable_size.cpp b/Mesh_3/examples/Mesh_3/mesh_3D_image_variable_size.cpp index 2f07fbf3abf..c4d07143c0a 100644 --- a/Mesh_3/examples/Mesh_3/mesh_3D_image_variable_size.cpp +++ b/Mesh_3/examples/Mesh_3/mesh_3D_image_variable_size.cpp @@ -1,5 +1,3 @@ -#define CGAL_MESH_3_VERBOSE - #include #include diff --git a/Mesh_3/examples/Mesh_3/mesh_3D_image_with_detection_of_features.cpp b/Mesh_3/examples/Mesh_3/mesh_3D_image_with_detection_of_features.cpp new file mode 100644 index 00000000000..0ab73c9748e --- /dev/null +++ b/Mesh_3/examples/Mesh_3/mesh_3D_image_with_detection_of_features.cpp @@ -0,0 +1,86 @@ +#include +#include + +#include +#include +#include + +#include +#include + +/// [Domain definition] +#include +#include +#include + +typedef CGAL::Exact_predicates_inexact_constructions_kernel K; +typedef CGAL::Labeled_mesh_domain_3 Image_domain; +typedef CGAL::Mesh_domain_with_polyline_features_3 Mesh_domain; +/// [Domain definition] + +#include + +#ifdef CGAL_CONCURRENT_MESH_3 +typedef CGAL::Parallel_tag Concurrency_tag; +#else +typedef CGAL::Sequential_tag Concurrency_tag; +#endif + +// Triangulation +typedef CGAL::Mesh_triangulation_3::type Tr; + +typedef CGAL::Mesh_complex_3_in_triangulation_3 C3t3; + +// Criteria +typedef CGAL::Mesh_criteria_3 Mesh_criteria; + +// To avoid verbose function and named parameters call +namespace params = CGAL::parameters; + +int main(int argc, char* argv[]) +{ + const std::string fname = (argc>1)?argv[1]:CGAL::data_file_path("images/420.inr"); + + /// [Loads image] + CGAL::Image_3 image; + if(!image.read(fname)){ + std::cerr << "Error: Cannot read file " << fname << std::endl; + return EXIT_FAILURE; + } + /// [Loads image] + + /// [Domain creation] + Mesh_domain domain + = Mesh_domain::create_labeled_image_mesh_domain(image, + params::features_detector = CGAL::Mesh_3::Detect_features_in_image()); + /// [Domain creation] + + CGAL::Bbox_3 bbox = domain.bbox(); + double diag = CGAL::sqrt(CGAL::square(bbox.xmax() - bbox.xmin()) + + CGAL::square(bbox.ymax() - bbox.ymin()) + + CGAL::square(bbox.zmax() - bbox.zmin())); + double sizing_default = diag * 0.05; + + /// [Mesh criteria] + /// Note that `edge_size` is needed with 1D-features + Mesh_criteria criteria(params::edge_size = sizing_default, + params::facet_angle = 30, + params::facet_size = sizing_default, + params::facet_distance = sizing_default / 10, + params::facet_topology = CGAL::FACET_VERTICES_ON_SAME_SURFACE_PATCH, + params::cell_radius_edge_ratio = 0, + params::cell_size = 0 + ); + /// [Mesh criteria] + + /// [Meshing] + C3t3 c3t3 = CGAL::make_mesh_3(domain, criteria, + params::no_exude(), + params::no_perturb()); + /// [Meshing] + + // Output + CGAL::dump_c3t3(c3t3, "out"); + + return 0; +} diff --git a/Mesh_3/examples/Mesh_3/mesh_3D_image_with_features.cpp b/Mesh_3/examples/Mesh_3/mesh_3D_image_with_features.cpp index 15d8c843bcf..eab5ad9ef56 100644 --- a/Mesh_3/examples/Mesh_3/mesh_3D_image_with_features.cpp +++ b/Mesh_3/examples/Mesh_3/mesh_3D_image_with_features.cpp @@ -18,6 +18,8 @@ typedef CGAL::Labeled_mesh_domain_3 Image_domain; typedef CGAL::Mesh_domain_with_polyline_features_3 Mesh_domain; /// [Domain definition] +#include + #ifdef CGAL_CONCURRENT_MESH_3 typedef CGAL::Parallel_tag Concurrency_tag; #else @@ -34,40 +36,8 @@ typedef CGAL::Mesh_criteria_3 Mesh_criteria; namespace params = CGAL::parameters; -/// [Add 1D features] +// Read input features #include "read_polylines.h" -#include // undocumented header - -// Protect the intersection of the object with the box of the image, -// by declaring 1D-features. Note that `CGAL::polylines_to_protect` is -// not documented. -bool add_1D_features(const CGAL::Image_3& image, - Mesh_domain& domain, - const std::string lines_fname) -{ - typedef K::Point_3 Point_3; - typedef unsigned char Word_type; - - std::vector > features_inside; - if(!read_polylines(lines_fname, features_inside)) // see file "read_polylines.h" - { - std::cerr << "Error: Cannot read file " << lines_fname << std::endl; - return false; - } - - std::vector > polylines_on_bbox; - CGAL::polylines_to_protect(image, polylines_on_bbox, - features_inside.begin(), - features_inside.end()); - - domain.add_features(polylines_on_bbox.begin(), polylines_on_bbox.end()); - - // It is very important that the polylines from the file `lines_fname` - // contain only polylines in the inside of the box of the image. - domain.add_features(features_inside.begin(), features_inside.end()); - return true; -} -/// [Add 1D features] int main(int argc, char* argv[]) { @@ -79,21 +49,28 @@ int main(int argc, char* argv[]) return EXIT_FAILURE; } - // Domain - Mesh_domain domain = Mesh_domain::create_labeled_image_mesh_domain(image); - - /// Declare 1D-features, see above [Call add_1D_features] - const std::string lines_fname = (argc>2)?argv[2]:CGAL::data_file_path("images/420.polylines.txt"); - - if(!add_1D_features(image, domain, lines_fname)) { + /// Load 1D-features + const std::string lines_fname = (argc > 2) ? argv[2] : CGAL::data_file_path("images/420.polylines.txt"); + std::vector > features_inside; + if (!read_polylines(lines_fname, features_inside)) // see file "read_polylines.h" + { + std::cerr << "Error: Cannot read file " << lines_fname << std::endl; return EXIT_FAILURE; } - /// [Call add_1D_features] + + /// [Domain creation] + Mesh_domain domain = Mesh_domain::create_labeled_image_mesh_domain(image, + params::features_detector = CGAL::Mesh_3::Detect_features_on_image_bbox(), + params::input_features = std::cref(features_inside));//use std::cref to avoid a copy + /// [Domain creation] /// Note that `edge_size` is needed with 1D-features [Mesh criteria] - Mesh_criteria criteria(params::edge_size(6). - facet_angle(30).facet_size(6).facet_distance(4). - cell_radius_edge_ratio(3).cell_size(8)); + Mesh_criteria criteria(params::edge_size = 6., + params::facet_angle = 30, + params::facet_size = 6, + params::facet_distance = 4, + params::cell_radius_edge_ratio = 3, + params::cell_size = 8); /// [Mesh criteria] // Meshing @@ -104,5 +81,5 @@ int main(int argc, char* argv[]) CGAL::IO::write_MEDIT(medit_file, c3t3); medit_file.close(); - return 0; + return EXIT_SUCCESS; } diff --git a/Mesh_3/examples/Mesh_3/mesh_3D_image_with_input_features.cpp b/Mesh_3/examples/Mesh_3/mesh_3D_image_with_input_features.cpp new file mode 100644 index 00000000000..8a83efae986 --- /dev/null +++ b/Mesh_3/examples/Mesh_3/mesh_3D_image_with_input_features.cpp @@ -0,0 +1,82 @@ +#include +#include + +#include +#include +#include + +#include +#include + +/// [Domain definition] +#include +#include +#include + +typedef CGAL::Exact_predicates_inexact_constructions_kernel K; +typedef CGAL::Labeled_mesh_domain_3 Image_domain; +typedef CGAL::Mesh_domain_with_polyline_features_3 Mesh_domain; +/// [Domain definition] + +#ifdef CGAL_CONCURRENT_MESH_3 +using Concurrency_tag = CGAL::Parallel_tag; +#else +using Concurrency_tag = CGAL::Sequential_tag; +#endif + +// Triangulation +typedef CGAL::Mesh_triangulation_3::type Tr; + +typedef CGAL::Mesh_complex_3_in_triangulation_3 C3t3; + +// Criteria +typedef CGAL::Mesh_criteria_3 Mesh_criteria; + +namespace params = CGAL::parameters; + +#include "read_polylines.h" + +int main(int argc, char* argv[]) +{ + const std::string fname = (argc>1)?argv[1]:CGAL::data_file_path("images/420.inr"); + // Loads image + CGAL::Image_3 image; + if(!image.read(fname)){ + std::cerr << "Error: Cannot read file " << fname << std::endl; + return EXIT_FAILURE; + } + + /// Declare 1D-features + const std::string lines_fname = (argc>2)?argv[2]:CGAL::data_file_path("images/420.polylines.txt"); + using Point_3 = K::Point_3; + std::vector > features_inside; + if (!read_polylines(lines_fname, features_inside)) // see file "read_polylines.h" + { + std::cerr << "Error: Cannot read file " << lines_fname << std::endl; + return EXIT_FAILURE; + } + + /// [Domain creation] + Mesh_domain domain = Mesh_domain::create_labeled_image_mesh_domain(image, + params::input_features = std::cref(features_inside));//use std::cref to avoid a copy + /// [Domain creation] + + /// Note that `edge_size` is needed with 1D-features [Mesh criteria] + Mesh_criteria criteria(params::edge_size = 6, + params::facet_angle = 30, + params::facet_size = 6, + params::facet_distance = 4, + params::cell_radius_edge_ratio = 3, + params::cell_size = 8); + /// [Mesh criteria] + + // Meshing + C3t3 c3t3 = CGAL::make_mesh_3(domain, criteria); + + // Output + std::ofstream medit_file("out.mesh"); + CGAL::IO::write_MEDIT(medit_file, c3t3); + medit_file.close(); + + return EXIT_SUCCESS; +} diff --git a/Mesh_3/include/CGAL/Implicit_mesh_domain_3.h b/Mesh_3/include/CGAL/Implicit_mesh_domain_3.h index 764444851de..62c9eb47b5c 100644 --- a/Mesh_3/include/CGAL/Implicit_mesh_domain_3.h +++ b/Mesh_3/include/CGAL/Implicit_mesh_domain_3.h @@ -24,6 +24,7 @@ #include #include +#include #include namespace CGAL { diff --git a/Mesh_3/include/CGAL/Labeled_image_mesh_domain_3.h b/Mesh_3/include/CGAL/Labeled_image_mesh_domain_3.h index bc2ff03ff73..d9bd487410a 100644 --- a/Mesh_3/include/CGAL/Labeled_image_mesh_domain_3.h +++ b/Mesh_3/include/CGAL/Labeled_image_mesh_domain_3.h @@ -26,6 +26,7 @@ #include #include #include +#include #include #include diff --git a/Mesh_3/include/CGAL/Labeled_mesh_domain_3.h b/Mesh_3/include/CGAL/Labeled_mesh_domain_3.h index 6faf6ee86ba..c995f28aeb7 100644 --- a/Mesh_3/include/CGAL/Labeled_mesh_domain_3.h +++ b/Mesh_3/include/CGAL/Labeled_mesh_domain_3.h @@ -31,6 +31,7 @@ #include #include +#include #include #include @@ -48,6 +49,11 @@ #endif #include +#include +#include + +#include + namespace CGAL { namespace Mesh_3 { namespace internal { @@ -117,15 +123,67 @@ namespace internal { } }; + // Detect_features_in_domain + template + struct Detect_features_in_domain { + std::vector> + operator()(const CGAL::Image_3& image, DetectFunctor functor) const { +#if defined(BOOST_MSVC) && (BOOST_MSVC < 1910) //before msvc2017 + return functor.operator()(image); +#else + return functor.template operator()(image); +#endif + } + }; + // specialization for `Null_functor`: create the default functor + template + struct Detect_features_in_domain { + std::vector> + operator()(const CGAL::Image_3&, Null_functor) const { + return std::vector>(); + } + }; + + template + std::vector> + detect_features(const CGAL::Image_3& image, DetectFunctor functor) + { + Detect_features_in_domain detector; + return detector(image, functor); + } + + template + struct Add_features_in_domain { + template + void operator()(const CGAL::Image_3&, MeshDomain&, const InputFeatureRange&, DetectFunctor) + {} + }; + + template<> + struct Add_features_in_domain + { + template + void operator()(const CGAL::Image_3& image, + MeshDomain& domain, + const InputFeatureRange& input_features, + DetectFunctor functor) + { + using P = typename MeshDomain::Point_3; + auto detected_feature_range + = CGAL::Mesh_3::internal::detect_features

(image, functor); + + CGAL::merge_and_snap_polylines(image, detected_feature_range, input_features); + + if (!input_features.empty()) + domain.add_features(input_features.begin(), input_features.end()); + domain.add_features(detected_feature_range.begin(), detected_feature_range.end()); + } + }; + } // end namespace CGAL::Mesh_3::internal } // end namespace CGAL::Mesh_3 #ifndef DOXYGEN_RUNNING -struct Null_subdomain_index { - template - bool operator()(const T& x) const { return 0 == x; } -}; - template struct Construct_pair_from_subdomain_indices { typedef std::pair result_type; @@ -539,6 +597,11 @@ public: * domain to be discretized is the union of voxels that have non-zero * values. * + * \returns either a `Labeled_mesh_domain_3`, + * or a `Mesh_domain_with_polyline_features_3` + * depending on whether one or more of the named parameters + * `features_detector` and `input_features` are provided. + * * \tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters" * \param image_ the input 3D image. * \param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below: @@ -565,6 +628,34 @@ public: * bound, relative to the diameter of the box of the image.} * \cgalParamDefault{FT(1e-3)} * \cgalParamNEnd + * + * \cgalParamNBegin{features_detector} + * \cgalParamDescription{ a functor that implements + * `std::vector> operator()(const Image_3& img) const`, + * where `%Point` matches the mesh domain point type. + * It returns a range of detected polyline features, which are added + * to the domain for feature protection. + * See \ref PkgMesh3FeatureDetection for a list of available functors.} + * \cgalParamDefault{CGAL::Null_functor()} + * \cgalParamExtra{The return type of the function depends on whether this parameter + or `input_features` are provided or not.} + * \cgalParamExtra{If `weights` is provided, this parameter is ignored} + * \cgalParamNEnd + * + * \cgalParamNBegin{input_features} + * \cgalParamDescription{ a `Range` of polyline features, represented as `Range`s of `Point_3`. + * Polyline features are added to the domain for further feature protection. + * Input polyline features must be different from the detected features + * and can intersect only at vertices, if they do. Otherwise, + * the meshing process may not terminate.} + * \cgalParamDefault{`std::vector>()`} + * \cgalParamExtra{The return type of the function depends on whether this parameter + or `input_features` are provided or not.} + * \cgalParamExtra{It is recommended to pass a const-reference for this parameter, + * possibly using `std::cref(polylines_range)` to avoid useless copies.} + * \cgalParamExtra{If `weights` is provided, this parameter is ignored} + * \cgalParamNEnd + * * \cgalNamedParamsEnd * * \cgalHeading{Example} @@ -578,13 +669,24 @@ public: * * \snippet Mesh_3/mesh_3D_weighted_image.cpp Domain creation * + * From the example (\ref Mesh_3/mesh_3D_image_with_detection_of_features.cpp) + * where the features are detected in `image`: + * + * \snippet Mesh_3/mesh_3D_image_with_detection_of_features.cpp Domain creation + * + * From the example (\ref Mesh_3/mesh_3D_image_with_input_features.cpp) + * where the features are provided by the user: + * + * \snippet Mesh_3/mesh_3D_image_with_input_features.cpp Domain creation */ template - static Labeled_mesh_domain_3 create_labeled_image_mesh_domain(const CGAL::Image_3& image_, const CGAL_NP_CLASS& np = parameters::default_values()) + static auto + create_labeled_image_mesh_domain(const CGAL::Image_3& image_, const CGAL_NP_CLASS& np = parameters::default_values()) { using parameters::get_parameter; using parameters::get_parameter_reference; using parameters::choose_parameter; + auto iso_value_ = choose_parameter(get_parameter(np, internal_np::iso_value_param), 0); auto value_outside_ = choose_parameter(get_parameter(np, internal_np::voxel_value), 0); FT relative_error_bound_ = choose_parameter(get_parameter(np, internal_np::error_bound), FT(1e-3)); @@ -592,41 +694,62 @@ public: CGAL::Random* p_rng_ = choose_parameter(get_parameter(np, internal_np::rng), nullptr); auto null_subdomain_index_ = choose_parameter(get_parameter(np, internal_np::null_subdomain_index_param), Null_functor()); auto construct_surface_patch_index_ = choose_parameter(get_parameter(np, internal_np::surface_patch_index), Null_functor()); - const CGAL::Image_3& weights_ = choose_parameter(get_parameter_reference(np, internal_np::weights_param), CGAL::Image_3()); + + using Image_ref_type = typename internal_np::Lookup_named_param_def::reference; + CGAL::Image_3 no_weights; + const Image_ref_type weights_ = choose_parameter(get_parameter_reference(np, internal_np::weights_param), no_weights); + auto features_detector_ = choose_parameter(get_parameter(np, internal_np::features_detector_param), Null_functor()); + + using Default_input_features = std::vector>; + using Input_features_ref_type = typename internal_np::Lookup_named_param_def::reference; + Default_input_features empty_vec; + Input_features_ref_type input_features_ + = choose_parameter(get_parameter_reference(np, internal_np::input_features_param), empty_vec); + CGAL_USE(iso_value_); namespace p = CGAL::parameters; + auto image_wrapper = weights_.is_valid() + ? create_weighted_labeled_image_wrapper(image_, + weights_, + image_values_to_subdomain_indices_, + value_outside_) + : create_labeled_image_wrapper(image_, + image_values_to_subdomain_indices_, + value_outside_); + + // warning : keep Return_type consistent with actual return type + const bool no_features + = CGAL::parameters::is_default_parameter::value + && CGAL::parameters::is_default_parameter::value; + using Return_type = std::conditional_t < + no_features, + Labeled_mesh_domain_3, + Mesh_domain_with_polyline_features_3 + >; + + Return_type domain + (p::function = image_wrapper, + p::bounding_object = Mesh_3::internal::compute_bounding_box(image_), + p::relative_error_bound = relative_error_bound_, + p::p_rng = p_rng_, + p::null_subdomain_index = + create_null_subdomain_index(null_subdomain_index_), + p::construct_surface_patch_index = + create_construct_surface_patch_index(construct_surface_patch_index_)); + if (weights_.is_valid()) - { - return Labeled_mesh_domain_3 - (p::function = create_weighted_labeled_image_wrapper - (image_, - weights_, - image_values_to_subdomain_indices_, - value_outside_), - p::bounding_object = Mesh_3::internal::compute_bounding_box(image_), - p::relative_error_bound = relative_error_bound_, - p::p_rng = p_rng_, - p::null_subdomain_index = - create_null_subdomain_index(null_subdomain_index_), - p::construct_surface_patch_index = - create_construct_surface_patch_index(construct_surface_patch_index_)); - } - else - { - return Labeled_mesh_domain_3 - (p::function = create_labeled_image_wrapper - (image_, - image_values_to_subdomain_indices_, - value_outside_), - p::bounding_object = Mesh_3::internal::compute_bounding_box(image_), - p::relative_error_bound = relative_error_bound_, - p::p_rng = p_rng_, - p::null_subdomain_index = - create_null_subdomain_index(null_subdomain_index_), - p::construct_surface_patch_index = - create_construct_surface_patch_index(construct_surface_patch_index_)); - } + return domain; + + // features + Mesh_3::internal::Add_features_in_domain() + (image_, domain, input_features_, features_detector_); + + return domain; } /// @} @@ -686,7 +809,7 @@ public: } template - static Labeled_mesh_domain_3 create_labeled_image_mesh_domain(const CGAL_NP_CLASS& np) + static auto create_labeled_image_mesh_domain(const CGAL_NP_CLASS& np) { static_assert(!parameters::is_default_parameter::value, "Value for required parameter not found"); using parameters::get_parameter_reference; @@ -698,10 +821,10 @@ public: template - static Labeled_mesh_domain_3 create_labeled_image_mesh_domain(const CGAL::Image_3& image_, - const CGAL_NP_CLASS_1& np1, - const CGAL_NP_CLASS_2& np2, - const NP& ... nps) + static auto create_labeled_image_mesh_domain(const CGAL::Image_3& image_, + const CGAL_NP_CLASS_1& np1, + const CGAL_NP_CLASS_2& np2, + const NP& ... nps) { return create_labeled_image_mesh_domain(image_, internal_np::combine_named_parameters(np1, np2, nps...)); } @@ -709,9 +832,9 @@ public: template - static Labeled_mesh_domain_3 create_labeled_image_mesh_domain(const CGAL_NP_CLASS_1& np1, - const CGAL_NP_CLASS_2& np2, - const NP& ... nps) + static auto create_labeled_image_mesh_domain(const CGAL_NP_CLASS_1& np1, + const CGAL_NP_CLASS_2& np2, + const NP& ... nps) { return create_labeled_image_mesh_domain(internal_np::combine_named_parameters(np1, np2, nps...)); } @@ -904,9 +1027,9 @@ public: // null(f(p)) means p is outside the domain Subdomain_index index = (r_domain_.function_)(p); if ( r_domain_.null(index) ) - return Subdomain(); + return Subdomain{}; else - return Subdomain(index); + return Subdomain{ index }; } private: const Labeled_mesh_domain_3& r_domain_; diff --git a/Mesh_3/include/CGAL/Mesh_3/C3T3_helpers.h b/Mesh_3/include/CGAL/Mesh_3/C3T3_helpers.h index 53ada34e04b..8e86644477b 100644 --- a/Mesh_3/include/CGAL/Mesh_3/C3T3_helpers.h +++ b/Mesh_3/include/CGAL/Mesh_3/C3T3_helpers.h @@ -791,6 +791,7 @@ public: Moving_vertices_set& moving_vertices); void update_restricted_facets(); + void update_restricted_cells(); #ifdef CGAL_INTRUSIVE_LIST template @@ -2924,6 +2925,18 @@ update_restricted_facets() updater(*fit); } +template +void +C3T3_helpers:: +update_restricted_cells() +{ + Update_c3t3 updater(domain_, c3t3_); + for (typename C3T3::Triangulation::Finite_cells_iterator + cit = tr_.finite_cells_begin(); + cit != tr_.finite_cells_end(); ++cit) + updater(cit); +} + template template diff --git a/Mesh_3/include/CGAL/Mesh_3/Detect_features_in_image.h b/Mesh_3/include/CGAL/Mesh_3/Detect_features_in_image.h new file mode 100644 index 00000000000..d12c55b1d8a --- /dev/null +++ b/Mesh_3/include/CGAL/Mesh_3/Detect_features_in_image.h @@ -0,0 +1,290 @@ +// Copyright (c) 2022 GeometryFactory (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org). +// +// $URL$ +// $Id$ +// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial +// +// +// Author(s) : Sebastien Loriot, Jane Tournois +// +//****************************************************************************** +// +//****************************************************************************** + +#ifndef CGAL_MESH_3_DETECT_FEATURES_IN_IMAGE_H +#define CGAL_MESH_3_DETECT_FEATURES_IN_IMAGE_H + +#include + +#include + +#include + +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include + +#ifdef CGAL_DEBUG_TRIPLE_LINES +#include +#endif + +namespace CGAL +{ +namespace Mesh_3 +{ +namespace internal +{ + +// Protect the intersection of the object with the box of the image, +// by declaring 1D-features. Note that `CGAL::polylines_to_protect` is +// not documented. +template +std::vector> +detect_features_in_image_with_know_word_type(const CGAL::Image_3& image) +{ + using Gt = typename CGAL::Kernel_traits

::Kernel; + using Point_3 = P; + using Vector_3 = typename Gt::Vector_3; + using Polyline_type = std::vector; + using Polylines = std::vector; + + CGAL::Mesh_3::Triple_line_extractor lines; + + Polylines features_inside; + + const double vx = image.vx(); + const double vy = image.vy(); + const double vz = image.vz(); + const double dist_bound = (std::min)(vx, (std::min)(vy, vz)) / 256; + const double sq_dist_bound = dist_bound * dist_bound; + + const std::size_t xdim = image.xdim(); + const std::size_t ydim = image.ydim(); + const std::size_t zdim = image.zdim(); + + const float tx = image.tx(); + const float ty = image.ty(); + const float tz = image.tz(); + + using CGAL::IMAGEIO::static_evaluate; + + using Del = CGAL::Delaunay_triangulation_3; + using Cell_handle = typename Del::Cell_handle; + using Vertex_handle = typename Del::Vertex_handle; + Del triangulation; + Cell_handle start_cell; + + using Word //use unsigned integral Word type to use it as an index + = typename CGAL::IMAGEIO::Word_type_generator::type; + + using Color_transform = internal::Color_transformation_helper; + typename Color_transform::type color_transformation; + std::array inv_color_transformation; + + using Permutation = internal::Permutation; + using Coord = internal::Coordinates; + + for (std::size_t k = 0, end_k = zdim - 1; k < end_k; ++k) + for (std::size_t j = 0, end_j = ydim - 1; j < end_j; ++j) + for (std::size_t i = 0, end_i = xdim - 1; i < end_i; ++i) + { + Vector_3 translation{ i * vx + tx, + j * vy + ty, + k * vz + tz }; + + const std::array cube = { + static_evaluate(image.image(), i , j , k), + static_evaluate(image.image(), i + 1, j , k), + static_evaluate(image.image(), i , j + 1, k), + static_evaluate(image.image(), i + 1, j + 1, k), + static_evaluate(image.image(), i , j , k + 1), + static_evaluate(image.image(), i + 1, j , k + 1), + static_evaluate(image.image(), i , j + 1, k + 1), + static_evaluate(image.image(), i + 1, j + 1, k + 1), + }; /// TODO: optimize the access to the image data + bool monocolor = (cube[0] == cube[1]); + for (int i = 2; i < 8; ++i) monocolor = monocolor && (cube[0] == cube[i]); + if (monocolor) continue; + + Color_transform::reset(color_transformation); + + std::uint8_t nb_color = 0; + for (int i = 0; i < 8; ++i) { + if (!Color_transform::is_valid(color_transformation, cube[i])) + { + color_transformation[cube[i]] = nb_color; + inv_color_transformation[nb_color] = cube[i]; + ++nb_color; + } + } + std::array reference_cube = { + color_transformation[cube[0]], + color_transformation[cube[1]], + color_transformation[cube[2]], + color_transformation[cube[3]], + color_transformation[cube[4]], + color_transformation[cube[5]], + color_transformation[cube[6]], + color_transformation[cube[7]] + }; + auto case_it = internal::find_case(internal::cases, reference_cube); + const bool case_found = (case_it != std::end(internal::cases)); + if (case_found) reference_cube = internal::combinations[(*case_it)[8]]; + else { + //std::cerr << "Warning: case not found: " << reference_cube << '\n'; + CGAL_error(); + }; +#ifdef CGAL_DEBUG_TRIPLE_LINES + CGAL::Mesh_3::internal::debug_cerr("Cube", cube); + CGAL::Mesh_3::internal::debug_cerr("reference cube", reference_cube); + CGAL::Mesh_3::internal::debug_cerr("with transformation", internal::cube_isometries[(*case_it)[9]]); +#endif // CGAL_DEBUG_TRIPLE_LINES + + auto fct_it = lines.create_polylines_fcts.find(reference_cube); + if (fct_it != lines.create_polylines_fcts.end()) + { +#ifdef CGAL_DEBUG_TRIPLE_LINES + CGAL::Mesh_3::internal::debug_cerr("Using the function of", Cube(fct_it->first)); +#endif // CGAL_DEBUG_TRIPLE_LINES + + Polylines cube_features = (fct_it->second)(10); + if (case_found) + { + const Permutation& transformation = internal::cube_isometries[(*case_it)[9]]; + + Coord a1 = internal::coordinates[transformation[0]]; + Coord u = internal::minus(internal::coordinates[transformation[1]], a1); + Coord v = internal::minus(internal::coordinates[transformation[2]], a1); + Coord w = internal::minus(internal::coordinates[transformation[4]], a1); + + const Point_3 pa{ a1[0], a1[1], a1[2] }; + const Vector_3 vu{ u[0], u[1], u[2] }; + const Vector_3 vv{ v[0], v[1], v[2] }; + const Vector_3 vw{ w[0], w[1], w[2] }; +#ifdef CGAL_DEBUG_TRIPLE_LINES + std::cerr << "pa: " << pa << "\n"; + std::cerr << "vu: " << vu << "\n"; + std::cerr << "vv: " << vv << "\n"; + std::cerr << "vw: " << vw << "\n"; +#endif // CGAL_DEBUG_TRIPLE_LINES + for (auto& polyline : cube_features) { + for (auto& point : polyline) { + point = pa + + point.x() * vu + + point.y() * vv + + point.z() * vw; + point = { vx * point.x(), + vy * point.y(), + vz * point.z(), }; + point = point + translation; + } + for (int i = 0; i < 2; ++i) { + Point_3& extremity = (i == 0) ? polyline.front() : polyline.back(); + Vertex_handle vh = triangulation.nearest_vertex(extremity, start_cell); + if (Vertex_handle() != vh) { + if (squared_distance(vh->point(), extremity) < sq_dist_bound) { + extremity = vh->point(); + } + } + vh = triangulation.insert(extremity, start_cell); + start_cell = vh->cell(); + } + features_inside.push_back(std::move(polyline)); + } // end loop on polylines + } // end case where the transformation is not the identity + } // end if the reference_cube has polylines + } + + // call the split_graph_into_polylines, to create long polylines from the + // short polylines that were generated per voxel. + Polylines polylines_inside; + CGAL::polylines_to_protect(polylines_inside, + features_inside.begin(), + features_inside.end()); + + Polylines polylines_on_bbox; + CGAL::polylines_to_protect(image, polylines_on_bbox, + polylines_inside.begin(), + polylines_inside.end()); + + polylines_inside.insert(polylines_inside.end(), + polylines_on_bbox.begin(), + polylines_on_bbox.end()); + +#ifdef CGAL_DEBUG_TRIPLE_LINES + std::ofstream output_polylines("out-generated.polylines.txt"); + output_polylines.precision(17); + for (auto poly : boost::range::join(polylines_on_bbox, polylines_inside)) { + output_polylines << poly.size(); + for (auto p : poly) output_polylines << " " << p; + output_polylines << std::endl; + } +#endif + + return polylines_inside; +} + + +}// namespace internal + +/*! +* \ingroup PkgMesh3FeatureDetection +* +* Functor for feature detection in labeled images. +*/ +struct Detect_features_in_image +{ +public: + /*! + * detects and constructs the polylines that lie at the + * intersection of three or more subdomains. + * + * Each subdomain inside the bounding box + * of the input labeled image is defined as the set of voxels + * with the same value. The outside of the bounding box + * of the image is considered as a subdomain with voxel value + * `value_outside` (see \link CGAL::Labeled_mesh_domain_3::create_labeled_image_mesh_domain `create_labeled_image_mesh_domain()` \endlink + * parameters description). Hence, this function also computes + * intersections with the image bounding box. + * + * \tparam Point class model of `Kernel::Point_3`. It + * must match the triangulation point type. + * + * \param image the input image + * + * \returns a `std::vector>` + * containing the constructed polylines for later feature protection. + */ + template + std::vector> + operator()(const CGAL::Image_3& image) const + { + CGAL_IMAGE_IO_CASE(image.image(), + return (internal::detect_features_in_image_with_know_word_type(image)); + ); + CGAL_error_msg("This place should never be reached, because it would mean " + "the image word type is a type that is not handled by " + "CGAL_ImageIO."); + + return std::vector>(); + } +}; + + +}//end namespace Mesh_3 +}//end namespace CGAL + + +#endif //CGAL_MESH_3_DETECT_FEATURES_IN_IMAGE_H diff --git a/Mesh_3/include/CGAL/Mesh_3/Detect_features_on_image_bbox.h b/Mesh_3/include/CGAL/Mesh_3/Detect_features_on_image_bbox.h new file mode 100644 index 00000000000..e6a7385659f --- /dev/null +++ b/Mesh_3/include/CGAL/Mesh_3/Detect_features_on_image_bbox.h @@ -0,0 +1,100 @@ +// Copyright (c) 2022 GeometryFactory (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org). +// +// $URL$ +// $Id$ +// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial +// +// +// Author(s) : Laurent Rineau, Jane Tournois +// +//****************************************************************************** +// +//****************************************************************************** + +#ifndef CGAL_MESH_3_DETECT_FEATURES_ON_IMAGE_BBOX_H +#define CGAL_MESH_3_DETECT_FEATURES_ON_IMAGE_BBOX_H + +#include + +#include + +#include + + +namespace CGAL +{ +namespace Mesh_3 +{ +namespace internal +{ + +template +std::vector> +detect_features_on_bbox(const CGAL::Image_3& image) +{ + using Point_3 = Point; + using Polyline_type = std::vector; + using Polylines = std::vector; + + Polylines polylines_on_bbox; + + CGAL_IMAGE_IO_CASE(image.image(), + { + (CGAL::polylines_to_protect(image, polylines_on_bbox)); + return polylines_on_bbox; + } + ); + CGAL_error_msg("This place should never be reached, because it would mean " + "the image word type is a type that is not handled by " + "CGAL_ImageIO."); + return Polylines(); +} + +}// namespace internal + +/*! +* \ingroup PkgMesh3FeatureDetection +* +* Functor for feature detection in labeled images. +*/ +struct Detect_features_on_image_bbox +{ +public: + + /*! + * detects and constructs the polylines that lie at the + * intersection of two or more subdomains and the bounding box + * of the input labeled image. + * + * Each subdomain inside the bounding box + * of the input labeled image is defined as the set of voxels + * with the same value. The outside of the bounding box + * of the image is considered as a subdomain with voxel value + * `value_outside` (see \link CGAL::Labeled_mesh_domain_3::create_labeled_image_mesh_domain `create_labeled_image_mesh_domain()` \endlink + * parameters description). Hence, this function computes + * intersections of "internal" subdomains with the image bounding box. + * + * \tparam Point class model of `Kernel::Point_3`. The point type + * must match the triangulation point type. + * + * \param image the input image + * + * \returns a `std::vector>` + * containing the constructed polylines for later feature protection. + */ + template + std::vector> + operator()(const CGAL::Image_3& image) const + { + return internal::detect_features_on_bbox(image); + } +}; + +}//end namespace Mesh_3 +}//end namespace CGAL + + +#endif //CGAL_MESH_3_DETECT_FEATURES_ON_IMAGE_BBOX_H diff --git a/Mesh_3/include/CGAL/Mesh_3/Null_subdomain_index.h b/Mesh_3/include/CGAL/Mesh_3/Null_subdomain_index.h new file mode 100644 index 00000000000..8889db81f44 --- /dev/null +++ b/Mesh_3/include/CGAL/Mesh_3/Null_subdomain_index.h @@ -0,0 +1,29 @@ +// Copyright (c) 2015 GeometryFactory +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org). +// +// $URL$ +// $Id$ +// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial +// +// +// Author(s) : Laurent Rineau + +#ifndef CGAL_MESH_3_NULL_SUBDOMAIN_INDEX +#define CGAL_MESH_3_NULL_SUBDOMAIN_INDEX + +#include + +#ifndef DOXYGEN_RUNNING + +namespace CGAL { + struct Null_subdomain_index { + template + bool operator()(const T& x) const { return 0 == x; } + }; +} + +#endif + +#endif //CGAL_MESH_3_NULL_SUBDOMAIN_INDEX diff --git a/Mesh_3/include/CGAL/Mesh_3/experimental/AABB_filtered_projection_traits.h b/Mesh_3/include/CGAL/Mesh_3/experimental/AABB_filtered_projection_traits.h index 872f6c0b7e9..ac5c1d30496 100644 --- a/Mesh_3/include/CGAL/Mesh_3/experimental/AABB_filtered_projection_traits.h +++ b/Mesh_3/include/CGAL/Mesh_3/experimental/AABB_filtered_projection_traits.h @@ -57,25 +57,40 @@ public: IndexToIgnoreIterator end, const AABBTraits& aabb_traits, IndexPropertyMap index_map = IndexPropertyMap()) - : m_closest_point(hint), - m_closest_point_initialized(true), - set_of_indices(begin, end), - aabb_traits(aabb_traits), - index_map(index_map) + : Filtered_projection_traits(begin, end, aabb_traits, index_map) { + m_closest_point = hint; + m_closest_point_initialized = true; } Filtered_projection_traits(const Point_3& hint, Index_type index, const AABBTraits& aabb_traits, IndexPropertyMap index_map = IndexPropertyMap()) - : m_closest_point(hint), - m_closest_point_initialized(true), - set_of_indices(), - aabb_traits(aabb_traits), - index_map(index_map) + : Filtered_projection_traits(index, aabb_traits, index_map) { - set_of_indices.insert(index); + m_closest_point = hint; + m_closest_point_initialized = true; + } + + template + Filtered_projection_traits(const Point_and_primitive_id& hint, + IndexToIgnoreIterator begin, + IndexToIgnoreIterator end, + const AABBTraits& aabb_traits, + IndexPropertyMap index_map = IndexPropertyMap()) + : Filtered_projection_traits(hint.first, begin, end, aabb_traits, index_map) + { + m_closest_primitive = hint.second; + } + + Filtered_projection_traits(const Point_and_primitive_id& hint, + Index_type index, + const AABBTraits& aabb_traits, + IndexPropertyMap index_map = IndexPropertyMap()) + : Filtered_projection_traits(hint.first, index, aabb_traits, index_map) + { + m_closest_primitive = hint.second; } template @@ -83,8 +98,7 @@ public: IndexToIgnoreIterator end, const AABBTraits& aabb_traits, IndexPropertyMap index_map = IndexPropertyMap()) - : m_closest_point_initialized(false), - set_of_indices(begin, end), + : set_of_indices(begin, end), aabb_traits(aabb_traits), index_map(index_map) { @@ -93,12 +107,10 @@ public: Filtered_projection_traits(Index_type index, const AABBTraits& aabb_traits, IndexPropertyMap index_map = IndexPropertyMap()) - : m_closest_point_initialized(false), - set_of_indices(), + : set_of_indices({index}), aabb_traits(aabb_traits), index_map(index_map) { - set_of_indices.insert(index); } bool go_further() const { return true; } @@ -151,7 +163,7 @@ public: private: Point_3 m_closest_point; typename Primitive::Id m_closest_primitive; - bool m_closest_point_initialized; + bool m_closest_point_initialized = false; Set_of_indices set_of_indices; const AABBTraits& aabb_traits; IndexPropertyMap index_map; diff --git a/Mesh_3/include/CGAL/Mesh_3/experimental/Sizing_field_with_aabb_tree.h b/Mesh_3/include/CGAL/Mesh_3/experimental/Sizing_field_with_aabb_tree.h index 0dcff62901b..11319fe065d 100644 --- a/Mesh_3/include/CGAL/Mesh_3/experimental/Sizing_field_with_aabb_tree.h +++ b/Mesh_3/include/CGAL/Mesh_3/experimental/Sizing_field_with_aabb_tree.h @@ -21,6 +21,10 @@ #include "Get_curve_index.h" #include // for weight_modifier +#include +#include +#include + #include #if defined(CGAL_MESH_3_PROTECTION_HIGH_VERBOSITY) || defined(CGAL_NO_ASSERTIONS) == 0 # include @@ -57,6 +61,8 @@ struct Sizing_field_with_aabb_tree typedef CGAL::Delaunay_triangulation_3 Dt; typedef Input_facets_AABB_tree Input_facets_AABB_tree_; + typedef typename Input_facets_AABB_tree_::AABB_traits AABB_traits; + using Point_and_primitive_id = typename AABB_traits::Point_and_primitive_id; typedef typename Input_facets_AABB_tree_::Primitive Input_facets_AABB_tree_primitive_; typedef typename MeshDomain::Curves_AABB_tree Input_curves_AABB_tree_; typedef typename Input_curves_AABB_tree_::Primitive Input_curves_AABB_tree_primitive_; @@ -71,6 +77,22 @@ struct Sizing_field_with_aabb_tree typename Input_facets_AABB_tree::Primitive> >::type Facet_patch_id_map; + struct Face_ids_traversal_traits { + using Limits = std::numeric_limits; + Patch_index min{Limits::max()}; + Patch_index max{Limits::lowest()}; + Facet_patch_id_map index_map{}; + + bool go_further() const { return true; } + template bool do_intersect(std::nullptr_t, const T&) { return true; } + + template void intersection(std::nullptr_t, const P& primitive) { + const Patch_index id = get(index_map, primitive.id()); + if (id < min) min = id; + if (id > max) max = id; + } + }; + Sizing_field_with_aabb_tree (typename Kernel_::FT d, const Input_facets_AABB_tree_& aabb_tree, @@ -78,87 +100,127 @@ struct Sizing_field_with_aabb_tree Get_curve_index get_curve_index = Get_curve_index(), Facet_patch_id_map facet_patch_id_map = Facet_patch_id_map() ) - : d_(d), aabb_tree(aabb_tree), - domain(domain), - dt(), - get_curve_index(get_curve_index), - facet_patch_id_map(facet_patch_id_map) + : d_ptr{std::make_shared(d, + aabb_tree, + domain, + get_curve_index, + facet_patch_id_map)} { + if(!d_ptr->aabb_tree.empty()) { + // Initialize the per-patch kd-trees + // - First compute the number of patches and min/max patch ids + Face_ids_traversal_traits traversal_traits; + d_ptr->aabb_tree.traversal(nullptr, traversal_traits); +#ifdef CGAL_MESH_3_PROTECTION_HIGH_VERBOSITY + std::cerr << "min: " << traversal_traits.min << ", max: " << traversal_traits.max << '\n'; +#endif // CGAL_MESH_3_PROTECTION_HIGH_VERBOSITY + d_ptr->min_patch_id = traversal_traits.min; + d_ptr->kd_trees_ptrs.resize(traversal_traits.max - d_ptr->min_patch_id + 1); + + using Node = CGAL::AABB_node; + using Primitive = typename AABB_traits::Primitive; + using Point_and_primitive_id = typename AABB_traits::Point_and_primitive_id; + + std::vector> vertices_per_patch; + vertices_per_patch.resize(d_ptr->kd_trees_ptrs.size()); + + // - then fill sets of vertices per patch + auto push_vertex = [&](const auto& primitive) { + const Patch_index id = get(d_ptr->facet_patch_id_map, primitive.id()); + const Point_3& p = primitive.reference_point(); + vertices_per_patch[id - d_ptr->min_patch_id].emplace(p, primitive.id()); + }; + + struct Visit_all_primitives { + decltype(push_vertex) register_vertex; + bool go_further() const { return true; } + bool do_intersect(std::nullptr_t, const Node&) { return true; } + void intersection(std::nullptr_t, const Primitive& primitive) + { + register_vertex(primitive); + } + } visit_all_primitives{push_vertex}; + d_ptr->aabb_tree.traversal(nullptr, visit_all_primitives); + + // - then create the kd-trees + for(std::size_t i = 0; i < vertices_per_patch.size(); ++i) { + if(!vertices_per_patch[i].empty()) { + d_ptr->kd_trees_ptrs[i] = std::make_unique(vertices_per_patch[i].begin(), + vertices_per_patch[i].end()); + } + } + } { Corner_index maximal_corner_index = 0; typedef std::pair Corner_index_and_point; std::vector corners_tmp; - domain.get_corners(std::back_inserter(corners_tmp)); + d_ptr->domain.get_corners(std::back_inserter(corners_tmp)); for(const Corner_index_and_point& pair : corners_tmp) { // Fill `corners_indices` if(pair.first > maximal_corner_index) maximal_corner_index = pair.first; - corners_indices. + d_ptr->corners_indices. insert(typename Corners_indices::value_type(pair.second, pair.first)); } - corners.resize(maximal_corner_index+1); + d_ptr->corners.resize(maximal_corner_index+1); for(const Corner_index_and_point& pair : corners_tmp) { // Fill `corners` - corners[pair.first] = pair.second; + d_ptr->corners[pair.first] = pair.second; } } //fill incidences of corners with curves - corners_incident_curves.resize(corners.size()); - for(const typename Corners_indices::value_type& pair : - corners_indices) - { - dt.insert(pair.first); + d_ptr->corners_incident_curves.resize(d_ptr->corners.size()); + for(const typename Corners_indices::value_type& pair : d_ptr->corners_indices) { + d_ptr->dt.insert(pair.first); // Fill `corners_incident_curves[corner_id]` - Curves_ids& incident_curves = corners_incident_curves[pair.second]; - domain.get_corner_incident_curves(pair.second, + Curves_ids& incident_curves = d_ptr->corners_incident_curves[pair.second]; + d_ptr->domain.get_corner_incident_curves(pair.second, std::inserter(incident_curves, incident_curves.end())); // For each incident loops, insert a point on the loop, as far as // possible. for(Curve_index curve_index : incident_curves) { if(domain.is_loop(curve_index)) { - FT curve_lenght = domain.curve_length(curve_index); + FT curve_length = d_ptr->domain.curve_length(curve_index); Point_3 other_point = - domain.construct_point_on_curve(pair.first, - curve_index, - curve_lenght / 2); - dt.insert(other_point); + d_ptr->domain.construct_point_on_curve(pair.first, + curve_index, + curve_length / 2); + d_ptr->dt.insert(other_point); } } } - if (aabb_tree.empty()) + if (d_ptr->aabb_tree.empty()) return;//there is no surface --> no surface patches //fill incidences with patches - curves_incident_patches.resize(domain.maximal_curve_index()+1); - corners_incident_patches.resize(corners.size()); + d_ptr->curves_incident_patches.resize(domain.maximal_curve_index()+1); + d_ptr->corners_incident_patches.resize(d_ptr->corners.size()); for (Curve_index curve_id = 1; - std::size_t(curve_id) < curves_incident_patches.size(); + std::size_t(curve_id) < d_ptr->curves_incident_patches.size(); ++curve_id) { const typename MeshDomain::Surface_patch_index_set& incident_patches = - domain.get_incidences(curve_id); + d_ptr->domain.get_incidences(curve_id); // Fill `curves_incident_patches[curve_id]` - curves_incident_patches[curve_id]. + d_ptr->curves_incident_patches[curve_id]. insert(boost::container::ordered_unique_range, incident_patches.begin(), incident_patches.end()); } - for(const typename Corners_indices::value_type& pair : - corners_indices) - { + for(const typename Corners_indices::value_type& pair : d_ptr->corners_indices) { // Get `corners_incident_curves[corner_id]` - Curves_ids& incident_curves = corners_incident_curves[pair.second]; + Curves_ids& incident_curves = d_ptr->corners_incident_curves[pair.second]; // Fill `corners_incident_patches[corner_id]` - Patches_ids& incident_patches = corners_incident_patches[pair.second]; + Patches_ids& incident_patches = d_ptr->corners_incident_patches[pair.second]; for(Curve_index curve_index : incident_curves) { const Patches_ids& curve_incident_patches = - curves_incident_patches[curve_index]; + d_ptr->curves_incident_patches[curve_index]; incident_patches.insert(boost::container::ordered_unique_range, curve_incident_patches.begin(), curve_incident_patches.end()); @@ -166,6 +228,37 @@ struct Sizing_field_with_aabb_tree } } + boost::optional + closest_point_on_surfaces(const Point_3& p, + const Patches_ids& patch_ids_to_ignore) const + { + boost::optional result{}; + if(d_ptr->aabb_tree.empty()) return result; + for(std::size_t i = 0; i < d_ptr->kd_trees_ptrs.size(); ++i) { + const auto patch_id = static_cast(i + d_ptr->min_patch_id); + if(patch_ids_to_ignore.find(patch_id) != patch_ids_to_ignore.end()) continue; + if(d_ptr->kd_trees_ptrs[i]) { + const Kd_tree& kd_tree = *d_ptr->kd_trees_ptrs[i]; + const Point_and_primitive_id closest_point = kd_tree.closest_point(p); + if(!result || CGAL::compare_distance(p, closest_point.first, result->first) == CGAL::SMALLER) + { + result = closest_point; + } + } + } + if(!result) return result; + CGAL::Mesh_3::Filtered_projection_traits< + AABB_traits, + Facet_patch_id_map + > projection_traits(*result, + patch_ids_to_ignore.begin(), patch_ids_to_ignore.end(), + d_ptr->aabb_tree.traits(), + d_ptr->facet_patch_id_map); + d_ptr->aabb_tree.traversal(p, projection_traits); + result = projection_traits.closest_point_and_primitive(); + return result; + } + double operator()(const Point_3& p, const int dim, const Index& id) const @@ -177,9 +270,9 @@ struct Sizing_field_with_aabb_tree << ", index=#" << CGAL::IO::oformat(id) << "): "; } #endif // CGAL_MESH_3_PROTECTION_HIGH_VERBOSITY - double result = d_; + double result = d_ptr->d_; if(dim == 0) { - if(dt.dimension() < 1) { + if(d_ptr->dt.dimension() < 1) { #ifdef CGAL_MESH_3_PROTECTION_HIGH_VERBOSITY std::cerr << result << "(dt.dimension() < 1)\n"; #endif // CGAL_MESH_3_PROTECTION_HIGH_VERBOSITY @@ -189,15 +282,15 @@ struct Sizing_field_with_aabb_tree typename Dt::Locate_type lt; int li, lj; - const typename Dt::Cell_handle ch = dt.locate(p, lt, li, lj); + const typename Dt::Cell_handle ch = d_ptr->dt.locate(p, lt, li, lj); if(lt == Dt::VERTEX) { // std::cerr << "lt == Dt::VERTEX\n"; const typename Dt::Vertex_handle vh = ch->vertex(li); std::vector vs; vs.reserve(32); - dt.finite_adjacent_vertices(vh, std::back_inserter(vs)); + d_ptr->dt.finite_adjacent_vertices(vh, std::back_inserter(vs)); CGAL_assertion(!vs.empty()); - nearest = dt.point(vs[0]); + nearest = d_ptr->dt.point(vs[0]); // std::cerr << "sq_dist = " << CGAL::squared_distance(p, nearest) // << std::endl; typename Kernel_::Compare_distance_3 compare_dist; @@ -206,44 +299,38 @@ struct Sizing_field_with_aabb_tree { // std::cerr << "sq_dist = " << CGAL::squared_distance(p, dt.point(*it)) // << std::endl; - if(compare_dist(p, dt.point(*it), nearest) == CGAL::SMALLER) { + if(compare_dist(p, d_ptr->dt.point(*it), nearest) == CGAL::SMALLER) { // std::cerr << " nearest!\n"; - nearest = dt.point(*it); + nearest = d_ptr->dt.point(*it); } } } else { // std::cerr << "lt=" << lt << std::endl; - const typename Dt::Vertex_handle vh = dt.nearest_vertex(p, ch); - nearest = dt.point(vh); + const typename Dt::Vertex_handle vh = d_ptr->dt.nearest_vertex(p, ch); + nearest = d_ptr->dt.point(vh); } const FT dist = CGAL_NTS sqrt(CGAL::squared_distance( nearest, p)); // std::cerr << (std::min)(dist / FT(1.5), d_) << "\n"; result = (std::min)(dist / FT(2), result); // now search in the AABB tree - typename Corners_indices::const_iterator ids_it = corners_indices.find(p); - if(ids_it == corners_indices.end()) { + typename Corners_indices::const_iterator ids_it = + d_ptr->corners_indices.find(p); + if(ids_it == d_ptr->corners_indices.end()) { std::cerr << "ERROR at " << __FILE__ << " line " << __LINE__ << "\n"; } - else if(!aabb_tree.empty()) { - const Patches_ids& ids = corners_incident_patches[ids_it->second]; + else if(!d_ptr->aabb_tree.empty()) { + const Patches_ids& ids = d_ptr->corners_incident_patches[ids_it->second]; CGAL_assertion(! ids.empty()); - CGAL::Mesh_3::Filtered_projection_traits< - typename Input_facets_AABB_tree_::AABB_traits, - Facet_patch_id_map - > projection_traits(ids.begin(), ids.end(), - aabb_tree.traits(), - facet_patch_id_map); + const auto closest_point_and_primitive = closest_point_on_surfaces(p, ids); - aabb_tree.traversal(p, projection_traits); - - if(projection_traits.found()) { + if(closest_point_and_primitive != boost::none) { result = (std::min)(0.9 / CGAL::sqrt(CGAL::Mesh_3::internal::weight_modifier) * CGAL_NTS sqrt(CGAL::squared_distance(p, - projection_traits.closest_point())), + closest_point_and_primitive->first)), result); #ifdef CGAL_MESH_3_PROTECTION_HIGH_VERBOSITY { @@ -258,10 +345,10 @@ struct Sizing_field_with_aabb_tree "Ids are { ") % group(setprecision(17),result) % group(setprecision(17),p) - % CGAL::IO::oformat(get(facet_patch_id_map, - projection_traits.closest_point_and_primitive().second)) + % CGAL::IO::oformat(get(d_ptr->facet_patch_id_map, + closest_point_and_primitive->second)) % group(setprecision(17), - projection_traits.closest_point_and_primitive().first); + closest_point_and_primitive->first); for(Patch_index i : ids) { s << CGAL::IO::oformat(i) << " "; } @@ -285,37 +372,33 @@ struct Sizing_field_with_aabb_tree } else { // dim == 1 const typename MeshDomain::Curve_index& curve_id = - domain.curve_index(id); - if(!aabb_tree.empty()) { - const Patches_ids& ids = curves_incident_patches[curve_id]; - CGAL_assertion(! ids.empty()); + d_ptr->domain.curve_index(id); + const Patches_ids& ids = d_ptr->curves_incident_patches[curve_id]; + CGAL_assertion(! ids.empty()); + if(!d_ptr->aabb_tree.empty()) { //Compute distance to surface patches - CGAL::Mesh_3::Filtered_projection_traits - < - typename Input_facets_AABB_tree_::AABB_traits - , Facet_patch_id_map - > projection_traits(ids.begin(), ids.end(), - aabb_tree.traits(), - facet_patch_id_map); - - aabb_tree.traversal(p, projection_traits); - - if(!projection_traits.found()) { + const auto closest_point_and_primitive = closest_point_on_surfaces(p, ids); + if(closest_point_and_primitive == boost::none) { #ifdef CGAL_MESH_3_PROTECTION_HIGH_VERBOSITY - std::cerr << result << " (projection not found)\n"; + std::cerr << result << " (projection not found) ids:"; + for(Patch_index i : ids) { + std::cerr << " " << CGAL::IO::oformat(i); + } + std::cerr << "\n"; + #endif // CGAL_MESH_3_PROTECTION_HIGH_VERBOSITY return result; } - CGAL_assertion(ids.count(get(facet_patch_id_map, - projection_traits.closest_point_and_primitive().second)) == 0); + CGAL_assertion(ids.count(get(d_ptr->facet_patch_id_map, + closest_point_and_primitive->second)) == 0); result = (std::min)(0.9 / CGAL::sqrt(CGAL::Mesh_3::internal::weight_modifier) * CGAL_NTS sqrt(CGAL::squared_distance(p, - projection_traits.closest_point())), + closest_point_and_primitive->first)), result); #ifdef CGAL_MESH_3_PROTECTION_HIGH_VERBOSITY @@ -327,8 +410,8 @@ struct Sizing_field_with_aabb_tree "Closest face id: %4%\n" "Ids are { ") % result % p % curve_id - % CGAL::IO::oformat(get(facet_patch_id_map, - projection_traits.closest_point_and_primitive().second)); + % CGAL::IO::oformat(get(d_ptr->facet_patch_id_map, + closest_point_and_primitive->second)); for(Patch_index i : ids) { s << CGAL::IO::oformat(i) << " "; } @@ -346,8 +429,8 @@ struct Sizing_field_with_aabb_tree "Closest face id: %4%\n" "Ids are { ") % result % p % curve_id - % CGAL::IO::oformat(get(facet_patch_id_map, - projection_traits.closest_point_and_primitive().second)); + % CGAL::IO::oformat(get(d_ptr->facet_patch_id_map, + closest_point_and_primitive->second)); for(Patch_index i : ids) { s << CGAL::IO::oformat(i) << " "; } @@ -362,7 +445,7 @@ struct Sizing_field_with_aabb_tree "Closest face id: %4%\n" "Ids are { ") % result % p % curve_id - % projection_traits.closest_point_and_primitive().second->patch_id(); + % closest_point_and_primitive->second->patch_id(); for(Patch_index i : ids) { s << CGAL::IO::oformat(i) << " "; } @@ -377,25 +460,25 @@ struct Sizing_field_with_aabb_tree CGAL::Mesh_3::Filtered_projection_traits curves_projection_traits(curve_id, - domain.curves_aabb_tree().traits(), - get_curve_index); + d_ptr->domain.curves_aabb_tree().traits(), + d_ptr->get_curve_index); - domain.curves_aabb_tree().traversal(p, curves_projection_traits); + d_ptr->domain.curves_aabb_tree().traversal(p, curves_projection_traits); //Compute distance to the curve on which p lies typedef typename GeomTraits::Segment_3 Segment_3; typedef typename GeomTraits::Plane_3 Plane_3; const typename Input_curves_AABB_tree_::Point_and_primitive_id& ppid - = domain.curves_aabb_tree().closest_point_and_primitive(p); + = d_ptr->domain.curves_aabb_tree().closest_point_and_primitive(p); Segment_3 curr_segment(*ppid.second.second, *(ppid.second.second + 1)); Plane_3 curr_ortho_plane(p, curr_segment.to_vector()/*normal*/); Input_curves_AABB_tree_primitive_ curr_prim(ppid.second); std::vector prims; - domain.curves_aabb_tree().all_intersected_primitives(curr_ortho_plane, - std::back_inserter(prims)); + d_ptr->domain.curves_aabb_tree(). + all_intersected_primitives(curr_ortho_plane, std::back_inserter(prims)); #ifdef CGAL_MESH_3_PROTECTION_HIGH_VERBOSITY std::cerr << std::endl; @@ -421,12 +504,12 @@ struct Sizing_field_with_aabb_tree if (const Point_3* pp = boost::get(&*int_res)) { FT new_sqd = CGAL::squared_distance(p, *pp); - FT gdist = CGAL::abs(domain.signed_geodesic_distance(p, *pp, curve_id)); + FT dist = CGAL::abs(d_ptr->domain.signed_geodesic_distance(p, *pp, curve_id)); #ifdef CGAL_MESH_3_PROTECTION_HIGH_VERBOSITY std::cerr << "Intersection point : Point_3(" << *pp << ") "; std::cerr << "\n new_sqd = " << new_sqd ; - std::cerr << "\n gdist = " << gdist << "\n"; + std::cerr << "\n dist = " << dist << "\n"; #endif if (new_sqd * 1e10 < CGAL::squared_distance(curr_segment.source(), curr_segment.target())) @@ -437,7 +520,7 @@ struct Sizing_field_with_aabb_tree #endif continue; } - if (CGAL_NTS sqrt(new_sqd) > 0.9 * gdist) + if (CGAL_NTS sqrt(new_sqd) > 0.9 * dist) continue; if (sqd_intersection == -1 || new_sqd < sqd_intersection) { @@ -468,7 +551,7 @@ struct Sizing_field_with_aabb_tree #ifdef CGAL_MESH_3_PROTECTION_HIGH_VERBOSITY std::cout << " curve_id = " << curve_id << " proj_cid = " << closest_primitive.id().first->first - << " (" << get(get_curve_index, closest_primitive.id()) << ")" + << " (" << get(d_ptr->get_curve_index, closest_primitive.id()) << ")" << std::endl; std::cerr << " --- domain.curves_aabb_tree().traversal \n"; #endif // CGAL_MESH_3_PROTECTION_HIGH_VERBOSITY @@ -482,7 +565,7 @@ struct Sizing_field_with_aabb_tree double new_result = (std::min)(0.45 / CGAL::sqrt(CGAL::Mesh_3::internal::weight_modifier) * CGAL_NTS sqrt(sqd_intersection), - d_); + d_ptr->d_); #ifdef CGAL_MESH_3_PROTECTION_HIGH_VERBOSITY std::cerr << "result = " << result << "\n"; @@ -515,17 +598,34 @@ struct Sizing_field_with_aabb_tree return result; } private: - typename Kernel_::FT d_; - const Input_facets_AABB_tree_& aabb_tree; - const MeshDomain& domain; - Dt dt; - Corners corners; - Corners_indices corners_indices; - Curves_incident_patches curves_incident_patches; - Corners_incident_patches corners_incident_patches; - Corners_incident_curves corners_incident_curves; - Get_curve_index get_curve_index; - Facet_patch_id_map facet_patch_id_map; + using Kd_tree = CGAL::AABB_search_tree; + struct Private_data { + using FT = typename Kernel_::FT; + Private_data(FT d, const Input_facets_AABB_tree_& aabb_tree, + const MeshDomain& domain, + Get_curve_index get_curve_index, + Facet_patch_id_map facet_patch_id_map) + : d_(d) + , aabb_tree(aabb_tree) + , domain(domain) + , get_curve_index(get_curve_index) + , facet_patch_id_map(facet_patch_id_map) + {} + FT d_; + const Input_facets_AABB_tree_& aabb_tree; + const MeshDomain& domain; + Get_curve_index get_curve_index; + Facet_patch_id_map facet_patch_id_map; + Dt dt{}; + Corners corners{}; + Corners_indices corners_indices{}; + Curves_incident_patches curves_incident_patches{}; + Corners_incident_patches corners_incident_patches{}; + Corners_incident_curves corners_incident_curves{}; + std::vector> kd_trees_ptrs{}; + Patch_index min_patch_id{}; + }; + std::shared_ptr d_ptr; }; #endif // CGAL_MESH_3_SIZING_FIELD_WITH_AABB_TREE_H diff --git a/Mesh_3/include/CGAL/Mesh_3/features_detection/cases_table.h b/Mesh_3/include/CGAL/Mesh_3/features_detection/cases_table.h new file mode 100644 index 00000000000..5510f6061bf --- /dev/null +++ b/Mesh_3/include/CGAL/Mesh_3/features_detection/cases_table.h @@ -0,0 +1,4204 @@ +// Copyright (c) 2022 GeometryFactory (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org). +// +// $URL$ +// $Id$ +// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial +// +// +// Author(s) : Sebastien Loriot +// +//****************************************************************************** +// +//****************************************************************************** + +#ifndef CGAL_MESH_3_FEATURES_DETECTION_CASES_TABLES_H +#define CGAL_MESH_3_FEATURES_DETECTION_CASES_TABLES_H + +#include + +#include +#include +#include +#include +#include + +namespace CGAL +{ +namespace Mesh_3 +{ +namespace internal +{ + +using Combination = std::array; +using Hash_combination = boost::hash; + +using Cases = std::array[4140]; + +inline auto find_case(const Cases& cases, Combination comb) { + using std::begin; + using std::end; + return std::lower_bound(begin(cases), end(cases), + std::array{ + comb[0], + comb[1], + comb[2], + comb[3], + comb[4], + comb[5], + comb[6], + comb[7], + 0, + 0 + }); +}; +const Cases cases = { +{ {0,0,0,0,0,0,0,0, 0,0} }, +{ {0,0,0,0,0,0,0,1, 1,0} }, +{ {0,0,0,0,0,0,1,0, 1,1} }, +{ {0,0,0,0,0,0,1,1, 2,0} }, +{ {0,0,0,0,0,0,1,2, 3,0} }, +{ {0,0,0,0,0,1,0,0, 1,6} }, +{ {0,0,0,0,0,1,0,1, 2,18} }, +{ {0,0,0,0,0,1,0,2, 3,19} }, +{ {0,0,0,0,0,1,1,0, 4,0} }, +{ {0,0,0,0,0,1,1,1, 5,0} }, +{ {0,0,0,0,0,1,1,2, 6,0} }, +{ {0,0,0,0,0,1,2,0, 7,0} }, +{ {0,0,0,0,0,1,2,1, 8,0} }, +{ {0,0,0,0,0,1,2,2, 8,19} }, +{ {0,0,0,0,0,1,2,3, 58,0} }, +{ {0,0,0,0,1,0,0,0, 1,7} }, +{ {0,0,0,0,1,0,0,1, 4,1} }, +{ {0,0,0,0,1,0,0,2, 7,1} }, +{ {0,0,0,0,1,0,1,0, 2,15} }, +{ {0,0,0,0,1,0,1,1, 5,1} }, +{ {0,0,0,0,1,0,1,2, 8,1} }, +{ {0,0,0,0,1,0,2,0, 3,14} }, +{ {0,0,0,0,1,0,2,1, 6,1} }, +{ {0,0,0,0,1,0,2,2, 8,14} }, +{ {0,0,0,0,1,0,2,3, 58,1} }, +{ {0,0,0,0,1,1,0,0, 2,6} }, +{ {0,0,0,0,1,1,0,1, 5,18} }, +{ {0,0,0,0,1,1,0,2, 8,18} }, +{ {0,0,0,0,1,1,1,0, 5,15} }, +{ {0,0,0,0,1,1,1,1, 9,0} }, +{ {0,0,0,0,1,1,1,2, 10,0} }, +{ {0,0,0,0,1,1,2,0, 8,15} }, +{ {0,0,0,0,1,1,2,1, 10,1} }, +{ {0,0,0,0,1,1,2,2, 11,0} }, +{ {0,0,0,0,1,1,2,3, 59,0} }, +{ {0,0,0,0,1,2,0,0, 3,6} }, +{ {0,0,0,0,1,2,0,1, 6,18} }, +{ {0,0,0,0,1,2,0,2, 8,17} }, +{ {0,0,0,0,1,2,0,3, 58,18} }, +{ {0,0,0,0,1,2,1,0, 8,16} }, +{ {0,0,0,0,1,2,1,1, 10,18} }, +{ {0,0,0,0,1,2,1,2, 11,18} }, +{ {0,0,0,0,1,2,1,3, 59,19} }, +{ {0,0,0,0,1,2,2,0, 6,15} }, +{ {0,0,0,0,1,2,2,1, 12,0} }, +{ {0,0,0,0,1,2,2,2, 10,15} }, +{ {0,0,0,0,1,2,2,3, 60,0} }, +{ {0,0,0,0,1,2,3,0, 58,15} }, +{ {0,0,0,0,1,2,3,1, 60,1} }, +{ {0,0,0,0,1,2,3,2, 59,14} }, +{ {0,0,0,0,1,2,3,3, 59,17} }, +{ {0,0,0,0,1,2,3,4, 124,0} }, +{ {0,0,0,1,0,0,0,0, 1,2} }, +{ {0,0,0,1,0,0,0,1, 2,12} }, +{ {0,0,0,1,0,0,0,2, 3,13} }, +{ {0,0,0,1,0,0,1,0, 4,3} }, +{ {0,0,0,1,0,0,1,1, 5,21} }, +{ {0,0,0,1,0,0,1,2, 6,21} }, +{ {0,0,0,1,0,0,2,0, 7,21} }, +{ {0,0,0,1,0,0,2,1, 8,21} }, +{ {0,0,0,1,0,0,2,2, 8,32} }, +{ {0,0,0,1,0,0,2,3, 58,21} }, +{ {0,0,0,1,0,1,0,0, 4,13} }, +{ {0,0,0,1,0,1,0,1, 5,13} }, +{ {0,0,0,1,0,1,0,2, 6,13} }, +{ {0,0,0,1,0,1,1,0, 13,0} }, +{ {0,0,0,1,0,1,1,1, 14,0} }, +{ {0,0,0,1,0,1,1,2, 15,0} }, +{ {0,0,0,1,0,1,2,0, 16,0} }, +{ {0,0,0,1,0,1,2,1, 17,0} }, +{ {0,0,0,1,0,1,2,2, 18,0} }, +{ {0,0,0,1,0,1,2,3, 61,0} }, +{ {0,0,0,1,0,2,0,0, 7,27} }, +{ {0,0,0,1,0,2,0,1, 8,40} }, +{ {0,0,0,1,0,2,0,2, 8,13} }, +{ {0,0,0,1,0,2,0,3, 58,40} }, +{ {0,0,0,1,0,2,1,0, 16,19} }, +{ {0,0,0,1,0,2,1,1, 17,19} }, +{ {0,0,0,1,0,2,1,2, 18,19} }, +{ {0,0,0,1,0,2,1,3, 61,19} }, +{ {0,0,0,1,0,2,2,0, 16,13} }, +{ {0,0,0,1,0,2,2,1, 18,13} }, +{ {0,0,0,1,0,2,2,2, 17,13} }, +{ {0,0,0,1,0,2,2,3, 61,13} }, +{ {0,0,0,1,0,2,3,0, 62,0} }, +{ {0,0,0,1,0,2,3,1, 63,0} }, +{ {0,0,0,1,0,2,3,2, 63,21} }, +{ {0,0,0,1,0,2,3,3, 63,40} }, +{ {0,0,0,1,0,2,3,4, 125,0} }, +{ {0,0,0,1,1,0,0,0, 19,0} }, +{ {0,0,0,1,1,0,0,1, 20,0} }, +{ {0,0,0,1,1,0,0,2, 21,0} }, +{ {0,0,0,1,1,0,1,0, 20,20} }, +{ {0,0,0,1,1,0,1,1, 22,0} }, +{ {0,0,0,1,1,0,1,2, 23,0} }, +{ {0,0,0,1,1,0,2,0, 21,20} }, +{ {0,0,0,1,1,0,2,1, 23,20} }, +{ {0,0,0,1,1,0,2,2, 24,0} }, +{ {0,0,0,1,1,0,2,3, 64,0} }, +{ {0,0,0,1,1,1,0,0, 20,26} }, +{ {0,0,0,1,1,1,0,1, 22,19} }, +{ {0,0,0,1,1,1,0,2, 23,19} }, +{ {0,0,0,1,1,1,1,0, 25,0} }, +{ {0,0,0,1,1,1,1,1, 5,5} }, +{ {0,0,0,1,1,1,1,2, 26,0} }, +{ {0,0,0,1,1,1,2,0, 27,0} }, +{ {0,0,0,1,1,1,2,1, 28,0} }, +{ {0,0,0,1,1,1,2,2, 29,0} }, +{ {0,0,0,1,1,1,2,3, 65,0} }, +{ {0,0,0,1,1,2,0,0, 21,26} }, +{ {0,0,0,1,1,2,0,1, 23,41} }, +{ {0,0,0,1,1,2,0,2, 24,19} }, +{ {0,0,0,1,1,2,0,3, 64,19} }, +{ {0,0,0,1,1,2,1,0, 27,19} }, +{ {0,0,0,1,1,2,1,1, 28,19} }, +{ {0,0,0,1,1,2,1,2, 29,19} }, +{ {0,0,0,1,1,2,1,3, 65,19} }, +{ {0,0,0,1,1,2,2,0, 30,0} }, +{ {0,0,0,1,1,2,2,1, 31,0} }, +{ {0,0,0,1,1,2,2,2, 32,0} }, +{ {0,0,0,1,1,2,2,3, 66,0} }, +{ {0,0,0,1,1,2,3,0, 67,0} }, +{ {0,0,0,1,1,2,3,1, 68,0} }, +{ {0,0,0,1,1,2,3,2, 69,0} }, +{ {0,0,0,1,1,2,3,3, 69,19} }, +{ {0,0,0,1,1,2,3,4, 126,0} }, +{ {0,0,0,1,2,0,0,0, 33,0} }, +{ {0,0,0,1,2,0,0,1, 34,0} }, +{ {0,0,0,1,2,0,0,2, 35,0} }, +{ {0,0,0,1,2,0,0,3, 70,0} }, +{ {0,0,0,1,2,0,1,0, 35,20} }, +{ {0,0,0,1,2,0,1,1, 28,39} }, +{ {0,0,0,1,2,0,1,2, 36,0} }, +{ {0,0,0,1,2,0,1,3, 71,0} }, +{ {0,0,0,1,2,0,2,0, 34,20} }, +{ {0,0,0,1,2,0,2,1, 37,0} }, +{ {0,0,0,1,2,0,2,2, 28,29} }, +{ {0,0,0,1,2,0,2,3, 72,0} }, +{ {0,0,0,1,2,0,3,0, 70,20} }, +{ {0,0,0,1,2,0,3,1, 72,20} }, +{ {0,0,0,1,2,0,3,2, 71,20} }, +{ {0,0,0,1,2,0,3,3, 73,0} }, +{ {0,0,0,1,2,0,3,4, 127,0} }, +{ {0,0,0,1,2,1,0,0, 35,26} }, +{ {0,0,0,1,2,1,0,1, 28,22} }, +{ {0,0,0,1,2,1,0,2, 36,19} }, +{ {0,0,0,1,2,1,0,3, 71,19} }, +{ {0,0,0,1,2,1,1,0, 38,0} }, +{ {0,0,0,1,2,1,1,1, 17,22} }, +{ {0,0,0,1,2,1,1,2, 39,0} }, +{ {0,0,0,1,2,1,1,3, 74,0} }, +{ {0,0,0,1,2,1,2,0, 40,0} }, +{ {0,0,0,1,2,1,2,1, 41,0} }, +{ {0,0,0,1,2,1,2,2, 42,0} }, +{ {0,0,0,1,2,1,2,3, 75,0} }, +{ {0,0,0,1,2,1,3,0, 76,0} }, +{ {0,0,0,1,2,1,3,1, 77,0} }, +{ {0,0,0,1,2,1,3,2, 78,0} }, +{ {0,0,0,1,2,1,3,3, 79,0} }, +{ {0,0,0,1,2,1,3,4, 128,0} }, +{ {0,0,0,1,2,2,0,0, 34,26} }, +{ {0,0,0,1,2,2,0,1, 37,19} }, +{ {0,0,0,1,2,2,0,2, 28,10} }, +{ {0,0,0,1,2,2,0,3, 72,19} }, +{ {0,0,0,1,2,2,1,0, 40,19} }, +{ {0,0,0,1,2,2,1,1, 41,19} }, +{ {0,0,0,1,2,2,1,2, 42,19} }, +{ {0,0,0,1,2,2,1,3, 75,19} }, +{ {0,0,0,1,2,2,2,0, 26,11} }, +{ {0,0,0,1,2,2,2,1, 43,0} }, +{ {0,0,0,1,2,2,2,2, 10,11} }, +{ {0,0,0,1,2,2,2,3, 80,0} }, +{ {0,0,0,1,2,2,3,0, 81,0} }, +{ {0,0,0,1,2,2,3,1, 82,0} }, +{ {0,0,0,1,2,2,3,2, 83,0} }, +{ {0,0,0,1,2,2,3,3, 84,0} }, +{ {0,0,0,1,2,2,3,4, 129,0} }, +{ {0,0,0,1,2,3,0,0, 70,26} }, +{ {0,0,0,1,2,3,0,1, 72,41} }, +{ {0,0,0,1,2,3,0,2, 71,41} }, +{ {0,0,0,1,2,3,0,3, 73,19} }, +{ {0,0,0,1,2,3,0,4, 127,19} }, +{ {0,0,0,1,2,3,1,0, 76,19} }, +{ {0,0,0,1,2,3,1,1, 77,19} }, +{ {0,0,0,1,2,3,1,2, 78,19} }, +{ {0,0,0,1,2,3,1,3, 79,19} }, +{ {0,0,0,1,2,3,1,4, 128,19} }, +{ {0,0,0,1,2,3,2,0, 81,19} }, +{ {0,0,0,1,2,3,2,1, 82,19} }, +{ {0,0,0,1,2,3,2,2, 83,19} }, +{ {0,0,0,1,2,3,2,3, 84,19} }, +{ {0,0,0,1,2,3,2,4, 129,19} }, +{ {0,0,0,1,2,3,3,0, 85,0} }, +{ {0,0,0,1,2,3,3,1, 86,0} }, +{ {0,0,0,1,2,3,3,2, 87,0} }, +{ {0,0,0,1,2,3,3,3, 88,0} }, +{ {0,0,0,1,2,3,3,4, 130,0} }, +{ {0,0,0,1,2,3,4,0, 131,0} }, +{ {0,0,0,1,2,3,4,1, 132,0} }, +{ {0,0,0,1,2,3,4,2, 133,0} }, +{ {0,0,0,1,2,3,4,3, 134,0} }, +{ {0,0,0,1,2,3,4,4, 134,19} }, +{ {0,0,0,1,2,3,4,5, 167,0} }, +{ {0,0,1,0,0,0,0,0, 1,3} }, +{ {0,0,1,0,0,0,0,1, 4,2} }, +{ {0,0,1,0,0,0,0,2, 7,20} }, +{ {0,0,1,0,0,0,1,0, 2,9} }, +{ {0,0,1,0,0,0,1,1, 5,20} }, +{ {0,0,1,0,0,0,1,2, 8,20} }, +{ {0,0,1,0,0,0,2,0, 3,8} }, +{ {0,0,1,0,0,0,2,1, 6,20} }, +{ {0,0,1,0,0,0,2,2, 8,43} }, +{ {0,0,1,0,0,0,2,3, 58,20} }, +{ {0,0,1,0,0,1,0,0, 19,1} }, +{ {0,0,1,0,0,1,0,1, 20,21} }, +{ {0,0,1,0,0,1,0,2, 21,21} }, +{ {0,0,1,0,0,1,1,0, 20,1} }, +{ {0,0,1,0,0,1,1,1, 22,1} }, +{ {0,0,1,0,0,1,1,2, 23,21} }, +{ {0,0,1,0,0,1,2,0, 21,1} }, +{ {0,0,1,0,0,1,2,1, 23,1} }, +{ {0,0,1,0,0,1,2,2, 24,1} }, +{ {0,0,1,0,0,1,2,3, 64,21} }, +{ {0,0,1,0,0,2,0,0, 33,1} }, +{ {0,0,1,0,0,2,0,1, 35,21} }, +{ {0,0,1,0,0,2,0,2, 34,21} }, +{ {0,0,1,0,0,2,0,3, 70,21} }, +{ {0,0,1,0,0,2,1,0, 34,1} }, +{ {0,0,1,0,0,2,1,1, 28,44} }, +{ {0,0,1,0,0,2,1,2, 37,1} }, +{ {0,0,1,0,0,2,1,3, 72,21} }, +{ {0,0,1,0,0,2,2,0, 35,1} }, +{ {0,0,1,0,0,2,2,1, 36,1} }, +{ {0,0,1,0,0,2,2,2, 28,30} }, +{ {0,0,1,0,0,2,2,3, 71,21} }, +{ {0,0,1,0,0,2,3,0, 70,1} }, +{ {0,0,1,0,0,2,3,1, 71,1} }, +{ {0,0,1,0,0,2,3,2, 72,1} }, +{ {0,0,1,0,0,2,3,3, 73,1} }, +{ {0,0,1,0,0,2,3,4, 127,21} }, +{ {0,0,1,0,1,0,0,0, 4,8} }, +{ {0,0,1,0,1,0,0,1, 13,1} }, +{ {0,0,1,0,1,0,0,2, 16,1} }, +{ {0,0,1,0,1,0,1,0, 5,8} }, +{ {0,0,1,0,1,0,1,1, 14,1} }, +{ {0,0,1,0,1,0,1,2, 17,1} }, +{ {0,0,1,0,1,0,2,0, 6,8} }, +{ {0,0,1,0,1,0,2,1, 15,1} }, +{ {0,0,1,0,1,0,2,2, 18,1} }, +{ {0,0,1,0,1,0,2,3, 61,1} }, +{ {0,0,1,0,1,1,0,0, 20,23} }, +{ {0,0,1,0,1,1,0,1, 25,1} }, +{ {0,0,1,0,1,1,0,2, 27,1} }, +{ {0,0,1,0,1,1,1,0, 22,14} }, +{ {0,0,1,0,1,1,1,1, 5,4} }, +{ {0,0,1,0,1,1,1,2, 28,1} }, +{ {0,0,1,0,1,1,2,0, 23,14} }, +{ {0,0,1,0,1,1,2,1, 26,1} }, +{ {0,0,1,0,1,1,2,2, 29,1} }, +{ {0,0,1,0,1,1,2,3, 65,1} }, +{ {0,0,1,0,1,2,0,0, 35,23} }, +{ {0,0,1,0,1,2,0,1, 38,1} }, +{ {0,0,1,0,1,2,0,2, 40,1} }, +{ {0,0,1,0,1,2,0,3, 76,1} }, +{ {0,0,1,0,1,2,1,0, 28,27} }, +{ {0,0,1,0,1,2,1,1, 17,27} }, +{ {0,0,1,0,1,2,1,2, 41,1} }, +{ {0,0,1,0,1,2,1,3, 77,1} }, +{ {0,0,1,0,1,2,2,0, 36,14} }, +{ {0,0,1,0,1,2,2,1, 39,1} }, +{ {0,0,1,0,1,2,2,2, 42,1} }, +{ {0,0,1,0,1,2,2,3, 78,1} }, +{ {0,0,1,0,1,2,3,0, 71,14} }, +{ {0,0,1,0,1,2,3,1, 74,1} }, +{ {0,0,1,0,1,2,3,2, 75,1} }, +{ {0,0,1,0,1,2,3,3, 79,1} }, +{ {0,0,1,0,1,2,3,4, 128,1} }, +{ {0,0,1,0,2,0,0,0, 7,22} }, +{ {0,0,1,0,2,0,0,1, 16,14} }, +{ {0,0,1,0,2,0,0,2, 16,8} }, +{ {0,0,1,0,2,0,0,3, 62,1} }, +{ {0,0,1,0,2,0,1,0, 8,35} }, +{ {0,0,1,0,2,0,1,1, 17,14} }, +{ {0,0,1,0,2,0,1,2, 18,8} }, +{ {0,0,1,0,2,0,1,3, 63,1} }, +{ {0,0,1,0,2,0,2,0, 8,8} }, +{ {0,0,1,0,2,0,2,1, 18,14} }, +{ {0,0,1,0,2,0,2,2, 17,8} }, +{ {0,0,1,0,2,0,2,3, 63,20} }, +{ {0,0,1,0,2,0,3,0, 58,35} }, +{ {0,0,1,0,2,0,3,1, 61,14} }, +{ {0,0,1,0,2,0,3,2, 61,8} }, +{ {0,0,1,0,2,0,3,3, 63,35} }, +{ {0,0,1,0,2,0,3,4, 125,1} }, +{ {0,0,1,0,2,1,0,0, 21,23} }, +{ {0,0,1,0,2,1,0,1, 27,14} }, +{ {0,0,1,0,2,1,0,2, 30,1} }, +{ {0,0,1,0,2,1,0,3, 67,1} }, +{ {0,0,1,0,2,1,1,0, 23,34} }, +{ {0,0,1,0,2,1,1,1, 28,14} }, +{ {0,0,1,0,2,1,1,2, 31,1} }, +{ {0,0,1,0,2,1,1,3, 68,1} }, +{ {0,0,1,0,2,1,2,0, 24,14} }, +{ {0,0,1,0,2,1,2,1, 29,14} }, +{ {0,0,1,0,2,1,2,2, 32,1} }, +{ {0,0,1,0,2,1,2,3, 69,1} }, +{ {0,0,1,0,2,1,3,0, 64,14} }, +{ {0,0,1,0,2,1,3,1, 65,14} }, +{ {0,0,1,0,2,1,3,2, 66,1} }, +{ {0,0,1,0,2,1,3,3, 69,14} }, +{ {0,0,1,0,2,1,3,4, 126,1} }, +{ {0,0,1,0,2,2,0,0, 34,23} }, +{ {0,0,1,0,2,2,0,1, 40,14} }, +{ {0,0,1,0,2,2,0,2, 26,10} }, +{ {0,0,1,0,2,2,0,3, 81,1} }, +{ {0,0,1,0,2,2,1,0, 37,14} }, +{ {0,0,1,0,2,2,1,1, 41,14} }, +{ {0,0,1,0,2,2,1,2, 43,1} }, +{ {0,0,1,0,2,2,1,3, 82,1} }, +{ {0,0,1,0,2,2,2,0, 28,11} }, +{ {0,0,1,0,2,2,2,1, 42,14} }, +{ {0,0,1,0,2,2,2,2, 10,10} }, +{ {0,0,1,0,2,2,2,3, 83,1} }, +{ {0,0,1,0,2,2,3,0, 72,14} }, +{ {0,0,1,0,2,2,3,1, 75,14} }, +{ {0,0,1,0,2,2,3,2, 80,1} }, +{ {0,0,1,0,2,2,3,3, 84,1} }, +{ {0,0,1,0,2,2,3,4, 129,1} }, +{ {0,0,1,0,2,3,0,0, 70,23} }, +{ {0,0,1,0,2,3,0,1, 76,14} }, +{ {0,0,1,0,2,3,0,2, 85,1} }, +{ {0,0,1,0,2,3,0,3, 81,14} }, +{ {0,0,1,0,2,3,0,4, 131,1} }, +{ {0,0,1,0,2,3,1,0, 72,34} }, +{ {0,0,1,0,2,3,1,1, 77,44} }, +{ {0,0,1,0,2,3,1,2, 86,1} }, +{ {0,0,1,0,2,3,1,3, 82,14} }, +{ {0,0,1,0,2,3,1,4, 132,1} }, +{ {0,0,1,0,2,3,2,0, 73,14} }, +{ {0,0,1,0,2,3,2,1, 79,14} }, +{ {0,0,1,0,2,3,2,2, 88,1} }, +{ {0,0,1,0,2,3,2,3, 84,14} }, +{ {0,0,1,0,2,3,2,4, 134,1} }, +{ {0,0,1,0,2,3,3,0, 71,34} }, +{ {0,0,1,0,2,3,3,1, 78,14} }, +{ {0,0,1,0,2,3,3,2, 87,1} }, +{ {0,0,1,0,2,3,3,3, 83,14} }, +{ {0,0,1,0,2,3,3,4, 133,1} }, +{ {0,0,1,0,2,3,4,0, 127,14} }, +{ {0,0,1,0,2,3,4,1, 128,14} }, +{ {0,0,1,0,2,3,4,2, 130,1} }, +{ {0,0,1,0,2,3,4,3, 129,14} }, +{ {0,0,1,0,2,3,4,4, 134,14} }, +{ {0,0,1,0,2,3,4,5, 167,1} }, +{ {0,0,1,1,0,0,0,0, 2,2} }, +{ {0,0,1,1,0,0,0,1, 5,2} }, +{ {0,0,1,1,0,0,0,2, 8,33} }, +{ {0,0,1,1,0,0,1,0, 5,3} }, +{ {0,0,1,1,0,0,1,1, 9,2} }, +{ {0,0,1,1,0,0,1,2, 10,21} }, +{ {0,0,1,1,0,0,2,0, 8,42} }, +{ {0,0,1,1,0,0,2,1, 10,20} }, +{ {0,0,1,1,0,0,2,2, 11,20} }, +{ {0,0,1,1,0,0,2,3, 59,21} }, +{ {0,0,1,1,0,1,0,0, 20,12} }, +{ {0,0,1,1,0,1,0,1, 22,12} }, +{ {0,0,1,1,0,1,0,2, 23,32} }, +{ {0,0,1,1,0,1,1,0, 25,21} }, +{ {0,0,1,1,0,1,1,1, 5,24} }, +{ {0,0,1,1,0,1,1,2, 26,21} }, +{ {0,0,1,1,0,1,2,0, 27,21} }, +{ {0,0,1,1,0,1,2,1, 28,21} }, +{ {0,0,1,1,0,1,2,2, 29,21} }, +{ {0,0,1,1,0,1,2,3, 65,21} }, +{ {0,0,1,1,0,2,0,0, 34,12} }, +{ {0,0,1,1,0,2,0,1, 28,7} }, +{ {0,0,1,1,0,2,0,2, 37,12} }, +{ {0,0,1,1,0,2,0,3, 72,32} }, +{ {0,0,1,1,0,2,1,0, 26,6} }, +{ {0,0,1,1,0,2,1,1, 10,6} }, +{ {0,0,1,1,0,2,1,2, 43,21} }, +{ {0,0,1,1,0,2,1,3, 80,21} }, +{ {0,0,1,1,0,2,2,0, 40,32} }, +{ {0,0,1,1,0,2,2,1, 42,32} }, +{ {0,0,1,1,0,2,2,2, 41,32} }, +{ {0,0,1,1,0,2,2,3, 75,32} }, +{ {0,0,1,1,0,2,3,0, 81,21} }, +{ {0,0,1,1,0,2,3,1, 83,21} }, +{ {0,0,1,1,0,2,3,2, 82,21} }, +{ {0,0,1,1,0,2,3,3, 84,21} }, +{ {0,0,1,1,0,2,3,4, 129,21} }, +{ {0,0,1,1,1,0,0,0, 20,9} }, +{ {0,0,1,1,1,0,0,1, 25,20} }, +{ {0,0,1,1,1,0,0,2, 27,20} }, +{ {0,0,1,1,1,0,1,0, 22,9} }, +{ {0,0,1,1,1,0,1,1, 5,25} }, +{ {0,0,1,1,1,0,1,2, 28,20} }, +{ {0,0,1,1,1,0,2,0, 23,43} }, +{ {0,0,1,1,1,0,2,1, 26,20} }, +{ {0,0,1,1,1,0,2,2, 29,20} }, +{ {0,0,1,1,1,0,2,3, 65,20} }, +{ {0,0,1,1,1,1,0,0, 44,0} }, +{ {0,0,1,1,1,1,0,1, 20,22} }, +{ {0,0,1,1,1,1,0,2, 45,0} }, +{ {0,0,1,1,1,1,1,0, 20,27} }, +{ {0,0,1,1,1,1,1,1, 2,4} }, +{ {0,0,1,1,1,1,1,2, 34,27} }, +{ {0,0,1,1,1,1,2,0, 45,1} }, +{ {0,0,1,1,1,1,2,1, 34,22} }, +{ {0,0,1,1,1,1,2,2, 46,0} }, +{ {0,0,1,1,1,1,2,3, 89,0} }, +{ {0,0,1,1,1,2,0,0, 45,6} }, +{ {0,0,1,1,1,2,0,1, 27,7} }, +{ {0,0,1,1,1,2,0,2, 47,0} }, +{ {0,0,1,1,1,2,0,3, 90,0} }, +{ {0,0,1,1,1,2,1,0, 23,45} }, +{ {0,0,1,1,1,2,1,1, 8,44} }, +{ {0,0,1,1,1,2,1,2, 37,27} }, +{ {0,0,1,1,1,2,1,3, 72,45} }, +{ {0,0,1,1,1,2,2,0, 48,0} }, +{ {0,0,1,1,1,2,2,1, 40,38} }, +{ {0,0,1,1,1,2,2,2, 29,5} }, +{ {0,0,1,1,1,2,2,3, 91,0} }, +{ {0,0,1,1,1,2,3,0, 92,0} }, +{ {0,0,1,1,1,2,3,1, 81,7} }, +{ {0,0,1,1,1,2,3,2, 93,0} }, +{ {0,0,1,1,1,2,3,3, 94,0} }, +{ {0,0,1,1,1,2,3,4, 135,0} }, +{ {0,0,1,1,2,0,0,0, 34,9} }, +{ {0,0,1,1,2,0,0,1, 26,7} }, +{ {0,0,1,1,2,0,0,2, 40,43} }, +{ {0,0,1,1,2,0,0,3, 81,20} }, +{ {0,0,1,1,2,0,1,0, 28,6} }, +{ {0,0,1,1,2,0,1,1, 10,7} }, +{ {0,0,1,1,2,0,1,2, 42,43} }, +{ {0,0,1,1,2,0,1,3, 83,20} }, +{ {0,0,1,1,2,0,2,0, 37,9} }, +{ {0,0,1,1,2,0,2,1, 43,20} }, +{ {0,0,1,1,2,0,2,2, 41,43} }, +{ {0,0,1,1,2,0,2,3, 82,20} }, +{ {0,0,1,1,2,0,3,0, 72,43} }, +{ {0,0,1,1,2,0,3,1, 80,20} }, +{ {0,0,1,1,2,0,3,2, 75,43} }, +{ {0,0,1,1,2,0,3,3, 84,20} }, +{ {0,0,1,1,2,0,3,4, 129,20} }, +{ {0,0,1,1,2,1,0,0, 45,7} }, +{ {0,0,1,1,2,1,0,1, 23,38} }, +{ {0,0,1,1,2,1,0,2, 48,1} }, +{ {0,0,1,1,2,1,0,3, 92,1} }, +{ {0,0,1,1,2,1,1,0, 27,6} }, +{ {0,0,1,1,2,1,1,1, 8,39} }, +{ {0,0,1,1,2,1,1,2, 40,45} }, +{ {0,0,1,1,2,1,1,3, 81,6} }, +{ {0,0,1,1,2,1,2,0, 47,1} }, +{ {0,0,1,1,2,1,2,1, 37,22} }, +{ {0,0,1,1,2,1,2,2, 29,4} }, +{ {0,0,1,1,2,1,2,3, 93,1} }, +{ {0,0,1,1,2,1,3,0, 90,1} }, +{ {0,0,1,1,2,1,3,1, 72,38} }, +{ {0,0,1,1,2,1,3,2, 91,1} }, +{ {0,0,1,1,2,1,3,3, 94,1} }, +{ {0,0,1,1,2,1,3,4, 135,1} }, +{ {0,0,1,1,2,2,0,0, 46,6} }, +{ {0,0,1,1,2,2,0,1, 29,7} }, +{ {0,0,1,1,2,2,0,2, 29,10} }, +{ {0,0,1,1,2,2,0,3, 94,17} }, +{ {0,0,1,1,2,2,1,0, 29,6} }, +{ {0,0,1,1,2,2,1,1, 11,6} }, +{ {0,0,1,1,2,2,1,2, 41,45} }, +{ {0,0,1,1,2,2,1,3, 84,6} }, +{ {0,0,1,1,2,2,2,0, 29,11} }, +{ {0,0,1,1,2,2,2,1, 41,38} }, +{ {0,0,1,1,2,2,2,2, 11,10} }, +{ {0,0,1,1,2,2,2,3, 84,11} }, +{ {0,0,1,1,2,2,3,0, 94,16} }, +{ {0,0,1,1,2,2,3,1, 84,7} }, +{ {0,0,1,1,2,2,3,2, 84,10} }, +{ {0,0,1,1,2,2,3,3, 95,0} }, +{ {0,0,1,1,2,2,3,4, 136,0} }, +{ {0,0,1,1,2,3,0,0, 89,6} }, +{ {0,0,1,1,2,3,0,1, 65,7} }, +{ {0,0,1,1,2,3,0,2, 91,17} }, +{ {0,0,1,1,2,3,0,3, 93,17} }, +{ {0,0,1,1,2,3,0,4, 135,17} }, +{ {0,0,1,1,2,3,1,0, 65,6} }, +{ {0,0,1,1,2,3,1,1, 59,6} }, +{ {0,0,1,1,2,3,1,2, 75,45} }, +{ {0,0,1,1,2,3,1,3, 82,6} }, +{ {0,0,1,1,2,3,1,4, 129,6} }, +{ {0,0,1,1,2,3,2,0, 93,16} }, +{ {0,0,1,1,2,3,2,1, 82,7} }, +{ {0,0,1,1,2,3,2,2, 84,4} }, +{ {0,0,1,1,2,3,2,3, 96,0} }, +{ {0,0,1,1,2,3,2,4, 137,0} }, +{ {0,0,1,1,2,3,3,0, 91,16} }, +{ {0,0,1,1,2,3,3,1, 75,38} }, +{ {0,0,1,1,2,3,3,2, 97,0} }, +{ {0,0,1,1,2,3,3,3, 84,5} }, +{ {0,0,1,1,2,3,3,4, 138,0} }, +{ {0,0,1,1,2,3,4,0, 135,16} }, +{ {0,0,1,1,2,3,4,1, 129,7} }, +{ {0,0,1,1,2,3,4,2, 138,1} }, +{ {0,0,1,1,2,3,4,3, 137,1} }, +{ {0,0,1,1,2,3,4,4, 136,17} }, +{ {0,0,1,1,2,3,4,5, 168,0} }, +{ {0,0,1,2,0,0,0,0, 3,2} }, +{ {0,0,1,2,0,0,0,1, 6,2} }, +{ {0,0,1,2,0,0,0,2, 8,2} }, +{ {0,0,1,2,0,0,0,3, 58,33} }, +{ {0,0,1,2,0,0,1,0, 8,3} }, +{ {0,0,1,2,0,0,1,1, 10,2} }, +{ {0,0,1,2,0,0,1,2, 11,33} }, +{ {0,0,1,2,0,0,1,3, 59,32} }, +{ {0,0,1,2,0,0,2,0, 6,3} }, +{ {0,0,1,2,0,0,2,1, 12,3} }, +{ {0,0,1,2,0,0,2,2, 10,3} }, +{ {0,0,1,2,0,0,2,3, 60,21} }, +{ {0,0,1,2,0,0,3,0, 58,42} }, +{ {0,0,1,2,0,0,3,1, 60,20} }, +{ {0,0,1,2,0,0,3,2, 59,43} }, +{ {0,0,1,2,0,0,3,3, 59,2} }, +{ {0,0,1,2,0,0,3,4, 124,21} }, +{ {0,0,1,2,0,1,0,0, 21,12} }, +{ {0,0,1,2,0,1,0,1, 23,12} }, +{ {0,0,1,2,0,1,0,2, 24,12} }, +{ {0,0,1,2,0,1,0,3, 64,32} }, +{ {0,0,1,2,0,1,1,0, 27,32} }, +{ {0,0,1,2,0,1,1,1, 28,32} }, +{ {0,0,1,2,0,1,1,2, 29,32} }, +{ {0,0,1,2,0,1,1,3, 65,32} }, +{ {0,0,1,2,0,1,2,0, 30,21} }, +{ {0,0,1,2,0,1,2,1, 31,21} }, +{ {0,0,1,2,0,1,2,2, 32,21} }, +{ {0,0,1,2,0,1,2,3, 66,21} }, +{ {0,0,1,2,0,1,3,0, 67,21} }, +{ {0,0,1,2,0,1,3,1, 68,21} }, +{ {0,0,1,2,0,1,3,2, 69,21} }, +{ {0,0,1,2,0,1,3,3, 69,32} }, +{ {0,0,1,2,0,1,3,4, 126,21} }, +{ {0,0,1,2,0,2,0,0, 35,12} }, +{ {0,0,1,2,0,2,0,1, 36,12} }, +{ {0,0,1,2,0,2,0,2, 28,37} }, +{ {0,0,1,2,0,2,0,3, 71,32} }, +{ {0,0,1,2,0,2,1,0, 40,21} }, +{ {0,0,1,2,0,2,1,1, 42,21} }, +{ {0,0,1,2,0,2,1,2, 41,21} }, +{ {0,0,1,2,0,2,1,3, 75,21} }, +{ {0,0,1,2,0,2,2,0, 38,21} }, +{ {0,0,1,2,0,2,2,1, 39,21} }, +{ {0,0,1,2,0,2,2,2, 17,30} }, +{ {0,0,1,2,0,2,2,3, 74,21} }, +{ {0,0,1,2,0,2,3,0, 76,21} }, +{ {0,0,1,2,0,2,3,1, 78,21} }, +{ {0,0,1,2,0,2,3,2, 77,21} }, +{ {0,0,1,2,0,2,3,3, 79,21} }, +{ {0,0,1,2,0,2,3,4, 128,21} }, +{ {0,0,1,2,0,3,0,0, 70,12} }, +{ {0,0,1,2,0,3,0,1, 71,12} }, +{ {0,0,1,2,0,3,0,2, 73,12} }, +{ {0,0,1,2,0,3,0,3, 72,12} }, +{ {0,0,1,2,0,3,0,4, 127,32} }, +{ {0,0,1,2,0,3,1,0, 81,32} }, +{ {0,0,1,2,0,3,1,1, 83,44} }, +{ {0,0,1,2,0,3,1,2, 84,32} }, +{ {0,0,1,2,0,3,1,3, 82,32} }, +{ {0,0,1,2,0,3,1,4, 129,32} }, +{ {0,0,1,2,0,3,2,0, 85,21} }, +{ {0,0,1,2,0,3,2,1, 87,21} }, +{ {0,0,1,2,0,3,2,2, 88,24} }, +{ {0,0,1,2,0,3,2,3, 86,21} }, +{ {0,0,1,2,0,3,2,4, 130,21} }, +{ {0,0,1,2,0,3,3,0, 76,32} }, +{ {0,0,1,2,0,3,3,1, 78,32} }, +{ {0,0,1,2,0,3,3,2, 79,32} }, +{ {0,0,1,2,0,3,3,3, 77,32} }, +{ {0,0,1,2,0,3,3,4, 128,32} }, +{ {0,0,1,2,0,3,4,0, 131,21} }, +{ {0,0,1,2,0,3,4,1, 133,21} }, +{ {0,0,1,2,0,3,4,2, 134,21} }, +{ {0,0,1,2,0,3,4,3, 132,21} }, +{ {0,0,1,2,0,3,4,4, 134,32} }, +{ {0,0,1,2,0,3,4,5, 167,21} }, +{ {0,0,1,2,1,0,0,0, 35,9} }, +{ {0,0,1,2,1,0,0,1, 38,20} }, +{ {0,0,1,2,1,0,0,2, 40,20} }, +{ {0,0,1,2,1,0,0,3, 76,20} }, +{ {0,0,1,2,1,0,1,0, 28,46} }, +{ {0,0,1,2,1,0,1,1, 17,29} }, +{ {0,0,1,2,1,0,1,2, 41,20} }, +{ {0,0,1,2,1,0,1,3, 77,20} }, +{ {0,0,1,2,1,0,2,0, 36,43} }, +{ {0,0,1,2,1,0,2,1, 39,20} }, +{ {0,0,1,2,1,0,2,2, 42,20} }, +{ {0,0,1,2,1,0,2,3, 78,20} }, +{ {0,0,1,2,1,0,3,0, 71,43} }, +{ {0,0,1,2,1,0,3,1, 74,20} }, +{ {0,0,1,2,1,0,3,2, 75,20} }, +{ {0,0,1,2,1,0,3,3, 79,20} }, +{ {0,0,1,2,1,0,3,4, 128,20} }, +{ {0,0,1,2,1,1,0,0, 45,2} }, +{ {0,0,1,2,1,1,0,1, 27,10} }, +{ {0,0,1,2,1,1,0,2, 47,21} }, +{ {0,0,1,2,1,1,0,3, 90,21} }, +{ {0,0,1,2,1,1,1,0, 23,28} }, +{ {0,0,1,2,1,1,1,1, 8,29} }, +{ {0,0,1,2,1,1,1,2, 37,46} }, +{ {0,0,1,2,1,1,1,3, 72,28} }, +{ {0,0,1,2,1,1,2,0, 48,21} }, +{ {0,0,1,2,1,1,2,1, 40,31} }, +{ {0,0,1,2,1,1,2,2, 29,24} }, +{ {0,0,1,2,1,1,2,3, 91,21} }, +{ {0,0,1,2,1,1,3,0, 92,21} }, +{ {0,0,1,2,1,1,3,1, 81,10} }, +{ {0,0,1,2,1,1,3,2, 93,21} }, +{ {0,0,1,2,1,1,3,3, 94,21} }, +{ {0,0,1,2,1,1,3,4, 135,21} }, +{ {0,0,1,2,1,2,0,0, 49,0} }, +{ {0,0,1,2,1,2,0,1, 50,0} }, +{ {0,0,1,2,1,2,0,2, 31,22} }, +{ {0,0,1,2,1,2,0,3, 98,0} }, +{ {0,0,1,2,1,2,1,0, 31,27} }, +{ {0,0,1,2,1,2,1,1, 18,4} }, +{ {0,0,1,2,1,2,1,2, 43,27} }, +{ {0,0,1,2,1,2,1,3, 86,27} }, +{ {0,0,1,2,1,2,2,0, 50,1} }, +{ {0,0,1,2,1,2,2,1, 51,0} }, +{ {0,0,1,2,1,2,2,2, 18,5} }, +{ {0,0,1,2,1,2,2,3, 99,0} }, +{ {0,0,1,2,1,2,3,0, 98,1} }, +{ {0,0,1,2,1,2,3,1, 99,1} }, +{ {0,0,1,2,1,2,3,2, 86,22} }, +{ {0,0,1,2,1,2,3,3, 100,0} }, +{ {0,0,1,2,1,2,3,4, 139,0} }, +{ {0,0,1,2,1,3,0,0, 101,0} }, +{ {0,0,1,2,1,3,0,1, 102,0} }, +{ {0,0,1,2,1,3,0,2, 103,0} }, +{ {0,0,1,2,1,3,0,3, 103,21} }, +{ {0,0,1,2,1,3,0,4, 140,0} }, +{ {0,0,1,2,1,3,1,0, 68,27} }, +{ {0,0,1,2,1,3,1,1, 63,27} }, +{ {0,0,1,2,1,3,1,2, 82,27} }, +{ {0,0,1,2,1,3,1,3, 82,46} }, +{ {0,0,1,2,1,3,1,4, 132,27} }, +{ {0,0,1,2,1,3,2,0, 104,0} }, +{ {0,0,1,2,1,3,2,1, 105,0} }, +{ {0,0,1,2,1,3,2,2, 79,24} }, +{ {0,0,1,2,1,3,2,3, 106,0} }, +{ {0,0,1,2,1,3,2,4, 141,0} }, +{ {0,0,1,2,1,3,3,0, 104,21} }, +{ {0,0,1,2,1,3,3,1, 105,21} }, +{ {0,0,1,2,1,3,3,2, 106,21} }, +{ {0,0,1,2,1,3,3,3, 79,5} }, +{ {0,0,1,2,1,3,3,4, 141,21} }, +{ {0,0,1,2,1,3,4,0, 142,0} }, +{ {0,0,1,2,1,3,4,1, 143,0} }, +{ {0,0,1,2,1,3,4,2, 144,0} }, +{ {0,0,1,2,1,3,4,3, 144,21} }, +{ {0,0,1,2,1,3,4,4, 145,0} }, +{ {0,0,1,2,1,3,4,5, 169,0} }, +{ {0,0,1,2,2,0,0,0, 21,9} }, +{ {0,0,1,2,2,0,0,1, 30,20} }, +{ {0,0,1,2,2,0,0,2, 27,43} }, +{ {0,0,1,2,2,0,0,3, 67,20} }, +{ {0,0,1,2,2,0,1,0, 24,9} }, +{ {0,0,1,2,2,0,1,1, 32,20} }, +{ {0,0,1,2,2,0,1,2, 29,43} }, +{ {0,0,1,2,2,0,1,3, 69,20} }, +{ {0,0,1,2,2,0,2,0, 23,9} }, +{ {0,0,1,2,2,0,2,1, 31,20} }, +{ {0,0,1,2,2,0,2,2, 28,43} }, +{ {0,0,1,2,2,0,2,3, 68,20} }, +{ {0,0,1,2,2,0,3,0, 64,43} }, +{ {0,0,1,2,2,0,3,1, 66,20} }, +{ {0,0,1,2,2,0,3,2, 65,43} }, +{ {0,0,1,2,2,0,3,3, 69,43} }, +{ {0,0,1,2,2,0,3,4, 126,20} }, +{ {0,0,1,2,2,1,0,0, 52,0} }, +{ {0,0,1,2,2,1,0,1, 53,0} }, +{ {0,0,1,2,2,1,0,2, 53,21} }, +{ {0,0,1,2,2,1,0,3, 107,0} }, +{ {0,0,1,2,2,1,1,0, 53,20} }, +{ {0,0,1,2,2,1,1,1, 24,5} }, +{ {0,0,1,2,2,1,1,2, 47,44} }, +{ {0,0,1,2,2,1,1,3, 108,0} }, +{ {0,0,1,2,2,1,2,0, 53,1} }, +{ {0,0,1,2,2,1,2,1, 47,30} }, +{ {0,0,1,2,2,1,2,2, 24,4} }, +{ {0,0,1,2,2,1,2,3, 108,21} }, +{ {0,0,1,2,2,1,3,0, 107,20} }, +{ {0,0,1,2,2,1,3,1, 108,20} }, +{ {0,0,1,2,2,1,3,2, 108,1} }, +{ {0,0,1,2,2,1,3,3, 109,0} }, +{ {0,0,1,2,2,1,3,4, 146,0} }, +{ {0,0,1,2,2,2,0,0, 45,3} }, +{ {0,0,1,2,2,2,0,1, 48,20} }, +{ {0,0,1,2,2,2,0,2, 23,31} }, +{ {0,0,1,2,2,2,0,3, 92,20} }, +{ {0,0,1,2,2,2,1,0, 47,20} }, +{ {0,0,1,2,2,2,1,1, 29,25} }, +{ {0,0,1,2,2,2,1,2, 37,37} }, +{ {0,0,1,2,2,2,1,3, 93,20} }, +{ {0,0,1,2,2,2,2,0, 27,11} }, +{ {0,0,1,2,2,2,2,1, 40,28} }, +{ {0,0,1,2,2,2,2,2, 8,30} }, +{ {0,0,1,2,2,2,2,3, 81,11} }, +{ {0,0,1,2,2,2,3,0, 90,20} }, +{ {0,0,1,2,2,2,3,1, 91,20} }, +{ {0,0,1,2,2,2,3,2, 72,31} }, +{ {0,0,1,2,2,2,3,3, 94,20} }, +{ {0,0,1,2,2,2,3,4, 135,20} }, +{ {0,0,1,2,2,3,0,0, 110,0} }, +{ {0,0,1,2,2,3,0,1, 111,0} }, +{ {0,0,1,2,2,3,0,2, 112,0} }, +{ {0,0,1,2,2,3,0,3, 108,36} }, +{ {0,0,1,2,2,3,0,4, 147,0} }, +{ {0,0,1,2,2,3,1,0, 108,26} }, +{ {0,0,1,2,2,3,1,1, 69,44} }, +{ {0,0,1,2,2,3,1,2, 93,44} }, +{ {0,0,1,2,2,3,1,3, 113,0} }, +{ {0,0,1,2,2,3,1,4, 148,0} }, +{ {0,0,1,2,2,3,2,0, 112,46} }, +{ {0,0,1,2,2,3,2,1, 103,46} }, +{ {0,0,1,2,2,3,2,2, 73,24} }, +{ {0,0,1,2,2,3,2,3, 93,30} }, +{ {0,0,1,2,2,3,2,4, 149,0} }, +{ {0,0,1,2,2,3,3,0, 111,20} }, +{ {0,0,1,2,2,3,3,1, 114,0} }, +{ {0,0,1,2,2,3,3,2, 103,22} }, +{ {0,0,1,2,2,3,3,3, 69,30} }, +{ {0,0,1,2,2,3,3,4, 150,0} }, +{ {0,0,1,2,2,3,4,0, 147,20} }, +{ {0,0,1,2,2,3,4,1, 150,20} }, +{ {0,0,1,2,2,3,4,2, 149,20} }, +{ {0,0,1,2,2,3,4,3, 148,20} }, +{ {0,0,1,2,2,3,4,4, 151,0} }, +{ {0,0,1,2,2,3,4,5, 170,0} }, +{ {0,0,1,2,3,0,0,0, 70,9} }, +{ {0,0,1,2,3,0,0,1, 85,20} }, +{ {0,0,1,2,3,0,0,2, 81,43} }, +{ {0,0,1,2,3,0,0,3, 76,43} }, +{ {0,0,1,2,3,0,0,4, 131,20} }, +{ {0,0,1,2,3,0,1,0, 73,9} }, +{ {0,0,1,2,3,0,1,1, 88,25} }, +{ {0,0,1,2,3,0,1,2, 84,43} }, +{ {0,0,1,2,3,0,1,3, 79,43} }, +{ {0,0,1,2,3,0,1,4, 134,20} }, +{ {0,0,1,2,3,0,2,0, 71,9} }, +{ {0,0,1,2,3,0,2,1, 87,20} }, +{ {0,0,1,2,3,0,2,2, 83,39} }, +{ {0,0,1,2,3,0,2,3, 78,43} }, +{ {0,0,1,2,3,0,2,4, 133,20} }, +{ {0,0,1,2,3,0,3,0, 72,9} }, +{ {0,0,1,2,3,0,3,1, 86,20} }, +{ {0,0,1,2,3,0,3,2, 82,43} }, +{ {0,0,1,2,3,0,3,3, 77,43} }, +{ {0,0,1,2,3,0,3,4, 132,20} }, +{ {0,0,1,2,3,0,4,0, 127,43} }, +{ {0,0,1,2,3,0,4,1, 130,20} }, +{ {0,0,1,2,3,0,4,2, 129,43} }, +{ {0,0,1,2,3,0,4,3, 128,43} }, +{ {0,0,1,2,3,0,4,4, 134,43} }, +{ {0,0,1,2,3,0,4,5, 167,20} }, +{ {0,0,1,2,3,1,0,0, 110,1} }, +{ {0,0,1,2,3,1,0,1, 112,37} }, +{ {0,0,1,2,3,1,0,2, 108,23} }, +{ {0,0,1,2,3,1,0,3, 111,21} }, +{ {0,0,1,2,3,1,0,4, 147,21} }, +{ {0,0,1,2,3,1,1,0, 112,1} }, +{ {0,0,1,2,3,1,1,1, 73,25} }, +{ {0,0,1,2,3,1,1,2, 93,39} }, +{ {0,0,1,2,3,1,1,3, 103,27} }, +{ {0,0,1,2,3,1,1,4, 149,21} }, +{ {0,0,1,2,3,1,2,0, 111,1} }, +{ {0,0,1,2,3,1,2,1, 103,37} }, +{ {0,0,1,2,3,1,2,2, 69,39} }, +{ {0,0,1,2,3,1,2,3, 114,1} }, +{ {0,0,1,2,3,1,2,4, 150,21} }, +{ {0,0,1,2,3,1,3,0, 108,47} }, +{ {0,0,1,2,3,1,3,1, 93,29} }, +{ {0,0,1,2,3,1,3,2, 113,1} }, +{ {0,0,1,2,3,1,3,3, 69,29} }, +{ {0,0,1,2,3,1,3,4, 148,21} }, +{ {0,0,1,2,3,1,4,0, 147,1} }, +{ {0,0,1,2,3,1,4,1, 149,1} }, +{ {0,0,1,2,3,1,4,2, 148,1} }, +{ {0,0,1,2,3,1,4,3, 150,1} }, +{ {0,0,1,2,3,1,4,4, 151,1} }, +{ {0,0,1,2,3,1,4,5, 170,1} }, +{ {0,0,1,2,3,2,0,0, 101,1} }, +{ {0,0,1,2,3,2,0,1, 104,1} }, +{ {0,0,1,2,3,2,0,2, 68,22} }, +{ {0,0,1,2,3,2,0,3, 104,20} }, +{ {0,0,1,2,3,2,0,4, 142,1} }, +{ {0,0,1,2,3,2,1,0, 103,1} }, +{ {0,0,1,2,3,2,1,1, 79,25} }, +{ {0,0,1,2,3,2,1,2, 82,22} }, +{ {0,0,1,2,3,2,1,3, 106,20} }, +{ {0,0,1,2,3,2,1,4, 144,1} }, +{ {0,0,1,2,3,2,2,0, 102,1} }, +{ {0,0,1,2,3,2,2,1, 105,1} }, +{ {0,0,1,2,3,2,2,2, 63,22} }, +{ {0,0,1,2,3,2,2,3, 105,20} }, +{ {0,0,1,2,3,2,2,4, 143,1} }, +{ {0,0,1,2,3,2,3,0, 103,20} }, +{ {0,0,1,2,3,2,3,1, 106,1} }, +{ {0,0,1,2,3,2,3,2, 82,37} }, +{ {0,0,1,2,3,2,3,3, 79,4} }, +{ {0,0,1,2,3,2,3,4, 144,20} }, +{ {0,0,1,2,3,2,4,0, 140,1} }, +{ {0,0,1,2,3,2,4,1, 141,1} }, +{ {0,0,1,2,3,2,4,2, 132,22} }, +{ {0,0,1,2,3,2,4,3, 141,20} }, +{ {0,0,1,2,3,2,4,4, 145,1} }, +{ {0,0,1,2,3,2,4,5, 169,1} }, +{ {0,0,1,2,3,3,0,0, 89,2} }, +{ {0,0,1,2,3,3,0,1, 91,2} }, +{ {0,0,1,2,3,3,0,2, 93,2} }, +{ {0,0,1,2,3,3,0,3, 65,10} }, +{ {0,0,1,2,3,3,0,4, 135,2} }, +{ {0,0,1,2,3,3,1,0, 93,3} }, +{ {0,0,1,2,3,3,1,1, 84,25} }, +{ {0,0,1,2,3,3,1,2, 96,45} }, +{ {0,0,1,2,3,3,1,3, 82,10} }, +{ {0,0,1,2,3,3,1,4, 137,21} }, +{ {0,0,1,2,3,3,2,0, 91,3} }, +{ {0,0,1,2,3,3,2,1, 97,21} }, +{ {0,0,1,2,3,3,2,2, 84,24} }, +{ {0,0,1,2,3,3,2,3, 75,31} }, +{ {0,0,1,2,3,3,2,4, 138,21} }, +{ {0,0,1,2,3,3,3,0, 65,11} }, +{ {0,0,1,2,3,3,3,1, 75,28} }, +{ {0,0,1,2,3,3,3,2, 82,11} }, +{ {0,0,1,2,3,3,3,3, 59,11} }, +{ {0,0,1,2,3,3,3,4, 129,11} }, +{ {0,0,1,2,3,3,4,0, 135,3} }, +{ {0,0,1,2,3,3,4,1, 138,20} }, +{ {0,0,1,2,3,3,4,2, 137,20} }, +{ {0,0,1,2,3,3,4,3, 129,10} }, +{ {0,0,1,2,3,3,4,4, 136,2} }, +{ {0,0,1,2,3,3,4,5, 168,21} }, +{ {0,0,1,2,3,4,0,0, 152,0} }, +{ {0,0,1,2,3,4,0,1, 153,0} }, +{ {0,0,1,2,3,4,0,2, 149,38} }, +{ {0,0,1,2,3,4,0,3, 153,21} }, +{ {0,0,1,2,3,4,0,4, 149,31} }, +{ {0,0,1,2,3,4,0,5, 171,0} }, +{ {0,0,1,2,3,4,1,0, 149,45} }, +{ {0,0,1,2,3,4,1,1, 134,44} }, +{ {0,0,1,2,3,4,1,2, 137,45} }, +{ {0,0,1,2,3,4,1,3, 144,27} }, +{ {0,0,1,2,3,4,1,4, 154,0} }, +{ {0,0,1,2,3,4,1,5, 172,0} }, +{ {0,0,1,2,3,4,2,0, 153,1} }, +{ {0,0,1,2,3,4,2,1, 155,0} }, +{ {0,0,1,2,3,4,2,2, 134,39} }, +{ {0,0,1,2,3,4,2,3, 156,0} }, +{ {0,0,1,2,3,4,2,4, 144,37} }, +{ {0,0,1,2,3,4,2,5, 173,0} }, +{ {0,0,1,2,3,4,3,0, 149,28} }, +{ {0,0,1,2,3,4,3,1, 144,46} }, +{ {0,0,1,2,3,4,3,2, 154,1} }, +{ {0,0,1,2,3,4,3,3, 134,29} }, +{ {0,0,1,2,3,4,3,4, 137,28} }, +{ {0,0,1,2,3,4,3,5, 172,21} }, +{ {0,0,1,2,3,4,4,0, 153,20} }, +{ {0,0,1,2,3,4,4,1, 156,1} }, +{ {0,0,1,2,3,4,4,2, 144,22} }, +{ {0,0,1,2,3,4,4,3, 155,21} }, +{ {0,0,1,2,3,4,4,4, 134,30} }, +{ {0,0,1,2,3,4,4,5, 173,21} }, +{ {0,0,1,2,3,4,5,0, 171,1} }, +{ {0,0,1,2,3,4,5,1, 173,1} }, +{ {0,0,1,2,3,4,5,2, 172,1} }, +{ {0,0,1,2,3,4,5,3, 173,20} }, +{ {0,0,1,2,3,4,5,4, 172,20} }, +{ {0,0,1,2,3,4,5,5, 174,0} }, +{ {0,0,1,2,3,4,5,6, 182,0} }, +{ {0,1,0,0,0,0,0,0, 1,4} }, +{ {0,1,0,0,0,0,0,1, 4,12} }, +{ {0,1,0,0,0,0,0,2, 7,12} }, +{ {0,1,0,0,0,0,1,0, 19,7} }, +{ {0,1,0,0,0,0,1,1, 20,13} }, +{ {0,1,0,0,0,0,1,2, 21,13} }, +{ {0,1,0,0,0,0,2,0, 33,2} }, +{ {0,1,0,0,0,0,2,1, 35,13} }, +{ {0,1,0,0,0,0,2,2, 34,13} }, +{ {0,1,0,0,0,0,2,3, 70,13} }, +{ {0,1,0,0,0,1,0,0, 2,27} }, +{ {0,1,0,0,0,1,0,1, 5,26} }, +{ {0,1,0,0,0,1,0,2, 8,41} }, +{ {0,1,0,0,0,1,1,0, 20,18} }, +{ {0,1,0,0,0,1,1,1, 22,18} }, +{ {0,1,0,0,0,1,1,2, 23,40} }, +{ {0,1,0,0,0,1,2,0, 34,18} }, +{ {0,1,0,0,0,1,2,1, 28,9} }, +{ {0,1,0,0,0,1,2,2, 37,18} }, +{ {0,1,0,0,0,1,2,3, 72,40} }, +{ {0,1,0,0,0,2,0,0, 3,26} }, +{ {0,1,0,0,0,2,0,1, 6,26} }, +{ {0,1,0,0,0,2,0,2, 8,26} }, +{ {0,1,0,0,0,2,0,3, 58,41} }, +{ {0,1,0,0,0,2,1,0, 21,18} }, +{ {0,1,0,0,0,2,1,1, 23,18} }, +{ {0,1,0,0,0,2,1,2, 24,18} }, +{ {0,1,0,0,0,2,1,3, 64,40} }, +{ {0,1,0,0,0,2,2,0, 35,18} }, +{ {0,1,0,0,0,2,2,1, 36,18} }, +{ {0,1,0,0,0,2,2,2, 28,5} }, +{ {0,1,0,0,0,2,2,3, 71,40} }, +{ {0,1,0,0,0,2,3,0, 70,18} }, +{ {0,1,0,0,0,2,3,1, 71,18} }, +{ {0,1,0,0,0,2,3,2, 73,18} }, +{ {0,1,0,0,0,2,3,3, 72,18} }, +{ {0,1,0,0,0,2,3,4, 127,40} }, +{ {0,1,0,0,1,0,0,0, 4,6} }, +{ {0,1,0,0,1,0,0,1, 13,6} }, +{ {0,1,0,0,1,0,0,2, 16,18} }, +{ {0,1,0,0,1,0,1,0, 20,7} }, +{ {0,1,0,0,1,0,1,1, 25,18} }, +{ {0,1,0,0,1,0,1,2, 27,18} }, +{ {0,1,0,0,1,0,2,0, 35,7} }, +{ {0,1,0,0,1,0,2,1, 38,18} }, +{ {0,1,0,0,1,0,2,2, 40,18} }, +{ {0,1,0,0,1,0,2,3, 76,18} }, +{ {0,1,0,0,1,1,0,0, 5,6} }, +{ {0,1,0,0,1,1,0,1, 14,6} }, +{ {0,1,0,0,1,1,0,2, 17,18} }, +{ {0,1,0,0,1,1,1,0, 22,7} }, +{ {0,1,0,0,1,1,1,1, 5,10} }, +{ {0,1,0,0,1,1,1,2, 28,18} }, +{ {0,1,0,0,1,1,2,0, 28,42} }, +{ {0,1,0,0,1,1,2,1, 17,9} }, +{ {0,1,0,0,1,1,2,2, 41,18} }, +{ {0,1,0,0,1,1,2,3, 77,18} }, +{ {0,1,0,0,1,2,0,0, 6,6} }, +{ {0,1,0,0,1,2,0,1, 15,6} }, +{ {0,1,0,0,1,2,0,2, 18,18} }, +{ {0,1,0,0,1,2,0,3, 61,18} }, +{ {0,1,0,0,1,2,1,0, 23,17} }, +{ {0,1,0,0,1,2,1,1, 26,18} }, +{ {0,1,0,0,1,2,1,2, 29,18} }, +{ {0,1,0,0,1,2,1,3, 65,18} }, +{ {0,1,0,0,1,2,2,0, 36,17} }, +{ {0,1,0,0,1,2,2,1, 39,18} }, +{ {0,1,0,0,1,2,2,2, 42,18} }, +{ {0,1,0,0,1,2,2,3, 78,18} }, +{ {0,1,0,0,1,2,3,0, 71,17} }, +{ {0,1,0,0,1,2,3,1, 74,18} }, +{ {0,1,0,0,1,2,3,2, 79,18} }, +{ {0,1,0,0,1,2,3,3, 75,18} }, +{ {0,1,0,0,1,2,3,4, 128,18} }, +{ {0,1,0,0,2,0,0,0, 7,6} }, +{ {0,1,0,0,2,0,0,1, 16,6} }, +{ {0,1,0,0,2,0,0,2, 16,26} }, +{ {0,1,0,0,2,0,0,3, 62,18} }, +{ {0,1,0,0,2,0,1,0, 21,7} }, +{ {0,1,0,0,2,0,1,1, 27,17} }, +{ {0,1,0,0,2,0,1,2, 30,18} }, +{ {0,1,0,0,2,0,1,3, 67,18} }, +{ {0,1,0,0,2,0,2,0, 34,7} }, +{ {0,1,0,0,2,0,2,1, 40,17} }, +{ {0,1,0,0,2,0,2,2, 26,4} }, +{ {0,1,0,0,2,0,2,3, 81,18} }, +{ {0,1,0,0,2,0,3,0, 70,7} }, +{ {0,1,0,0,2,0,3,1, 76,17} }, +{ {0,1,0,0,2,0,3,2, 85,18} }, +{ {0,1,0,0,2,0,3,3, 81,17} }, +{ {0,1,0,0,2,0,3,4, 131,18} }, +{ {0,1,0,0,2,1,0,0, 8,6} }, +{ {0,1,0,0,2,1,0,1, 17,6} }, +{ {0,1,0,0,2,1,0,2, 18,26} }, +{ {0,1,0,0,2,1,0,3, 63,18} }, +{ {0,1,0,0,2,1,1,0, 23,7} }, +{ {0,1,0,0,2,1,1,1, 28,17} }, +{ {0,1,0,0,2,1,1,2, 31,18} }, +{ {0,1,0,0,2,1,1,3, 68,18} }, +{ {0,1,0,0,2,1,2,0, 37,17} }, +{ {0,1,0,0,2,1,2,1, 41,17} }, +{ {0,1,0,0,2,1,2,2, 43,18} }, +{ {0,1,0,0,2,1,2,3, 82,18} }, +{ {0,1,0,0,2,1,3,0, 72,7} }, +{ {0,1,0,0,2,1,3,1, 77,9} }, +{ {0,1,0,0,2,1,3,2, 86,18} }, +{ {0,1,0,0,2,1,3,3, 82,17} }, +{ {0,1,0,0,2,1,3,4, 132,18} }, +{ {0,1,0,0,2,2,0,0, 8,45} }, +{ {0,1,0,0,2,2,0,1, 18,6} }, +{ {0,1,0,0,2,2,0,2, 17,26} }, +{ {0,1,0,0,2,2,0,3, 63,41} }, +{ {0,1,0,0,2,2,1,0, 24,7} }, +{ {0,1,0,0,2,2,1,1, 29,17} }, +{ {0,1,0,0,2,2,1,2, 32,18} }, +{ {0,1,0,0,2,2,1,3, 69,18} }, +{ {0,1,0,0,2,2,2,0, 28,28} }, +{ {0,1,0,0,2,2,2,1, 42,17} }, +{ {0,1,0,0,2,2,2,2, 10,4} }, +{ {0,1,0,0,2,2,2,3, 83,18} }, +{ {0,1,0,0,2,2,3,0, 73,17} }, +{ {0,1,0,0,2,2,3,1, 79,17} }, +{ {0,1,0,0,2,2,3,2, 88,18} }, +{ {0,1,0,0,2,2,3,3, 84,17} }, +{ {0,1,0,0,2,2,3,4, 134,18} }, +{ {0,1,0,0,2,3,0,0, 58,6} }, +{ {0,1,0,0,2,3,0,1, 61,6} }, +{ {0,1,0,0,2,3,0,2, 61,26} }, +{ {0,1,0,0,2,3,0,3, 63,6} }, +{ {0,1,0,0,2,3,0,4, 125,18} }, +{ {0,1,0,0,2,3,1,0, 64,17} }, +{ {0,1,0,0,2,3,1,1, 65,17} }, +{ {0,1,0,0,2,3,1,2, 66,18} }, +{ {0,1,0,0,2,3,1,3, 69,17} }, +{ {0,1,0,0,2,3,1,4, 126,18} }, +{ {0,1,0,0,2,3,2,0, 72,17} }, +{ {0,1,0,0,2,3,2,1, 75,17} }, +{ {0,1,0,0,2,3,2,2, 80,18} }, +{ {0,1,0,0,2,3,2,3, 84,18} }, +{ {0,1,0,0,2,3,2,4, 129,18} }, +{ {0,1,0,0,2,3,3,0, 71,7} }, +{ {0,1,0,0,2,3,3,1, 78,17} }, +{ {0,1,0,0,2,3,3,2, 87,18} }, +{ {0,1,0,0,2,3,3,3, 83,17} }, +{ {0,1,0,0,2,3,3,4, 133,18} }, +{ {0,1,0,0,2,3,4,0, 127,17} }, +{ {0,1,0,0,2,3,4,1, 128,17} }, +{ {0,1,0,0,2,3,4,2, 130,18} }, +{ {0,1,0,0,2,3,4,3, 134,17} }, +{ {0,1,0,0,2,3,4,4, 129,17} }, +{ {0,1,0,0,2,3,4,5, 167,18} }, +{ {0,1,0,1,0,0,0,0, 2,28} }, +{ {0,1,0,1,0,0,0,1, 5,12} }, +{ {0,1,0,1,0,0,0,2, 8,12} }, +{ {0,1,0,1,0,0,1,0, 20,2} }, +{ {0,1,0,1,0,0,1,1, 22,13} }, +{ {0,1,0,1,0,0,1,2, 23,13} }, +{ {0,1,0,1,0,0,2,0, 34,2} }, +{ {0,1,0,1,0,0,2,1, 28,34} }, +{ {0,1,0,1,0,0,2,2, 37,33} }, +{ {0,1,0,1,0,0,2,3, 72,13} }, +{ {0,1,0,1,0,1,0,0, 5,27} }, +{ {0,1,0,1,0,1,0,1, 9,12} }, +{ {0,1,0,1,0,1,0,2, 10,13} }, +{ {0,1,0,1,0,1,1,0, 25,13} }, +{ {0,1,0,1,0,1,1,1, 5,22} }, +{ {0,1,0,1,0,1,1,2, 26,13} }, +{ {0,1,0,1,0,1,2,0, 26,8} }, +{ {0,1,0,1,0,1,2,1, 10,8} }, +{ {0,1,0,1,0,1,2,2, 43,13} }, +{ {0,1,0,1,0,1,2,3, 80,13} }, +{ {0,1,0,1,0,2,0,0, 8,27} }, +{ {0,1,0,1,0,2,0,1, 10,26} }, +{ {0,1,0,1,0,2,0,2, 11,40} }, +{ {0,1,0,1,0,2,0,3, 59,40} }, +{ {0,1,0,1,0,2,1,0, 27,40} }, +{ {0,1,0,1,0,2,1,1, 28,40} }, +{ {0,1,0,1,0,2,1,2, 29,40} }, +{ {0,1,0,1,0,2,1,3, 65,40} }, +{ {0,1,0,1,0,2,2,0, 40,13} }, +{ {0,1,0,1,0,2,2,1, 42,13} }, +{ {0,1,0,1,0,2,2,2, 41,13} }, +{ {0,1,0,1,0,2,2,3, 75,13} }, +{ {0,1,0,1,0,2,3,0, 81,40} }, +{ {0,1,0,1,0,2,3,1, 83,34} }, +{ {0,1,0,1,0,2,3,2, 84,40} }, +{ {0,1,0,1,0,2,3,3, 82,40} }, +{ {0,1,0,1,0,2,3,4, 129,40} }, +{ {0,1,0,1,1,0,0,0, 20,25} }, +{ {0,1,0,1,1,0,0,1, 25,26} }, +{ {0,1,0,1,1,0,0,2, 27,41} }, +{ {0,1,0,1,1,0,1,0, 44,18} }, +{ {0,1,0,1,1,0,1,1, 20,24} }, +{ {0,1,0,1,1,0,1,2, 45,19} }, +{ {0,1,0,1,1,0,2,0, 45,14} }, +{ {0,1,0,1,1,0,2,1, 27,34} }, +{ {0,1,0,1,1,0,2,2, 47,19} }, +{ {0,1,0,1,1,0,2,3, 90,19} }, +{ {0,1,0,1,1,1,0,0, 22,26} }, +{ {0,1,0,1,1,1,0,1, 5,9} }, +{ {0,1,0,1,1,1,0,2, 28,41} }, +{ {0,1,0,1,1,1,1,0, 20,3} }, +{ {0,1,0,1,1,1,1,1, 2,31} }, +{ {0,1,0,1,1,1,1,2, 34,3} }, +{ {0,1,0,1,1,1,2,0, 23,8} }, +{ {0,1,0,1,1,1,2,1, 8,9} }, +{ {0,1,0,1,1,1,2,2, 37,42} }, +{ {0,1,0,1,1,1,2,3, 72,8} }, +{ {0,1,0,1,1,2,0,0, 23,26} }, +{ {0,1,0,1,1,2,0,1, 26,26} }, +{ {0,1,0,1,1,2,0,2, 29,41} }, +{ {0,1,0,1,1,2,0,3, 65,41} }, +{ {0,1,0,1,1,2,1,0, 45,18} }, +{ {0,1,0,1,1,2,1,1, 34,24} }, +{ {0,1,0,1,1,2,1,2, 46,18} }, +{ {0,1,0,1,1,2,1,3, 89,19} }, +{ {0,1,0,1,1,2,2,0, 48,19} }, +{ {0,1,0,1,1,2,2,1, 40,23} }, +{ {0,1,0,1,1,2,2,2, 29,30} }, +{ {0,1,0,1,1,2,2,3, 91,19} }, +{ {0,1,0,1,1,2,3,0, 92,15} }, +{ {0,1,0,1,1,2,3,1, 81,34} }, +{ {0,1,0,1,1,2,3,2, 94,19} }, +{ {0,1,0,1,1,2,3,3, 93,19} }, +{ {0,1,0,1,1,2,3,4, 135,19} }, +{ {0,1,0,1,2,0,0,0, 34,25} }, +{ {0,1,0,1,2,0,0,1, 26,23} }, +{ {0,1,0,1,2,0,0,2, 40,26} }, +{ {0,1,0,1,2,0,0,3, 81,41} }, +{ {0,1,0,1,2,0,1,0, 45,15} }, +{ {0,1,0,1,2,0,1,1, 23,23} }, +{ {0,1,0,1,2,0,1,2, 48,18} }, +{ {0,1,0,1,2,0,1,3, 92,18} }, +{ {0,1,0,1,2,0,2,0, 46,15} }, +{ {0,1,0,1,2,0,2,1, 29,34} }, +{ {0,1,0,1,2,0,2,2, 29,29} }, +{ {0,1,0,1,2,0,2,3, 94,14} }, +{ {0,1,0,1,2,0,3,0, 89,14} }, +{ {0,1,0,1,2,0,3,1, 65,34} }, +{ {0,1,0,1,2,0,3,2, 91,14} }, +{ {0,1,0,1,2,0,3,3, 93,14} }, +{ {0,1,0,1,2,0,3,4, 135,14} }, +{ {0,1,0,1,2,1,0,0, 28,35} }, +{ {0,1,0,1,2,1,0,1, 10,23} }, +{ {0,1,0,1,2,1,0,2, 42,26} }, +{ {0,1,0,1,2,1,0,3, 83,41} }, +{ {0,1,0,1,2,1,1,0, 27,35} }, +{ {0,1,0,1,2,1,1,1, 8,22} }, +{ {0,1,0,1,2,1,1,2, 40,8} }, +{ {0,1,0,1,2,1,1,3, 81,35} }, +{ {0,1,0,1,2,1,2,0, 29,35} }, +{ {0,1,0,1,2,1,2,1, 11,35} }, +{ {0,1,0,1,2,1,2,2, 41,8} }, +{ {0,1,0,1,2,1,2,3, 84,35} }, +{ {0,1,0,1,2,1,3,0, 65,35} }, +{ {0,1,0,1,2,1,3,1, 59,35} }, +{ {0,1,0,1,2,1,3,2, 75,8} }, +{ {0,1,0,1,2,1,3,3, 82,35} }, +{ {0,1,0,1,2,1,3,4, 129,35} }, +{ {0,1,0,1,2,2,0,0, 37,44} }, +{ {0,1,0,1,2,2,0,1, 43,26} }, +{ {0,1,0,1,2,2,0,2, 41,26} }, +{ {0,1,0,1,2,2,0,3, 82,41} }, +{ {0,1,0,1,2,2,1,0, 47,18} }, +{ {0,1,0,1,2,2,1,1, 37,39} }, +{ {0,1,0,1,2,2,1,2, 29,31} }, +{ {0,1,0,1,2,2,1,3, 93,18} }, +{ {0,1,0,1,2,2,2,0, 29,28} }, +{ {0,1,0,1,2,2,2,1, 41,23} }, +{ {0,1,0,1,2,2,2,2, 11,28} }, +{ {0,1,0,1,2,2,2,3, 84,28} }, +{ {0,1,0,1,2,2,3,0, 93,15} }, +{ {0,1,0,1,2,2,3,1, 82,34} }, +{ {0,1,0,1,2,2,3,2, 84,31} }, +{ {0,1,0,1,2,2,3,3, 96,19} }, +{ {0,1,0,1,2,2,3,4, 137,19} }, +{ {0,1,0,1,2,3,0,0, 72,26} }, +{ {0,1,0,1,2,3,0,1, 80,26} }, +{ {0,1,0,1,2,3,0,2, 75,26} }, +{ {0,1,0,1,2,3,0,3, 84,41} }, +{ {0,1,0,1,2,3,0,4, 129,41} }, +{ {0,1,0,1,2,3,1,0, 90,18} }, +{ {0,1,0,1,2,3,1,1, 72,23} }, +{ {0,1,0,1,2,3,1,2, 91,18} }, +{ {0,1,0,1,2,3,1,3, 94,18} }, +{ {0,1,0,1,2,3,1,4, 135,18} }, +{ {0,1,0,1,2,3,2,0, 94,15} }, +{ {0,1,0,1,2,3,2,1, 84,34} }, +{ {0,1,0,1,2,3,2,2, 84,29} }, +{ {0,1,0,1,2,3,2,3, 95,18} }, +{ {0,1,0,1,2,3,2,4, 136,19} }, +{ {0,1,0,1,2,3,3,0, 91,15} }, +{ {0,1,0,1,2,3,3,1, 75,23} }, +{ {0,1,0,1,2,3,3,2, 97,19} }, +{ {0,1,0,1,2,3,3,3, 84,30} }, +{ {0,1,0,1,2,3,3,4, 138,19} }, +{ {0,1,0,1,2,3,4,0, 135,15} }, +{ {0,1,0,1,2,3,4,1, 129,34} }, +{ {0,1,0,1,2,3,4,2, 138,14} }, +{ {0,1,0,1,2,3,4,3, 136,14} }, +{ {0,1,0,1,2,3,4,4, 137,18} }, +{ {0,1,0,1,2,3,4,5, 168,19} }, +{ {0,1,0,2,0,0,0,0, 3,28} }, +{ {0,1,0,2,0,0,0,1, 6,12} }, +{ {0,1,0,2,0,0,0,2, 8,47} }, +{ {0,1,0,2,0,0,0,3, 58,12} }, +{ {0,1,0,2,0,0,1,0, 21,2} }, +{ {0,1,0,2,0,0,1,1, 23,33} }, +{ {0,1,0,2,0,0,1,2, 24,13} }, +{ {0,1,0,2,0,0,1,3, 64,13} }, +{ {0,1,0,2,0,0,2,0, 35,2} }, +{ {0,1,0,2,0,0,2,1, 36,33} }, +{ {0,1,0,2,0,0,2,2, 28,24} }, +{ {0,1,0,2,0,0,2,3, 71,13} }, +{ {0,1,0,2,0,0,3,0, 70,2} }, +{ {0,1,0,2,0,0,3,1, 71,33} }, +{ {0,1,0,2,0,0,3,2, 73,33} }, +{ {0,1,0,2,0,0,3,3, 72,33} }, +{ {0,1,0,2,0,0,3,4, 127,13} }, +{ {0,1,0,2,0,1,0,0, 8,46} }, +{ {0,1,0,2,0,1,0,1, 10,12} }, +{ {0,1,0,2,0,1,0,2, 11,12} }, +{ {0,1,0,2,0,1,0,3, 59,13} }, +{ {0,1,0,2,0,1,1,0, 27,13} }, +{ {0,1,0,2,0,1,1,1, 28,13} }, +{ {0,1,0,2,0,1,1,2, 29,13} }, +{ {0,1,0,2,0,1,1,3, 65,13} }, +{ {0,1,0,2,0,1,2,0, 40,40} }, +{ {0,1,0,2,0,1,2,1, 42,40} }, +{ {0,1,0,2,0,1,2,2, 41,40} }, +{ {0,1,0,2,0,1,2,3, 75,40} }, +{ {0,1,0,2,0,1,3,0, 81,13} }, +{ {0,1,0,2,0,1,3,1, 83,9} }, +{ {0,1,0,2,0,1,3,2, 84,13} }, +{ {0,1,0,2,0,1,3,3, 82,13} }, +{ {0,1,0,2,0,1,3,4, 129,13} }, +{ {0,1,0,2,0,2,0,0, 6,27} }, +{ {0,1,0,2,0,2,0,1, 12,13} }, +{ {0,1,0,2,0,2,0,2, 10,27} }, +{ {0,1,0,2,0,2,0,3, 60,13} }, +{ {0,1,0,2,0,2,1,0, 30,13} }, +{ {0,1,0,2,0,2,1,1, 31,13} }, +{ {0,1,0,2,0,2,1,2, 32,13} }, +{ {0,1,0,2,0,2,1,3, 66,13} }, +{ {0,1,0,2,0,2,2,0, 38,13} }, +{ {0,1,0,2,0,2,2,1, 39,13} }, +{ {0,1,0,2,0,2,2,2, 17,5} }, +{ {0,1,0,2,0,2,2,3, 74,13} }, +{ {0,1,0,2,0,2,3,0, 85,13} }, +{ {0,1,0,2,0,2,3,1, 87,13} }, +{ {0,1,0,2,0,2,3,2, 88,22} }, +{ {0,1,0,2,0,2,3,3, 86,13} }, +{ {0,1,0,2,0,2,3,4, 130,13} }, +{ {0,1,0,2,0,3,0,0, 58,27} }, +{ {0,1,0,2,0,3,0,1, 60,26} }, +{ {0,1,0,2,0,3,0,2, 59,26} }, +{ {0,1,0,2,0,3,0,3, 59,47} }, +{ {0,1,0,2,0,3,0,4, 124,40} }, +{ {0,1,0,2,0,3,1,0, 67,40} }, +{ {0,1,0,2,0,3,1,1, 68,40} }, +{ {0,1,0,2,0,3,1,2, 69,40} }, +{ {0,1,0,2,0,3,1,3, 69,13} }, +{ {0,1,0,2,0,3,1,4, 126,40} }, +{ {0,1,0,2,0,3,2,0, 76,40} }, +{ {0,1,0,2,0,3,2,1, 78,40} }, +{ {0,1,0,2,0,3,2,2, 77,40} }, +{ {0,1,0,2,0,3,2,3, 79,40} }, +{ {0,1,0,2,0,3,2,4, 128,40} }, +{ {0,1,0,2,0,3,3,0, 76,13} }, +{ {0,1,0,2,0,3,3,1, 78,13} }, +{ {0,1,0,2,0,3,3,2, 79,13} }, +{ {0,1,0,2,0,3,3,3, 77,13} }, +{ {0,1,0,2,0,3,3,4, 128,13} }, +{ {0,1,0,2,0,3,4,0, 131,40} }, +{ {0,1,0,2,0,3,4,1, 133,40} }, +{ {0,1,0,2,0,3,4,2, 134,40} }, +{ {0,1,0,2,0,3,4,3, 134,13} }, +{ {0,1,0,2,0,3,4,4, 132,40} }, +{ {0,1,0,2,0,3,4,5, 167,40} }, +{ {0,1,0,2,1,0,0,0, 35,25} }, +{ {0,1,0,2,1,0,0,1, 38,26} }, +{ {0,1,0,2,1,0,0,2, 40,41} }, +{ {0,1,0,2,1,0,0,3, 76,41} }, +{ {0,1,0,2,1,0,1,0, 45,28} }, +{ {0,1,0,2,1,0,1,1, 27,29} }, +{ {0,1,0,2,1,0,1,2, 47,40} }, +{ {0,1,0,2,1,0,1,3, 90,40} }, +{ {0,1,0,2,1,0,2,0, 49,19} }, +{ {0,1,0,2,1,0,2,1, 50,19} }, +{ {0,1,0,2,1,0,2,2, 31,24} }, +{ {0,1,0,2,1,0,2,3, 98,19} }, +{ {0,1,0,2,1,0,3,0, 101,19} }, +{ {0,1,0,2,1,0,3,1, 102,19} }, +{ {0,1,0,2,1,0,3,2, 103,19} }, +{ {0,1,0,2,1,0,3,3, 103,40} }, +{ {0,1,0,2,1,0,3,4, 140,19} }, +{ {0,1,0,2,1,1,0,0, 28,3} }, +{ {0,1,0,2,1,1,0,1, 17,3} }, +{ {0,1,0,2,1,1,0,2, 41,41} }, +{ {0,1,0,2,1,1,0,3, 77,41} }, +{ {0,1,0,2,1,1,1,0, 23,11} }, +{ {0,1,0,2,1,1,1,1, 8,10} }, +{ {0,1,0,2,1,1,1,2, 37,3} }, +{ {0,1,0,2,1,1,1,3, 72,11} }, +{ {0,1,0,2,1,1,2,0, 31,3} }, +{ {0,1,0,2,1,1,2,1, 18,31} }, +{ {0,1,0,2,1,1,2,2, 43,3} }, +{ {0,1,0,2,1,1,2,3, 86,3} }, +{ {0,1,0,2,1,1,3,0, 68,42} }, +{ {0,1,0,2,1,1,3,1, 63,42} }, +{ {0,1,0,2,1,1,3,2, 82,42} }, +{ {0,1,0,2,1,1,3,3, 82,3} }, +{ {0,1,0,2,1,1,3,4, 132,42} }, +{ {0,1,0,2,1,2,0,0, 36,26} }, +{ {0,1,0,2,1,2,0,1, 39,26} }, +{ {0,1,0,2,1,2,0,2, 42,41} }, +{ {0,1,0,2,1,2,0,3, 78,41} }, +{ {0,1,0,2,1,2,1,0, 48,40} }, +{ {0,1,0,2,1,2,1,1, 40,4} }, +{ {0,1,0,2,1,2,1,2, 29,37} }, +{ {0,1,0,2,1,2,1,3, 91,40} }, +{ {0,1,0,2,1,2,2,0, 50,18} }, +{ {0,1,0,2,1,2,2,1, 51,19} }, +{ {0,1,0,2,1,2,2,2, 18,30} }, +{ {0,1,0,2,1,2,2,3, 99,19} }, +{ {0,1,0,2,1,2,3,0, 104,19} }, +{ {0,1,0,2,1,2,3,1, 105,19} }, +{ {0,1,0,2,1,2,3,2, 79,37} }, +{ {0,1,0,2,1,2,3,3, 106,19} }, +{ {0,1,0,2,1,2,3,4, 141,19} }, +{ {0,1,0,2,1,3,0,0, 71,26} }, +{ {0,1,0,2,1,3,0,1, 74,26} }, +{ {0,1,0,2,1,3,0,2, 75,41} }, +{ {0,1,0,2,1,3,0,3, 79,41} }, +{ {0,1,0,2,1,3,0,4, 128,41} }, +{ {0,1,0,2,1,3,1,0, 92,40} }, +{ {0,1,0,2,1,3,1,1, 81,29} }, +{ {0,1,0,2,1,3,1,2, 93,40} }, +{ {0,1,0,2,1,3,1,3, 94,40} }, +{ {0,1,0,2,1,3,1,4, 135,40} }, +{ {0,1,0,2,1,3,2,0, 98,18} }, +{ {0,1,0,2,1,3,2,1, 99,18} }, +{ {0,1,0,2,1,3,2,2, 86,24} }, +{ {0,1,0,2,1,3,2,3, 100,19} }, +{ {0,1,0,2,1,3,2,4, 139,19} }, +{ {0,1,0,2,1,3,3,0, 104,40} }, +{ {0,1,0,2,1,3,3,1, 105,40} }, +{ {0,1,0,2,1,3,3,2, 106,40} }, +{ {0,1,0,2,1,3,3,3, 79,30} }, +{ {0,1,0,2,1,3,3,4, 141,40} }, +{ {0,1,0,2,1,3,4,0, 142,19} }, +{ {0,1,0,2,1,3,4,1, 143,19} }, +{ {0,1,0,2,1,3,4,2, 144,19} }, +{ {0,1,0,2,1,3,4,3, 145,19} }, +{ {0,1,0,2,1,3,4,4, 144,40} }, +{ {0,1,0,2,1,3,4,5, 169,19} }, +{ {0,1,0,2,2,0,0,0, 21,25} }, +{ {0,1,0,2,2,0,0,1, 30,26} }, +{ {0,1,0,2,2,0,0,2, 27,26} }, +{ {0,1,0,2,2,0,0,3, 67,41} }, +{ {0,1,0,2,2,0,1,0, 52,19} }, +{ {0,1,0,2,2,0,1,1, 53,19} }, +{ {0,1,0,2,2,0,1,2, 53,40} }, +{ {0,1,0,2,2,0,1,3, 107,19} }, +{ {0,1,0,2,2,0,2,0, 45,29} }, +{ {0,1,0,2,2,0,2,1, 48,41} }, +{ {0,1,0,2,2,0,2,2, 23,4} }, +{ {0,1,0,2,2,0,2,3, 92,41} }, +{ {0,1,0,2,2,0,3,0, 110,19} }, +{ {0,1,0,2,2,0,3,1, 111,19} }, +{ {0,1,0,2,2,0,3,2, 112,19} }, +{ {0,1,0,2,2,0,3,3, 108,25} }, +{ {0,1,0,2,2,0,3,4, 147,19} }, +{ {0,1,0,2,2,1,0,0, 24,26} }, +{ {0,1,0,2,2,1,0,1, 32,26} }, +{ {0,1,0,2,2,1,0,2, 29,26} }, +{ {0,1,0,2,2,1,0,3, 69,41} }, +{ {0,1,0,2,2,1,1,0, 53,41} }, +{ {0,1,0,2,2,1,1,1, 24,30} }, +{ {0,1,0,2,2,1,1,2, 47,9} }, +{ {0,1,0,2,2,1,1,3, 108,19} }, +{ {0,1,0,2,2,1,2,0, 47,41} }, +{ {0,1,0,2,2,1,2,1, 29,36} }, +{ {0,1,0,2,2,1,2,2, 37,24} }, +{ {0,1,0,2,2,1,2,3, 93,41} }, +{ {0,1,0,2,2,1,3,0, 108,43} }, +{ {0,1,0,2,2,1,3,1, 69,9} }, +{ {0,1,0,2,2,1,3,2, 93,9} }, +{ {0,1,0,2,2,1,3,3, 113,19} }, +{ {0,1,0,2,2,1,3,4, 148,19} }, +{ {0,1,0,2,2,2,0,0, 23,44} }, +{ {0,1,0,2,2,2,0,1, 31,26} }, +{ {0,1,0,2,2,2,0,2, 28,26} }, +{ {0,1,0,2,2,2,0,3, 68,41} }, +{ {0,1,0,2,2,2,1,0, 53,18} }, +{ {0,1,0,2,2,2,1,1, 47,5} }, +{ {0,1,0,2,2,2,1,2, 24,31} }, +{ {0,1,0,2,2,2,1,3, 108,40} }, +{ {0,1,0,2,2,2,2,0, 27,28} }, +{ {0,1,0,2,2,2,2,1, 40,11} }, +{ {0,1,0,2,2,2,2,2, 8,5} }, +{ {0,1,0,2,2,2,2,3, 81,28} }, +{ {0,1,0,2,2,2,3,0, 112,3} }, +{ {0,1,0,2,2,2,3,1, 103,3} }, +{ {0,1,0,2,2,2,3,2, 73,37} }, +{ {0,1,0,2,2,2,3,3, 93,5} }, +{ {0,1,0,2,2,2,3,4, 149,19} }, +{ {0,1,0,2,2,3,0,0, 64,26} }, +{ {0,1,0,2,2,3,0,1, 66,26} }, +{ {0,1,0,2,2,3,0,2, 65,26} }, +{ {0,1,0,2,2,3,0,3, 69,26} }, +{ {0,1,0,2,2,3,0,4, 126,41} }, +{ {0,1,0,2,2,3,1,0, 107,41} }, +{ {0,1,0,2,2,3,1,1, 108,41} }, +{ {0,1,0,2,2,3,1,2, 108,18} }, +{ {0,1,0,2,2,3,1,3, 109,19} }, +{ {0,1,0,2,2,3,1,4, 146,19} }, +{ {0,1,0,2,2,3,2,0, 90,41} }, +{ {0,1,0,2,2,3,2,1, 91,41} }, +{ {0,1,0,2,2,3,2,2, 72,4} }, +{ {0,1,0,2,2,3,2,3, 94,41} }, +{ {0,1,0,2,2,3,2,4, 135,41} }, +{ {0,1,0,2,2,3,3,0, 111,41} }, +{ {0,1,0,2,2,3,3,1, 114,19} }, +{ {0,1,0,2,2,3,3,2, 103,39} }, +{ {0,1,0,2,2,3,3,3, 69,5} }, +{ {0,1,0,2,2,3,3,4, 150,19} }, +{ {0,1,0,2,2,3,4,0, 147,41} }, +{ {0,1,0,2,2,3,4,1, 150,41} }, +{ {0,1,0,2,2,3,4,2, 149,41} }, +{ {0,1,0,2,2,3,4,3, 151,19} }, +{ {0,1,0,2,2,3,4,4, 148,41} }, +{ {0,1,0,2,2,3,4,5, 170,19} }, +{ {0,1,0,2,3,0,0,0, 70,25} }, +{ {0,1,0,2,3,0,0,1, 85,26} }, +{ {0,1,0,2,3,0,0,2, 81,26} }, +{ {0,1,0,2,3,0,0,3, 76,26} }, +{ {0,1,0,2,3,0,0,4, 131,41} }, +{ {0,1,0,2,3,0,1,0, 110,18} }, +{ {0,1,0,2,3,0,1,1, 112,24} }, +{ {0,1,0,2,3,0,1,2, 108,38} }, +{ {0,1,0,2,3,0,1,3, 111,40} }, +{ {0,1,0,2,3,0,1,4, 147,40} }, +{ {0,1,0,2,3,0,2,0, 101,18} }, +{ {0,1,0,2,3,0,2,1, 104,18} }, +{ {0,1,0,2,3,0,2,2, 68,39} }, +{ {0,1,0,2,3,0,2,3, 104,41} }, +{ {0,1,0,2,3,0,2,4, 142,18} }, +{ {0,1,0,2,3,0,3,0, 89,28} }, +{ {0,1,0,2,3,0,3,1, 91,47} }, +{ {0,1,0,2,3,0,3,2, 93,47} }, +{ {0,1,0,2,3,0,3,3, 65,29} }, +{ {0,1,0,2,3,0,3,4, 135,47} }, +{ {0,1,0,2,3,0,4,0, 152,19} }, +{ {0,1,0,2,3,0,4,1, 153,19} }, +{ {0,1,0,2,3,0,4,2, 149,23} }, +{ {0,1,0,2,3,0,4,3, 153,40} }, +{ {0,1,0,2,3,0,4,4, 149,4} }, +{ {0,1,0,2,3,0,4,5, 171,19} }, +{ {0,1,0,2,3,1,0,0, 73,44} }, +{ {0,1,0,2,3,1,0,1, 88,9} }, +{ {0,1,0,2,3,1,0,2, 84,26} }, +{ {0,1,0,2,3,1,0,3, 79,26} }, +{ {0,1,0,2,3,1,0,4, 134,41} }, +{ {0,1,0,2,3,1,1,0, 112,18} }, +{ {0,1,0,2,3,1,1,1, 73,36} }, +{ {0,1,0,2,3,1,1,2, 93,22} }, +{ {0,1,0,2,3,1,1,3, 103,42} }, +{ {0,1,0,2,3,1,1,4, 149,40} }, +{ {0,1,0,2,3,1,2,0, 103,18} }, +{ {0,1,0,2,3,1,2,1, 79,36} }, +{ {0,1,0,2,3,1,2,2, 82,39} }, +{ {0,1,0,2,3,1,2,3, 106,41} }, +{ {0,1,0,2,3,1,2,4, 144,18} }, +{ {0,1,0,2,3,1,3,0, 93,46} }, +{ {0,1,0,2,3,1,3,1, 84,36} }, +{ {0,1,0,2,3,1,3,2, 96,8} }, +{ {0,1,0,2,3,1,3,3, 82,29} }, +{ {0,1,0,2,3,1,3,4, 137,40} }, +{ {0,1,0,2,3,1,4,0, 149,8} }, +{ {0,1,0,2,3,1,4,1, 134,9} }, +{ {0,1,0,2,3,1,4,2, 137,8} }, +{ {0,1,0,2,3,1,4,3, 144,42} }, +{ {0,1,0,2,3,1,4,4, 154,19} }, +{ {0,1,0,2,3,1,4,5, 172,19} }, +{ {0,1,0,2,3,2,0,0, 71,44} }, +{ {0,1,0,2,3,2,0,1, 87,26} }, +{ {0,1,0,2,3,2,0,2, 83,22} }, +{ {0,1,0,2,3,2,0,3, 78,26} }, +{ {0,1,0,2,3,2,0,4, 133,41} }, +{ {0,1,0,2,3,2,1,0, 111,18} }, +{ {0,1,0,2,3,2,1,1, 103,24} }, +{ {0,1,0,2,3,2,1,2, 69,22} }, +{ {0,1,0,2,3,2,1,3, 114,18} }, +{ {0,1,0,2,3,2,1,4, 150,40} }, +{ {0,1,0,2,3,2,2,0, 102,18} }, +{ {0,1,0,2,3,2,2,1, 105,18} }, +{ {0,1,0,2,3,2,2,2, 63,39} }, +{ {0,1,0,2,3,2,2,3, 105,41} }, +{ {0,1,0,2,3,2,2,4, 143,18} }, +{ {0,1,0,2,3,2,3,0, 91,46} }, +{ {0,1,0,2,3,2,3,1, 97,40} }, +{ {0,1,0,2,3,2,3,2, 84,37} }, +{ {0,1,0,2,3,2,3,3, 75,4} }, +{ {0,1,0,2,3,2,3,4, 138,40} }, +{ {0,1,0,2,3,2,4,0, 153,18} }, +{ {0,1,0,2,3,2,4,1, 155,19} }, +{ {0,1,0,2,3,2,4,2, 134,22} }, +{ {0,1,0,2,3,2,4,3, 156,19} }, +{ {0,1,0,2,3,2,4,4, 144,24} }, +{ {0,1,0,2,3,2,4,5, 173,19} }, +{ {0,1,0,2,3,3,0,0, 72,44} }, +{ {0,1,0,2,3,3,0,1, 86,26} }, +{ {0,1,0,2,3,3,0,2, 82,26} }, +{ {0,1,0,2,3,3,0,3, 77,26} }, +{ {0,1,0,2,3,3,0,4, 132,41} }, +{ {0,1,0,2,3,3,1,0, 108,2} }, +{ {0,1,0,2,3,3,1,1, 93,10} }, +{ {0,1,0,2,3,3,1,2, 113,18} }, +{ {0,1,0,2,3,3,1,3, 69,10} }, +{ {0,1,0,2,3,3,1,4, 148,40} }, +{ {0,1,0,2,3,3,2,0, 103,41} }, +{ {0,1,0,2,3,3,2,1, 106,18} }, +{ {0,1,0,2,3,3,2,2, 82,24} }, +{ {0,1,0,2,3,3,2,3, 79,31} }, +{ {0,1,0,2,3,3,2,4, 144,41} }, +{ {0,1,0,2,3,3,3,0, 65,28} }, +{ {0,1,0,2,3,3,3,1, 75,11} }, +{ {0,1,0,2,3,3,3,2, 82,28} }, +{ {0,1,0,2,3,3,3,3, 59,28} }, +{ {0,1,0,2,3,3,3,4, 129,28} }, +{ {0,1,0,2,3,3,4,0, 149,11} }, +{ {0,1,0,2,3,3,4,1, 144,3} }, +{ {0,1,0,2,3,3,4,2, 154,18} }, +{ {0,1,0,2,3,3,4,3, 134,10} }, +{ {0,1,0,2,3,3,4,4, 137,11} }, +{ {0,1,0,2,3,3,4,5, 172,40} }, +{ {0,1,0,2,3,4,0,0, 127,26} }, +{ {0,1,0,2,3,4,0,1, 130,26} }, +{ {0,1,0,2,3,4,0,2, 129,26} }, +{ {0,1,0,2,3,4,0,3, 128,26} }, +{ {0,1,0,2,3,4,0,4, 134,26} }, +{ {0,1,0,2,3,4,0,5, 167,41} }, +{ {0,1,0,2,3,4,1,0, 147,18} }, +{ {0,1,0,2,3,4,1,1, 149,18} }, +{ {0,1,0,2,3,4,1,2, 148,18} }, +{ {0,1,0,2,3,4,1,3, 150,18} }, +{ {0,1,0,2,3,4,1,4, 151,18} }, +{ {0,1,0,2,3,4,1,5, 170,18} }, +{ {0,1,0,2,3,4,2,0, 140,18} }, +{ {0,1,0,2,3,4,2,1, 141,18} }, +{ {0,1,0,2,3,4,2,2, 132,39} }, +{ {0,1,0,2,3,4,2,3, 141,41} }, +{ {0,1,0,2,3,4,2,4, 145,18} }, +{ {0,1,0,2,3,4,2,5, 169,18} }, +{ {0,1,0,2,3,4,3,0, 135,46} }, +{ {0,1,0,2,3,4,3,1, 138,41} }, +{ {0,1,0,2,3,4,3,2, 137,41} }, +{ {0,1,0,2,3,4,3,3, 129,29} }, +{ {0,1,0,2,3,4,3,4, 136,47} }, +{ {0,1,0,2,3,4,3,5, 168,40} }, +{ {0,1,0,2,3,4,4,0, 153,41} }, +{ {0,1,0,2,3,4,4,1, 156,18} }, +{ {0,1,0,2,3,4,4,2, 144,39} }, +{ {0,1,0,2,3,4,4,3, 155,40} }, +{ {0,1,0,2,3,4,4,4, 134,5} }, +{ {0,1,0,2,3,4,4,5, 173,40} }, +{ {0,1,0,2,3,4,5,0, 171,18} }, +{ {0,1,0,2,3,4,5,1, 173,18} }, +{ {0,1,0,2,3,4,5,2, 172,18} }, +{ {0,1,0,2,3,4,5,3, 173,41} }, +{ {0,1,0,2,3,4,5,4, 174,19} }, +{ {0,1,0,2,3,4,5,5, 172,41} }, +{ {0,1,0,2,3,4,5,6, 182,19} }, +{ {0,1,1,0,0,0,0,0, 4,5} }, +{ {0,1,1,0,0,0,0,1, 13,2} }, +{ {0,1,1,0,0,0,0,2, 16,12} }, +{ {0,1,1,0,0,0,1,0, 20,10} }, +{ {0,1,1,0,0,0,1,1, 25,2} }, +{ {0,1,1,0,0,0,1,2, 27,33} }, +{ {0,1,1,0,0,0,2,0, 35,10} }, +{ {0,1,1,0,0,0,2,1, 38,2} }, +{ {0,1,1,0,0,0,2,2, 40,33} }, +{ {0,1,1,0,0,0,2,3, 76,33} }, +{ {0,1,1,0,0,1,0,0, 20,4} }, +{ {0,1,1,0,0,1,0,1, 25,12} }, +{ {0,1,1,0,0,1,0,2, 27,12} }, +{ {0,1,1,0,0,1,1,0, 44,12} }, +{ {0,1,1,0,0,1,1,1, 20,5} }, +{ {0,1,1,0,0,1,1,2, 45,13} }, +{ {0,1,1,0,0,1,2,0, 45,8} }, +{ {0,1,1,0,0,1,2,1, 27,9} }, +{ {0,1,1,0,0,1,2,2, 47,32} }, +{ {0,1,1,0,0,1,2,3, 90,32} }, +{ {0,1,1,0,0,2,0,0, 35,4} }, +{ {0,1,1,0,0,2,0,1, 38,12} }, +{ {0,1,1,0,0,2,0,2, 40,12} }, +{ {0,1,1,0,0,2,0,3, 76,12} }, +{ {0,1,1,0,0,2,1,0, 45,26} }, +{ {0,1,1,0,0,2,1,1, 27,44} }, +{ {0,1,1,0,0,2,1,2, 47,13} }, +{ {0,1,1,0,0,2,1,3, 90,13} }, +{ {0,1,1,0,0,2,2,0, 49,13} }, +{ {0,1,1,0,0,2,2,1, 50,13} }, +{ {0,1,1,0,0,2,2,2, 31,5} }, +{ {0,1,1,0,0,2,2,3, 98,13} }, +{ {0,1,1,0,0,2,3,0, 101,23} }, +{ {0,1,1,0,0,2,3,1, 102,32} }, +{ {0,1,1,0,0,2,3,2, 103,32} }, +{ {0,1,1,0,0,2,3,3, 103,13} }, +{ {0,1,1,0,0,2,3,4, 140,32} }, +{ {0,1,1,0,1,0,0,0, 13,5} }, +{ {0,1,1,0,1,0,0,1, 54,0} }, +{ {0,1,1,0,1,0,0,2, 55,0} }, +{ {0,1,1,0,1,0,1,0, 25,22} }, +{ {0,1,1,0,1,0,1,1, 13,4} }, +{ {0,1,1,0,1,0,1,2, 38,27} }, +{ {0,1,1,0,1,0,2,0, 38,22} }, +{ {0,1,1,0,1,0,2,1, 55,1} }, +{ {0,1,1,0,1,0,2,2, 51,5} }, +{ {0,1,1,0,1,0,2,3, 115,0} }, +{ {0,1,1,0,1,1,0,0, 25,24} }, +{ {0,1,1,0,1,1,0,1, 13,3} }, +{ {0,1,1,0,1,1,0,2, 38,3} }, +{ {0,1,1,0,1,1,1,0, 20,11} }, +{ {0,1,1,0,1,1,1,1, 4,4} }, +{ {0,1,1,0,1,1,1,2, 35,11} }, +{ {0,1,1,0,1,1,2,0, 27,42} }, +{ {0,1,1,0,1,1,2,1, 16,9} }, +{ {0,1,1,0,1,1,2,2, 40,42} }, +{ {0,1,1,0,1,1,2,3, 76,42} }, +{ {0,1,1,0,1,2,0,0, 38,24} }, +{ {0,1,1,0,1,2,0,1, 55,6} }, +{ {0,1,1,0,1,2,0,2, 51,30} }, +{ {0,1,1,0,1,2,0,3, 115,19} }, +{ {0,1,1,0,1,2,1,0, 27,27} }, +{ {0,1,1,0,1,2,1,1, 16,27} }, +{ {0,1,1,0,1,2,1,2, 40,27} }, +{ {0,1,1,0,1,2,1,3, 76,27} }, +{ {0,1,1,0,1,2,2,0, 50,23} }, +{ {0,1,1,0,1,2,2,1, 56,0} }, +{ {0,1,1,0,1,2,2,2, 39,5} }, +{ {0,1,1,0,1,2,2,3, 116,0} }, +{ {0,1,1,0,1,2,3,0, 102,23} }, +{ {0,1,1,0,1,2,3,1, 117,0} }, +{ {0,1,1,0,1,2,3,2, 105,36} }, +{ {0,1,1,0,1,2,3,3, 105,25} }, +{ {0,1,1,0,1,2,3,4, 157,0} }, +{ {0,1,1,0,2,0,0,0, 16,22} }, +{ {0,1,1,0,2,0,0,1, 55,7} }, +{ {0,1,1,0,2,0,0,2, 56,1} }, +{ {0,1,1,0,2,0,0,3, 117,1} }, +{ {0,1,1,0,2,0,1,0, 27,22} }, +{ {0,1,1,0,2,0,1,1, 38,25} }, +{ {0,1,1,0,2,0,1,2, 50,26} }, +{ {0,1,1,0,2,0,1,3, 102,26} }, +{ {0,1,1,0,2,0,2,0, 40,22} }, +{ {0,1,1,0,2,0,2,1, 51,28} }, +{ {0,1,1,0,2,0,2,2, 39,4} }, +{ {0,1,1,0,2,0,2,3, 105,47} }, +{ {0,1,1,0,2,0,3,0, 76,22} }, +{ {0,1,1,0,2,0,3,1, 115,14} }, +{ {0,1,1,0,2,0,3,2, 116,1} }, +{ {0,1,1,0,2,0,3,3, 105,24} }, +{ {0,1,1,0,2,0,3,4, 157,1} }, +{ {0,1,1,0,2,1,0,0, 27,39} }, +{ {0,1,1,0,2,1,0,1, 38,9} }, +{ {0,1,1,0,2,1,0,2, 50,8} }, +{ {0,1,1,0,2,1,0,3, 102,43} }, +{ {0,1,1,0,2,1,1,0, 45,23} }, +{ {0,1,1,0,2,1,1,1, 35,5} }, +{ {0,1,1,0,2,1,1,2, 49,8} }, +{ {0,1,1,0,2,1,1,3, 101,26} }, +{ {0,1,1,0,2,1,2,0, 47,23} }, +{ {0,1,1,0,2,1,2,1, 40,9} }, +{ {0,1,1,0,2,1,2,2, 31,4} }, +{ {0,1,1,0,2,1,2,3, 103,43} }, +{ {0,1,1,0,2,1,3,0, 90,8} }, +{ {0,1,1,0,2,1,3,1, 76,9} }, +{ {0,1,1,0,2,1,3,2, 98,8} }, +{ {0,1,1,0,2,1,3,3, 103,8} }, +{ {0,1,1,0,2,1,3,4, 140,43} }, +{ {0,1,1,0,2,2,0,0, 40,39} }, +{ {0,1,1,0,2,2,0,1, 51,2} }, +{ {0,1,1,0,2,2,0,2, 39,10} }, +{ {0,1,1,0,2,2,0,3, 105,2} }, +{ {0,1,1,0,2,2,1,0, 47,38} }, +{ {0,1,1,0,2,2,1,1, 40,44} }, +{ {0,1,1,0,2,2,1,2, 31,10} }, +{ {0,1,1,0,2,2,1,3, 103,26} }, +{ {0,1,1,0,2,2,2,0, 31,11} }, +{ {0,1,1,0,2,2,2,1, 39,11} }, +{ {0,1,1,0,2,2,2,2, 12,5} }, +{ {0,1,1,0,2,2,2,3, 87,11} }, +{ {0,1,1,0,2,2,3,0, 103,23} }, +{ {0,1,1,0,2,2,3,1, 105,3} }, +{ {0,1,1,0,2,2,3,2, 87,10} }, +{ {0,1,1,0,2,2,3,3, 97,11} }, +{ {0,1,1,0,2,2,3,4, 155,2} }, +{ {0,1,1,0,2,3,0,0, 76,39} }, +{ {0,1,1,0,2,3,0,1, 115,6} }, +{ {0,1,1,0,2,3,0,2, 116,18} }, +{ {0,1,1,0,2,3,0,3, 105,37} }, +{ {0,1,1,0,2,3,0,4, 157,18} }, +{ {0,1,1,0,2,3,1,0, 90,45} }, +{ {0,1,1,0,2,3,1,1, 76,44} }, +{ {0,1,1,0,2,3,1,2, 98,26} }, +{ {0,1,1,0,2,3,1,3, 103,45} }, +{ {0,1,1,0,2,3,1,4, 140,26} }, +{ {0,1,1,0,2,3,2,0, 103,38} }, +{ {0,1,1,0,2,3,2,1, 105,46} }, +{ {0,1,1,0,2,3,2,2, 87,4} }, +{ {0,1,1,0,2,3,2,3, 97,28} }, +{ {0,1,1,0,2,3,2,4, 155,47} }, +{ {0,1,1,0,2,3,3,0, 98,23} }, +{ {0,1,1,0,2,3,3,1, 116,15} }, +{ {0,1,1,0,2,3,3,2, 118,0} }, +{ {0,1,1,0,2,3,3,3, 87,5} }, +{ {0,1,1,0,2,3,3,4, 158,0} }, +{ {0,1,1,0,2,3,4,0, 140,23} }, +{ {0,1,1,0,2,3,4,1, 157,15} }, +{ {0,1,1,0,2,3,4,2, 158,1} }, +{ {0,1,1,0,2,3,4,3, 155,36} }, +{ {0,1,1,0,2,3,4,4, 155,25} }, +{ {0,1,1,0,2,3,4,5, 175,0} }, +{ {0,1,1,1,0,0,0,0, 5,11} }, +{ {0,1,1,1,0,0,0,1, 14,2} }, +{ {0,1,1,1,0,0,0,2, 17,12} }, +{ {0,1,1,1,0,0,1,0, 22,2} }, +{ {0,1,1,1,0,0,1,1, 5,7} }, +{ {0,1,1,1,0,0,1,2, 28,33} }, +{ {0,1,1,1,0,0,2,0, 28,15} }, +{ {0,1,1,1,0,0,2,1, 17,15} }, +{ {0,1,1,1,0,0,2,2, 41,33} }, +{ {0,1,1,1,0,0,2,3, 77,33} }, +{ {0,1,1,1,0,1,0,0, 22,29} }, +{ {0,1,1,1,0,1,0,1, 5,23} }, +{ {0,1,1,1,0,1,0,2, 28,12} }, +{ {0,1,1,1,0,1,1,0, 20,15} }, +{ {0,1,1,1,0,1,1,1, 2,22} }, +{ {0,1,1,1,0,1,1,2, 34,15} }, +{ {0,1,1,1,0,1,2,0, 23,35} }, +{ {0,1,1,1,0,1,2,1, 8,34} }, +{ {0,1,1,1,0,1,2,2, 37,15} }, +{ {0,1,1,1,0,1,2,3, 72,35} }, +{ {0,1,1,1,0,2,0,0, 28,16} }, +{ {0,1,1,1,0,2,0,1, 17,7} }, +{ {0,1,1,1,0,2,0,2, 41,12} }, +{ {0,1,1,1,0,2,0,3, 77,12} }, +{ {0,1,1,1,0,2,1,0, 23,6} }, +{ {0,1,1,1,0,2,1,1, 8,7} }, +{ {0,1,1,1,0,2,1,2, 37,16} }, +{ {0,1,1,1,0,2,1,3, 72,6} }, +{ {0,1,1,1,0,2,2,0, 31,15} }, +{ {0,1,1,1,0,2,2,1, 18,23} }, +{ {0,1,1,1,0,2,2,2, 43,15} }, +{ {0,1,1,1,0,2,2,3, 86,15} }, +{ {0,1,1,1,0,2,3,0, 68,15} }, +{ {0,1,1,1,0,2,3,1, 63,15} }, +{ {0,1,1,1,0,2,3,2, 82,15} }, +{ {0,1,1,1,0,2,3,3, 82,16} }, +{ {0,1,1,1,0,2,3,4, 132,15} }, +{ {0,1,1,1,1,0,0,0, 25,5} }, +{ {0,1,1,1,1,0,0,1, 13,7} }, +{ {0,1,1,1,1,0,0,2, 38,15} }, +{ {0,1,1,1,1,0,1,0, 20,6} }, +{ {0,1,1,1,1,0,1,1, 4,7} }, +{ {0,1,1,1,1,0,1,2, 35,6} }, +{ {0,1,1,1,1,0,2,0, 27,15} }, +{ {0,1,1,1,1,0,2,1, 16,15} }, +{ {0,1,1,1,1,0,2,2, 40,15} }, +{ {0,1,1,1,1,0,2,3, 76,15} }, +{ {0,1,1,1,1,1,0,0, 20,8} }, +{ {0,1,1,1,1,1,0,1, 4,9} }, +{ {0,1,1,1,1,1,0,2, 35,8} }, +{ {0,1,1,1,1,1,1,0, 19,6} }, +{ {0,1,1,1,1,1,1,1, 1,5} }, +{ {0,1,1,1,1,1,1,2, 33,3} }, +{ {0,1,1,1,1,1,2,0, 21,8} }, +{ {0,1,1,1,1,1,2,1, 7,9} }, +{ {0,1,1,1,1,1,2,2, 34,8} }, +{ {0,1,1,1,1,1,2,3, 70,8} }, +{ {0,1,1,1,1,2,0,0, 27,16} }, +{ {0,1,1,1,1,2,0,1, 16,7} }, +{ {0,1,1,1,1,2,0,2, 40,16} }, +{ {0,1,1,1,1,2,0,3, 76,16} }, +{ {0,1,1,1,1,2,1,0, 21,6} }, +{ {0,1,1,1,1,2,1,1, 7,7} }, +{ {0,1,1,1,1,2,1,2, 34,6} }, +{ {0,1,1,1,1,2,1,3, 70,6} }, +{ {0,1,1,1,1,2,2,0, 30,15} }, +{ {0,1,1,1,1,2,2,1, 16,23} }, +{ {0,1,1,1,1,2,2,2, 26,5} }, +{ {0,1,1,1,1,2,2,3, 85,15} }, +{ {0,1,1,1,1,2,3,0, 67,15} }, +{ {0,1,1,1,1,2,3,1, 62,15} }, +{ {0,1,1,1,1,2,3,2, 81,15} }, +{ {0,1,1,1,1,2,3,3, 81,16} }, +{ {0,1,1,1,1,2,3,4, 131,15} }, +{ {0,1,1,1,2,0,0,0, 26,15} }, +{ {0,1,1,1,2,0,0,1, 15,7} }, +{ {0,1,1,1,2,0,0,2, 39,15} }, +{ {0,1,1,1,2,0,0,3, 74,15} }, +{ {0,1,1,1,2,0,1,0, 23,16} }, +{ {0,1,1,1,2,0,1,1, 6,7} }, +{ {0,1,1,1,2,0,1,2, 36,16} }, +{ {0,1,1,1,2,0,1,3, 71,16} }, +{ {0,1,1,1,2,0,2,0, 29,15} }, +{ {0,1,1,1,2,0,2,1, 18,15} }, +{ {0,1,1,1,2,0,2,2, 42,15} }, +{ {0,1,1,1,2,0,2,3, 79,15} }, +{ {0,1,1,1,2,0,3,0, 65,15} }, +{ {0,1,1,1,2,0,3,1, 61,15} }, +{ {0,1,1,1,2,0,3,2, 78,15} }, +{ {0,1,1,1,2,0,3,3, 75,15} }, +{ {0,1,1,1,2,0,3,4, 128,15} }, +{ {0,1,1,1,2,1,0,0, 23,15} }, +{ {0,1,1,1,2,1,0,1, 6,23} }, +{ {0,1,1,1,2,1,0,2, 36,15} }, +{ {0,1,1,1,2,1,0,3, 71,15} }, +{ {0,1,1,1,2,1,1,0, 21,15} }, +{ {0,1,1,1,2,1,1,1, 3,23} }, +{ {0,1,1,1,2,1,1,2, 35,15} }, +{ {0,1,1,1,2,1,1,3, 70,15} }, +{ {0,1,1,1,2,1,2,0, 24,15} }, +{ {0,1,1,1,2,1,2,1, 8,23} }, +{ {0,1,1,1,2,1,2,2, 28,4} }, +{ {0,1,1,1,2,1,2,3, 73,15} }, +{ {0,1,1,1,2,1,3,0, 64,35} }, +{ {0,1,1,1,2,1,3,1, 58,34} }, +{ {0,1,1,1,2,1,3,2, 71,35} }, +{ {0,1,1,1,2,1,3,3, 72,15} }, +{ {0,1,1,1,2,1,3,4, 127,15} }, +{ {0,1,1,1,2,2,0,0, 29,16} }, +{ {0,1,1,1,2,2,0,1, 18,7} }, +{ {0,1,1,1,2,2,0,2, 42,16} }, +{ {0,1,1,1,2,2,0,3, 79,16} }, +{ {0,1,1,1,2,2,1,0, 24,6} }, +{ {0,1,1,1,2,2,1,1, 8,38} }, +{ {0,1,1,1,2,2,1,2, 28,31} }, +{ {0,1,1,1,2,2,1,3, 73,16} }, +{ {0,1,1,1,2,2,2,0, 32,15} }, +{ {0,1,1,1,2,2,2,1, 17,23} }, +{ {0,1,1,1,2,2,2,2, 10,5} }, +{ {0,1,1,1,2,2,2,3, 88,15} }, +{ {0,1,1,1,2,2,3,0, 69,15} }, +{ {0,1,1,1,2,2,3,1, 63,34} }, +{ {0,1,1,1,2,2,3,2, 83,15} }, +{ {0,1,1,1,2,2,3,3, 84,16} }, +{ {0,1,1,1,2,2,3,4, 134,15} }, +{ {0,1,1,1,2,3,0,0, 65,16} }, +{ {0,1,1,1,2,3,0,1, 61,7} }, +{ {0,1,1,1,2,3,0,2, 78,16} }, +{ {0,1,1,1,2,3,0,3, 75,16} }, +{ {0,1,1,1,2,3,0,4, 128,16} }, +{ {0,1,1,1,2,3,1,0, 64,6} }, +{ {0,1,1,1,2,3,1,1, 58,7} }, +{ {0,1,1,1,2,3,1,2, 71,6} }, +{ {0,1,1,1,2,3,1,3, 72,16} }, +{ {0,1,1,1,2,3,1,4, 127,16} }, +{ {0,1,1,1,2,3,2,0, 69,16} }, +{ {0,1,1,1,2,3,2,1, 63,7} }, +{ {0,1,1,1,2,3,2,2, 83,16} }, +{ {0,1,1,1,2,3,2,3, 84,15} }, +{ {0,1,1,1,2,3,2,4, 134,16} }, +{ {0,1,1,1,2,3,3,0, 66,15} }, +{ {0,1,1,1,2,3,3,1, 61,23} }, +{ {0,1,1,1,2,3,3,2, 87,15} }, +{ {0,1,1,1,2,3,3,3, 80,15} }, +{ {0,1,1,1,2,3,3,4, 130,15} }, +{ {0,1,1,1,2,3,4,0, 126,15} }, +{ {0,1,1,1,2,3,4,1, 125,15} }, +{ {0,1,1,1,2,3,4,2, 133,15} }, +{ {0,1,1,1,2,3,4,3, 129,15} }, +{ {0,1,1,1,2,3,4,4, 129,16} }, +{ {0,1,1,1,2,3,4,5, 167,15} }, +{ {0,1,1,2,0,0,0,0, 6,11} }, +{ {0,1,1,2,0,0,0,1, 15,2} }, +{ {0,1,1,2,0,0,0,2, 18,12} }, +{ {0,1,1,2,0,0,0,3, 61,12} }, +{ {0,1,1,2,0,0,1,0, 23,2} }, +{ {0,1,1,2,0,0,1,1, 26,2} }, +{ {0,1,1,2,0,0,1,2, 29,33} }, +{ {0,1,1,2,0,0,1,3, 65,33} }, +{ {0,1,1,2,0,0,2,0, 36,2} }, +{ {0,1,1,2,0,0,2,1, 39,2} }, +{ {0,1,1,2,0,0,2,2, 42,33} }, +{ {0,1,1,2,0,0,2,3, 78,33} }, +{ {0,1,1,2,0,0,3,0, 71,2} }, +{ {0,1,1,2,0,0,3,1, 74,2} }, +{ {0,1,1,2,0,0,3,2, 79,33} }, +{ {0,1,1,2,0,0,3,3, 75,33} }, +{ {0,1,1,2,0,0,3,4, 128,33} }, +{ {0,1,1,2,0,1,0,0, 23,47} }, +{ {0,1,1,2,0,1,0,1, 26,12} }, +{ {0,1,1,2,0,1,0,2, 29,12} }, +{ {0,1,1,2,0,1,0,3, 65,12} }, +{ {0,1,1,2,0,1,1,0, 45,12} }, +{ {0,1,1,2,0,1,1,1, 34,5} }, +{ {0,1,1,2,0,1,1,2, 46,12} }, +{ {0,1,1,2,0,1,1,3, 89,13} }, +{ {0,1,1,2,0,1,2,0, 48,32} }, +{ {0,1,1,2,0,1,2,1, 40,36} }, +{ {0,1,1,2,0,1,2,2, 29,39} }, +{ {0,1,1,2,0,1,2,3, 91,32} }, +{ {0,1,1,2,0,1,3,0, 92,42} }, +{ {0,1,1,2,0,1,3,1, 81,9} }, +{ {0,1,1,2,0,1,3,2, 94,32} }, +{ {0,1,1,2,0,1,3,3, 93,32} }, +{ {0,1,1,2,0,1,3,4, 135,32} }, +{ {0,1,1,2,0,2,0,0, 36,47} }, +{ {0,1,1,2,0,2,0,1, 39,12} }, +{ {0,1,1,2,0,2,0,2, 42,12} }, +{ {0,1,1,2,0,2,0,3, 78,12} }, +{ {0,1,1,2,0,2,1,0, 48,13} }, +{ {0,1,1,2,0,2,1,1, 40,25} }, +{ {0,1,1,2,0,2,1,2, 29,22} }, +{ {0,1,1,2,0,2,1,3, 91,13} }, +{ {0,1,1,2,0,2,2,0, 50,12} }, +{ {0,1,1,2,0,2,2,1, 51,13} }, +{ {0,1,1,2,0,2,2,2, 18,22} }, +{ {0,1,1,2,0,2,2,3, 99,13} }, +{ {0,1,1,2,0,2,3,0, 104,32} }, +{ {0,1,1,2,0,2,3,1, 105,32} }, +{ {0,1,1,2,0,2,3,2, 79,22} }, +{ {0,1,1,2,0,2,3,3, 106,32} }, +{ {0,1,1,2,0,2,3,4, 141,32} }, +{ {0,1,1,2,0,3,0,0, 71,47} }, +{ {0,1,1,2,0,3,0,1, 74,12} }, +{ {0,1,1,2,0,3,0,2, 79,12} }, +{ {0,1,1,2,0,3,0,3, 75,12} }, +{ {0,1,1,2,0,3,0,4, 128,12} }, +{ {0,1,1,2,0,3,1,0, 92,27} }, +{ {0,1,1,2,0,3,1,1, 81,44} }, +{ {0,1,1,2,0,3,1,2, 94,13} }, +{ {0,1,1,2,0,3,1,3, 93,13} }, +{ {0,1,1,2,0,3,1,4, 135,13} }, +{ {0,1,1,2,0,3,2,0, 104,13} }, +{ {0,1,1,2,0,3,2,1, 105,13} }, +{ {0,1,1,2,0,3,2,2, 79,39} }, +{ {0,1,1,2,0,3,2,3, 106,13} }, +{ {0,1,1,2,0,3,2,4, 141,13} }, +{ {0,1,1,2,0,3,3,0, 98,12} }, +{ {0,1,1,2,0,3,3,1, 99,12} }, +{ {0,1,1,2,0,3,3,2, 100,13} }, +{ {0,1,1,2,0,3,3,3, 86,5} }, +{ {0,1,1,2,0,3,3,4, 139,13} }, +{ {0,1,1,2,0,3,4,0, 142,32} }, +{ {0,1,1,2,0,3,4,1, 143,32} }, +{ {0,1,1,2,0,3,4,2, 145,32} }, +{ {0,1,1,2,0,3,4,3, 144,32} }, +{ {0,1,1,2,0,3,4,4, 144,13} }, +{ {0,1,1,2,0,3,4,5, 169,32} }, +{ {0,1,1,2,1,0,0,0, 38,5} }, +{ {0,1,1,2,1,0,0,1, 55,2} }, +{ {0,1,1,2,1,0,0,2, 51,22} }, +{ {0,1,1,2,1,0,0,3, 115,13} }, +{ {0,1,1,2,1,0,1,0, 27,46} }, +{ {0,1,1,2,1,0,1,1, 16,29} }, +{ {0,1,1,2,1,0,1,2, 40,46} }, +{ {0,1,1,2,1,0,1,3, 76,46} }, +{ {0,1,1,2,1,0,2,0, 50,31} }, +{ {0,1,1,2,1,0,2,1, 56,3} }, +{ {0,1,1,2,1,0,2,2, 39,24} }, +{ {0,1,1,2,1,0,2,3, 116,21} }, +{ {0,1,1,2,1,0,3,0, 102,36} }, +{ {0,1,1,2,1,0,3,1, 117,21} }, +{ {0,1,1,2,1,0,3,2, 105,23} }, +{ {0,1,1,2,1,0,3,3, 105,4} }, +{ {0,1,1,2,1,0,3,4, 157,21} }, +{ {0,1,1,2,1,1,0,0, 27,3} }, +{ {0,1,1,2,1,1,0,1, 16,3} }, +{ {0,1,1,2,1,1,0,2, 40,3} }, +{ {0,1,1,2,1,1,0,3, 76,3} }, +{ {0,1,1,2,1,1,1,0, 21,11} }, +{ {0,1,1,2,1,1,1,1, 7,10} }, +{ {0,1,1,2,1,1,1,2, 34,11} }, +{ {0,1,1,2,1,1,1,3, 70,11} }, +{ {0,1,1,2,1,1,2,0, 30,3} }, +{ {0,1,1,2,1,1,2,1, 16,31} }, +{ {0,1,1,2,1,1,2,2, 26,24} }, +{ {0,1,1,2,1,1,2,3, 85,3} }, +{ {0,1,1,2,1,1,3,0, 67,42} }, +{ {0,1,1,2,1,1,3,1, 62,42} }, +{ {0,1,1,2,1,1,3,2, 81,42} }, +{ {0,1,1,2,1,1,3,3, 81,3} }, +{ {0,1,1,2,1,1,3,4, 131,42} }, +{ {0,1,1,2,1,2,0,0, 50,4} }, +{ {0,1,1,2,1,2,0,1, 56,13} }, +{ {0,1,1,2,1,2,0,2, 39,22} }, +{ {0,1,1,2,1,2,0,3, 116,13} }, +{ {0,1,1,2,1,2,1,0, 30,27} }, +{ {0,1,1,2,1,2,1,1, 16,4} }, +{ {0,1,1,2,1,2,1,2, 26,22} }, +{ {0,1,1,2,1,2,1,3, 85,27} }, +{ {0,1,1,2,1,2,2,0, 57,0} }, +{ {0,1,1,2,1,2,2,1, 55,5} }, +{ {0,1,1,2,1,2,2,2, 15,5} }, +{ {0,1,1,2,1,2,2,3, 119,0} }, +{ {0,1,1,2,1,2,3,0, 120,0} }, +{ {0,1,1,2,1,2,3,1, 117,9} }, +{ {0,1,1,2,1,2,3,2, 74,22} }, +{ {0,1,1,2,1,2,3,3, 99,5} }, +{ {0,1,1,2,1,2,3,4, 159,0} }, +{ {0,1,1,2,1,3,0,0, 102,25} }, +{ {0,1,1,2,1,3,0,1, 117,27} }, +{ {0,1,1,2,1,3,0,2, 105,38} }, +{ {0,1,1,2,1,3,0,3, 105,31} }, +{ {0,1,1,2,1,3,0,4, 157,40} }, +{ {0,1,1,2,1,3,1,0, 67,27} }, +{ {0,1,1,2,1,3,1,1, 62,27} }, +{ {0,1,1,2,1,3,1,2, 81,27} }, +{ {0,1,1,2,1,3,1,3, 81,46} }, +{ {0,1,1,2,1,3,1,4, 131,27} }, +{ {0,1,1,2,1,3,2,0, 120,19} }, +{ {0,1,1,2,1,3,2,1, 117,7} }, +{ {0,1,1,2,1,3,2,2, 74,24} }, +{ {0,1,1,2,1,3,2,3, 99,30} }, +{ {0,1,1,2,1,3,2,4, 159,19} }, +{ {0,1,1,2,1,3,3,0, 120,13} }, +{ {0,1,1,2,1,3,3,1, 117,10} }, +{ {0,1,1,2,1,3,3,2, 99,22} }, +{ {0,1,1,2,1,3,3,3, 74,5} }, +{ {0,1,1,2,1,3,3,4, 159,13} }, +{ {0,1,1,2,1,3,4,0, 160,0} }, +{ {0,1,1,2,1,3,4,1, 161,0} }, +{ {0,1,1,2,1,3,4,2, 143,23} }, +{ {0,1,1,2,1,3,4,3, 143,36} }, +{ {0,1,1,2,1,3,4,4, 143,25} }, +{ {0,1,1,2,1,3,4,5, 176,0} }, +{ {0,1,1,2,2,0,0,0, 30,5} }, +{ {0,1,1,2,2,0,0,1, 57,2} }, +{ {0,1,1,2,2,0,0,2, 50,22} }, +{ {0,1,1,2,2,0,0,3, 120,12} }, +{ {0,1,1,2,2,0,1,0, 53,36} }, +{ {0,1,1,2,2,0,1,1, 30,25} }, +{ {0,1,1,2,2,0,1,2, 48,44} }, +{ {0,1,1,2,2,0,1,3, 111,26} }, +{ {0,1,1,2,2,0,2,0, 48,30} }, +{ {0,1,1,2,2,0,2,1, 50,29} }, +{ {0,1,1,2,2,0,2,2, 36,4} }, +{ {0,1,1,2,2,0,2,3, 104,47} }, +{ {0,1,1,2,2,0,3,0, 111,36} }, +{ {0,1,1,2,2,0,3,1, 120,15} }, +{ {0,1,1,2,2,0,3,2, 104,23} }, +{ {0,1,1,2,2,0,3,3, 114,5} }, +{ {0,1,1,2,2,0,3,4, 162,0} }, +{ {0,1,1,2,2,1,0,0, 53,25} }, +{ {0,1,1,2,2,1,0,1, 30,9} }, +{ {0,1,1,2,2,1,0,2, 48,9} }, +{ {0,1,1,2,2,1,0,3, 111,43} }, +{ {0,1,1,2,2,1,1,0, 52,9} }, +{ {0,1,1,2,2,1,1,1, 21,5} }, +{ {0,1,1,2,2,1,1,2, 45,22} }, +{ {0,1,1,2,2,1,1,3, 110,26} }, +{ {0,1,1,2,2,1,2,0, 53,8} }, +{ {0,1,1,2,2,1,2,1, 27,36} }, +{ {0,1,1,2,2,1,2,2, 23,24} }, +{ {0,1,1,2,2,1,2,3, 112,43} }, +{ {0,1,1,2,2,1,3,0, 107,43} }, +{ {0,1,1,2,2,1,3,1, 67,9} }, +{ {0,1,1,2,2,1,3,2, 92,9} }, +{ {0,1,1,2,2,1,3,3, 108,5} }, +{ {0,1,1,2,2,1,3,4, 147,43} }, +{ {0,1,1,2,2,2,0,0, 48,5} }, +{ {0,1,1,2,2,2,0,1, 50,3} }, +{ {0,1,1,2,2,2,0,2, 36,31} }, +{ {0,1,1,2,2,2,0,3, 104,2} }, +{ {0,1,1,2,2,2,1,0, 53,45} }, +{ {0,1,1,2,2,2,1,1, 27,25} }, +{ {0,1,1,2,2,2,1,2, 23,37} }, +{ {0,1,1,2,2,2,1,3, 112,26} }, +{ {0,1,1,2,2,2,2,0, 30,11} }, +{ {0,1,1,2,2,2,2,1, 38,11} }, +{ {0,1,1,2,2,2,2,2, 6,5} }, +{ {0,1,1,2,2,2,2,3, 85,11} }, +{ {0,1,1,2,2,2,3,0, 111,3} }, +{ {0,1,1,2,2,2,3,1, 102,3} }, +{ {0,1,1,2,2,2,3,2, 71,37} }, +{ {0,1,1,2,2,2,3,3, 91,5} }, +{ {0,1,1,2,2,2,3,4, 153,3} }, +{ {0,1,1,2,2,3,0,0, 111,25} }, +{ {0,1,1,2,2,3,0,1, 120,7} }, +{ {0,1,1,2,2,3,0,2, 104,38} }, +{ {0,1,1,2,2,3,0,3, 114,30} }, +{ {0,1,1,2,2,3,0,4, 162,19} }, +{ {0,1,1,2,2,3,1,0, 107,26} }, +{ {0,1,1,2,2,3,1,1, 67,44} }, +{ {0,1,1,2,2,3,1,2, 92,44} }, +{ {0,1,1,2,2,3,1,3, 108,30} }, +{ {0,1,1,2,2,3,1,4, 147,26} }, +{ {0,1,1,2,2,3,2,0, 111,46} }, +{ {0,1,1,2,2,3,2,1, 102,46} }, +{ {0,1,1,2,2,3,2,2, 71,24} }, +{ {0,1,1,2,2,3,2,3, 91,30} }, +{ {0,1,1,2,2,3,2,4, 153,46} }, +{ {0,1,1,2,2,3,3,0, 121,0} }, +{ {0,1,1,2,2,3,3,1, 120,23} }, +{ {0,1,1,2,2,3,3,2, 98,22} }, +{ {0,1,1,2,2,3,3,3, 66,5} }, +{ {0,1,1,2,2,3,3,4, 163,0} }, +{ {0,1,1,2,2,3,4,0, 164,0} }, +{ {0,1,1,2,2,3,4,1, 160,15} }, +{ {0,1,1,2,2,3,4,2, 142,23} }, +{ {0,1,1,2,2,3,4,3, 150,30} }, +{ {0,1,1,2,2,3,4,4, 150,5} }, +{ {0,1,1,2,2,3,4,5, 177,0} }, +{ {0,1,1,2,3,0,0,0, 85,5} }, +{ {0,1,1,2,3,0,0,1, 119,7} }, +{ {0,1,1,2,3,0,0,2, 99,23} }, +{ {0,1,1,2,3,0,0,3, 116,11} }, +{ {0,1,1,2,3,0,0,4, 159,12} }, +{ {0,1,1,2,3,0,1,0, 112,45} }, +{ {0,1,1,2,3,0,1,1, 85,25} }, +{ {0,1,1,2,3,0,1,2, 91,38} }, +{ {0,1,1,2,3,0,1,3, 104,27} }, +{ {0,1,1,2,3,0,1,4, 153,26} }, +{ {0,1,1,2,3,0,2,0, 104,37} }, +{ {0,1,1,2,3,0,2,1, 116,7} }, +{ {0,1,1,2,3,0,2,2, 78,39} }, +{ {0,1,1,2,3,0,2,3, 122,0} }, +{ {0,1,1,2,3,0,2,4, 165,0} }, +{ {0,1,1,2,3,0,3,0, 91,28} }, +{ {0,1,1,2,3,0,3,1, 99,28} }, +{ {0,1,1,2,3,0,3,2, 106,23} }, +{ {0,1,1,2,3,0,3,3, 78,29} }, +{ {0,1,1,2,3,0,3,4, 141,47} }, +{ {0,1,1,2,3,0,4,0, 153,36} }, +{ {0,1,1,2,3,0,4,1, 159,15} }, +{ {0,1,1,2,3,0,4,2, 141,23} }, +{ {0,1,1,2,3,0,4,3, 165,20} }, +{ {0,1,1,2,3,0,4,4, 156,24} }, +{ {0,1,1,2,3,0,4,5, 178,0} }, +{ {0,1,1,2,3,1,0,0, 112,8} }, +{ {0,1,1,2,3,1,0,1, 85,9} }, +{ {0,1,1,2,3,1,0,2, 91,23} }, +{ {0,1,1,2,3,1,0,3, 104,42} }, +{ {0,1,1,2,3,1,0,4, 153,43} }, +{ {0,1,1,2,3,1,1,0, 110,8} }, +{ {0,1,1,2,3,1,1,1, 70,5} }, +{ {0,1,1,2,3,1,1,2, 89,23} }, +{ {0,1,1,2,3,1,1,3, 101,27} }, +{ {0,1,1,2,3,1,1,4, 152,26} }, +{ {0,1,1,2,3,1,2,0, 111,8} }, +{ {0,1,1,2,3,1,2,1, 76,36} }, +{ {0,1,1,2,3,1,2,2, 65,39} }, +{ {0,1,1,2,3,1,2,3, 104,9} }, +{ {0,1,1,2,3,1,2,4, 153,8} }, +{ {0,1,1,2,3,1,3,0, 108,28} }, +{ {0,1,1,2,3,1,3,1, 81,36} }, +{ {0,1,1,2,3,1,3,2, 93,23} }, +{ {0,1,1,2,3,1,3,3, 68,29} }, +{ {0,1,1,2,3,1,3,4, 149,47} }, +{ {0,1,1,2,3,1,4,0, 147,8} }, +{ {0,1,1,2,3,1,4,1, 131,9} }, +{ {0,1,1,2,3,1,4,2, 135,23} }, +{ {0,1,1,2,3,1,4,3, 142,42} }, +{ {0,1,1,2,3,1,4,4, 149,24} }, +{ {0,1,1,2,3,1,4,5, 171,43} }, +{ {0,1,1,2,3,2,0,0, 104,24} }, +{ {0,1,1,2,3,2,0,1, 116,23} }, +{ {0,1,1,2,3,2,0,2, 78,22} }, +{ {0,1,1,2,3,2,0,3, 122,19} }, +{ {0,1,1,2,3,2,0,4, 165,19} }, +{ {0,1,1,2,3,2,1,0, 111,45} }, +{ {0,1,1,2,3,2,1,1, 76,25} }, +{ {0,1,1,2,3,2,1,2, 65,22} }, +{ {0,1,1,2,3,2,1,3, 104,44} }, +{ {0,1,1,2,3,2,1,4, 153,45} }, +{ {0,1,1,2,3,2,2,0, 120,22} }, +{ {0,1,1,2,3,2,2,1, 115,23} }, +{ {0,1,1,2,3,2,2,2, 61,22} }, +{ {0,1,1,2,3,2,2,3, 116,5} }, +{ {0,1,1,2,3,2,2,4, 159,22} }, +{ {0,1,1,2,3,2,3,0, 114,46} }, +{ {0,1,1,2,3,2,3,1, 105,29} }, +{ {0,1,1,2,3,2,3,2, 75,22} }, +{ {0,1,1,2,3,2,3,3, 78,4} }, +{ {0,1,1,2,3,2,3,4, 156,47} }, +{ {0,1,1,2,3,2,4,0, 162,35} }, +{ {0,1,1,2,3,2,4,1, 157,34} }, +{ {0,1,1,2,3,2,4,2, 128,22} }, +{ {0,1,1,2,3,2,4,3, 165,35} }, +{ {0,1,1,2,3,2,4,4, 141,24} }, +{ {0,1,1,2,3,2,4,5, 178,35} }, +{ {0,1,1,2,3,3,0,0, 91,11} }, +{ {0,1,1,2,3,3,0,1, 99,2} }, +{ {0,1,1,2,3,3,0,2, 106,38} }, +{ {0,1,1,2,3,3,0,3, 78,10} }, +{ {0,1,1,2,3,3,0,4, 141,2} }, +{ {0,1,1,2,3,3,1,0, 108,11} }, +{ {0,1,1,2,3,3,1,1, 81,25} }, +{ {0,1,1,2,3,3,1,2, 93,38} }, +{ {0,1,1,2,3,3,1,3, 68,10} }, +{ {0,1,1,2,3,3,1,4, 149,2} }, +{ {0,1,1,2,3,3,2,0, 114,3} }, +{ {0,1,1,2,3,3,2,1, 105,10} }, +{ {0,1,1,2,3,3,2,2, 75,39} }, +{ {0,1,1,2,3,3,2,3, 78,31} }, +{ {0,1,1,2,3,3,2,4, 156,2} }, +{ {0,1,1,2,3,3,3,0, 66,11} }, +{ {0,1,1,2,3,3,3,1, 74,11} }, +{ {0,1,1,2,3,3,3,2, 86,11} }, +{ {0,1,1,2,3,3,3,3, 60,11} }, +{ {0,1,1,2,3,3,3,4, 130,11} }, +{ {0,1,1,2,3,3,4,0, 150,11} }, +{ {0,1,1,2,3,3,4,1, 143,3} }, +{ {0,1,1,2,3,3,4,2, 144,23} }, +{ {0,1,1,2,3,3,4,3, 133,10} }, +{ {0,1,1,2,3,3,4,4, 138,11} }, +{ {0,1,1,2,3,3,4,5, 173,2} }, +{ {0,1,1,2,3,4,0,0, 153,25} }, +{ {0,1,1,2,3,4,0,1, 159,7} }, +{ {0,1,1,2,3,4,0,2, 141,38} }, +{ {0,1,1,2,3,4,0,3, 165,41} }, +{ {0,1,1,2,3,4,0,4, 156,37} }, +{ {0,1,1,2,3,4,0,5, 178,19} }, +{ {0,1,1,2,3,4,1,0, 147,45} }, +{ {0,1,1,2,3,4,1,1, 131,44} }, +{ {0,1,1,2,3,4,1,2, 135,38} }, +{ {0,1,1,2,3,4,1,3, 142,27} }, +{ {0,1,1,2,3,4,1,4, 149,37} }, +{ {0,1,1,2,3,4,1,5, 171,26} }, +{ {0,1,1,2,3,4,2,0, 162,6} }, +{ {0,1,1,2,3,4,2,1, 157,7} }, +{ {0,1,1,2,3,4,2,2, 128,39} }, +{ {0,1,1,2,3,4,2,3, 165,6} }, +{ {0,1,1,2,3,4,2,4, 141,37} }, +{ {0,1,1,2,3,4,2,5, 178,6} }, +{ {0,1,1,2,3,4,3,0, 150,28} }, +{ {0,1,1,2,3,4,3,1, 143,46} }, +{ {0,1,1,2,3,4,3,2, 144,38} }, +{ {0,1,1,2,3,4,3,3, 133,29} }, +{ {0,1,1,2,3,4,3,4, 138,28} }, +{ {0,1,1,2,3,4,3,5, 173,47} }, +{ {0,1,1,2,3,4,4,0, 163,15} }, +{ {0,1,1,2,3,4,4,1, 159,23} }, +{ {0,1,1,2,3,4,4,2, 139,23} }, +{ {0,1,1,2,3,4,4,3, 158,11} }, +{ {0,1,1,2,3,4,4,4, 130,5} }, +{ {0,1,1,2,3,4,4,5, 179,0} }, +{ {0,1,1,2,3,4,5,0, 177,15} }, +{ {0,1,1,2,3,4,5,1, 176,15} }, +{ {0,1,1,2,3,4,5,2, 169,23} }, +{ {0,1,1,2,3,4,5,3, 180,0} }, +{ {0,1,1,2,3,4,5,4, 173,37} }, +{ {0,1,1,2,3,4,5,5, 173,24} }, +{ {0,1,1,2,3,4,5,6, 183,0} }, +{ {0,1,2,0,0,0,0,0, 7,11} }, +{ {0,1,2,0,0,0,0,1, 16,2} }, +{ {0,1,2,0,0,0,0,2, 16,28} }, +{ {0,1,2,0,0,0,0,3, 62,33} }, +{ {0,1,2,0,0,0,1,0, 21,10} }, +{ {0,1,2,0,0,0,1,1, 27,2} }, +{ {0,1,2,0,0,0,1,2, 30,2} }, +{ {0,1,2,0,0,0,1,3, 67,33} }, +{ {0,1,2,0,0,0,2,0, 34,10} }, +{ {0,1,2,0,0,0,2,1, 40,2} }, +{ {0,1,2,0,0,0,2,2, 26,25} }, +{ {0,1,2,0,0,0,2,3, 81,33} }, +{ {0,1,2,0,0,0,3,0, 70,10} }, +{ {0,1,2,0,0,0,3,1, 76,2} }, +{ {0,1,2,0,0,0,3,2, 85,2} }, +{ {0,1,2,0,0,0,3,3, 81,2} }, +{ {0,1,2,0,0,0,3,4, 131,33} }, +{ {0,1,2,0,0,1,0,0, 34,4} }, +{ {0,1,2,0,0,1,0,1, 26,9} }, +{ {0,1,2,0,0,1,0,2, 40,47} }, +{ {0,1,2,0,0,1,0,3, 81,12} }, +{ {0,1,2,0,0,1,1,0, 45,9} }, +{ {0,1,2,0,0,1,1,1, 23,36} }, +{ {0,1,2,0,0,1,1,2, 48,33} }, +{ {0,1,2,0,0,1,1,3, 92,33} }, +{ {0,1,2,0,0,1,2,0, 46,9} }, +{ {0,1,2,0,0,1,2,1, 29,9} }, +{ {0,1,2,0,0,1,2,2, 29,44} }, +{ {0,1,2,0,0,1,2,3, 94,43} }, +{ {0,1,2,0,0,1,3,0, 89,8} }, +{ {0,1,2,0,0,1,3,1, 65,9} }, +{ {0,1,2,0,0,1,3,2, 91,43} }, +{ {0,1,2,0,0,1,3,3, 93,43} }, +{ {0,1,2,0,0,1,3,4, 135,43} }, +{ {0,1,2,0,0,2,0,0, 21,4} }, +{ {0,1,2,0,0,2,0,1, 30,12} }, +{ {0,1,2,0,0,2,0,2, 27,47} }, +{ {0,1,2,0,0,2,0,3, 67,12} }, +{ {0,1,2,0,0,2,1,0, 52,12} }, +{ {0,1,2,0,0,2,1,1, 53,32} }, +{ {0,1,2,0,0,2,1,2, 53,13} }, +{ {0,1,2,0,0,2,1,3, 107,32} }, +{ {0,1,2,0,0,2,2,0, 45,27} }, +{ {0,1,2,0,0,2,2,1, 48,12} }, +{ {0,1,2,0,0,2,2,2, 23,25} }, +{ {0,1,2,0,0,2,2,3, 92,12} }, +{ {0,1,2,0,0,2,3,0, 110,23} }, +{ {0,1,2,0,0,2,3,1, 111,32} }, +{ {0,1,2,0,0,2,3,2, 112,32} }, +{ {0,1,2,0,0,2,3,3, 108,4} }, +{ {0,1,2,0,0,2,3,4, 147,32} }, +{ {0,1,2,0,0,3,0,0, 70,4} }, +{ {0,1,2,0,0,3,0,1, 85,12} }, +{ {0,1,2,0,0,3,0,2, 76,47} }, +{ {0,1,2,0,0,3,0,3, 81,47} }, +{ {0,1,2,0,0,3,0,4, 131,12} }, +{ {0,1,2,0,0,3,1,0, 110,13} }, +{ {0,1,2,0,0,3,1,1, 112,13} }, +{ {0,1,2,0,0,3,1,2, 111,13} }, +{ {0,1,2,0,0,3,1,3, 108,31} }, +{ {0,1,2,0,0,3,1,4, 147,13} }, +{ {0,1,2,0,0,3,2,0, 89,26} }, +{ {0,1,2,0,0,3,2,1, 91,26} }, +{ {0,1,2,0,0,3,2,2, 65,44} }, +{ {0,1,2,0,0,3,2,3, 93,26} }, +{ {0,1,2,0,0,3,2,4, 135,26} }, +{ {0,1,2,0,0,3,3,0, 101,22} }, +{ {0,1,2,0,0,3,3,1, 104,33} }, +{ {0,1,2,0,0,3,3,2, 104,12} }, +{ {0,1,2,0,0,3,3,3, 68,30} }, +{ {0,1,2,0,0,3,3,4, 142,33} }, +{ {0,1,2,0,0,3,4,0, 152,23} }, +{ {0,1,2,0,0,3,4,1, 153,32} }, +{ {0,1,2,0,0,3,4,2, 153,13} }, +{ {0,1,2,0,0,3,4,3, 149,36} }, +{ {0,1,2,0,0,3,4,4, 149,25} }, +{ {0,1,2,0,0,3,4,5, 171,32} }, +{ {0,1,2,0,1,0,0,0, 16,30} }, +{ {0,1,2,0,1,0,0,1, 55,3} }, +{ {0,1,2,0,1,0,0,2, 56,2} }, +{ {0,1,2,0,1,0,0,3, 117,20} }, +{ {0,1,2,0,1,0,1,0, 27,37} }, +{ {0,1,2,0,1,0,1,1, 38,4} }, +{ {0,1,2,0,1,0,1,2, 50,28} }, +{ {0,1,2,0,1,0,1,3, 102,47} }, +{ {0,1,2,0,1,0,2,0, 40,37} }, +{ {0,1,2,0,1,0,2,1, 51,26} }, +{ {0,1,2,0,1,0,2,2, 39,25} }, +{ {0,1,2,0,1,0,2,3, 105,26} }, +{ {0,1,2,0,1,0,3,0, 76,37} }, +{ {0,1,2,0,1,0,3,1, 115,8} }, +{ {0,1,2,0,1,0,3,2, 116,20} }, +{ {0,1,2,0,1,0,3,3, 105,5} }, +{ {0,1,2,0,1,0,3,4, 157,20} }, +{ {0,1,2,0,1,1,0,0, 26,3} }, +{ {0,1,2,0,1,1,0,1, 15,3} }, +{ {0,1,2,0,1,1,0,2, 39,3} }, +{ {0,1,2,0,1,1,0,3, 74,3} }, +{ {0,1,2,0,1,1,1,0, 23,3} }, +{ {0,1,2,0,1,1,1,1, 6,10} }, +{ {0,1,2,0,1,1,1,2, 36,3} }, +{ {0,1,2,0,1,1,1,3, 71,3} }, +{ {0,1,2,0,1,1,2,0, 29,42} }, +{ {0,1,2,0,1,1,2,1, 18,9} }, +{ {0,1,2,0,1,1,2,2, 42,42} }, +{ {0,1,2,0,1,1,2,3, 79,42} }, +{ {0,1,2,0,1,1,3,0, 65,42} }, +{ {0,1,2,0,1,1,3,1, 61,9} }, +{ {0,1,2,0,1,1,3,2, 78,42} }, +{ {0,1,2,0,1,1,3,3, 75,42} }, +{ {0,1,2,0,1,1,3,4, 128,42} }, +{ {0,1,2,0,1,2,0,0, 30,24} }, +{ {0,1,2,0,1,2,0,1, 57,6} }, +{ {0,1,2,0,1,2,0,2, 50,30} }, +{ {0,1,2,0,1,2,0,3, 120,18} }, +{ {0,1,2,0,1,2,1,0, 53,23} }, +{ {0,1,2,0,1,2,1,1, 30,4} }, +{ {0,1,2,0,1,2,1,2, 48,29} }, +{ {0,1,2,0,1,2,1,3, 111,47} }, +{ {0,1,2,0,1,2,2,0, 48,39} }, +{ {0,1,2,0,1,2,2,1, 50,27} }, +{ {0,1,2,0,1,2,2,2, 36,25} }, +{ {0,1,2,0,1,2,2,3, 104,26} }, +{ {0,1,2,0,1,2,3,0, 111,23} }, +{ {0,1,2,0,1,2,3,1, 120,9} }, +{ {0,1,2,0,1,2,3,2, 104,36} }, +{ {0,1,2,0,1,2,3,3, 114,24} }, +{ {0,1,2,0,1,2,3,4, 162,21} }, +{ {0,1,2,0,1,3,0,0, 85,24} }, +{ {0,1,2,0,1,3,0,1, 119,6} }, +{ {0,1,2,0,1,3,0,2, 116,6} }, +{ {0,1,2,0,1,3,0,3, 99,31} }, +{ {0,1,2,0,1,3,0,4, 159,18} }, +{ {0,1,2,0,1,3,1,0, 112,38} }, +{ {0,1,2,0,1,3,1,1, 85,4} }, +{ {0,1,2,0,1,3,1,2, 104,46} }, +{ {0,1,2,0,1,3,1,3, 91,31} }, +{ {0,1,2,0,1,3,1,4, 153,47} }, +{ {0,1,2,0,1,3,2,0, 91,45} }, +{ {0,1,2,0,1,3,2,1, 99,26} }, +{ {0,1,2,0,1,3,2,2, 78,44} }, +{ {0,1,2,0,1,3,2,3, 106,26} }, +{ {0,1,2,0,1,3,2,4, 141,26} }, +{ {0,1,2,0,1,3,3,0, 104,22} }, +{ {0,1,2,0,1,3,3,1, 116,10} }, +{ {0,1,2,0,1,3,3,2, 122,1} }, +{ {0,1,2,0,1,3,3,3, 78,30} }, +{ {0,1,2,0,1,3,3,4, 165,21} }, +{ {0,1,2,0,1,3,4,0, 153,23} }, +{ {0,1,2,0,1,3,4,1, 159,9} }, +{ {0,1,2,0,1,3,4,2, 165,1} }, +{ {0,1,2,0,1,3,4,3, 141,36} }, +{ {0,1,2,0,1,3,4,4, 156,25} }, +{ {0,1,2,0,1,3,4,5, 178,21} }, +{ {0,1,2,0,2,0,0,0, 16,5} }, +{ {0,1,2,0,2,0,0,1, 56,8} }, +{ {0,1,2,0,2,0,0,2, 55,4} }, +{ {0,1,2,0,2,0,0,3, 117,12} }, +{ {0,1,2,0,2,0,1,0, 30,22} }, +{ {0,1,2,0,2,0,1,1, 50,5} }, +{ {0,1,2,0,2,0,1,2, 57,1} }, +{ {0,1,2,0,2,0,1,3, 120,1} }, +{ {0,1,2,0,2,0,2,0, 26,27} }, +{ {0,1,2,0,2,0,2,1, 39,27} }, +{ {0,1,2,0,2,0,2,2, 15,4} }, +{ {0,1,2,0,2,0,2,3, 74,27} }, +{ {0,1,2,0,2,0,3,0, 85,22} }, +{ {0,1,2,0,2,0,3,1, 116,8} }, +{ {0,1,2,0,2,0,3,2, 119,1} }, +{ {0,1,2,0,2,0,3,3, 99,4} }, +{ {0,1,2,0,2,0,3,4, 159,1} }, +{ {0,1,2,0,2,1,0,0, 40,24} }, +{ {0,1,2,0,2,1,0,1, 39,9} }, +{ {0,1,2,0,2,1,0,2, 51,8} }, +{ {0,1,2,0,2,1,0,3, 105,43} }, +{ {0,1,2,0,2,1,1,0, 48,22} }, +{ {0,1,2,0,2,1,1,1, 36,36} }, +{ {0,1,2,0,2,1,1,2, 50,9} }, +{ {0,1,2,0,2,1,1,3, 104,43} }, +{ {0,1,2,0,2,1,2,0, 29,27} }, +{ {0,1,2,0,2,1,2,1, 42,9} }, +{ {0,1,2,0,2,1,2,2, 18,27} }, +{ {0,1,2,0,2,1,2,3, 79,27} }, +{ {0,1,2,0,2,1,3,0, 91,8} }, +{ {0,1,2,0,2,1,3,1, 78,9} }, +{ {0,1,2,0,2,1,3,2, 99,8} }, +{ {0,1,2,0,2,1,3,3, 106,43} }, +{ {0,1,2,0,2,1,3,4, 141,43} }, +{ {0,1,2,0,2,2,0,0, 27,24} }, +{ {0,1,2,0,2,2,0,1, 50,2} }, +{ {0,1,2,0,2,2,0,2, 38,10} }, +{ {0,1,2,0,2,2,0,3, 102,2} }, +{ {0,1,2,0,2,2,1,0, 53,38} }, +{ {0,1,2,0,2,2,1,1, 48,4} }, +{ {0,1,2,0,2,2,1,2, 30,10} }, +{ {0,1,2,0,2,2,1,3, 111,2} }, +{ {0,1,2,0,2,2,2,0, 23,46} }, +{ {0,1,2,0,2,2,2,1, 36,46} }, +{ {0,1,2,0,2,2,2,2, 6,4} }, +{ {0,1,2,0,2,2,2,3, 71,46} }, +{ {0,1,2,0,2,2,3,0, 112,23} }, +{ {0,1,2,0,2,2,3,1, 104,3} }, +{ {0,1,2,0,2,2,3,2, 85,10} }, +{ {0,1,2,0,2,2,3,3, 91,4} }, +{ {0,1,2,0,2,2,3,4, 153,2} }, +{ {0,1,2,0,2,3,0,0, 76,24} }, +{ {0,1,2,0,2,3,0,1, 116,26} }, +{ {0,1,2,0,2,3,0,2, 115,26} }, +{ {0,1,2,0,2,3,0,3, 105,30} }, +{ {0,1,2,0,2,3,0,4, 157,41} }, +{ {0,1,2,0,2,3,1,0, 111,38} }, +{ {0,1,2,0,2,3,1,1, 104,25} }, +{ {0,1,2,0,2,3,1,2, 120,27} }, +{ {0,1,2,0,2,3,1,3, 114,37} }, +{ {0,1,2,0,2,3,1,4, 162,40} }, +{ {0,1,2,0,2,3,2,0, 65,27} }, +{ {0,1,2,0,2,3,2,1, 78,27} }, +{ {0,1,2,0,2,3,2,2, 61,27} }, +{ {0,1,2,0,2,3,2,3, 75,27} }, +{ {0,1,2,0,2,3,2,4, 128,27} }, +{ {0,1,2,0,2,3,3,0, 104,39} }, +{ {0,1,2,0,2,3,3,1, 122,14} }, +{ {0,1,2,0,2,3,3,2, 116,4} }, +{ {0,1,2,0,2,3,3,3, 78,5} }, +{ {0,1,2,0,2,3,3,4, 165,40} }, +{ {0,1,2,0,2,3,4,0, 153,38} }, +{ {0,1,2,0,2,3,4,1, 165,14} }, +{ {0,1,2,0,2,3,4,2, 159,27} }, +{ {0,1,2,0,2,3,4,3, 156,36} }, +{ {0,1,2,0,2,3,4,4, 141,25} }, +{ {0,1,2,0,2,3,4,5, 178,40} }, +{ {0,1,2,0,3,0,0,0, 62,22} }, +{ {0,1,2,0,3,0,0,1, 117,22} }, +{ {0,1,2,0,3,0,0,2, 117,6} }, +{ {0,1,2,0,3,0,0,3, 117,11} }, +{ {0,1,2,0,3,0,0,4, 161,1} }, +{ {0,1,2,0,3,0,1,0, 67,22} }, +{ {0,1,2,0,3,0,1,1, 102,24} }, +{ {0,1,2,0,3,0,1,2, 120,14} }, +{ {0,1,2,0,3,0,1,3, 120,8} }, +{ {0,1,2,0,3,0,1,4, 160,1} }, +{ {0,1,2,0,3,0,2,0, 81,22} }, +{ {0,1,2,0,3,0,2,1, 105,45} }, +{ {0,1,2,0,3,0,2,2, 74,25} }, +{ {0,1,2,0,3,0,2,3, 99,27} }, +{ {0,1,2,0,3,0,2,4, 143,26} }, +{ {0,1,2,0,3,0,3,0, 81,37} }, +{ {0,1,2,0,3,0,3,1, 105,28} }, +{ {0,1,2,0,3,0,3,2, 99,29} }, +{ {0,1,2,0,3,0,3,3, 74,4} }, +{ {0,1,2,0,3,0,3,4, 143,47} }, +{ {0,1,2,0,3,0,4,0, 131,22} }, +{ {0,1,2,0,3,0,4,1, 157,35} }, +{ {0,1,2,0,3,0,4,2, 159,14} }, +{ {0,1,2,0,3,0,4,3, 159,8} }, +{ {0,1,2,0,3,0,4,4, 143,24} }, +{ {0,1,2,0,3,0,4,5, 176,1} }, +{ {0,1,2,0,3,1,0,0, 81,39} }, +{ {0,1,2,0,3,1,0,1, 74,9} }, +{ {0,1,2,0,3,1,0,2, 105,8} }, +{ {0,1,2,0,3,1,0,3, 99,9} }, +{ {0,1,2,0,3,1,0,4, 143,43} }, +{ {0,1,2,0,3,1,1,0, 92,22} }, +{ {0,1,2,0,3,1,1,1, 71,36} }, +{ {0,1,2,0,3,1,1,2, 104,8} }, +{ {0,1,2,0,3,1,1,3, 98,9} }, +{ {0,1,2,0,3,1,1,4, 142,43} }, +{ {0,1,2,0,3,1,2,0, 94,8} }, +{ {0,1,2,0,3,1,2,1, 79,9} }, +{ {0,1,2,0,3,1,2,2, 79,44} }, +{ {0,1,2,0,3,1,2,3, 100,8} }, +{ {0,1,2,0,3,1,2,4, 145,43} }, +{ {0,1,2,0,3,1,3,0, 93,8} }, +{ {0,1,2,0,3,1,3,1, 75,9} }, +{ {0,1,2,0,3,1,3,2, 106,8} }, +{ {0,1,2,0,3,1,3,3, 86,4} }, +{ {0,1,2,0,3,1,3,4, 144,43} }, +{ {0,1,2,0,3,1,4,0, 135,8} }, +{ {0,1,2,0,3,1,4,1, 128,9} }, +{ {0,1,2,0,3,1,4,2, 141,8} }, +{ {0,1,2,0,3,1,4,3, 139,8} }, +{ {0,1,2,0,3,1,4,4, 144,8} }, +{ {0,1,2,0,3,1,4,5, 169,43} }, +{ {0,1,2,0,3,2,0,0, 67,39} }, +{ {0,1,2,0,3,2,0,1, 120,6} }, +{ {0,1,2,0,3,2,0,2, 102,37} }, +{ {0,1,2,0,3,2,0,3, 120,26} }, +{ {0,1,2,0,3,2,0,4, 160,18} }, +{ {0,1,2,0,3,2,1,0, 107,23} }, +{ {0,1,2,0,3,2,1,1, 111,24} }, +{ {0,1,2,0,3,2,1,2, 111,37} }, +{ {0,1,2,0,3,2,1,3, 121,1} }, +{ {0,1,2,0,3,2,1,4, 164,1} }, +{ {0,1,2,0,3,2,2,0, 92,39} }, +{ {0,1,2,0,3,2,2,1, 104,45} }, +{ {0,1,2,0,3,2,2,2, 71,25} }, +{ {0,1,2,0,3,2,2,3, 98,27} }, +{ {0,1,2,0,3,2,2,4, 142,26} }, +{ {0,1,2,0,3,2,3,0, 108,29} }, +{ {0,1,2,0,3,2,3,1, 114,47} }, +{ {0,1,2,0,3,2,3,2, 91,29} }, +{ {0,1,2,0,3,2,3,3, 66,4} }, +{ {0,1,2,0,3,2,3,4, 150,29} }, +{ {0,1,2,0,3,2,4,0, 147,23} }, +{ {0,1,2,0,3,2,4,1, 162,14} }, +{ {0,1,2,0,3,2,4,2, 153,37} }, +{ {0,1,2,0,3,2,4,3, 163,1} }, +{ {0,1,2,0,3,2,4,4, 150,4} }, +{ {0,1,2,0,3,2,4,5, 177,1} }, +{ {0,1,2,0,3,3,0,0, 81,24} }, +{ {0,1,2,0,3,3,0,1, 99,3} }, +{ {0,1,2,0,3,3,0,2, 105,11} }, +{ {0,1,2,0,3,3,0,3, 74,10} }, +{ {0,1,2,0,3,3,0,4, 143,2} }, +{ {0,1,2,0,3,3,1,0, 108,10} }, +{ {0,1,2,0,3,3,1,1, 91,10} }, +{ {0,1,2,0,3,3,1,2, 114,2} }, +{ {0,1,2,0,3,3,1,3, 66,10} }, +{ {0,1,2,0,3,3,1,4, 150,10} }, +{ {0,1,2,0,3,3,2,0, 93,45} }, +{ {0,1,2,0,3,3,2,1, 106,45} }, +{ {0,1,2,0,3,3,2,2, 75,44} }, +{ {0,1,2,0,3,3,2,3, 86,10} }, +{ {0,1,2,0,3,3,2,4, 144,26} }, +{ {0,1,2,0,3,3,3,0, 68,11} }, +{ {0,1,2,0,3,3,3,1, 78,11} }, +{ {0,1,2,0,3,3,3,2, 78,28} }, +{ {0,1,2,0,3,3,3,3, 60,10} }, +{ {0,1,2,0,3,3,3,4, 133,11} }, +{ {0,1,2,0,3,3,4,0, 149,3} }, +{ {0,1,2,0,3,3,4,1, 141,3} }, +{ {0,1,2,0,3,3,4,2, 156,3} }, +{ {0,1,2,0,3,3,4,3, 130,10} }, +{ {0,1,2,0,3,3,4,4, 138,10} }, +{ {0,1,2,0,3,3,4,5, 173,3} }, +{ {0,1,2,0,3,4,0,0, 131,39} }, +{ {0,1,2,0,3,4,0,1, 159,6} }, +{ {0,1,2,0,3,4,0,2, 157,6} }, +{ {0,1,2,0,3,4,0,3, 159,26} }, +{ {0,1,2,0,3,4,0,4, 143,37} }, +{ {0,1,2,0,3,4,0,5, 176,18} }, +{ {0,1,2,0,3,4,1,0, 147,38} }, +{ {0,1,2,0,3,4,1,1, 153,24} }, +{ {0,1,2,0,3,4,1,2, 162,17} }, +{ {0,1,2,0,3,4,1,3, 163,18} }, +{ {0,1,2,0,3,4,1,4, 150,31} }, +{ {0,1,2,0,3,4,1,5, 177,18} }, +{ {0,1,2,0,3,4,2,0, 135,45} }, +{ {0,1,2,0,3,4,2,1, 141,45} }, +{ {0,1,2,0,3,4,2,2, 128,44} }, +{ {0,1,2,0,3,4,2,3, 139,26} }, +{ {0,1,2,0,3,4,2,4, 144,45} }, +{ {0,1,2,0,3,4,2,5, 169,26} }, +{ {0,1,2,0,3,4,3,0, 149,46} }, +{ {0,1,2,0,3,4,3,1, 156,46} }, +{ {0,1,2,0,3,4,3,2, 141,46} }, +{ {0,1,2,0,3,4,3,3, 130,4} }, +{ {0,1,2,0,3,4,3,4, 138,29} }, +{ {0,1,2,0,3,4,3,5, 173,46} }, +{ {0,1,2,0,3,4,4,0, 142,22} }, +{ {0,1,2,0,3,4,4,1, 165,34} }, +{ {0,1,2,0,3,4,4,2, 165,7} }, +{ {0,1,2,0,3,4,4,3, 158,10} }, +{ {0,1,2,0,3,4,4,4, 133,30} }, +{ {0,1,2,0,3,4,4,5, 180,1} }, +{ {0,1,2,0,3,4,5,0, 171,23} }, +{ {0,1,2,0,3,4,5,1, 178,34} }, +{ {0,1,2,0,3,4,5,2, 178,7} }, +{ {0,1,2,0,3,4,5,3, 179,1} }, +{ {0,1,2,0,3,4,5,4, 173,36} }, +{ {0,1,2,0,3,4,5,5, 173,25} }, +{ {0,1,2,0,3,4,5,6, 183,1} }, +{ {0,1,2,1,0,0,0,0, 8,11} }, +{ {0,1,2,1,0,0,0,1, 17,2} }, +{ {0,1,2,1,0,0,0,2, 18,28} }, +{ {0,1,2,1,0,0,0,3, 63,33} }, +{ {0,1,2,1,0,0,1,0, 23,10} }, +{ {0,1,2,1,0,0,1,1, 28,2} }, +{ {0,1,2,1,0,0,1,2, 31,2} }, +{ {0,1,2,1,0,0,1,3, 68,33} }, +{ {0,1,2,1,0,0,2,0, 37,2} }, +{ {0,1,2,1,0,0,2,1, 41,2} }, +{ {0,1,2,1,0,0,2,2, 43,2} }, +{ {0,1,2,1,0,0,2,3, 82,33} }, +{ {0,1,2,1,0,0,3,0, 72,10} }, +{ {0,1,2,1,0,0,3,1, 77,34} }, +{ {0,1,2,1,0,0,3,2, 86,2} }, +{ {0,1,2,1,0,0,3,3, 82,2} }, +{ {0,1,2,1,0,0,3,4, 132,33} }, +{ {0,1,2,1,0,1,0,0, 28,8} }, +{ {0,1,2,1,0,1,0,1, 10,9} }, +{ {0,1,2,1,0,1,0,2, 42,47} }, +{ {0,1,2,1,0,1,0,3, 83,12} }, +{ {0,1,2,1,0,1,1,0, 27,8} }, +{ {0,1,2,1,0,1,1,1, 8,37} }, +{ {0,1,2,1,0,1,1,2, 40,35} }, +{ {0,1,2,1,0,1,1,3, 81,8} }, +{ {0,1,2,1,0,1,2,0, 29,8} }, +{ {0,1,2,1,0,1,2,1, 11,9} }, +{ {0,1,2,1,0,1,2,2, 41,35} }, +{ {0,1,2,1,0,1,2,3, 84,8} }, +{ {0,1,2,1,0,1,3,0, 65,8} }, +{ {0,1,2,1,0,1,3,1, 59,8} }, +{ {0,1,2,1,0,1,3,2, 75,35} }, +{ {0,1,2,1,0,1,3,3, 82,8} }, +{ {0,1,2,1,0,1,3,4, 129,8} }, +{ {0,1,2,1,0,2,0,0, 24,29} }, +{ {0,1,2,1,0,2,0,1, 32,12} }, +{ {0,1,2,1,0,2,0,2, 29,47} }, +{ {0,1,2,1,0,2,0,3, 69,12} }, +{ {0,1,2,1,0,2,1,0, 53,12} }, +{ {0,1,2,1,0,2,1,1, 24,23} }, +{ {0,1,2,1,0,2,1,2, 47,34} }, +{ {0,1,2,1,0,2,1,3, 108,32} }, +{ {0,1,2,1,0,2,2,0, 47,12} }, +{ {0,1,2,1,0,2,2,1, 29,23} }, +{ {0,1,2,1,0,2,2,2, 37,5} }, +{ {0,1,2,1,0,2,2,3, 93,12} }, +{ {0,1,2,1,0,2,3,0, 108,14} }, +{ {0,1,2,1,0,2,3,1, 69,34} }, +{ {0,1,2,1,0,2,3,2, 93,34} }, +{ {0,1,2,1,0,2,3,3, 113,32} }, +{ {0,1,2,1,0,2,3,4, 148,32} }, +{ {0,1,2,1,0,3,0,0, 73,47} }, +{ {0,1,2,1,0,3,0,1, 88,12} }, +{ {0,1,2,1,0,3,0,2, 79,47} }, +{ {0,1,2,1,0,3,0,3, 84,47} }, +{ {0,1,2,1,0,3,0,4, 134,12} }, +{ {0,1,2,1,0,3,1,0, 112,15} }, +{ {0,1,2,1,0,3,1,1, 73,39} }, +{ {0,1,2,1,0,3,1,2, 103,15} }, +{ {0,1,2,1,0,3,1,3, 93,37} }, +{ {0,1,2,1,0,3,1,4, 149,13} }, +{ {0,1,2,1,0,3,2,0, 93,27} }, +{ {0,1,2,1,0,3,2,1, 84,23} }, +{ {0,1,2,1,0,3,2,2, 82,44} }, +{ {0,1,2,1,0,3,2,3, 96,13} }, +{ {0,1,2,1,0,3,2,4, 137,13} }, +{ {0,1,2,1,0,3,3,0, 103,33} }, +{ {0,1,2,1,0,3,3,1, 79,23} }, +{ {0,1,2,1,0,3,3,2, 106,34} }, +{ {0,1,2,1,0,3,3,3, 82,30} }, +{ {0,1,2,1,0,3,3,4, 144,33} }, +{ {0,1,2,1,0,3,4,0, 149,35} }, +{ {0,1,2,1,0,3,4,1, 134,34} }, +{ {0,1,2,1,0,3,4,2, 144,15} }, +{ {0,1,2,1,0,3,4,3, 137,35} }, +{ {0,1,2,1,0,3,4,4, 154,14} }, +{ {0,1,2,1,0,3,4,5, 172,32} }, +{ {0,1,2,1,1,0,0,0, 27,30} }, +{ {0,1,2,1,1,0,0,1, 38,23} }, +{ {0,1,2,1,1,0,0,2, 50,14} }, +{ {0,1,2,1,1,0,0,3, 102,14} }, +{ {0,1,2,1,1,0,1,0, 45,31} }, +{ {0,1,2,1,1,0,1,1, 35,24} }, +{ {0,1,2,1,1,0,1,2, 49,14} }, +{ {0,1,2,1,1,0,1,3, 101,14} }, +{ {0,1,2,1,1,0,2,0, 47,36} }, +{ {0,1,2,1,1,0,2,1, 40,34} }, +{ {0,1,2,1,1,0,2,2, 31,25} }, +{ {0,1,2,1,1,0,2,3, 103,14} }, +{ {0,1,2,1,1,0,3,0, 90,35} }, +{ {0,1,2,1,1,0,3,1, 76,34} }, +{ {0,1,2,1,1,0,3,2, 98,14} }, +{ {0,1,2,1,1,0,3,3, 103,35} }, +{ {0,1,2,1,1,0,3,4, 140,14} }, +{ {0,1,2,1,1,1,0,0, 23,42} }, +{ {0,1,2,1,1,1,0,1, 6,9} }, +{ {0,1,2,1,1,1,0,2, 36,42} }, +{ {0,1,2,1,1,1,0,3, 71,42} }, +{ {0,1,2,1,1,1,1,0, 21,3} }, +{ {0,1,2,1,1,1,1,1, 3,31} }, +{ {0,1,2,1,1,1,1,2, 35,3} }, +{ {0,1,2,1,1,1,1,3, 70,3} }, +{ {0,1,2,1,1,1,2,0, 24,8} }, +{ {0,1,2,1,1,1,2,1, 8,36} }, +{ {0,1,2,1,1,1,2,2, 28,25} }, +{ {0,1,2,1,1,1,2,3, 73,42} }, +{ {0,1,2,1,1,1,3,0, 64,8} }, +{ {0,1,2,1,1,1,3,1, 58,9} }, +{ {0,1,2,1,1,1,3,2, 71,8} }, +{ {0,1,2,1,1,1,3,3, 72,42} }, +{ {0,1,2,1,1,1,3,4, 127,42} }, +{ {0,1,2,1,1,2,0,0, 53,4} }, +{ {0,1,2,1,1,2,0,1, 30,23} }, +{ {0,1,2,1,1,2,0,2, 48,34} }, +{ {0,1,2,1,1,2,0,3, 111,14} }, +{ {0,1,2,1,1,2,1,0, 52,14} }, +{ {0,1,2,1,1,2,1,1, 21,24} }, +{ {0,1,2,1,1,2,1,2, 45,30} }, +{ {0,1,2,1,1,2,1,3, 110,14} }, +{ {0,1,2,1,1,2,2,0, 53,35} }, +{ {0,1,2,1,1,2,2,1, 27,23} }, +{ {0,1,2,1,1,2,2,2, 23,5} }, +{ {0,1,2,1,1,2,2,3, 112,14} }, +{ {0,1,2,1,1,2,3,0, 107,14} }, +{ {0,1,2,1,1,2,3,1, 67,34} }, +{ {0,1,2,1,1,2,3,2, 92,34} }, +{ {0,1,2,1,1,2,3,3, 108,24} }, +{ {0,1,2,1,1,2,3,4, 147,14} }, +{ {0,1,2,1,1,3,0,0, 112,25} }, +{ {0,1,2,1,1,3,0,1, 85,23} }, +{ {0,1,2,1,1,3,0,2, 104,15} }, +{ {0,1,2,1,1,3,0,3, 91,36} }, +{ {0,1,2,1,1,3,0,4, 153,14} }, +{ {0,1,2,1,1,3,1,0, 110,15} }, +{ {0,1,2,1,1,3,1,1, 70,24} }, +{ {0,1,2,1,1,3,1,2, 101,15} }, +{ {0,1,2,1,1,3,1,3, 89,31} }, +{ {0,1,2,1,1,3,1,4, 152,14} }, +{ {0,1,2,1,1,3,2,0, 108,45} }, +{ {0,1,2,1,1,3,2,1, 81,23} }, +{ {0,1,2,1,1,3,2,2, 68,44} }, +{ {0,1,2,1,1,3,2,3, 93,36} }, +{ {0,1,2,1,1,3,2,4, 149,26} }, +{ {0,1,2,1,1,3,3,0, 111,35} }, +{ {0,1,2,1,1,3,3,1, 76,23} }, +{ {0,1,2,1,1,3,3,2, 104,34} }, +{ {0,1,2,1,1,3,3,3, 65,30} }, +{ {0,1,2,1,1,3,3,4, 153,35} }, +{ {0,1,2,1,1,3,4,0, 147,35} }, +{ {0,1,2,1,1,3,4,1, 131,34} }, +{ {0,1,2,1,1,3,4,2, 142,15} }, +{ {0,1,2,1,1,3,4,3, 135,36} }, +{ {0,1,2,1,1,3,4,4, 149,5} }, +{ {0,1,2,1,1,3,4,5, 171,14} }, +{ {0,1,2,1,2,0,0,0, 40,5} }, +{ {0,1,2,1,2,0,0,1, 39,23} }, +{ {0,1,2,1,2,0,0,2, 51,14} }, +{ {0,1,2,1,2,0,0,3, 105,14} }, +{ {0,1,2,1,2,0,1,0, 48,37} }, +{ {0,1,2,1,2,0,1,1, 36,23} }, +{ {0,1,2,1,2,0,1,2, 50,15} }, +{ {0,1,2,1,2,0,1,3, 104,14} }, +{ {0,1,2,1,2,0,2,0, 29,46} }, +{ {0,1,2,1,2,0,2,1, 42,34} }, +{ {0,1,2,1,2,0,2,2, 18,29} }, +{ {0,1,2,1,2,0,2,3, 79,46} }, +{ {0,1,2,1,2,0,3,0, 91,35} }, +{ {0,1,2,1,2,0,3,1, 78,34} }, +{ {0,1,2,1,2,0,3,2, 99,14} }, +{ {0,1,2,1,2,0,3,3, 106,14} }, +{ {0,1,2,1,2,0,3,4, 141,14} }, +{ {0,1,2,1,2,1,0,0, 31,8} }, +{ {0,1,2,1,2,1,0,1, 12,8} }, +{ {0,1,2,1,2,1,0,2, 39,8} }, +{ {0,1,2,1,2,1,0,3, 87,8} }, +{ {0,1,2,1,2,1,1,0, 30,8} }, +{ {0,1,2,1,2,1,1,1, 6,22} }, +{ {0,1,2,1,2,1,1,2, 38,8} }, +{ {0,1,2,1,2,1,1,3, 85,8} }, +{ {0,1,2,1,2,1,2,0, 32,8} }, +{ {0,1,2,1,2,1,2,1, 10,22} }, +{ {0,1,2,1,2,1,2,2, 17,4} }, +{ {0,1,2,1,2,1,2,3, 88,27} }, +{ {0,1,2,1,2,1,3,0, 66,8} }, +{ {0,1,2,1,2,1,3,1, 60,8} }, +{ {0,1,2,1,2,1,3,2, 74,8} }, +{ {0,1,2,1,2,1,3,3, 86,8} }, +{ {0,1,2,1,2,1,3,4, 130,8} }, +{ {0,1,2,1,2,2,0,0, 47,4} }, +{ {0,1,2,1,2,2,0,1, 31,23} }, +{ {0,1,2,1,2,2,0,2, 40,10} }, +{ {0,1,2,1,2,2,0,3, 103,2} }, +{ {0,1,2,1,2,2,1,0, 53,15} }, +{ {0,1,2,1,2,2,1,1, 23,39} }, +{ {0,1,2,1,2,2,1,2, 27,31} }, +{ {0,1,2,1,2,2,1,3, 112,2} }, +{ {0,1,2,1,2,2,2,0, 24,28} }, +{ {0,1,2,1,2,2,2,1, 28,23} }, +{ {0,1,2,1,2,2,2,2, 8,4} }, +{ {0,1,2,1,2,2,2,3, 73,46} }, +{ {0,1,2,1,2,2,3,0, 108,35} }, +{ {0,1,2,1,2,2,3,1, 68,34} }, +{ {0,1,2,1,2,2,3,2, 81,31} }, +{ {0,1,2,1,2,2,3,3, 93,4} }, +{ {0,1,2,1,2,2,3,4, 149,14} }, +{ {0,1,2,1,2,3,0,0, 103,25} }, +{ {0,1,2,1,2,3,0,1, 87,23} }, +{ {0,1,2,1,2,3,0,2, 105,15} }, +{ {0,1,2,1,2,3,0,3, 97,35} }, +{ {0,1,2,1,2,3,0,4, 155,14} }, +{ {0,1,2,1,2,3,1,0, 111,15} }, +{ {0,1,2,1,2,3,1,1, 71,39} }, +{ {0,1,2,1,2,3,1,2, 102,15} }, +{ {0,1,2,1,2,3,1,3, 91,37} }, +{ {0,1,2,1,2,3,1,4, 153,15} }, +{ {0,1,2,1,2,3,2,0, 69,27} }, +{ {0,1,2,1,2,3,2,1, 83,27} }, +{ {0,1,2,1,2,3,2,2, 63,44} }, +{ {0,1,2,1,2,3,2,3, 84,46} }, +{ {0,1,2,1,2,3,2,4, 134,27} }, +{ {0,1,2,1,2,3,3,0, 114,15} }, +{ {0,1,2,1,2,3,3,1, 78,23} }, +{ {0,1,2,1,2,3,3,2, 105,34} }, +{ {0,1,2,1,2,3,3,3, 75,5} }, +{ {0,1,2,1,2,3,3,4, 156,14} }, +{ {0,1,2,1,2,3,4,0, 150,35} }, +{ {0,1,2,1,2,3,4,1, 133,34} }, +{ {0,1,2,1,2,3,4,2, 143,15} }, +{ {0,1,2,1,2,3,4,3, 138,35} }, +{ {0,1,2,1,2,3,4,4, 144,25} }, +{ {0,1,2,1,2,3,4,5, 173,14} }, +{ {0,1,2,1,3,0,0,0, 81,30} }, +{ {0,1,2,1,3,0,0,1, 74,23} }, +{ {0,1,2,1,3,0,0,2, 99,15} }, +{ {0,1,2,1,3,0,0,3, 105,35} }, +{ {0,1,2,1,3,0,0,4, 143,14} }, +{ {0,1,2,1,3,0,1,0, 92,35} }, +{ {0,1,2,1,3,0,1,1, 71,23} }, +{ {0,1,2,1,3,0,1,2, 98,15} }, +{ {0,1,2,1,3,0,1,3, 104,35} }, +{ {0,1,2,1,3,0,1,4, 142,14} }, +{ {0,1,2,1,3,0,2,0, 93,35} }, +{ {0,1,2,1,3,0,2,1, 75,34} }, +{ {0,1,2,1,3,0,2,2, 86,25} }, +{ {0,1,2,1,3,0,2,3, 106,35} }, +{ {0,1,2,1,3,0,2,4, 144,14} }, +{ {0,1,2,1,3,0,3,0, 94,35} }, +{ {0,1,2,1,3,0,3,1, 79,34} }, +{ {0,1,2,1,3,0,3,2, 100,14} }, +{ {0,1,2,1,3,0,3,3, 79,29} }, +{ {0,1,2,1,3,0,3,4, 145,14} }, +{ {0,1,2,1,3,0,4,0, 135,35} }, +{ {0,1,2,1,3,0,4,1, 128,34} }, +{ {0,1,2,1,3,0,4,2, 139,14} }, +{ {0,1,2,1,3,0,4,3, 141,35} }, +{ {0,1,2,1,3,0,4,4, 144,35} }, +{ {0,1,2,1,3,0,4,5, 169,14} }, +{ {0,1,2,1,3,1,0,0, 68,35} }, +{ {0,1,2,1,3,1,0,1, 60,23} }, +{ {0,1,2,1,3,1,0,2, 78,35} }, +{ {0,1,2,1,3,1,0,3, 78,8} }, +{ {0,1,2,1,3,1,0,4, 133,35} }, +{ {0,1,2,1,3,1,1,0, 67,35} }, +{ {0,1,2,1,3,1,1,1, 58,22} }, +{ {0,1,2,1,3,1,1,2, 76,35} }, +{ {0,1,2,1,3,1,1,3, 76,8} }, +{ {0,1,2,1,3,1,1,4, 131,35} }, +{ {0,1,2,1,3,1,2,0, 69,35} }, +{ {0,1,2,1,3,1,2,1, 59,23} }, +{ {0,1,2,1,3,1,2,2, 77,35} }, +{ {0,1,2,1,3,1,2,3, 79,8} }, +{ {0,1,2,1,3,1,2,4, 134,35} }, +{ {0,1,2,1,3,1,3,0, 69,8} }, +{ {0,1,2,1,3,1,3,1, 59,36} }, +{ {0,1,2,1,3,1,3,2, 79,35} }, +{ {0,1,2,1,3,1,3,3, 77,8} }, +{ {0,1,2,1,3,1,3,4, 134,8} }, +{ {0,1,2,1,3,1,4,0, 126,35} }, +{ {0,1,2,1,3,1,4,1, 124,35} }, +{ {0,1,2,1,3,1,4,2, 128,35} }, +{ {0,1,2,1,3,1,4,3, 128,8} }, +{ {0,1,2,1,3,1,4,4, 132,35} }, +{ {0,1,2,1,3,1,4,5, 167,35} }, +{ {0,1,2,1,3,2,0,0, 108,34} }, +{ {0,1,2,1,3,2,0,1, 66,23} }, +{ {0,1,2,1,3,2,0,2, 91,34} }, +{ {0,1,2,1,3,2,0,3, 114,14} }, +{ {0,1,2,1,3,2,0,4, 150,34} }, +{ {0,1,2,1,3,2,1,0, 107,34} }, +{ {0,1,2,1,3,2,1,1, 64,23} }, +{ {0,1,2,1,3,2,1,2, 90,34} }, +{ {0,1,2,1,3,2,1,3, 111,34} }, +{ {0,1,2,1,3,2,1,4, 147,34} }, +{ {0,1,2,1,3,2,2,0, 108,15} }, +{ {0,1,2,1,3,2,2,1, 65,23} }, +{ {0,1,2,1,3,2,2,2, 72,5} }, +{ {0,1,2,1,3,2,2,3, 103,44} }, +{ {0,1,2,1,3,2,2,4, 149,34} }, +{ {0,1,2,1,3,2,3,0, 109,14} }, +{ {0,1,2,1,3,2,3,1, 69,23} }, +{ {0,1,2,1,3,2,3,2, 94,34} }, +{ {0,1,2,1,3,2,3,3, 69,4} }, +{ {0,1,2,1,3,2,3,4, 151,14} }, +{ {0,1,2,1,3,2,4,0, 146,14} }, +{ {0,1,2,1,3,2,4,1, 126,34} }, +{ {0,1,2,1,3,2,4,2, 135,34} }, +{ {0,1,2,1,3,2,4,3, 150,14} }, +{ {0,1,2,1,3,2,4,4, 148,34} }, +{ {0,1,2,1,3,2,4,5, 170,14} }, +{ {0,1,2,1,3,3,0,0, 93,11} }, +{ {0,1,2,1,3,3,0,1, 86,23} }, +{ {0,1,2,1,3,3,0,2, 106,15} }, +{ {0,1,2,1,3,3,0,3, 75,10} }, +{ {0,1,2,1,3,3,0,4, 144,2} }, +{ {0,1,2,1,3,3,1,0, 108,3} }, +{ {0,1,2,1,3,3,1,1, 72,39} }, +{ {0,1,2,1,3,3,1,2, 103,34} }, +{ {0,1,2,1,3,3,1,3, 65,31} }, +{ {0,1,2,1,3,3,1,4, 149,10} }, +{ {0,1,2,1,3,3,2,0, 113,15} }, +{ {0,1,2,1,3,3,2,1, 82,23} }, +{ {0,1,2,1,3,3,2,2, 82,25} }, +{ {0,1,2,1,3,3,2,3, 82,31} }, +{ {0,1,2,1,3,3,2,4, 154,15} }, +{ {0,1,2,1,3,3,3,0, 69,11} }, +{ {0,1,2,1,3,3,3,1, 77,23} }, +{ {0,1,2,1,3,3,3,2, 79,28} }, +{ {0,1,2,1,3,3,3,3, 59,31} }, +{ {0,1,2,1,3,3,3,4, 134,11} }, +{ {0,1,2,1,3,3,4,0, 148,35} }, +{ {0,1,2,1,3,3,4,1, 132,34} }, +{ {0,1,2,1,3,3,4,2, 144,34} }, +{ {0,1,2,1,3,3,4,3, 129,31} }, +{ {0,1,2,1,3,3,4,4, 137,10} }, +{ {0,1,2,1,3,3,4,5, 172,35} }, +{ {0,1,2,1,3,4,0,0, 149,15} }, +{ {0,1,2,1,3,4,0,1, 130,23} }, +{ {0,1,2,1,3,4,0,2, 141,15} }, +{ {0,1,2,1,3,4,0,3, 156,15} }, +{ {0,1,2,1,3,4,0,4, 138,34} }, +{ {0,1,2,1,3,4,0,5, 173,15} }, +{ {0,1,2,1,3,4,1,0, 147,15} }, +{ {0,1,2,1,3,4,1,1, 127,39} }, +{ {0,1,2,1,3,4,1,2, 140,15} }, +{ {0,1,2,1,3,4,1,3, 153,34} }, +{ {0,1,2,1,3,4,1,4, 135,37} }, +{ {0,1,2,1,3,4,1,5, 171,15} }, +{ {0,1,2,1,3,4,2,0, 148,45} }, +{ {0,1,2,1,3,4,2,1, 129,23} }, +{ {0,1,2,1,3,4,2,2, 132,44} }, +{ {0,1,2,1,3,4,2,3, 144,44} }, +{ {0,1,2,1,3,4,2,4, 137,34} }, +{ {0,1,2,1,3,4,2,5, 172,15} }, +{ {0,1,2,1,3,4,3,0, 151,15} }, +{ {0,1,2,1,3,4,3,1, 134,23} }, +{ {0,1,2,1,3,4,3,2, 145,15} }, +{ {0,1,2,1,3,4,3,3, 134,4} }, +{ {0,1,2,1,3,4,3,4, 136,36} }, +{ {0,1,2,1,3,4,3,5, 174,14} }, +{ {0,1,2,1,3,4,4,0, 150,15} }, +{ {0,1,2,1,3,4,4,1, 128,23} }, +{ {0,1,2,1,3,4,4,2, 141,34} }, +{ {0,1,2,1,3,4,4,3, 155,34} }, +{ {0,1,2,1,3,4,4,4, 129,30} }, +{ {0,1,2,1,3,4,4,5, 173,34} }, +{ {0,1,2,1,3,4,5,0, 170,15} }, +{ {0,1,2,1,3,4,5,1, 167,34} }, +{ {0,1,2,1,3,4,5,2, 169,15} }, +{ {0,1,2,1,3,4,5,3, 173,35} }, +{ {0,1,2,1,3,4,5,4, 168,35} }, +{ {0,1,2,1,3,4,5,5, 172,34} }, +{ {0,1,2,1,3,4,5,6, 182,14} }, +{ {0,1,2,2,0,0,0,0, 8,28} }, +{ {0,1,2,2,0,0,0,1, 18,2} }, +{ {0,1,2,2,0,0,0,2, 17,28} }, +{ {0,1,2,2,0,0,0,3, 63,12} }, +{ {0,1,2,2,0,0,1,0, 24,2} }, +{ {0,1,2,2,0,0,1,1, 29,2} }, +{ {0,1,2,2,0,0,1,2, 32,2} }, +{ {0,1,2,2,0,0,1,3, 69,33} }, +{ {0,1,2,2,0,0,2,0, 28,45} }, +{ {0,1,2,2,0,0,2,1, 42,2} }, +{ {0,1,2,2,0,0,2,2, 10,25} }, +{ {0,1,2,2,0,0,2,3, 83,33} }, +{ {0,1,2,2,0,0,3,0, 73,2} }, +{ {0,1,2,2,0,0,3,1, 79,2} }, +{ {0,1,2,2,0,0,3,2, 88,2} }, +{ {0,1,2,2,0,0,3,3, 84,2} }, +{ {0,1,2,2,0,0,3,4, 134,33} }, +{ {0,1,2,2,0,1,0,0, 37,29} }, +{ {0,1,2,2,0,1,0,1, 43,12} }, +{ {0,1,2,2,0,1,0,2, 41,47} }, +{ {0,1,2,2,0,1,0,3, 82,12} }, +{ {0,1,2,2,0,1,1,0, 47,33} }, +{ {0,1,2,2,0,1,1,1, 37,30} }, +{ {0,1,2,2,0,1,1,2, 29,38} }, +{ {0,1,2,2,0,1,1,3, 93,33} }, +{ {0,1,2,2,0,1,2,0, 29,45} }, +{ {0,1,2,2,0,1,2,1, 41,36} }, +{ {0,1,2,2,0,1,2,2, 11,44} }, +{ {0,1,2,2,0,1,2,3, 84,45} }, +{ {0,1,2,2,0,1,3,0, 93,42} }, +{ {0,1,2,2,0,1,3,1, 82,9} }, +{ {0,1,2,2,0,1,3,2, 84,38} }, +{ {0,1,2,2,0,1,3,3, 96,32} }, +{ {0,1,2,2,0,1,3,4, 137,32} }, +{ {0,1,2,2,0,2,0,0, 23,29} }, +{ {0,1,2,2,0,2,0,1, 31,12} }, +{ {0,1,2,2,0,2,0,2, 28,47} }, +{ {0,1,2,2,0,2,0,3, 68,12} }, +{ {0,1,2,2,0,2,1,0, 53,33} }, +{ {0,1,2,2,0,2,1,1, 47,24} }, +{ {0,1,2,2,0,2,1,2, 24,22} }, +{ {0,1,2,2,0,2,1,3, 108,13} }, +{ {0,1,2,2,0,2,2,0, 27,45} }, +{ {0,1,2,2,0,2,2,1, 40,6} }, +{ {0,1,2,2,0,2,2,2, 8,24} }, +{ {0,1,2,2,0,2,2,3, 81,45} }, +{ {0,1,2,2,0,2,3,0, 112,16} }, +{ {0,1,2,2,0,2,3,1, 103,16} }, +{ {0,1,2,2,0,2,3,2, 73,22} }, +{ {0,1,2,2,0,2,3,3, 93,24} }, +{ {0,1,2,2,0,2,3,4, 149,32} }, +{ {0,1,2,2,0,3,0,0, 72,29} }, +{ {0,1,2,2,0,3,0,1, 86,12} }, +{ {0,1,2,2,0,3,0,2, 77,7} }, +{ {0,1,2,2,0,3,0,3, 82,47} }, +{ {0,1,2,2,0,3,0,4, 132,12} }, +{ {0,1,2,2,0,3,1,0, 108,17} }, +{ {0,1,2,2,0,3,1,1, 93,7} }, +{ {0,1,2,2,0,3,1,2, 69,7} }, +{ {0,1,2,2,0,3,1,3, 113,13} }, +{ {0,1,2,2,0,3,1,4, 148,13} }, +{ {0,1,2,2,0,3,2,0, 65,45} }, +{ {0,1,2,2,0,3,2,1, 75,6} }, +{ {0,1,2,2,0,3,2,2, 59,45} }, +{ {0,1,2,2,0,3,2,3, 82,45} }, +{ {0,1,2,2,0,3,2,4, 129,45} }, +{ {0,1,2,2,0,3,3,0, 103,12} }, +{ {0,1,2,2,0,3,3,1, 106,7} }, +{ {0,1,2,2,0,3,3,2, 79,38} }, +{ {0,1,2,2,0,3,3,3, 82,5} }, +{ {0,1,2,2,0,3,3,4, 144,12} }, +{ {0,1,2,2,0,3,4,0, 149,6} }, +{ {0,1,2,2,0,3,4,1, 144,16} }, +{ {0,1,2,2,0,3,4,2, 134,7} }, +{ {0,1,2,2,0,3,4,3, 154,17} }, +{ {0,1,2,2,0,3,4,4, 137,6} }, +{ {0,1,2,2,0,3,4,5, 172,13} }, +{ {0,1,2,2,1,0,0,0, 40,30} }, +{ {0,1,2,2,1,0,0,1, 51,6} }, +{ {0,1,2,2,1,0,0,2, 39,7} }, +{ {0,1,2,2,1,0,0,3, 105,17} }, +{ {0,1,2,2,1,0,1,0, 47,31} }, +{ {0,1,2,2,1,0,1,1, 40,29} }, +{ {0,1,2,2,1,0,1,2, 31,7} }, +{ {0,1,2,2,1,0,1,3, 103,47} }, +{ {0,1,2,2,1,0,2,0, 31,6} }, +{ {0,1,2,2,1,0,2,1, 39,6} }, +{ {0,1,2,2,1,0,2,2, 12,6} }, +{ {0,1,2,2,1,0,2,3, 87,6} }, +{ {0,1,2,2,1,0,3,0, 103,36} }, +{ {0,1,2,2,1,0,3,1, 105,16} }, +{ {0,1,2,2,1,0,3,2, 87,7} }, +{ {0,1,2,2,1,0,3,3, 97,6} }, +{ {0,1,2,2,1,0,3,4, 155,17} }, +{ {0,1,2,2,1,1,0,0, 29,3} }, +{ {0,1,2,2,1,1,0,1, 18,3} }, +{ {0,1,2,2,1,1,0,2, 42,3} }, +{ {0,1,2,2,1,1,0,3, 79,3} }, +{ {0,1,2,2,1,1,1,0, 24,3} }, +{ {0,1,2,2,1,1,1,1, 8,31} }, +{ {0,1,2,2,1,1,1,2, 28,38} }, +{ {0,1,2,2,1,1,1,3, 73,3} }, +{ {0,1,2,2,1,1,2,0, 32,3} }, +{ {0,1,2,2,1,1,2,1, 17,31} }, +{ {0,1,2,2,1,1,2,2, 10,24} }, +{ {0,1,2,2,1,1,2,3, 88,3} }, +{ {0,1,2,2,1,1,3,0, 69,42} }, +{ {0,1,2,2,1,1,3,1, 63,9} }, +{ {0,1,2,2,1,1,3,2, 83,42} }, +{ {0,1,2,2,1,1,3,3, 84,3} }, +{ {0,1,2,2,1,1,3,4, 134,42} }, +{ {0,1,2,2,1,2,0,0, 48,24} }, +{ {0,1,2,2,1,2,0,1, 50,7} }, +{ {0,1,2,2,1,2,0,2, 36,38} }, +{ {0,1,2,2,1,2,0,3, 104,17} }, +{ {0,1,2,2,1,2,1,0, 53,28} }, +{ {0,1,2,2,1,2,1,1, 27,4} }, +{ {0,1,2,2,1,2,1,2, 23,22} }, +{ {0,1,2,2,1,2,1,3, 112,47} }, +{ {0,1,2,2,1,2,2,0, 30,6} }, +{ {0,1,2,2,1,2,2,1, 38,6} }, +{ {0,1,2,2,1,2,2,2, 6,24} }, +{ {0,1,2,2,1,2,2,3, 85,6} }, +{ {0,1,2,2,1,2,3,0, 111,16} }, +{ {0,1,2,2,1,2,3,1, 102,16} }, +{ {0,1,2,2,1,2,3,2, 71,22} }, +{ {0,1,2,2,1,2,3,3, 91,24} }, +{ {0,1,2,2,1,2,3,4, 153,16} }, +{ {0,1,2,2,1,3,0,0, 91,6} }, +{ {0,1,2,2,1,3,0,1, 99,6} }, +{ {0,1,2,2,1,3,0,2, 78,7} }, +{ {0,1,2,2,1,3,0,3, 106,17} }, +{ {0,1,2,2,1,3,0,4, 141,17} }, +{ {0,1,2,2,1,3,1,0, 108,6} }, +{ {0,1,2,2,1,3,1,1, 81,4} }, +{ {0,1,2,2,1,3,1,2, 68,7} }, +{ {0,1,2,2,1,3,1,3, 93,31} }, +{ {0,1,2,2,1,3,1,4, 149,17} }, +{ {0,1,2,2,1,3,2,0, 66,6} }, +{ {0,1,2,2,1,3,2,1, 74,6} }, +{ {0,1,2,2,1,3,2,2, 60,6} }, +{ {0,1,2,2,1,3,2,3, 86,6} }, +{ {0,1,2,2,1,3,2,4, 130,6} }, +{ {0,1,2,2,1,3,3,0, 114,16} }, +{ {0,1,2,2,1,3,3,1, 105,7} }, +{ {0,1,2,2,1,3,3,2, 78,38} }, +{ {0,1,2,2,1,3,3,3, 75,30} }, +{ {0,1,2,2,1,3,3,4, 156,17} }, +{ {0,1,2,2,1,3,4,0, 150,6} }, +{ {0,1,2,2,1,3,4,1, 143,16} }, +{ {0,1,2,2,1,3,4,2, 133,7} }, +{ {0,1,2,2,1,3,4,3, 144,36} }, +{ {0,1,2,2,1,3,4,4, 138,6} }, +{ {0,1,2,2,1,3,4,5, 173,17} }, +{ {0,1,2,2,2,0,0,0, 27,5} }, +{ {0,1,2,2,2,0,0,1, 50,6} }, +{ {0,1,2,2,2,0,0,2, 38,7} }, +{ {0,1,2,2,2,0,0,3, 102,17} }, +{ {0,1,2,2,2,0,1,0, 53,31} }, +{ {0,1,2,2,2,0,1,1, 48,25} }, +{ {0,1,2,2,2,0,1,2, 30,7} }, +{ {0,1,2,2,2,0,1,3, 111,17} }, +{ {0,1,2,2,2,0,2,0, 23,27} }, +{ {0,1,2,2,2,0,2,1, 36,27} }, +{ {0,1,2,2,2,0,2,2, 6,25} }, +{ {0,1,2,2,2,0,2,3, 71,27} }, +{ {0,1,2,2,2,0,3,0, 112,36} }, +{ {0,1,2,2,2,0,3,1, 104,16} }, +{ {0,1,2,2,2,0,3,2, 85,7} }, +{ {0,1,2,2,2,0,3,3, 91,25} }, +{ {0,1,2,2,2,0,3,4, 153,17} }, +{ {0,1,2,2,2,1,0,0, 47,25} }, +{ {0,1,2,2,2,1,0,1, 31,9} }, +{ {0,1,2,2,2,1,0,2, 40,7} }, +{ {0,1,2,2,2,1,0,3, 103,17} }, +{ {0,1,2,2,2,1,1,0, 53,42} }, +{ {0,1,2,2,2,1,1,1, 23,30} }, +{ {0,1,2,2,2,1,1,2, 27,38} }, +{ {0,1,2,2,2,1,1,3, 112,17} }, +{ {0,1,2,2,2,1,2,0, 24,27} }, +{ {0,1,2,2,2,1,2,1, 28,36} }, +{ {0,1,2,2,2,1,2,2, 8,25} }, +{ {0,1,2,2,2,1,2,3, 73,27} }, +{ {0,1,2,2,2,1,3,0, 108,8} }, +{ {0,1,2,2,2,1,3,1, 68,9} }, +{ {0,1,2,2,2,1,3,2, 81,38} }, +{ {0,1,2,2,2,1,3,3, 93,25} }, +{ {0,1,2,2,2,1,3,4, 149,43} }, +{ {0,1,2,2,2,2,0,0, 45,4} }, +{ {0,1,2,2,2,2,0,1, 49,6} }, +{ {0,1,2,2,2,2,0,2, 35,22} }, +{ {0,1,2,2,2,2,0,3, 101,2} }, +{ {0,1,2,2,2,2,1,0, 52,7} }, +{ {0,1,2,2,2,2,1,1, 45,5} }, +{ {0,1,2,2,2,2,1,2, 21,22} }, +{ {0,1,2,2,2,2,1,3, 110,2} }, +{ {0,1,2,2,2,2,2,0, 21,27} }, +{ {0,1,2,2,2,2,2,1, 35,27} }, +{ {0,1,2,2,2,2,2,2, 3,4} }, +{ {0,1,2,2,2,2,2,3, 70,27} }, +{ {0,1,2,2,2,2,3,0, 110,3} }, +{ {0,1,2,2,2,2,3,1, 101,3} }, +{ {0,1,2,2,2,2,3,2, 70,22} }, +{ {0,1,2,2,2,2,3,3, 89,4} }, +{ {0,1,2,2,2,2,3,4, 152,2} }, +{ {0,1,2,2,2,3,0,0, 90,6} }, +{ {0,1,2,2,2,3,0,1, 98,6} }, +{ {0,1,2,2,2,3,0,2, 76,7} }, +{ {0,1,2,2,2,3,0,3, 103,6} }, +{ {0,1,2,2,2,3,0,4, 140,17} }, +{ {0,1,2,2,2,3,1,0, 107,17} }, +{ {0,1,2,2,2,3,1,1, 92,7} }, +{ {0,1,2,2,2,3,1,2, 67,7} }, +{ {0,1,2,2,2,3,1,3, 108,37} }, +{ {0,1,2,2,2,3,1,4, 147,17} }, +{ {0,1,2,2,2,3,2,0, 64,45} }, +{ {0,1,2,2,2,3,2,1, 71,45} }, +{ {0,1,2,2,2,3,2,2, 58,44} }, +{ {0,1,2,2,2,3,2,3, 72,27} }, +{ {0,1,2,2,2,3,2,4, 127,27} }, +{ {0,1,2,2,2,3,3,0, 111,6} }, +{ {0,1,2,2,2,3,3,1, 104,7} }, +{ {0,1,2,2,2,3,3,2, 76,38} }, +{ {0,1,2,2,2,3,3,3, 65,5} }, +{ {0,1,2,2,2,3,3,4, 153,6} }, +{ {0,1,2,2,2,3,4,0, 147,6} }, +{ {0,1,2,2,2,3,4,1, 142,16} }, +{ {0,1,2,2,2,3,4,2, 131,7} }, +{ {0,1,2,2,2,3,4,3, 149,30} }, +{ {0,1,2,2,2,3,4,4, 135,25} }, +{ {0,1,2,2,2,3,4,5, 171,17} }, +{ {0,1,2,2,3,0,0,0, 81,5} }, +{ {0,1,2,2,3,0,0,1, 99,7} }, +{ {0,1,2,2,3,0,0,2, 74,7} }, +{ {0,1,2,2,3,0,0,3, 105,6} }, +{ {0,1,2,2,3,0,0,4, 143,17} }, +{ {0,1,2,2,3,0,1,0, 108,7} }, +{ {0,1,2,2,3,0,1,1, 91,7} }, +{ {0,1,2,2,3,0,1,2, 66,7} }, +{ {0,1,2,2,3,0,1,3, 114,17} }, +{ {0,1,2,2,3,0,1,4, 150,7} }, +{ {0,1,2,2,3,0,2,0, 68,6} }, +{ {0,1,2,2,3,0,2,1, 78,6} }, +{ {0,1,2,2,3,0,2,2, 60,7} }, +{ {0,1,2,2,3,0,2,3, 78,45} }, +{ {0,1,2,2,3,0,2,4, 133,6} }, +{ {0,1,2,2,3,0,3,0, 93,28} }, +{ {0,1,2,2,3,0,3,1, 106,16} }, +{ {0,1,2,2,3,0,3,2, 86,7} }, +{ {0,1,2,2,3,0,3,3, 75,29} }, +{ {0,1,2,2,3,0,3,4, 144,47} }, +{ {0,1,2,2,3,0,4,0, 149,16} }, +{ {0,1,2,2,3,0,4,1, 141,16} }, +{ {0,1,2,2,3,0,4,2, 130,7} }, +{ {0,1,2,2,3,0,4,3, 156,16} }, +{ {0,1,2,2,3,0,4,4, 138,7} }, +{ {0,1,2,2,3,0,4,5, 173,16} }, +{ {0,1,2,2,3,1,0,0, 93,6} }, +{ {0,1,2,2,3,1,0,1, 86,9} }, +{ {0,1,2,2,3,1,0,2, 75,7} }, +{ {0,1,2,2,3,1,0,3, 106,6} }, +{ {0,1,2,2,3,1,0,4, 144,17} }, +{ {0,1,2,2,3,1,1,0, 108,16} }, +{ {0,1,2,2,3,1,1,1, 72,30} }, +{ {0,1,2,2,3,1,1,2, 65,38} }, +{ {0,1,2,2,3,1,1,3, 103,9} }, +{ {0,1,2,2,3,1,1,4, 149,7} }, +{ {0,1,2,2,3,1,2,0, 69,6} }, +{ {0,1,2,2,3,1,2,1, 77,6} }, +{ {0,1,2,2,3,1,2,2, 59,38} }, +{ {0,1,2,2,3,1,2,3, 79,45} }, +{ {0,1,2,2,3,1,2,4, 134,6} }, +{ {0,1,2,2,3,1,3,0, 113,8} }, +{ {0,1,2,2,3,1,3,1, 82,36} }, +{ {0,1,2,2,3,1,3,2, 82,38} }, +{ {0,1,2,2,3,1,3,3, 82,4} }, +{ {0,1,2,2,3,1,3,4, 154,16} }, +{ {0,1,2,2,3,1,4,0, 148,8} }, +{ {0,1,2,2,3,1,4,1, 132,9} }, +{ {0,1,2,2,3,1,4,2, 129,38} }, +{ {0,1,2,2,3,1,4,3, 144,9} }, +{ {0,1,2,2,3,1,4,4, 137,7} }, +{ {0,1,2,2,3,1,4,5, 172,8} }, +{ {0,1,2,2,3,2,0,0, 92,6} }, +{ {0,1,2,2,3,2,0,1, 98,7} }, +{ {0,1,2,2,3,2,0,2, 71,38} }, +{ {0,1,2,2,3,2,0,3, 104,6} }, +{ {0,1,2,2,3,2,0,4, 142,17} }, +{ {0,1,2,2,3,2,1,0, 107,7} }, +{ {0,1,2,2,3,2,1,1, 90,7} }, +{ {0,1,2,2,3,2,1,2, 64,38} }, +{ {0,1,2,2,3,2,1,3, 111,7} }, +{ {0,1,2,2,3,2,1,4, 147,7} }, +{ {0,1,2,2,3,2,2,0, 67,6} }, +{ {0,1,2,2,3,2,2,1, 76,6} }, +{ {0,1,2,2,3,2,2,2, 58,39} }, +{ {0,1,2,2,3,2,2,3, 76,45} }, +{ {0,1,2,2,3,2,2,4, 131,6} }, +{ {0,1,2,2,3,2,3,0, 108,46} }, +{ {0,1,2,2,3,2,3,1, 103,7} }, +{ {0,1,2,2,3,2,3,2, 72,22} }, +{ {0,1,2,2,3,2,3,3, 65,4} }, +{ {0,1,2,2,3,2,3,4, 149,29} }, +{ {0,1,2,2,3,2,4,0, 147,16} }, +{ {0,1,2,2,3,2,4,1, 140,16} }, +{ {0,1,2,2,3,2,4,2, 127,22} }, +{ {0,1,2,2,3,2,4,3, 153,7} }, +{ {0,1,2,2,3,2,4,4, 135,24} }, +{ {0,1,2,2,3,2,4,5, 171,16} }, +{ {0,1,2,2,3,3,0,0, 94,6} }, +{ {0,1,2,2,3,3,0,1, 100,6} }, +{ {0,1,2,2,3,3,0,2, 79,7} }, +{ {0,1,2,2,3,3,0,3, 79,10} }, +{ {0,1,2,2,3,3,0,4, 145,17} }, +{ {0,1,2,2,3,3,1,0, 109,7} }, +{ {0,1,2,2,3,3,1,1, 94,7} }, +{ {0,1,2,2,3,3,1,2, 69,38} }, +{ {0,1,2,2,3,3,1,3, 69,31} }, +{ {0,1,2,2,3,3,1,4, 151,17} }, +{ {0,1,2,2,3,3,2,0, 69,45} }, +{ {0,1,2,2,3,3,2,1, 79,6} }, +{ {0,1,2,2,3,3,2,2, 59,25} }, +{ {0,1,2,2,3,3,2,3, 77,45} }, +{ {0,1,2,2,3,3,2,4, 134,45} }, +{ {0,1,2,2,3,3,3,0, 69,28} }, +{ {0,1,2,2,3,3,3,1, 79,11} }, +{ {0,1,2,2,3,3,3,2, 77,38} }, +{ {0,1,2,2,3,3,3,3, 59,4} }, +{ {0,1,2,2,3,3,3,4, 134,28} }, +{ {0,1,2,2,3,3,4,0, 151,16} }, +{ {0,1,2,2,3,3,4,1, 145,16} }, +{ {0,1,2,2,3,3,4,2, 134,38} }, +{ {0,1,2,2,3,3,4,3, 134,31} }, +{ {0,1,2,2,3,3,4,4, 136,25} }, +{ {0,1,2,2,3,3,4,5, 174,17} }, +{ {0,1,2,2,3,4,0,0, 135,6} }, +{ {0,1,2,2,3,4,0,1, 139,6} }, +{ {0,1,2,2,3,4,0,2, 128,7} }, +{ {0,1,2,2,3,4,0,3, 141,6} }, +{ {0,1,2,2,3,4,0,4, 144,6} }, +{ {0,1,2,2,3,4,0,5, 169,17} }, +{ {0,1,2,2,3,4,1,0, 146,17} }, +{ {0,1,2,2,3,4,1,1, 135,7} }, +{ {0,1,2,2,3,4,1,2, 126,7} }, +{ {0,1,2,2,3,4,1,3, 150,17} }, +{ {0,1,2,2,3,4,1,4, 148,7} }, +{ {0,1,2,2,3,4,1,5, 170,17} }, +{ {0,1,2,2,3,4,2,0, 126,6} }, +{ {0,1,2,2,3,4,2,1, 128,6} }, +{ {0,1,2,2,3,4,2,2, 124,6} }, +{ {0,1,2,2,3,4,2,3, 128,45} }, +{ {0,1,2,2,3,4,2,4, 132,6} }, +{ {0,1,2,2,3,4,2,5, 167,6} }, +{ {0,1,2,2,3,4,3,0, 148,6} }, +{ {0,1,2,2,3,4,3,1, 144,7} }, +{ {0,1,2,2,3,4,3,2, 132,7} }, +{ {0,1,2,2,3,4,3,3, 129,4} }, +{ {0,1,2,2,3,4,3,4, 137,29} }, +{ {0,1,2,2,3,4,3,5, 172,6} }, +{ {0,1,2,2,3,4,4,0, 150,16} }, +{ {0,1,2,2,3,4,4,1, 141,7} }, +{ {0,1,2,2,3,4,4,2, 128,38} }, +{ {0,1,2,2,3,4,4,3, 155,7} }, +{ {0,1,2,2,3,4,4,4, 129,5} }, +{ {0,1,2,2,3,4,4,5, 173,7} }, +{ {0,1,2,2,3,4,5,0, 170,16} }, +{ {0,1,2,2,3,4,5,1, 169,16} }, +{ {0,1,2,2,3,4,5,2, 167,7} }, +{ {0,1,2,2,3,4,5,3, 173,6} }, +{ {0,1,2,2,3,4,5,4, 172,7} }, +{ {0,1,2,2,3,4,5,5, 168,6} }, +{ {0,1,2,2,3,4,5,6, 182,17} }, +{ {0,1,2,3,0,0,0,0, 58,11} }, +{ {0,1,2,3,0,0,0,1, 61,2} }, +{ {0,1,2,3,0,0,0,2, 61,28} }, +{ {0,1,2,3,0,0,0,3, 63,11} }, +{ {0,1,2,3,0,0,0,4, 125,33} }, +{ {0,1,2,3,0,0,1,0, 64,2} }, +{ {0,1,2,3,0,0,1,1, 65,2} }, +{ {0,1,2,3,0,0,1,2, 66,2} }, +{ {0,1,2,3,0,0,1,3, 69,2} }, +{ {0,1,2,3,0,0,1,4, 126,33} }, +{ {0,1,2,3,0,0,2,0, 72,2} }, +{ {0,1,2,3,0,0,2,1, 75,2} }, +{ {0,1,2,3,0,0,2,2, 80,2} }, +{ {0,1,2,3,0,0,2,3, 84,33} }, +{ {0,1,2,3,0,0,2,4, 129,33} }, +{ {0,1,2,3,0,0,3,0, 71,10} }, +{ {0,1,2,3,0,0,3,1, 78,2} }, +{ {0,1,2,3,0,0,3,2, 87,2} }, +{ {0,1,2,3,0,0,3,3, 83,2} }, +{ {0,1,2,3,0,0,3,4, 133,33} }, +{ {0,1,2,3,0,0,4,0, 127,2} }, +{ {0,1,2,3,0,0,4,1, 128,2} }, +{ {0,1,2,3,0,0,4,2, 130,2} }, +{ {0,1,2,3,0,0,4,3, 134,2} }, +{ {0,1,2,3,0,0,4,4, 129,2} }, +{ {0,1,2,3,0,0,4,5, 167,33} }, +{ {0,1,2,3,0,1,0,0, 72,47} }, +{ {0,1,2,3,0,1,0,1, 80,12} }, +{ {0,1,2,3,0,1,0,2, 75,47} }, +{ {0,1,2,3,0,1,0,3, 84,12} }, +{ {0,1,2,3,0,1,0,4, 129,12} }, +{ {0,1,2,3,0,1,1,0, 90,33} }, +{ {0,1,2,3,0,1,1,1, 72,36} }, +{ {0,1,2,3,0,1,1,2, 91,33} }, +{ {0,1,2,3,0,1,1,3, 94,33} }, +{ {0,1,2,3,0,1,1,4, 135,33} }, +{ {0,1,2,3,0,1,2,0, 94,42} }, +{ {0,1,2,3,0,1,2,1, 84,9} }, +{ {0,1,2,3,0,1,2,2, 84,44} }, +{ {0,1,2,3,0,1,2,3, 95,33} }, +{ {0,1,2,3,0,1,2,4, 136,32} }, +{ {0,1,2,3,0,1,3,0, 91,42} }, +{ {0,1,2,3,0,1,3,1, 75,36} }, +{ {0,1,2,3,0,1,3,2, 97,32} }, +{ {0,1,2,3,0,1,3,3, 84,39} }, +{ {0,1,2,3,0,1,3,4, 138,32} }, +{ {0,1,2,3,0,1,4,0, 135,42} }, +{ {0,1,2,3,0,1,4,1, 129,9} }, +{ {0,1,2,3,0,1,4,2, 138,43} }, +{ {0,1,2,3,0,1,4,3, 136,43} }, +{ {0,1,2,3,0,1,4,4, 137,33} }, +{ {0,1,2,3,0,1,4,5, 168,32} }, +{ {0,1,2,3,0,2,0,0, 64,47} }, +{ {0,1,2,3,0,2,0,1, 66,12} }, +{ {0,1,2,3,0,2,0,2, 65,47} }, +{ {0,1,2,3,0,2,0,3, 69,47} }, +{ {0,1,2,3,0,2,0,4, 126,12} }, +{ {0,1,2,3,0,2,1,0, 107,12} }, +{ {0,1,2,3,0,2,1,1, 108,12} }, +{ {0,1,2,3,0,2,1,2, 108,33} }, +{ {0,1,2,3,0,2,1,3, 109,12} }, +{ {0,1,2,3,0,2,1,4, 146,32} }, +{ {0,1,2,3,0,2,2,0, 90,12} }, +{ {0,1,2,3,0,2,2,1, 91,12} }, +{ {0,1,2,3,0,2,2,2, 72,25} }, +{ {0,1,2,3,0,2,2,3, 94,12} }, +{ {0,1,2,3,0,2,2,4, 135,12} }, +{ {0,1,2,3,0,2,3,0, 111,12} }, +{ {0,1,2,3,0,2,3,1, 114,32} }, +{ {0,1,2,3,0,2,3,2, 103,30} }, +{ {0,1,2,3,0,2,3,3, 69,24} }, +{ {0,1,2,3,0,2,3,4, 150,32} }, +{ {0,1,2,3,0,2,4,0, 147,12} }, +{ {0,1,2,3,0,2,4,1, 150,12} }, +{ {0,1,2,3,0,2,4,2, 149,12} }, +{ {0,1,2,3,0,2,4,3, 151,32} }, +{ {0,1,2,3,0,2,4,4, 148,12} }, +{ {0,1,2,3,0,2,4,5, 170,32} }, +{ {0,1,2,3,0,3,0,0, 71,29} }, +{ {0,1,2,3,0,3,0,1, 87,12} }, +{ {0,1,2,3,0,3,0,2, 78,47} }, +{ {0,1,2,3,0,3,0,3, 83,47} }, +{ {0,1,2,3,0,3,0,4, 133,12} }, +{ {0,1,2,3,0,3,1,0, 111,33} }, +{ {0,1,2,3,0,3,1,1, 103,5} }, +{ {0,1,2,3,0,3,1,2, 114,13} }, +{ {0,1,2,3,0,3,1,3, 69,37} }, +{ {0,1,2,3,0,3,1,4, 150,13} }, +{ {0,1,2,3,0,3,2,0, 91,27} }, +{ {0,1,2,3,0,3,2,1, 97,13} }, +{ {0,1,2,3,0,3,2,2, 75,25} }, +{ {0,1,2,3,0,3,2,3, 84,22} }, +{ {0,1,2,3,0,3,2,4, 138,13} }, +{ {0,1,2,3,0,3,3,0, 102,33} }, +{ {0,1,2,3,0,3,3,1, 105,33} }, +{ {0,1,2,3,0,3,3,2, 105,12} }, +{ {0,1,2,3,0,3,3,3, 63,30} }, +{ {0,1,2,3,0,3,3,4, 143,33} }, +{ {0,1,2,3,0,3,4,0, 153,33} }, +{ {0,1,2,3,0,3,4,1, 155,32} }, +{ {0,1,2,3,0,3,4,2, 156,32} }, +{ {0,1,2,3,0,3,4,3, 134,37} }, +{ {0,1,2,3,0,3,4,4, 144,5} }, +{ {0,1,2,3,0,3,4,5, 173,32} }, +{ {0,1,2,3,0,4,0,0, 127,47} }, +{ {0,1,2,3,0,4,0,1, 130,12} }, +{ {0,1,2,3,0,4,0,2, 128,47} }, +{ {0,1,2,3,0,4,0,3, 134,47} }, +{ {0,1,2,3,0,4,0,4, 129,47} }, +{ {0,1,2,3,0,4,0,5, 167,12} }, +{ {0,1,2,3,0,4,1,0, 147,33} }, +{ {0,1,2,3,0,4,1,1, 149,33} }, +{ {0,1,2,3,0,4,1,2, 150,33} }, +{ {0,1,2,3,0,4,1,3, 151,13} }, +{ {0,1,2,3,0,4,1,4, 148,33} }, +{ {0,1,2,3,0,4,1,5, 170,13} }, +{ {0,1,2,3,0,4,2,0, 135,27} }, +{ {0,1,2,3,0,4,2,1, 138,26} }, +{ {0,1,2,3,0,4,2,2, 129,44} }, +{ {0,1,2,3,0,4,2,3, 136,26} }, +{ {0,1,2,3,0,4,2,4, 137,12} }, +{ {0,1,2,3,0,4,2,5, 168,13} }, +{ {0,1,2,3,0,4,3,0, 153,12} }, +{ {0,1,2,3,0,4,3,1, 156,13} }, +{ {0,1,2,3,0,4,3,2, 155,13} }, +{ {0,1,2,3,0,4,3,3, 134,24} }, +{ {0,1,2,3,0,4,3,4, 144,30} }, +{ {0,1,2,3,0,4,3,5, 173,13} }, +{ {0,1,2,3,0,4,4,0, 140,33} }, +{ {0,1,2,3,0,4,4,1, 141,33} }, +{ {0,1,2,3,0,4,4,2, 141,12} }, +{ {0,1,2,3,0,4,4,3, 145,33} }, +{ {0,1,2,3,0,4,4,4, 132,30} }, +{ {0,1,2,3,0,4,4,5, 169,33} }, +{ {0,1,2,3,0,4,5,0, 171,33} }, +{ {0,1,2,3,0,4,5,1, 173,33} }, +{ {0,1,2,3,0,4,5,2, 173,12} }, +{ {0,1,2,3,0,4,5,3, 174,32} }, +{ {0,1,2,3,0,4,5,4, 172,33} }, +{ {0,1,2,3,0,4,5,5, 172,12} }, +{ {0,1,2,3,0,4,5,6, 182,32} }, +{ {0,1,2,3,1,0,0,0, 76,30} }, +{ {0,1,2,3,1,0,0,1, 115,2} }, +{ {0,1,2,3,1,0,0,2, 116,2} }, +{ {0,1,2,3,1,0,0,3, 105,22} }, +{ {0,1,2,3,1,0,0,4, 157,33} }, +{ {0,1,2,3,1,0,1,0, 90,28} }, +{ {0,1,2,3,1,0,1,1, 76,29} }, +{ {0,1,2,3,1,0,1,2, 98,28} }, +{ {0,1,2,3,1,0,1,3, 103,28} }, +{ {0,1,2,3,1,0,1,4, 140,47} }, +{ {0,1,2,3,1,0,2,0, 103,31} }, +{ {0,1,2,3,1,0,2,1, 105,27} }, +{ {0,1,2,3,1,0,2,2, 87,25} }, +{ {0,1,2,3,1,0,2,3, 97,45} }, +{ {0,1,2,3,1,0,2,4, 155,26} }, +{ {0,1,2,3,1,0,3,0, 98,31} }, +{ {0,1,2,3,1,0,3,1, 116,3} }, +{ {0,1,2,3,1,0,3,2, 118,3} }, +{ {0,1,2,3,1,0,3,3, 87,24} }, +{ {0,1,2,3,1,0,3,4, 158,21} }, +{ {0,1,2,3,1,0,4,0, 140,36} }, +{ {0,1,2,3,1,0,4,1, 157,42} }, +{ {0,1,2,3,1,0,4,2, 158,20} }, +{ {0,1,2,3,1,0,4,3, 155,23} }, +{ {0,1,2,3,1,0,4,4, 155,4} }, +{ {0,1,2,3,1,0,4,5, 175,21} }, +{ {0,1,2,3,1,1,0,0, 65,3} }, +{ {0,1,2,3,1,1,0,1, 61,3} }, +{ {0,1,2,3,1,1,0,2, 78,3} }, +{ {0,1,2,3,1,1,0,3, 75,3} }, +{ {0,1,2,3,1,1,0,4, 128,3} }, +{ {0,1,2,3,1,1,1,0, 64,11} }, +{ {0,1,2,3,1,1,1,1, 58,10} }, +{ {0,1,2,3,1,1,1,2, 71,11} }, +{ {0,1,2,3,1,1,1,3, 72,3} }, +{ {0,1,2,3,1,1,1,4, 127,3} }, +{ {0,1,2,3,1,1,2,0, 69,3} }, +{ {0,1,2,3,1,1,2,1, 63,10} }, +{ {0,1,2,3,1,1,2,2, 83,3} }, +{ {0,1,2,3,1,1,2,3, 84,42} }, +{ {0,1,2,3,1,1,2,4, 134,3} }, +{ {0,1,2,3,1,1,3,0, 66,3} }, +{ {0,1,2,3,1,1,3,1, 61,31} }, +{ {0,1,2,3,1,1,3,2, 87,3} }, +{ {0,1,2,3,1,1,3,3, 80,3} }, +{ {0,1,2,3,1,1,3,4, 130,3} }, +{ {0,1,2,3,1,1,4,0, 126,42} }, +{ {0,1,2,3,1,1,4,1, 125,42} }, +{ {0,1,2,3,1,1,4,2, 133,42} }, +{ {0,1,2,3,1,1,4,3, 129,42} }, +{ {0,1,2,3,1,1,4,4, 129,3} }, +{ {0,1,2,3,1,1,4,5, 167,42} }, +{ {0,1,2,3,1,2,0,0, 111,4} }, +{ {0,1,2,3,1,2,0,1, 120,3} }, +{ {0,1,2,3,1,2,0,2, 104,31} }, +{ {0,1,2,3,1,2,0,3, 114,39} }, +{ {0,1,2,3,1,2,0,4, 162,32} }, +{ {0,1,2,3,1,2,1,0, 107,47} }, +{ {0,1,2,3,1,2,1,1, 67,29} }, +{ {0,1,2,3,1,2,1,2, 92,29} }, +{ {0,1,2,3,1,2,1,3, 108,39} }, +{ {0,1,2,3,1,2,1,4, 147,47} }, +{ {0,1,2,3,1,2,2,0, 111,27} }, +{ {0,1,2,3,1,2,2,1, 102,27} }, +{ {0,1,2,3,1,2,2,2, 71,5} }, +{ {0,1,2,3,1,2,2,3, 91,39} }, +{ {0,1,2,3,1,2,2,4, 153,27} }, +{ {0,1,2,3,1,2,3,0, 121,21} }, +{ {0,1,2,3,1,2,3,1, 120,31} }, +{ {0,1,2,3,1,2,3,2, 98,30} }, +{ {0,1,2,3,1,2,3,3, 66,24} }, +{ {0,1,2,3,1,2,3,4, 163,21} }, +{ {0,1,2,3,1,2,4,0, 164,21} }, +{ {0,1,2,3,1,2,4,1, 160,42} }, +{ {0,1,2,3,1,2,4,2, 142,36} }, +{ {0,1,2,3,1,2,4,3, 150,39} }, +{ {0,1,2,3,1,2,4,4, 150,24} }, +{ {0,1,2,3,1,2,4,5, 177,21} }, +{ {0,1,2,3,1,3,0,0, 104,5} }, +{ {0,1,2,3,1,3,0,1, 116,9} }, +{ {0,1,2,3,1,3,0,2, 122,12} }, +{ {0,1,2,3,1,3,0,3, 78,37} }, +{ {0,1,2,3,1,3,0,4, 165,32} }, +{ {0,1,2,3,1,3,1,0, 111,28} }, +{ {0,1,2,3,1,3,1,1, 76,4} }, +{ {0,1,2,3,1,3,1,2, 104,29} }, +{ {0,1,2,3,1,3,1,3, 65,37} }, +{ {0,1,2,3,1,3,1,4, 153,28} }, +{ {0,1,2,3,1,3,2,0, 114,27} }, +{ {0,1,2,3,1,3,2,1, 105,44} }, +{ {0,1,2,3,1,3,2,2, 78,25} }, +{ {0,1,2,3,1,3,2,3, 75,37} }, +{ {0,1,2,3,1,3,2,4, 156,26} }, +{ {0,1,2,3,1,3,3,0, 120,30} }, +{ {0,1,2,3,1,3,3,1, 115,30} }, +{ {0,1,2,3,1,3,3,2, 116,24} }, +{ {0,1,2,3,1,3,3,3, 61,30} }, +{ {0,1,2,3,1,3,3,4, 159,30} }, +{ {0,1,2,3,1,3,4,0, 162,8} }, +{ {0,1,2,3,1,3,4,1, 157,9} }, +{ {0,1,2,3,1,3,4,2, 165,8} }, +{ {0,1,2,3,1,3,4,3, 128,37} }, +{ {0,1,2,3,1,3,4,4, 141,5} }, +{ {0,1,2,3,1,3,4,5, 178,8} }, +{ {0,1,2,3,1,4,0,0, 153,4} }, +{ {0,1,2,3,1,4,0,1, 159,3} }, +{ {0,1,2,3,1,4,0,2, 165,26} }, +{ {0,1,2,3,1,4,0,3, 156,38} }, +{ {0,1,2,3,1,4,0,4, 141,31} }, +{ {0,1,2,3,1,4,0,5, 178,32} }, +{ {0,1,2,3,1,4,1,0, 147,28} }, +{ {0,1,2,3,1,4,1,1, 131,29} }, +{ {0,1,2,3,1,4,1,2, 142,46} }, +{ {0,1,2,3,1,4,1,3, 149,22} }, +{ {0,1,2,3,1,4,1,4, 135,31} }, +{ {0,1,2,3,1,4,1,5, 171,47} }, +{ {0,1,2,3,1,4,2,0, 150,45} }, +{ {0,1,2,3,1,4,2,1, 143,27} }, +{ {0,1,2,3,1,4,2,2, 133,44} }, +{ {0,1,2,3,1,4,2,3, 138,45} }, +{ {0,1,2,3,1,4,2,4, 144,31} }, +{ {0,1,2,3,1,4,2,5, 173,26} }, +{ {0,1,2,3,1,4,3,0, 163,6} }, +{ {0,1,2,3,1,4,3,1, 159,31} }, +{ {0,1,2,3,1,4,3,2, 158,6} }, +{ {0,1,2,3,1,4,3,3, 130,24} }, +{ {0,1,2,3,1,4,3,4, 139,31} }, +{ {0,1,2,3,1,4,3,5, 179,21} }, +{ {0,1,2,3,1,4,4,0, 162,11} }, +{ {0,1,2,3,1,4,4,1, 157,10} }, +{ {0,1,2,3,1,4,4,2, 165,11} }, +{ {0,1,2,3,1,4,4,3, 141,22} }, +{ {0,1,2,3,1,4,4,4, 128,30} }, +{ {0,1,2,3,1,4,4,5, 178,11} }, +{ {0,1,2,3,1,4,5,0, 177,42} }, +{ {0,1,2,3,1,4,5,1, 176,42} }, +{ {0,1,2,3,1,4,5,2, 180,21} }, +{ {0,1,2,3,1,4,5,3, 173,22} }, +{ {0,1,2,3,1,4,5,4, 169,36} }, +{ {0,1,2,3,1,4,5,5, 173,5} }, +{ {0,1,2,3,1,4,5,6, 183,21} }, +{ {0,1,2,3,2,0,0,0, 76,5} }, +{ {0,1,2,3,2,0,0,1, 116,12} }, +{ {0,1,2,3,2,0,0,2, 115,28} }, +{ {0,1,2,3,2,0,0,3, 105,39} }, +{ {0,1,2,3,2,0,0,4, 157,12} }, +{ {0,1,2,3,2,0,1,0, 111,31} }, +{ {0,1,2,3,2,0,1,1, 104,4} }, +{ {0,1,2,3,2,0,1,2, 120,29} }, +{ {0,1,2,3,2,0,1,3, 114,22} }, +{ {0,1,2,3,2,0,1,4, 162,13} }, +{ {0,1,2,3,2,0,2,0, 65,46} }, +{ {0,1,2,3,2,0,2,1, 78,46} }, +{ {0,1,2,3,2,0,2,2, 61,29} }, +{ {0,1,2,3,2,0,2,3, 75,46} }, +{ {0,1,2,3,2,0,2,4, 128,46} }, +{ {0,1,2,3,2,0,3,0, 104,30} }, +{ {0,1,2,3,2,0,3,1, 122,43} }, +{ {0,1,2,3,2,0,3,2, 116,25} }, +{ {0,1,2,3,2,0,3,3, 78,24} }, +{ {0,1,2,3,2,0,3,4, 165,13} }, +{ {0,1,2,3,2,0,4,0, 153,31} }, +{ {0,1,2,3,2,0,4,1, 165,43} }, +{ {0,1,2,3,2,0,4,2, 159,29} }, +{ {0,1,2,3,2,0,4,3, 156,23} }, +{ {0,1,2,3,2,0,4,4, 141,4} }, +{ {0,1,2,3,2,0,4,5, 178,13} }, +{ {0,1,2,3,2,1,0,0, 103,4} }, +{ {0,1,2,3,2,1,0,1, 87,9} }, +{ {0,1,2,3,2,1,0,2, 105,42} }, +{ {0,1,2,3,2,1,0,3, 97,8} }, +{ {0,1,2,3,2,1,0,4, 155,43} }, +{ {0,1,2,3,2,1,1,0, 111,42} }, +{ {0,1,2,3,2,1,1,1, 71,30} }, +{ {0,1,2,3,2,1,1,2, 102,42} }, +{ {0,1,2,3,2,1,1,3, 91,22} }, +{ {0,1,2,3,2,1,1,4, 153,42} }, +{ {0,1,2,3,2,1,2,0, 69,46} }, +{ {0,1,2,3,2,1,2,1, 83,46} }, +{ {0,1,2,3,2,1,2,2, 63,29} }, +{ {0,1,2,3,2,1,2,3, 84,27} }, +{ {0,1,2,3,2,1,2,4, 134,46} }, +{ {0,1,2,3,2,1,3,0, 114,42} }, +{ {0,1,2,3,2,1,3,1, 78,36} }, +{ {0,1,2,3,2,1,3,2, 105,9} }, +{ {0,1,2,3,2,1,3,3, 75,24} }, +{ {0,1,2,3,2,1,3,4, 156,43} }, +{ {0,1,2,3,2,1,4,0, 150,8} }, +{ {0,1,2,3,2,1,4,1, 133,9} }, +{ {0,1,2,3,2,1,4,2, 143,42} }, +{ {0,1,2,3,2,1,4,3, 138,8} }, +{ {0,1,2,3,2,1,4,4, 144,4} }, +{ {0,1,2,3,2,1,4,5, 173,43} }, +{ {0,1,2,3,2,2,0,0, 90,11} }, +{ {0,1,2,3,2,2,0,1, 98,2} }, +{ {0,1,2,3,2,2,0,2, 76,10} }, +{ {0,1,2,3,2,2,0,3, 103,11} }, +{ {0,1,2,3,2,2,0,4, 140,2} }, +{ {0,1,2,3,2,2,1,0, 107,2} }, +{ {0,1,2,3,2,2,1,1, 92,10} }, +{ {0,1,2,3,2,2,1,2, 67,10} }, +{ {0,1,2,3,2,2,1,3, 108,22} }, +{ {0,1,2,3,2,2,1,4, 147,2} }, +{ {0,1,2,3,2,2,2,0, 64,28} }, +{ {0,1,2,3,2,2,2,1, 71,28} }, +{ {0,1,2,3,2,2,2,2, 58,29} }, +{ {0,1,2,3,2,2,2,3, 72,46} }, +{ {0,1,2,3,2,2,2,4, 127,46} }, +{ {0,1,2,3,2,2,3,0, 111,11} }, +{ {0,1,2,3,2,2,3,1, 104,10} }, +{ {0,1,2,3,2,2,3,2, 76,31} }, +{ {0,1,2,3,2,2,3,3, 65,24} }, +{ {0,1,2,3,2,2,3,4, 153,11} }, +{ {0,1,2,3,2,2,4,0, 147,11} }, +{ {0,1,2,3,2,2,4,1, 142,3} }, +{ {0,1,2,3,2,2,4,2, 131,10} }, +{ {0,1,2,3,2,2,4,3, 149,39} }, +{ {0,1,2,3,2,2,4,4, 135,4} }, +{ {0,1,2,3,2,2,4,5, 171,2} }, +{ {0,1,2,3,2,3,0,0, 98,4} }, +{ {0,1,2,3,2,3,0,1, 118,13} }, +{ {0,1,2,3,2,3,0,2, 116,27} }, +{ {0,1,2,3,2,3,0,3, 87,22} }, +{ {0,1,2,3,2,3,0,4, 158,13} }, +{ {0,1,2,3,2,3,1,0, 121,13} }, +{ {0,1,2,3,2,3,1,1, 98,5} }, +{ {0,1,2,3,2,3,1,2, 120,4} }, +{ {0,1,2,3,2,3,1,3, 66,22} }, +{ {0,1,2,3,2,3,1,4, 163,13} }, +{ {0,1,2,3,2,3,2,0, 66,27} }, +{ {0,1,2,3,2,3,2,1, 87,27} }, +{ {0,1,2,3,2,3,2,2, 61,4} }, +{ {0,1,2,3,2,3,2,3, 80,27} }, +{ {0,1,2,3,2,3,2,4, 130,27} }, +{ {0,1,2,3,2,3,3,0, 120,5} }, +{ {0,1,2,3,2,3,3,1, 116,22} }, +{ {0,1,2,3,2,3,3,2, 115,5} }, +{ {0,1,2,3,2,3,3,3, 61,5} }, +{ {0,1,2,3,2,3,3,4, 159,5} }, +{ {0,1,2,3,2,3,4,0, 163,8} }, +{ {0,1,2,3,2,3,4,1, 158,8} }, +{ {0,1,2,3,2,3,4,2, 159,4} }, +{ {0,1,2,3,2,3,4,3, 130,22} }, +{ {0,1,2,3,2,3,4,4, 139,4} }, +{ {0,1,2,3,2,3,4,5, 179,13} }, +{ {0,1,2,3,2,4,0,0, 140,25} }, +{ {0,1,2,3,2,4,0,1, 158,26} }, +{ {0,1,2,3,2,4,0,2, 157,27} }, +{ {0,1,2,3,2,4,0,3, 155,38} }, +{ {0,1,2,3,2,4,0,4, 155,31} }, +{ {0,1,2,3,2,4,0,5, 175,40} }, +{ {0,1,2,3,2,4,1,0, 164,40} }, +{ {0,1,2,3,2,4,1,1, 142,25} }, +{ {0,1,2,3,2,4,1,2, 160,27} }, +{ {0,1,2,3,2,4,1,3, 150,22} }, +{ {0,1,2,3,2,4,1,4, 150,37} }, +{ {0,1,2,3,2,4,1,5, 177,40} }, +{ {0,1,2,3,2,4,2,0, 126,27} }, +{ {0,1,2,3,2,4,2,1, 133,27} }, +{ {0,1,2,3,2,4,2,2, 125,27} }, +{ {0,1,2,3,2,4,2,3, 129,27} }, +{ {0,1,2,3,2,4,2,4, 129,46} }, +{ {0,1,2,3,2,4,2,5, 167,27} }, +{ {0,1,2,3,2,4,3,0, 162,45} }, +{ {0,1,2,3,2,4,3,1, 165,45} }, +{ {0,1,2,3,2,4,3,2, 157,44} }, +{ {0,1,2,3,2,4,3,3, 128,24} }, +{ {0,1,2,3,2,4,3,4, 141,30} }, +{ {0,1,2,3,2,4,3,5, 178,45} }, +{ {0,1,2,3,2,4,4,0, 162,28} }, +{ {0,1,2,3,2,4,4,1, 165,28} }, +{ {0,1,2,3,2,4,4,2, 157,29} }, +{ {0,1,2,3,2,4,4,3, 141,39} }, +{ {0,1,2,3,2,4,4,4, 128,5} }, +{ {0,1,2,3,2,4,4,5, 178,28} }, +{ {0,1,2,3,2,4,5,0, 177,27} }, +{ {0,1,2,3,2,4,5,1, 180,40} }, +{ {0,1,2,3,2,4,5,2, 176,27} }, +{ {0,1,2,3,2,4,5,3, 173,39} }, +{ {0,1,2,3,2,4,5,4, 173,30} }, +{ {0,1,2,3,2,4,5,5, 169,25} }, +{ {0,1,2,3,2,4,5,6, 183,40} }, +{ {0,1,2,3,3,0,0,0, 67,30} }, +{ {0,1,2,3,3,0,0,1, 120,2} }, +{ {0,1,2,3,3,0,0,2, 120,28} }, +{ {0,1,2,3,3,0,0,3, 102,22} }, +{ {0,1,2,3,3,0,0,4, 160,33} }, +{ {0,1,2,3,3,0,1,0, 107,36} }, +{ {0,1,2,3,3,0,1,1, 111,5} }, +{ {0,1,2,3,3,0,1,2, 121,20} }, +{ {0,1,2,3,3,0,1,3, 111,22} }, +{ {0,1,2,3,3,0,1,4, 164,20} }, +{ {0,1,2,3,3,0,2,0, 108,44} }, +{ {0,1,2,3,3,0,2,1, 114,26} }, +{ {0,1,2,3,3,0,2,2, 66,25} }, +{ {0,1,2,3,3,0,2,3, 91,44} }, +{ {0,1,2,3,3,0,2,4, 150,44} }, +{ {0,1,2,3,3,0,3,0, 92,30} }, +{ {0,1,2,3,3,0,3,1, 104,28} }, +{ {0,1,2,3,3,0,3,2, 98,29} }, +{ {0,1,2,3,3,0,3,3, 71,4} }, +{ {0,1,2,3,3,0,3,4, 142,47} }, +{ {0,1,2,3,3,0,4,0, 147,36} }, +{ {0,1,2,3,3,0,4,1, 162,43} }, +{ {0,1,2,3,3,0,4,2, 163,20} }, +{ {0,1,2,3,3,0,4,3, 153,22} }, +{ {0,1,2,3,3,0,4,4, 150,25} }, +{ {0,1,2,3,3,0,4,5, 177,20} }, +{ {0,1,2,3,3,1,0,0, 108,9} }, +{ {0,1,2,3,3,1,0,1, 66,9} }, +{ {0,1,2,3,3,1,0,2, 114,43} }, +{ {0,1,2,3,3,1,0,3, 91,9} }, +{ {0,1,2,3,3,1,0,4, 150,9} }, +{ {0,1,2,3,3,1,1,0, 107,9} }, +{ {0,1,2,3,3,1,1,1, 64,36} }, +{ {0,1,2,3,3,1,1,2, 111,9} }, +{ {0,1,2,3,3,1,1,3, 90,9} }, +{ {0,1,2,3,3,1,1,4, 147,9} }, +{ {0,1,2,3,3,1,2,0, 109,9} }, +{ {0,1,2,3,3,1,2,1, 69,36} }, +{ {0,1,2,3,3,1,2,2, 69,25} }, +{ {0,1,2,3,3,1,2,3, 94,9} }, +{ {0,1,2,3,3,1,2,4, 151,43} }, +{ {0,1,2,3,3,1,3,0, 108,42} }, +{ {0,1,2,3,3,1,3,1, 65,36} }, +{ {0,1,2,3,3,1,3,2, 103,29} }, +{ {0,1,2,3,3,1,3,3, 72,24} }, +{ {0,1,2,3,3,1,3,4, 149,9} }, +{ {0,1,2,3,3,1,4,0, 146,43} }, +{ {0,1,2,3,3,1,4,1, 126,9} }, +{ {0,1,2,3,3,1,4,2, 150,43} }, +{ {0,1,2,3,3,1,4,3, 135,9} }, +{ {0,1,2,3,3,1,4,4, 148,9} }, +{ {0,1,2,3,3,1,4,5, 170,43} }, +{ {0,1,2,3,3,2,0,0, 107,25} }, +{ {0,1,2,3,3,2,0,1, 121,26} }, +{ {0,1,2,3,3,2,0,2, 111,30} }, +{ {0,1,2,3,3,2,0,3, 111,39} }, +{ {0,1,2,3,3,2,0,4, 164,41} }, +{ {0,1,2,3,3,2,1,0, 123,0} }, +{ {0,1,2,3,3,2,1,1, 107,5} }, +{ {0,1,2,3,3,2,1,2, 107,30} }, +{ {0,1,2,3,3,2,1,3, 107,39} }, +{ {0,1,2,3,3,2,1,4, 166,0} }, +{ {0,1,2,3,3,2,2,0, 107,44} }, +{ {0,1,2,3,3,2,2,1, 111,44} }, +{ {0,1,2,3,3,2,2,2, 64,25} }, +{ {0,1,2,3,3,2,2,3, 90,44} }, +{ {0,1,2,3,3,2,2,4, 147,44} }, +{ {0,1,2,3,3,2,3,0, 107,29} }, +{ {0,1,2,3,3,2,3,1, 111,29} }, +{ {0,1,2,3,3,2,3,2, 90,30} }, +{ {0,1,2,3,3,2,3,3, 64,4} }, +{ {0,1,2,3,3,2,3,4, 147,29} }, +{ {0,1,2,3,3,2,4,0, 166,20} }, +{ {0,1,2,3,3,2,4,1, 164,9} }, +{ {0,1,2,3,3,2,4,2, 147,30} }, +{ {0,1,2,3,3,2,4,3, 147,39} }, +{ {0,1,2,3,3,2,4,4, 146,25} }, +{ {0,1,2,3,3,2,4,5, 181,0} }, +{ {0,1,2,3,3,3,0,0, 92,5} }, +{ {0,1,2,3,3,3,0,1, 98,3} }, +{ {0,1,2,3,3,3,0,2, 104,11} }, +{ {0,1,2,3,3,3,0,3, 71,31} }, +{ {0,1,2,3,3,3,0,4, 142,2} }, +{ {0,1,2,3,3,3,1,0, 107,10} }, +{ {0,1,2,3,3,3,1,1, 90,5} }, +{ {0,1,2,3,3,3,1,2, 111,10} }, +{ {0,1,2,3,3,3,1,3, 64,31} }, +{ {0,1,2,3,3,3,1,4, 147,10} }, +{ {0,1,2,3,3,3,2,0, 108,27} }, +{ {0,1,2,3,3,3,2,1, 103,10} }, +{ {0,1,2,3,3,3,2,2, 65,25} }, +{ {0,1,2,3,3,3,2,3, 72,37} }, +{ {0,1,2,3,3,3,2,4, 149,44} }, +{ {0,1,2,3,3,3,3,0, 67,11} }, +{ {0,1,2,3,3,3,3,1, 76,11} }, +{ {0,1,2,3,3,3,3,2, 76,28} }, +{ {0,1,2,3,3,3,3,3, 58,30} }, +{ {0,1,2,3,3,3,3,4, 131,11} }, +{ {0,1,2,3,3,3,4,0, 147,3} }, +{ {0,1,2,3,3,3,4,1, 140,3} }, +{ {0,1,2,3,3,3,4,2, 153,10} }, +{ {0,1,2,3,3,3,4,3, 127,37} }, +{ {0,1,2,3,3,3,4,4, 135,5} }, +{ {0,1,2,3,3,3,4,5, 171,3} }, +{ {0,1,2,3,3,4,0,0, 147,25} }, +{ {0,1,2,3,3,4,0,1, 163,26} }, +{ {0,1,2,3,3,4,0,2, 162,26} }, +{ {0,1,2,3,3,4,0,3, 153,39} }, +{ {0,1,2,3,3,4,0,4, 150,36} }, +{ {0,1,2,3,3,4,0,5, 177,41} }, +{ {0,1,2,3,3,4,1,0, 166,41} }, +{ {0,1,2,3,3,4,1,1, 147,5} }, +{ {0,1,2,3,3,4,1,2, 164,44} }, +{ {0,1,2,3,3,4,1,3, 147,22} }, +{ {0,1,2,3,3,4,1,4, 146,36} }, +{ {0,1,2,3,3,4,1,5, 181,19} }, +{ {0,1,2,3,3,4,2,0, 146,26} }, +{ {0,1,2,3,3,4,2,1, 150,26} }, +{ {0,1,2,3,3,4,2,2, 126,44} }, +{ {0,1,2,3,3,4,2,3, 135,44} }, +{ {0,1,2,3,3,4,2,4, 148,44} }, +{ {0,1,2,3,3,4,2,5, 170,26} }, +{ {0,1,2,3,3,4,3,0, 147,46} }, +{ {0,1,2,3,3,4,3,1, 153,29} }, +{ {0,1,2,3,3,4,3,2, 140,46} }, +{ {0,1,2,3,3,4,3,3, 127,24} }, +{ {0,1,2,3,3,4,3,4, 135,30} }, +{ {0,1,2,3,3,4,3,5, 171,46} }, +{ {0,1,2,3,3,4,4,0, 164,30} }, +{ {0,1,2,3,3,4,4,1, 162,30} }, +{ {0,1,2,3,3,4,4,2, 162,5} }, +{ {0,1,2,3,3,4,4,3, 140,22} }, +{ {0,1,2,3,3,4,4,4, 126,30} }, +{ {0,1,2,3,3,4,4,5, 177,30} }, +{ {0,1,2,3,3,4,5,0, 181,43} }, +{ {0,1,2,3,3,4,5,1, 177,9} }, +{ {0,1,2,3,3,4,5,2, 177,44} }, +{ {0,1,2,3,3,4,5,3, 171,22} }, +{ {0,1,2,3,3,4,5,4, 170,36} }, +{ {0,1,2,3,3,4,5,5, 170,25} }, +{ {0,1,2,3,3,4,5,6, 184,0} }, +{ {0,1,2,3,4,0,0,0, 131,30} }, +{ {0,1,2,3,4,0,0,1, 159,2} }, +{ {0,1,2,3,4,0,0,2, 159,28} }, +{ {0,1,2,3,4,0,0,3, 143,22} }, +{ {0,1,2,3,4,0,0,4, 157,11} }, +{ {0,1,2,3,4,0,0,5, 176,33} }, +{ {0,1,2,3,4,0,1,0, 147,31} }, +{ {0,1,2,3,4,0,1,1, 153,5} }, +{ {0,1,2,3,4,0,1,2, 163,7} }, +{ {0,1,2,3,4,0,1,3, 150,38} }, +{ {0,1,2,3,4,0,1,4, 162,10} }, +{ {0,1,2,3,4,0,1,5, 177,33} }, +{ {0,1,2,3,4,0,2,0, 149,27} }, +{ {0,1,2,3,4,0,2,1, 156,45} }, +{ {0,1,2,3,4,0,2,2, 130,25} }, +{ {0,1,2,3,4,0,2,3, 138,38} }, +{ {0,1,2,3,4,0,2,4, 141,27} }, +{ {0,1,2,3,4,0,2,5, 173,27} }, +{ {0,1,2,3,4,0,3,0, 142,37} }, +{ {0,1,2,3,4,0,3,1, 165,23} }, +{ {0,1,2,3,4,0,3,2, 158,7} }, +{ {0,1,2,3,4,0,3,3, 133,39} }, +{ {0,1,2,3,4,0,3,4, 165,10} }, +{ {0,1,2,3,4,0,3,5, 180,20} }, +{ {0,1,2,3,4,0,4,0, 135,28} }, +{ {0,1,2,3,4,0,4,1, 141,28} }, +{ {0,1,2,3,4,0,4,2, 139,28} }, +{ {0,1,2,3,4,0,4,3, 144,28} }, +{ {0,1,2,3,4,0,4,4, 128,29} }, +{ {0,1,2,3,4,0,4,5, 169,47} }, +{ {0,1,2,3,4,0,5,0, 171,36} }, +{ {0,1,2,3,4,0,5,1, 178,9} }, +{ {0,1,2,3,4,0,5,2, 179,20} }, +{ {0,1,2,3,4,0,5,3, 173,23} }, +{ {0,1,2,3,4,0,5,4, 178,10} }, +{ {0,1,2,3,4,0,5,5, 173,4} }, +{ {0,1,2,3,4,0,5,6, 183,20} }, +{ {0,1,2,3,4,1,0,0, 149,42} }, +{ {0,1,2,3,4,1,0,1, 130,9} }, +{ {0,1,2,3,4,1,0,2, 156,8} }, +{ {0,1,2,3,4,1,0,3, 138,23} }, +{ {0,1,2,3,4,1,0,4, 141,42} }, +{ {0,1,2,3,4,1,0,5, 173,42} }, +{ {0,1,2,3,4,1,1,0, 147,42} }, +{ {0,1,2,3,4,1,1,1, 127,36} }, +{ {0,1,2,3,4,1,1,2, 153,9} }, +{ {0,1,2,3,4,1,1,3, 135,22} }, +{ {0,1,2,3,4,1,1,4, 140,42} }, +{ {0,1,2,3,4,1,1,5, 171,42} }, +{ {0,1,2,3,4,1,2,0, 151,8} }, +{ {0,1,2,3,4,1,2,1, 134,36} }, +{ {0,1,2,3,4,1,2,2, 134,25} }, +{ {0,1,2,3,4,1,2,3, 136,23} }, +{ {0,1,2,3,4,1,2,4, 145,42} }, +{ {0,1,2,3,4,1,2,5, 174,43} }, +{ {0,1,2,3,4,1,3,0, 150,42} }, +{ {0,1,2,3,4,1,3,1, 128,36} }, +{ {0,1,2,3,4,1,3,2, 155,8} }, +{ {0,1,2,3,4,1,3,3, 129,39} }, +{ {0,1,2,3,4,1,3,4, 141,9} }, +{ {0,1,2,3,4,1,3,5, 173,9} }, +{ {0,1,2,3,4,1,4,0, 148,42} }, +{ {0,1,2,3,4,1,4,1, 129,36} }, +{ {0,1,2,3,4,1,4,2, 144,29} }, +{ {0,1,2,3,4,1,4,3, 137,9} }, +{ {0,1,2,3,4,1,4,4, 132,29} }, +{ {0,1,2,3,4,1,4,5, 172,42} }, +{ {0,1,2,3,4,1,5,0, 170,8} }, +{ {0,1,2,3,4,1,5,1, 167,9} }, +{ {0,1,2,3,4,1,5,2, 173,8} }, +{ {0,1,2,3,4,1,5,3, 168,8} }, +{ {0,1,2,3,4,1,5,4, 169,42} }, +{ {0,1,2,3,4,1,5,5, 172,9} }, +{ {0,1,2,3,4,1,5,6, 182,43} }, +{ {0,1,2,3,4,2,0,0, 147,4} }, +{ {0,1,2,3,4,2,0,1, 163,23} }, +{ {0,1,2,3,4,2,0,2, 153,30} }, +{ {0,1,2,3,4,2,0,3, 150,23} }, +{ {0,1,2,3,4,2,0,4, 162,29} }, +{ {0,1,2,3,4,2,0,5, 177,12} }, +{ {0,1,2,3,4,2,1,0, 166,23} }, +{ {0,1,2,3,4,2,1,1, 147,24} }, +{ {0,1,2,3,4,2,1,2, 147,37} }, +{ {0,1,2,3,4,2,1,3, 146,23} }, +{ {0,1,2,3,4,2,1,4, 164,29} }, +{ {0,1,2,3,4,2,1,5, 181,32} }, +{ {0,1,2,3,4,2,2,0, 147,27} }, +{ {0,1,2,3,4,2,2,1, 153,44} }, +{ {0,1,2,3,4,2,2,2, 127,25} }, +{ {0,1,2,3,4,2,2,3, 135,39} }, +{ {0,1,2,3,4,2,2,4, 140,27} }, +{ {0,1,2,3,4,2,2,5, 171,27} }, +{ {0,1,2,3,4,2,3,0, 164,39} }, +{ {0,1,2,3,4,2,3,1, 162,23} }, +{ {0,1,2,3,4,2,3,2, 140,37} }, +{ {0,1,2,3,4,2,3,3, 126,39} }, +{ {0,1,2,3,4,2,3,4, 162,4} }, +{ {0,1,2,3,4,2,3,5, 177,39} }, +{ {0,1,2,3,4,2,4,0, 146,47} }, +{ {0,1,2,3,4,2,4,1, 150,47} }, +{ {0,1,2,3,4,2,4,2, 135,29} }, +{ {0,1,2,3,4,2,4,3, 148,39} }, +{ {0,1,2,3,4,2,4,4, 126,29} }, +{ {0,1,2,3,4,2,4,5, 170,47} }, +{ {0,1,2,3,4,2,5,0, 181,14} }, +{ {0,1,2,3,4,2,5,1, 177,34} }, +{ {0,1,2,3,4,2,5,2, 171,37} }, +{ {0,1,2,3,4,2,5,3, 170,23} }, +{ {0,1,2,3,4,2,5,4, 177,29} }, +{ {0,1,2,3,4,2,5,5, 170,24} }, +{ {0,1,2,3,4,2,5,6, 184,21} }, +{ {0,1,2,3,4,3,0,0, 142,24} }, +{ {0,1,2,3,4,3,0,1, 158,23} }, +{ {0,1,2,3,4,3,0,2, 165,38} }, +{ {0,1,2,3,4,3,0,3, 133,22} }, +{ {0,1,2,3,4,3,0,4, 165,29} }, +{ {0,1,2,3,4,3,0,5, 180,35} }, +{ {0,1,2,3,4,3,1,0, 164,22} }, +{ {0,1,2,3,4,3,1,1, 140,24} }, +{ {0,1,2,3,4,3,1,2, 162,38} }, +{ {0,1,2,3,4,3,1,3, 126,22} }, +{ {0,1,2,3,4,3,1,4, 162,31} }, +{ {0,1,2,3,4,3,1,5, 177,22} }, +{ {0,1,2,3,4,3,2,0, 150,27} }, +{ {0,1,2,3,4,3,2,1, 155,45} }, +{ {0,1,2,3,4,3,2,2, 128,25} }, +{ {0,1,2,3,4,3,2,3, 129,22} }, +{ {0,1,2,3,4,3,2,4, 141,44} }, +{ {0,1,2,3,4,3,2,5, 173,44} }, +{ {0,1,2,3,4,3,3,0, 160,22} }, +{ {0,1,2,3,4,3,3,1, 157,22} }, +{ {0,1,2,3,4,3,3,2, 157,39} }, +{ {0,1,2,3,4,3,3,3, 125,22} }, +{ {0,1,2,3,4,3,3,4, 157,30} }, +{ {0,1,2,3,4,3,3,5, 176,22} }, +{ {0,1,2,3,4,3,4,0, 150,46} }, +{ {0,1,2,3,4,3,4,1, 155,29} }, +{ {0,1,2,3,4,3,4,2, 141,29} }, +{ {0,1,2,3,4,3,4,3, 129,37} }, +{ {0,1,2,3,4,3,4,4, 128,4} }, +{ {0,1,2,3,4,3,4,5, 173,29} }, +{ {0,1,2,3,4,3,5,0, 177,35} }, +{ {0,1,2,3,4,3,5,1, 175,35} }, +{ {0,1,2,3,4,3,5,2, 178,22} }, +{ {0,1,2,3,4,3,5,3, 167,22} }, +{ {0,1,2,3,4,3,5,4, 178,31} }, +{ {0,1,2,3,4,3,5,5, 169,24} }, +{ {0,1,2,3,4,3,5,6, 183,35} }, +{ {0,1,2,3,4,4,0,0, 135,11} }, +{ {0,1,2,3,4,4,0,1, 139,2} }, +{ {0,1,2,3,4,4,0,2, 141,11} }, +{ {0,1,2,3,4,4,0,3, 144,11} }, +{ {0,1,2,3,4,4,0,4, 128,10} }, +{ {0,1,2,3,4,4,0,5, 169,2} }, +{ {0,1,2,3,4,4,1,0, 146,2} }, +{ {0,1,2,3,4,4,1,1, 135,10} }, +{ {0,1,2,3,4,4,1,2, 150,2} }, +{ {0,1,2,3,4,4,1,3, 148,22} }, +{ {0,1,2,3,4,4,1,4, 126,10} }, +{ {0,1,2,3,4,4,1,5, 170,2} }, +{ {0,1,2,3,4,4,2,0, 148,27} }, +{ {0,1,2,3,4,4,2,1, 144,10} }, +{ {0,1,2,3,4,4,2,2, 129,25} }, +{ {0,1,2,3,4,4,2,3, 137,44} }, +{ {0,1,2,3,4,4,2,4, 132,10} }, +{ {0,1,2,3,4,4,2,5, 172,27} }, +{ {0,1,2,3,4,4,3,0, 150,3} }, +{ {0,1,2,3,4,4,3,1, 141,10} }, +{ {0,1,2,3,4,4,3,2, 155,10} }, +{ {0,1,2,3,4,4,3,3, 129,24} }, +{ {0,1,2,3,4,4,3,4, 128,31} }, +{ {0,1,2,3,4,4,3,5, 173,10} }, +{ {0,1,2,3,4,4,4,0, 126,11} }, +{ {0,1,2,3,4,4,4,1, 128,11} }, +{ {0,1,2,3,4,4,4,2, 128,28} }, +{ {0,1,2,3,4,4,4,3, 132,11} }, +{ {0,1,2,3,4,4,4,4, 124,11} }, +{ {0,1,2,3,4,4,4,5, 167,11} }, +{ {0,1,2,3,4,4,5,0, 170,3} }, +{ {0,1,2,3,4,4,5,1, 169,3} }, +{ {0,1,2,3,4,4,5,2, 173,11} }, +{ {0,1,2,3,4,4,5,3, 172,22} }, +{ {0,1,2,3,4,4,5,4, 167,10} }, +{ {0,1,2,3,4,4,5,5, 168,11} }, +{ {0,1,2,3,4,4,5,6, 182,2} }, +{ {0,1,2,3,4,5,0,0, 171,25} }, +{ {0,1,2,3,4,5,0,1, 179,26} }, +{ {0,1,2,3,4,5,0,2, 178,44} }, +{ {0,1,2,3,4,5,0,3, 173,38} }, +{ {0,1,2,3,4,5,0,4, 178,29} }, +{ {0,1,2,3,4,5,0,5, 173,31} }, +{ {0,1,2,3,4,5,0,6, 183,41} }, +{ {0,1,2,3,4,5,1,0, 181,17} }, +{ {0,1,2,3,4,5,1,1, 171,24} }, +{ {0,1,2,3,4,5,1,2, 177,7} }, +{ {0,1,2,3,4,5,1,3, 170,38} }, +{ {0,1,2,3,4,5,1,4, 177,10} }, +{ {0,1,2,3,4,5,1,5, 170,37} }, +{ {0,1,2,3,4,5,1,6, 184,40} }, +{ {0,1,2,3,4,5,2,0, 170,45} }, +{ {0,1,2,3,4,5,2,1, 173,45} }, +{ {0,1,2,3,4,5,2,2, 167,44} }, +{ {0,1,2,3,4,5,2,3, 168,45} }, +{ {0,1,2,3,4,5,2,4, 169,27} }, +{ {0,1,2,3,4,5,2,5, 172,44} }, +{ {0,1,2,3,4,5,2,6, 182,26} }, +{ {0,1,2,3,4,5,3,0, 177,6} }, +{ {0,1,2,3,4,5,3,1, 178,39} }, +{ {0,1,2,3,4,5,3,2, 175,6} }, +{ {0,1,2,3,4,5,3,3, 167,39} }, +{ {0,1,2,3,4,5,3,4, 178,4} }, +{ {0,1,2,3,4,5,3,5, 169,37} }, +{ {0,1,2,3,4,5,3,6, 183,6} }, +{ {0,1,2,3,4,5,4,0, 170,46} }, +{ {0,1,2,3,4,5,4,1, 173,28} }, +{ {0,1,2,3,4,5,4,2, 169,46} }, +{ {0,1,2,3,4,5,4,3, 172,39} }, +{ {0,1,2,3,4,5,4,4, 167,29} }, +{ {0,1,2,3,4,5,4,5, 168,28} }, +{ {0,1,2,3,4,5,4,6, 182,47} }, +{ {0,1,2,3,4,5,5,0, 177,11} }, +{ {0,1,2,3,4,5,5,1, 178,30} }, +{ {0,1,2,3,4,5,5,2, 178,5} }, +{ {0,1,2,3,4,5,5,3, 169,22} }, +{ {0,1,2,3,4,5,5,4, 175,11} }, +{ {0,1,2,3,4,5,5,5, 167,30} }, +{ {0,1,2,3,4,5,5,6, 183,11} }, +{ {0,1,2,3,4,5,6,0, 184,35} }, +{ {0,1,2,3,4,5,6,1, 183,34} }, +{ {0,1,2,3,4,5,6,2, 183,7} }, +{ {0,1,2,3,4,5,6,3, 182,23} }, +{ {0,1,2,3,4,5,6,4, 183,10} }, +{ {0,1,2,3,4,5,6,5, 182,36} }, +{ {0,1,2,3,4,5,6,6, 182,25} }, +{ {0,1,2,3,4,5,6,7, 185,0} } +}; + +}//end namespace internal +}//end namespace Mesh_3 +}//end namespace CGAL + +#endif // CGAL_MESH_3_FEATURES_DETECTION_CASES_TABLES_H diff --git a/Mesh_3/include/CGAL/Mesh_3/features_detection/combinations.h b/Mesh_3/include/CGAL/Mesh_3/features_detection/combinations.h new file mode 100644 index 00000000000..a241ed1eade --- /dev/null +++ b/Mesh_3/include/CGAL/Mesh_3/features_detection/combinations.h @@ -0,0 +1,235 @@ +// Copyright (c) 2022 GeometryFactory (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org). +// +// $URL$ +// $Id$ +// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial +// +// +// Author(s) : Sebastien Loriot +// +//****************************************************************************** +// +//****************************************************************************** + + +#ifndef CGAL_MESH_3_FEATURES_DETECTION_COMBINATIONS_H +#define CGAL_MESH_3_FEATURES_DETECTION_COMBINATIONS_H + +#include + +#include + +namespace CGAL +{ +namespace Mesh_3 +{ +namespace internal +{ + const std::array combinations[] + = { + // 1 color + {0,0,0,0,0,0,0,0}, //0 + // 2 colors + {0,0,0,0,0,0,0,1}, //1 + {0,0,0,0,0,0,1,1}, //2 + // 3 colors + {0,0,0,0,0,0,1,2}, //3 + {0,0,0,0,0,1,1,0}, + {0,0,0,0,0,1,1,1}, + {0,0,0,0,0,1,1,2}, + {0,0,0,0,0,1,2,0}, + {0,0,0,0,0,1,2,1}, + {0,0,0,0,1,1,1,1}, + {0,0,0,0,1,1,1,2}, + {0,0,0,0,1,1,2,2}, + {0,0,0,0,1,2,2,1}, + {0,0,0,1,0,1,1,0}, + {0,0,0,1,0,1,1,1}, + {0,0,0,1,0,1,1,2}, + {0,0,0,1,0,1,2,0}, + {0,0,0,1,0,1,2,1}, + {0,0,0,1,0,1,2,2}, + {0,0,0,1,1,0,0,0}, + {0,0,0,1,1,0,0,1}, + {0,0,0,1,1,0,0,2}, + {0,0,0,1,1,0,1,1}, + {0,0,0,1,1,0,1,2}, + {0,0,0,1,1,0,2,2}, + {0,0,0,1,1,1,1,0}, + {0,0,0,1,1,1,1,2}, + {0,0,0,1,1,1,2,0}, + {0,0,0,1,1,1,2,1}, + {0,0,0,1,1,1,2,2}, + {0,0,0,1,1,2,2,0}, + {0,0,0,1,1,2,2,1}, + {0,0,0,1,1,2,2,2}, + {0,0,0,1,2,0,0,0}, + {0,0,0,1,2,0,0,1}, + {0,0,0,1,2,0,0,2}, + {0,0,0,1,2,0,1,2}, + {0,0,0,1,2,0,2,1}, + {0,0,0,1,2,1,1,0}, + {0,0,0,1,2,1,1,2}, + {0,0,0,1,2,1,2,0}, + {0,0,0,1,2,1,2,1}, + {0,0,0,1,2,1,2,2}, + {0,0,0,1,2,2,2,1}, + {0,0,1,1,1,1,0,0}, + {0,0,1,1,1,1,0,2}, + {0,0,1,1,1,1,2,2}, + {0,0,1,1,1,2,0,2}, + {0,0,1,1,1,2,2,0}, + {0,0,1,2,1,2,0,0}, + {0,0,1,2,1,2,0,1}, + {0,0,1,2,1,2,2,1}, + {0,0,1,2,2,1,0,0}, + {0,0,1,2,2,1,0,1}, + {0,1,1,0,1,0,0,1}, + {0,1,1,0,1,0,0,2}, + {0,1,1,0,1,2,2,1}, + {0,1,1,2,1,2,2,0}, //57 + // 4 colors + {0,0,0,0,0,1,2,3}, //58 + {0,0,0,0,1,1,2,3}, + {0,0,0,0,1,2,2,3}, + {0,0,0,1,0,1,2,3}, + {0,0,0,1,0,2,3,0}, + {0,0,0,1,0,2,3,1}, + {0,0,0,1,1,0,2,3}, + {0,0,0,1,1,1,2,3}, + {0,0,0,1,1,2,2,3}, + {0,0,0,1,1,2,3,0}, + {0,0,0,1,1,2,3,1}, + {0,0,0,1,1,2,3,2}, + {0,0,0,1,2,0,0,3}, + {0,0,0,1,2,0,1,3}, + {0,0,0,1,2,0,2,3}, + {0,0,0,1,2,0,3,3}, + {0,0,0,1,2,1,1,3}, + {0,0,0,1,2,1,2,3}, + {0,0,0,1,2,1,3,0}, + {0,0,0,1,2,1,3,1}, + {0,0,0,1,2,1,3,2}, + {0,0,0,1,2,1,3,3}, + {0,0,0,1,2,2,2,3}, + {0,0,0,1,2,2,3,0}, + {0,0,0,1,2,2,3,1}, + {0,0,0,1,2,2,3,2}, + {0,0,0,1,2,2,3,3}, + {0,0,0,1,2,3,3,0}, + {0,0,0,1,2,3,3,1}, + {0,0,0,1,2,3,3,2}, + {0,0,0,1,2,3,3,3}, + {0,0,1,1,1,1,2,3}, + {0,0,1,1,1,2,0,3}, + {0,0,1,1,1,2,2,3}, + {0,0,1,1,1,2,3,0}, + {0,0,1,1,1,2,3,2}, + {0,0,1,1,1,2,3,3}, + {0,0,1,1,2,2,3,3}, + {0,0,1,1,2,3,2,3}, + {0,0,1,1,2,3,3,2}, + {0,0,1,2,1,2,0,3}, + {0,0,1,2,1,2,2,3}, + {0,0,1,2,1,2,3,3}, + {0,0,1,2,1,3,0,0}, + {0,0,1,2,1,3,0,1}, + {0,0,1,2,1,3,0,2}, + {0,0,1,2,1,3,2,0}, + {0,0,1,2,1,3,2,1}, + {0,0,1,2,1,3,2,3}, + {0,0,1,2,2,1,0,3}, + {0,0,1,2,2,1,1,3}, + {0,0,1,2,2,1,3,3}, + {0,0,1,2,2,3,0,0}, + {0,0,1,2,2,3,0,1}, + {0,0,1,2,2,3,0,2}, + {0,0,1,2,2,3,1,3}, + {0,0,1,2,2,3,3,1}, + {0,1,1,0,1,0,2,3}, + {0,1,1,0,1,2,2,3}, + {0,1,1,0,1,2,3,1}, + {0,1,1,0,2,3,3,2}, + {0,1,1,2,1,2,2,3}, + {0,1,1,2,1,2,3,0}, + {0,1,1,2,2,3,3,0}, + {0,1,1,2,3,0,2,3}, + {0,1,2,3,3,2,1,0}, //123 + // 5 colors + {0,0,0,0,1,2,3,4}, //124 + {0,0,0,1,0,2,3,4}, + {0,0,0,1,1,2,3,4}, + {0,0,0,1,2,0,3,4}, + {0,0,0,1,2,1,3,4}, + {0,0,0,1,2,2,3,4}, + {0,0,0,1,2,3,3,4}, + {0,0,0,1,2,3,4,0}, + {0,0,0,1,2,3,4,1}, + {0,0,0,1,2,3,4,2}, + {0,0,0,1,2,3,4,3}, + {0,0,1,1,1,2,3,4}, + {0,0,1,1,2,2,3,4}, + {0,0,1,1,2,3,2,4}, + {0,0,1,1,2,3,3,4}, + {0,0,1,2,1,2,3,4}, + {0,0,1,2,1,3,0,4}, + {0,0,1,2,1,3,2,4}, + {0,0,1,2,1,3,4,0}, + {0,0,1,2,1,3,4,1}, + {0,0,1,2,1,3,4,2}, + {0,0,1,2,1,3,4,4}, + {0,0,1,2,2,1,3,4}, + {0,0,1,2,2,3,0,4}, + {0,0,1,2,2,3,1,4}, + {0,0,1,2,2,3,2,4}, + {0,0,1,2,2,3,3,4}, + {0,0,1,2,2,3,4,4}, + {0,0,1,2,3,4,0,0}, + {0,0,1,2,3,4,0,1}, + {0,0,1,2,3,4,1,4}, + {0,0,1,2,3,4,2,1}, + {0,0,1,2,3,4,2,3}, + {0,1,1,0,1,2,3,4}, + {0,1,1,0,2,3,3,4}, + {0,1,1,2,1,2,3,4}, + {0,1,1,2,1,3,4,0}, + {0,1,1,2,1,3,4,1}, + {0,1,1,2,2,0,3,4}, + {0,1,1,2,2,3,3,4}, + {0,1,1,2,2,3,4,0}, + {0,1,1,2,3,0,2,4}, + {0,1,2,3,3,2,1,4}, //166 + // 6 colors + {0,0,0,1,2,3,4,5}, //167 + {0,0,1,1,2,3,4,5}, + {0,0,1,2,1,3,4,5}, + {0,0,1,2,2,3,4,5}, + {0,0,1,2,3,4,0,5}, + {0,0,1,2,3,4,1,5}, + {0,0,1,2,3,4,2,5}, + {0,0,1,2,3,4,5,5}, + {0,1,1,0,2,3,4,5}, + {0,1,1,2,1,3,4,5}, + {0,1,1,2,2,3,4,5}, + {0,1,1,2,3,0,4,5}, + {0,1,1,2,3,4,4,5}, + {0,1,1,2,3,4,5,3}, + {0,1,2,3,3,2,4,5}, //181 + // 7 colors + {0,0,1,2,3,4,5,6}, //182 + {0,1,1,2,3,4,5,6}, + {0,1,2,3,3,4,5,6}, //184 + // 8 colors + {0,1,2,3,4,5,6,7} //185 + + }; + +}//end namespace internal +}//end namespace Mesh_3 +}//end namespace CGAL + + +#endif // CGAL_MESH_3_FEATURES_DETECTION_COMBINATIONS_H diff --git a/Mesh_3/include/CGAL/Mesh_3/features_detection/coordinates.h b/Mesh_3/include/CGAL/Mesh_3/features_detection/coordinates.h new file mode 100644 index 00000000000..ab08d468423 --- /dev/null +++ b/Mesh_3/include/CGAL/Mesh_3/features_detection/coordinates.h @@ -0,0 +1,62 @@ +// Copyright (c) 2022 GeometryFactory (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org). +// +// $URL$ +// $Id$ +// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial +// +// +// Author(s) : Sebastien Loriot +// +//****************************************************************************** +// +//****************************************************************************** + + +#ifndef CGAL_MESH_3_FEATURES_DETECTION_COORDINATES_H +#define CGAL_MESH_3_FEATURES_DETECTION_COORDINATES_H + +#include + +#include + +namespace CGAL +{ +namespace Mesh_3 +{ +namespace internal +{ + using Coordinates = std::array; + constexpr Coordinates coordinates[8] = { {0, 0, 0}, + {1, 0, 0}, + {0, 1, 0}, + {1, 1, 0}, + {0, 0, 1}, + {1, 0, 1}, + {0, 1, 1}, + {1, 1, 1} }; + + inline Coordinates minus(const Coordinates& b, const Coordinates& a) { + return { b[0] - a[0], b[1] - a[1], b[2] - a[2] }; + } + + inline Coordinates cross(Coordinates a, Coordinates b) { + return { a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0] }; + } + + inline Coordinates square(Coordinates c) { + return { c[0] * c[0], c[1] * c[1], c[2] * c[2] }; + } + + inline int dist(Coordinates a, Coordinates b) { + auto s = square(minus(b, a)); + return s[0] + s[1] + s[2]; + } + +}//end namespace internal +}//end namespace Mesh_3 +}//end namespace CGAL + +#endif // CGAL_MESH_3_FEATURES_DETECTION_COORDINATES_H diff --git a/Mesh_3/include/CGAL/Mesh_3/features_detection/cube_isometries.h b/Mesh_3/include/CGAL/Mesh_3/features_detection/cube_isometries.h new file mode 100644 index 00000000000..f1c76005625 --- /dev/null +++ b/Mesh_3/include/CGAL/Mesh_3/features_detection/cube_isometries.h @@ -0,0 +1,89 @@ +// Copyright (c) 2022 GeometryFactory (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org). +// +// $URL$ +// $Id$ +// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial +// +// +// Author(s) : Sebastien Loriot +// +//****************************************************************************** +// +//****************************************************************************** + +#ifndef CGAL_MESH_3_FEATURES_DETECTION_CUBE_ISOMETRIES_H +#define CGAL_MESH_3_FEATURES_DETECTION_CUBE_ISOMETRIES_H + +#include + +#include + +namespace CGAL +{ +namespace Mesh_3 +{ +namespace internal +{ + using Permutation = std::array; + + constexpr Permutation cube_isometries[] = { + {0,1,2,3,4,5,6,7}, + {1,0,3,2,5,4,7,6}, + {4,5,0,1,6,7,2,3}, + {5,4,1,0,7,6,3,2}, + {6,7,4,5,2,3,0,1}, + {7,6,5,4,3,2,1,0}, + {2,3,6,7,0,1,4,5}, + {3,2,7,6,1,0,5,4}, + {1,5,3,7,0,4,2,6}, + {5,1,7,3,4,0,6,2}, + {5,4,7,6,1,0,3,2}, + {4,5,6,7,0,1,2,3}, + {4,0,6,2,5,1,7,3}, + {0,4,2,6,1,5,3,7}, + {1,3,0,2,5,7,4,6}, + {3,1,2,0,7,5,6,4}, + {3,2,1,0,7,6,5,4}, + {2,3,0,1,6,7,4,5}, + {2,0,3,1,6,4,7,5}, + {0,2,1,3,4,6,5,7}, + {1,0,5,4,3,2,7,6}, + {0,1,4,5,2,3,6,7}, + {7,3,5,1,6,2,4,0}, + {3,7,1,5,2,6,0,4}, + {7,6,3,2,5,4,1,0}, + {6,7,2,3,4,5,0,1}, + {2,6,0,4,3,7,1,5}, + {6,2,4,0,7,3,5,1}, + {4,6,5,7,0,2,1,3}, + {6,4,7,5,2,0,3,1}, + {7,5,6,4,3,1,2,0}, + {5,7,4,6,1,3,0,2}, + {0,4,1,5,2,6,3,7}, + {4,0,5,1,6,2,7,3}, + {3,1,7,5,2,0,6,4}, + {1,3,5,7,0,2,4,6}, + {5,7,1,3,4,6,0,2}, + {7,5,3,1,6,4,2,0}, + {3,7,2,6,1,5,0,4}, + {7,3,6,2,5,1,4,0}, + {0,2,4,6,1,3,5,7}, + {2,0,6,4,3,1,7,5}, + {5,1,4,0,7,3,6,2}, + {1,5,0,4,3,7,2,6}, + {6,2,7,3,4,0,5,1}, + {2,6,3,7,0,4,1,5}, + {6,4,2,0,7,5,3,1}, + {4,6,0,2,5,7,1,3} + }; + + constexpr int num_isometries = 48; + +}//end namespace internal +}//end namespace Mesh_3 +}//end namespace CGAL + +#endif // CGAL_MESH_3_FEATURES_DETECTION_CUBE_ISOMETRIES_H diff --git a/Mesh_3/include/CGAL/Mesh_3/features_detection/features_detection.h b/Mesh_3/include/CGAL/Mesh_3/features_detection/features_detection.h new file mode 100644 index 00000000000..49b637c8b0c --- /dev/null +++ b/Mesh_3/include/CGAL/Mesh_3/features_detection/features_detection.h @@ -0,0 +1,4011 @@ +// Copyright (c) 2022 GeometryFactory (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org). +// +// $URL$ +// $Id$ +// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial +// +// +// Author(s) : Sebastien Loriot, Christopher Nicol +// +//****************************************************************************** +// +//****************************************************************************** + + +#ifndef CGAL_MESH_3_FEATURES_DETECTION_H +#define CGAL_MESH_3_FEATURES_DETECTION_H + +#include + +#include + +#include +#include + +#include +#include //std::sqrt + +namespace CGAL +{ +namespace Mesh_3 +{ + +template +std::vector

create_polyline(const double start, + const double end, + P starting_point, + P ending_point, + Functor f, + const int prec) +{ + using Polyline = std::vector

; + Polyline poly; + poly.reserve(prec + 1); + poly.push_back(std::move(starting_point)); +#ifdef CGAL_DEBUG_TRIPLE_LINES + std::cerr << "new poly\n"; + std::cerr << " poly.push_back(" << poly.back() << "\n"; +#endif // CGAL_DEBUG_TRIPLE_LINES + const double step = (end - start) / prec; + const double stop = end - step / 2; + const bool step_is_positive = (step > 0); + for (double t = start + step; + (step_is_positive ? t < stop : t > stop); + t += step) + { + poly.push_back(f(t)); +#ifdef CGAL_DEBUG_TRIPLE_LINES + std::cerr << " poly.push_back(" << poly.back() << ")\n"; +#endif // CGAL_DEBUG_TRIPLE_LINES + } + poly.push_back(std::move(ending_point)); +#ifdef CGAL_DEBUG_TRIPLE_LINES + std::cerr << " poly.push_back(" << poly.back() << ")\n"; +#endif // CGAL_DEBUG_TRIPLE_LINES + return poly; +} + +template +std::vector

create_polyline(const double start, + const double end, + P starting_point, + Functor f, + const int prec) +{ + return create_polyline(start, end, starting_point, f(end), f, prec); +} + +template +std::vector

create_polyline(const double start, + const double end, + Functor f, + const int prec) +{ + return create_polyline

(start, end, f(start), f(end), f, prec); +} + + +/* + c6 ------- c7 + /| /| + / | / | + / | / | + c4 ------- c5 | + | c2 ----|-- c3 + | / | / + | / | / + |/ |/ + c0 ------- c1 + + ci = color at the corner + + The coordinates of the unit cube are given by: + + for(int z = 0; z <=1 ; ++z) + for(int y = 0; y <=1 ; ++y) + for(int x = 0; x <=1 ; ++x) + cube.emplace_back(x, y, z); +*/ + + +// +// One internal corner +// + + // 00001221 + // corner is (1/2,1/2,2/3) + // curve_1 : x=1/2, y=[0,1/2], z=2/3 + // curve_1' : x=1/2, y=[1/2,1], z=2/3 + // curve_2 : x=[0,1/2], y=1/2, z=2/3 + // curve_2' : x=[1/2,1], y=1/2, z=2/3 + // curve_3 : x=1/2, y=1/2, z=[2/3,1] +template +std::vector> poly00001221(const int /* no sampling for segments */) +{ + P corner{ 1. / 2, 1. / 2, 2. / 3 }; + P a{ 1. / 2, 0, 2. / 3 }; + P b{ 1. / 2, 1, 2. / 3 }; + P c{ 0, 1. / 2, 2. / 3 }; + P d{ 1, 1. / 2, 2. / 3 }; + P e{ 1. / 2, 1. / 2, 1 }; + + return + { + { a, corner}, // segment curve_1 + { corner, b}, // segment curve_1' + { corner, c}, // segment curve_2 + { corner, d}, // segment curve_2' + { corner, e}, // segment curve_3 + }; +} +// 00111202 +// corner is (1/2,1/2,2/3) +// curve_1 : x=1/2,y=[0,1/2],z=2/3 +// curve_1' : x=1/2,y=[1/2,1],z=2/3 +// curve_2 : x=1/(3*z),y=1/2,z=[2/3,1] +// ADDED curve_2' : x=1/(3*z),y=1/2,z=[1/3,2/3] +// curve_3 : x=(2*z−1)/z,y=1/2, z=[1/2,2/3] +// REMOVED curve_3' : x=(2*z−1)/z,y=1/2, z=[2/3,1] +template +std::vector> poly00111202(const int prec = 10) +{ + P a{ 1. / 2, 0. , 2. / 3 }; + P corner{ 1. / 2, 1. / 2, 2. / 3 }; + P b{ 1. / 2, 1. , 2. / 3 }; + + auto f_curve_2 = [](double z) { return P(1. / (3 * z), 1. / 2, z); }; + auto f_curve_3 = [](double z) { return P((2. * z - 1) / z, 1. / 2, z); }; + + return + { + { a, corner}, // segment curve_1 + { corner, b}, // segment curve_1' + create_polyline(2. / 3, 1 , corner, f_curve_2, prec), // curve_2 + create_polyline(2. / 3, 1. / 3, corner, f_curve_2, prec), // curve_2' ADDED + create_polyline(2. / 3, 1. / 2, corner, f_curve_3, prec), // curve_3 + // create_polyline(2./3, 1. , corner, f_curve_3, prec), // curve_3' REMOVED + }; +} + +// 01101001 +// corner is (1/2,1/2,1/2) +// curve_1 : x=1/2, y=1/2, z=[0,1/2] +// curve_1' : x=1/2, y=1/2, z=[1/2,1] +// curve_2 : x=1/2, y=[0,1/2], z=1/2 +// curve_2' : x=1/2, y=[1/2,1], z=1/2 +// curve_3 : x=[0,1/2], y=1/2, z=1/2 +// curve_3' : x=[1/2,1], y=1/2, z=1/2 +template +std::vector> poly01101001(const int /* no sampling for segments */) +{ + P corner{ 1. / 2, 1. / 2, 1. / 2 }; + P a{ 1. / 2, 1. / 2, 0 }; + P b{ 1. / 2, 1. / 2, 1 }; + P c{ 1. / 2, 0, 1. / 2 }; + P d{ 1. / 2, 1, 1. / 2 }; + P e{ 0, 1. / 2, 1. / 2 }; + P f{ 1, 1. / 2, 1. / 2 }; + + return + { + { a, corner}, // segment curve_1 + { corner, b}, // segment curve_1' + { corner, c}, // segment curve_2 + { corner, d}, // segment curve_2' + { corner, e}, // segment curve_3 + { corner, f}, // segment curve_3' + }; +} + +// +// Two curves +// +template +std::vector> poly00011022(const int prec = 10) +{ + // x = (3*z^2-2*z)/(3*z^2-1), y = 1/(3*z), z = [1/3,1/2] + // x = (3*z^2-2*z)/(3*z^2-1), y = 1/(3*z), z = [2/3,1] + auto f = [](double z) {return P(z * (3 * z - 2) / (3 * z * z - 1), + 1 / (3 * z), + z); }; + return { + create_polyline

(1. / 3, 1. / 2, f, prec), + create_polyline

(2. / 3, 1. , f, prec), + }; +} + +// 00011221 +// curve_1 : x = ]1/2,1], y = (3 * x * x - sqrt(9 * x * x * x * x - 30 * x * x * x + 45 * x * x - 24 * x + 4) + 3 * x - 2)/(6 * x * (2 * x - 1)), z = 1./(3*x+3*y-6*x*y) +// point limit x = 1/2, y = 0, z = 2/3 +// curve_2 : x = ]0,1/3], y = (3 * x * x + sqrt(9 * x * x * x * x - 30 * x * x * x + 45 * x * x - 24 * x + 4) + 3 * x - 2)/(6 * x * (2 * x - 1)), z = 1./(3*x+3*y-6*x*y) +// point limit x = 0, y = 1/2, z = 2/3 +template +std::vector> poly00011221(const int prec = 10) +{ + auto sq_exp = [](double x) { + return std::sqrt(9 * x * x * x * x - 30 * x * x * x + 45 * x * x - 24 * x + 4); + }; + auto y1 = [sq_exp](double x) { return (3 * x * x - sq_exp(x) + 3 * x - 2) / (6 * x * (2 * x - 1)); }; + P corner1 = { 1. / 2, 0, 2. / 3 }; + auto y2 = [sq_exp](double x) { return (3 * x * x + sq_exp(x) + 3 * x - 2) / (6 * x * (2 * x - 1)); }; + P corner2 = { 0, 1. / 2, 2. / 3 }; + auto z = [](double x, double y) { return 1. / (3 * x + 3 * y - 6 * x * y); }; + return { + create_polyline(1. / 2, 1, corner1, + [y1, z](double x) { return P(x, y1(x), z(x, y1(x))); }, + prec), + create_polyline(0, 1. / 3, corner2, + [y2, z](double x) { return P(x, y2(x), z(x, y2(x))); }, + prec) + }; +} + +// 00011222 +// curve_1 : x = ]1/2,1[, y = (3 * x * x - sqrt(9 * x * x * x * x - 18 * x * x * x + 25 *x * x - 16 * x + 4) + x - 2)/(6 * (x - 1) * x), z = 1./(3*x+3*y-3*x*y) +// point limit x = 1/2, y = 1, z=1/3 +// point limit x = 1, y = 1/2, z=1/3 +// curve_2 : x = ]0,1/2], y = (3 * x * x + sqrt(9 * x * x * x * x - 18 * x * x * x + 25 *x * x - 16 * x + 4) + x - 2)/(6 * (x - 1) * x), z = 1./(3*x+3*y-3*x*y) +// point limit x = 0, y=1/2, z=2/3 +template +std::vector> poly00011222(const int prec = 10) +{ + auto sq_exp = [](double x) { + return std::sqrt(9 * x * x * x * x - 18 * x * x * x + 25 * x * x - 16 * x + 4); + }; + auto y1 = [sq_exp](double x) { return (3 * x * x - sq_exp(x) + x - 2) / (6 * (x - 1) * x); }; + P corner1 = { 1. / 2, 1, 1. / 3 }; + P corner1_bis = { 1, 1. / 2, 1. / 3 }; + auto y2 = [sq_exp](double x) { return (3 * x * x + sq_exp(x) + x - 2) / (6 * (x - 1) * x); }; + P corner2 = { 0, 1. / 2, 2. / 3 }; + auto z = [](double x, double y) { return 1. / (3 * x + 3 * y - 3 * x * y); }; + return { + create_polyline(1. / 2, 1, corner1, corner1_bis, + [y1, z](double x) { return P(x, y1(x), z(x, y1(x))); }, + prec), + create_polyline(0, 1. / 2, corner2, + [y2, z](double x) { return P(x, y2(x), z(x, y2(x))); }, + prec) + }; +} + +// 00121200 +// curve_1 : x = 1/2, y = (3*z-2)/(6*z-3), z = [0,1/3] +// curve_1' : x = 1/2, y = (3*z-2)/(6*z-3), z = [2/3,1] +template +std::vector> poly00121200(const int prec = 10) +{ + auto y = [](double z) { return (3 * z - 2) / (6 * z - 3); }; + return { + create_polyline

(0, 1. / 3, + [y](double z) { return P(1. / 2, y(z), z); }, + prec), + create_polyline

(2. / 3, 1, + [y](double z) { return P(1. / 2, y(z), z); }, + prec) + }; +} + +// 00121221 +// curve_1 : x = 1/2, y = (3*z-2)/(3*z-3), z = [0,2/3] +// curve_2 : x = 1/2, y = z/(3*z-1), z = [1/2,1] +template +std::vector> poly00121221(const int prec = 10) +{ + auto y1 = [](double z) { return (3 * z - 2) / (3 * z - 3); }; + auto y2 = [](double z) { return z / (3 * z - 1); }; + return { + create_polyline

(0, 2. / 3, + [y1](double z) { return P(1. / 2, y1(z), z); }, + prec), + create_polyline

(1. / 2, 1, + [y2](double z) { return P(1. / 2, y2(z), z); }, + prec) + }; +} + +// 00122100 +// curve_1 : x = 1/2, y = (3*z-2)/(6*z-3), z = [0,1/3] +// curve_1' : x = 1/2, y = (3*z-2)/(6*z-3), z = [2/3,1] +template +std::vector> poly00122100(const int prec = 10) +{ + auto y = [](double z) { return (3 * z - 2) / (6 * z - 3); }; + return { + create_polyline

(0, 1. / 3, + [y](double z) { return P(1. / 2, y(z), z); }, + prec), + create_polyline

(2. / 3, 1, + [y](double z) { return P(1. / 2, y(z), z); }, + prec) + }; +} + +// 00122101 +// curve_1 : x = [1/3,1/2] , y = (-sqrt(24 x^3 - 35 x^2 + 18 x - 3) - 5 x + 3)/(6 (x - 1)^2), x^2 - 3 x + 1!=0, +// z = (-sqrt(24 x^3 - 35 x^2 + 18 x - 3) - 7 x + 3)/(6 (x^2 - 3 x + 1)) +// curve_2 : x = [1./2,1[ , y = ( sqrt(24 x^3 - 35 x^2 + 18 x - 3) - 5 x + 3)/(6 (x - 1)^2), +// z = ( sqrt(24 x^3 - 35 x^2 + 18 x - 3) - 7 x + 3)/(6 (x^2 - 3 x + 1)) +// point limit of curve_2 when x -> 1 x = 1, y = 1/2, z = 1/3 +template +std::vector> poly00122101(const int prec = 10) +{ + auto sq_exp = [](double x) { + return std::sqrt(24 * x * x * x - 35 * x * x + 18 * x - 3); + }; + auto y1 = [sq_exp](double x) + { return (-sq_exp(x) - 5 * x + 3) / (6 * (x - 1) * (x - 1)); }; + auto z1 = [sq_exp](double x) + { return (-sq_exp(x) - 7 * x + 3) / (6 * (x * x - 3 * x + 1)); }; + auto y2 = [sq_exp](double x) + { return (sq_exp(x) - 5 * x + 3) / (6 * (x - 1) * (x - 1)); }; + auto z2 = [sq_exp](double x) + { return (sq_exp(x) - 7 * x + 3) / (6 * (x * x - 3 * x + 1)); }; + P corner{ 1., .5, 1. / 3 }; + return { + create_polyline

(1. / 3, 1. / 2, + [y1, z1](double x) { return P(x, y1(x), z1(x)); }, + prec), + create_polyline

(1., 1. / 2, corner, + [y2, z2](double x) { return P(x, y2(x), z2(x)); }, + prec), + }; +} + +// +// One curve +// +template +std::vector> poly00000012(const int prec = 10) +{ + // curve : x = 1/2, y = 2/(3*z), z = [2/3,1] + return { create_polyline

(2. / 3, 1., + [](double z) { return P(0.5, 2. / (3. * z), z); }, + prec) }; +} + +// 00000112 +// x =[1/2,1], y = x/(3 * x - 1), z = (3 * x - 1)/(3 * x * x) +template +std::vector> poly00000112(const int prec = 10) +{ + return { create_polyline

(1. / 2, 1, + [](double x) { return P(x, x / (3 * x - 1), (3 * x - 1) / (3 * x * x)); }, + prec) }; +} + +// 00000121 +// curve : x = 1/(3*z), y = 1/(3*z-1), z = [2/3,1] +template +std::vector> poly00000121(const int prec = 10) +{ + return { create_polyline

(2. / 3, 1, + [](double z) { return P(1 / (3 * z), 1 / (3 * z - 1), z); }, + prec) }; +} + +// 00001112 +// curve : x = 1/(2*y), y = [1/2, 1],z = 2/3 +template +std::vector> poly00001112(const int prec = 10) +{ + return { create_polyline

(1. / 2, 1, + [](double y) { return P(1 / (2 * y), y, 2. / 3); }, + prec) }; +} + +// 00001122 +// curve : x = [0,1], y = 1/2, z = 2/3 +template +std::vector> poly00001122(const int prec = 10) +{ + return { create_polyline

(0, 1, + [](double x) { return P(x, 1. / 2, 2. / 3); }, + prec) }; +} + +// 00010121 +// curve : x =y * z / (z+y), y = ((3 * z * z - 1) - sqrt(CGAL::square(1 - 3 * z * z) - 12 * (z - 1) * z * z))/(6 * (z - 1) * z), z=[1,1/2[ +// point limit = (1/3, 1/2, 1) +template +std::vector> poly00010121(const int prec = 10) +{ + auto y = [](double z) { return ((3 * z * z - 1) - std::sqrt((1. - 3 * z * z)*(1. - 3 * z * z) - 12 * (z - 1) * z * z)) / (6 * (z - 1) * z); }; + auto x = [](double y, double z) { return y * z / (z + y); }; + P corner(1. / 3, 1. / 2, 1); + return { create_polyline

(1, 1. / 2, corner, + [x, y](double z) { return P(x(y(z), z), y(z), z); }, + prec) }; +} + +// 00010122 +// curve : x = z/(3*z^2-2*z+1), y = 1/(3*z), z = [1/3,1] +template +std::vector> poly00010122(const int prec = 10) +{ + return { create_polyline

(1. / 3, 1, + [](double z) { return P(z / (3 * z * z - 2 * z + 1), 1. / (3 * z), z); }, + prec) }; +} +// 00011002 +// curve : x = (y+1)/(4*y-1), y = [2/3,1], z = 1/2 +template +std::vector> poly00011002(const int prec = 10) +{ + return { create_polyline

(2. / 3, 1, + [](double y) { return P((y + 1) / (4 * y - 1), y, 1. / 2); }, + prec) }; +} +// 00011012 +// curve : x = (3*z^2-2*z+1)/(3*z^2), y = z/(3*z^2-2*z+1), z = [1/2, 1] +template +std::vector> poly00011012(const int prec = 10) +{ + return { create_polyline

(1. / 2, 1, + [](double z) { return P((3 * z * z - 2 * z + 1) / (3 * z * z), z / (3 * z * z - 2 * z + 1), z); }, + prec) }; +} +// 00011110 +// curve : x = 1/(2*y), y = [1/2,1], z = 1/2 +template +std::vector> poly00011110(const int prec = 10) +{ + return { create_polyline

(1. / 2, 1, + [](double y) { return P(1. / (2 * y), y, 1. / 2); }, + prec) }; +} +// 00011120 +// curve : x = (3*z^2-2*z)/(3*z^2-1), y = (3*z^2-1)/(6*z^2-3*z), z = [2/3,1] +template +std::vector> poly00011120(const int prec = 10) +{ + return { create_polyline

(2. / 3, 1, + [](double z) { return P((3 * z * z - 2 * z) / (3 * z * z - 1), (3 * z * z - 1) / (6 * z * z - 3 * z), z); }, + prec) }; +} +// 00011121 +// curve : x = (3*z^2-2*z)/(3*z^2-z-1), y = (3*z^2-z-1)/(3*z^2-3*z), z =[1/2,2./3] +template +std::vector> poly00011121(const int prec = 10) +{ + return { create_polyline

(1. / 2, 2. / 3, + [](double z) { return P((3 * z * z - 2 * z) / (3 * z * z - z - 1), (3 * z * z - z - 1) / (3 * z * z - 3 * z), z); }, + prec) }; +} +// 00011122 +// curve : x = (3*z*z-2*z)/(z-1),y = 1/(3*z),z = [1/3, 2/3] +// +template +std::vector> poly00011122(const int prec = 10) +{ + return { create_polyline

(1. / 3,2. / 3, + [](double z) { return P((3 * z * z - 2 * z) / (z - 1), 1 / (3 * z), z); }, + prec) }; +} + +// 00011220 +// curve : x=[0,1/2], y = (2 * x - 1)/(3 * x - 2), z = (2 * (x^2 - 2 * x + 1))/(5 * x^2 - 7 * x + 3) +template +std::vector> poly00011220(const int prec = 10) +{ + return { create_polyline

(0, 1. / 2, + [](double x) { return P(x, (2 * x - 1) / (3 * x - 2), (2 * (x * x - 2 * x + 1)) / (5 * x * x - 7 * x + 3)); }, + prec) }; +} +// 00012002 +// curve_1 : x = [2/3,1], y = (3 * x*x + sqrt(9 * x*x*x*x - 24 * x*x*x + 30 * x*x - 12 * x + 1) - 1)/(6 * x * (2 * x - 1)), z = 1 - 1./(3*x*y) +template +std::vector> poly00012002(const int prec = 10) +{ + auto y = [](double x) { return (3 * x * x + std::sqrt(9 * x * x * x * x - 24 * x * x * x + 30 * x * x - 12 * x + 1) - 1) / (6 * x * (2 * x - 1)); }; + return { create_polyline

(2. / 3, 1, + [y](double x) { return P(x, y(x), 1 - 1. / (3 * x * y(x))); }, + prec) }; +} +// 00012012 +// curve_1 : x = [0, 1/2[ , y = 1./(-6*x*z+3*x+3*z), z = (3 *x*x + sqrt(9 *x*x*x*x - 18 *x*x*x + 25 *x*x - 16 * x + 4) - 7 * x + 2)/(6 *(x - 1) * (2 * x - 1)) +// curve_1 : x = ]1/2,1[, y = 1./(-6*x*z+3*x+3*z), z = (3 *x*x + sqrt(9 *x*x*x*x - 18 *x*x*x + 25 *x*x - 16 * x + 4) - 7 * x + 2)/(6 *(x - 1) * (2 * x - 1)) +// point limit x = 1, y = 2/3, z = 1/2 +// point limit x = 1/2, y= 2./3, z = 2./3); +// +template +std::vector> poly00012012(const int prec = 10) +{ + auto y = [](double x, double z) { return 1. / (-6 * x * z + 3 * x + 3 * z); }; + auto z = [](double x) { return (3 * x * x + std::sqrt(9 * x * x * x * x - 18 * x * x * x + 25 * x * x - 16 * x + 4) - 7 * x + 2) / (6 * (x - 1) * (2 * x - 1)); }; + P corner1(1. / 2, 2. / 3, 2. / 3); + P corner2(1, 2. / 3, 1. / 2); + return { create_polyline

(1. / 2, 0, corner1, + [y, z](double x) { return P(x, y(x, z(x)), z(x)); }, + prec), + create_polyline

(1. / 2, 1, corner1, corner2, + [y, z](double x) { return P(x, y(x, z(x)), z(x)); }, + prec) + }; +} +// 00012021 +// curve : x = (3*z-1)/(3*z), y = z/(3*z-1), z = [1/2,1] +template +std::vector> poly00012021(const int prec = 10) +{ + return { create_polyline

(1. / 2, 1, + [](double z) { return P((3 * z - 1) / (3 * z), z / (3 * z - 1), z); }, + prec) }; +} +// 00012110 +// curve : x=]0,1/2], y = (3 * x * x + sqrt(9 * x * x * x * x - 18 * x * x * x + 25 * x * x - 16 * x + 4) + x - 2)/(6 * (x - 1) * x), z = (3*x*y-1)/(9*x*y-3*x-3*y) +// point limit : x = 0, y = 1/2, z = 2/3 +// +template +std::vector> poly00012110(const int prec = 10) +{ + auto y = [](double x) { return (3 * x * x + std::sqrt(9 * x * x * x * x - 18 * x * x * x + 25 * x * x - 16 * x + 4) + x - 2) / (6 * (x - 1) * x); }; + auto z = [](double x, double y) { return (3 * x * y - 1) / (9 * x * y - 3 * x - 3 * y); }; + P corner(0, 1. / 2, 2. / 3); + return { create_polyline

(0, 1. / 2, corner, + [y, z](double x) { return P(x, y(x), z(x, y(x))); }, + prec) }; +} +// 00012112 +// x = ]0,1/2[, y = (3 * x*x + sqrt(9 * x * x * x * x - 36 * x * x * x + 40 * x * x - 20 * x + 4) + 2 * x - 2)/(6 * x * (2 * x - 1)), z = (3*x*y-1)/(9*x*y-3*x-3*y) +// point limit x = 0, y = 1/2, z = 2/3 +// point limit x = 1/2, y = 0, z = 2/3 +// +template +std::vector> poly00012112(const int prec = 10) +{ + auto y = [](double x) { return (3 * x * x + std::sqrt(9 * x * x * x * x - 36 * x * x * x + 40 * x * x - 20 * x + 4) + 2 * x - 2) / (6 * x * (2 * x - 1)); }; + auto z = [](double x, double y) { return (3 * x * y - 1) / (9 * x * y - 3 * x - 3 * y); }; + P corner1(0, 1. / 2, 2. / 3); + P corner2(1. / 2, 0, 2. / 3); + return { create_polyline

(0, 1. / 2, corner1, corner2, + [y, z](double x) { return P(x, y(x), z(x, y(x))); }, + prec) }; +} + +// 00012120 +// curve : x = (3*z-1)/(3*z), y = (3*z^2-2*z)/(6*z^2-5*z+1), z = [2/3,1] +template +std::vector> poly00012120(const int prec = 10) +{ + return { create_polyline

(2. / 3, 1, + [](double z) { return P((3 * z - 1) / (3 * z), (3 * z * z - 2 * z) / (6 * z * z - 5 * z + 1), z); }, + prec)}; +} +// +// 00012121 +// curve : x = (3*z-1)/(3*z), y = (3*z^2-2*z)/(3*z^2-4*z+1), z = [1/2,2/3] +template +std::vector> poly00012121(const int prec = 10) +{ + return { create_polyline

(1. / 2, 2. / 3, + [](double z) { return P((3 * z - 1) / (3 * z), (3 * z * z - 2 * z) / (3 * z * z - 4 * z + 1), z); }, + prec) }; +} +// 00012122 +// curve : x = (6*z^2-6*z+1)/(3*z^2-3*z), y = (3*z^2-2*z)/(6*z^2-6*z+1), z = [1/3,2/3] +template +std::vector> poly00012122(const int prec = 10) +{ + auto x = [](double z) { return (6 * z * z - 6 * z + 1) / (3 * z * z - 3 * z); }; + auto y = [](double z) { return (3 * z * z - 2 * z) / (6 * z * z - 6 * z + 1); }; + return { create_polyline

(1. / 3, 2. / 3, + [x,y](double z) { return P(x(z), y(z), z); }, + prec) }; +} +// 00012221 +// curve : x = 1/(3*y),y = [1/3,1],z = 1/2 +template +std::vector> poly00012221(const int prec = 10) +{ + return { create_polyline

(1. / 3, 1, + [](double y) { return P(1. / (3 * y),y , 1. / 2); }, + prec) }; +} + +// 00111100 +// curve : x = [0,1], y = 1/2, z = 1/2 +template +std::vector> poly00111100(const int prec = 10) +{ + return { create_polyline

(0, 1, + [](double x) { return P(x , 1. / 2, 1. / 2); }, + prec) }; +} + +// 00111102 +// curve : x = (2*z-1)/(3*z^2-z), y = (3*z-1)/(6*z-3), z = [2/3,1] +template +std::vector> poly00111102(const int prec = 10) +{ + return { create_polyline

(2. / 3, 1, + [](double z) { return P((2 * z - 1) / (3 * z * z - z), (3 * z - 1) / (6 * z - 3), z); }, + prec) }; +} + +// 00111220 +// segment 1/2 0 2/3 1/2 1 2/3 +template +std::vector> poly00111220(const int /*not needed for a segment*/) +{ + return { { P(1. / 2, 0, 2. / 3), P(1. / 2, 1, 2. / 3) } }; +} + +// 00121201 +// curve_1 : x =[1/2, 2/3], y = (-sqrt(-24 * x^3 + 37 * x^2 - 20 * x + 4) + 5 * x - 2)/(6 * x^2), z = ( sqrt(-24 * x^3 + 37 * x^2 - 20 * x + 4) + 5 * x - 2)/(6 * x^2) +// curve_2 : x =[1/2, 2/3], y = ( sqrt(-24 * x^3 + 37 * x^2 - 20 * x + 4) + 5 * x - 2)/(6 * x^2), z = (-sqrt(-24 * x^3 + 37 * x^2 - 20 * x + 4) + 5 * x - 2)/(6 * x^2) +// point 0 1/2 1/2 +template +std::vector> poly00121201(const int prec = 10) +{ + auto sq_exp = [](double x) { + return std::sqrt(-24 * x * x * x + 37 * x * x - 20 * x + 4); + }; + auto y = [sq_exp](double x) { return (-sq_exp(x) + 5 * x - 2) / (6 * x * x); }; + auto z = [sq_exp](double x) { return (sq_exp(x) + 5 * x - 2) / (6 * x * x); }; + P corner{ 2. / 3, y(2. / 3), z(2. / 3) }; + return { + create_polyline

(2. / 3, 1. / 2, corner, + [y, z](double x) { return P(x, y(x), z(x)); }, + prec), + create_polyline

(2. / 3, 1. / 2, corner, + [y, z](double x) { return P(x, z(x), y(x)); }, + prec), + // { P(0., .5, .5), P(0., .5, .5) } + }; +} + + +inline double limit_value(double bound, double direction, double epsilon=1e-6) +{ + return bound + direction * epsilon; +} + +// 00000123 +// curve 1 : x =1/2, y = -(z-2.)/(2.*z), z = [2/3, 1] +// curve 2 : x = -(z/2.-1)/z, y = 1./2., z =[2/3, 1] +template +std::vector> poly00000123(const int prec = 10) +{ + return { + create_polyline(2./3, 1., P(1./2, 1, 2./3), + [](double z) { return P( 1./2, -(z-2.)/(2.*z), z); }, + prec), + create_polyline(2./3, 1., P(1, 1./2, 2./3), + [](double z) { return P(-(z-2.)/(2.*z), 1./2, z); }, + prec), +}; +} + + +//00001123 +// curve 1 : x = (3*z - 2)/(2*z - 1), y = (2*z - 1)/z, z = [2/3, 3/4] +// curve 2 : x = -(z - 1)/(2*z - 1), y = (2*z - 1)/z, z = [2/3, 3/4] +// curve 3 : x =1/2, y = -2*(z - 1)/z, z = [2/3, 3/4] +// curve 4 : x = 1/2, y = 2/3, z = [3/4,1] +template +std::vector> poly00001123(const int prec = 10) +{ +return { + create_polyline(2./3, 3./4, P(0, 1./2, 2./3), + [](double z) { return P( (3*z - 2)/(2*z - 1), (2*z - 1)/z, z); }, + prec), + create_polyline(2./3, 3./4, P(1, 1./2, 2./3), + [](double z) { return P( -(z - 1)/(2*z - 1),(2*z - 1)/z, z); }, + prec), + create_polyline(2./3, 3./4, P(1./2, 1, 2./3), + [](double z) { return P( 1./2,-2*(z - 1)/z, z); }, + prec), + create_polyline(3./4, 1., P(1./2, 2./3, 3./4),P(1./2,2./3.,1.), + [](double z) { return P( 1./2,2./3, z); }, + prec), +}; +} + +//00001223 + +// curve 1 : x = -(z*(-sqrt((z - 1)*(13*z - 9))/(2*z) + (5*z - 3)/(2*z)) - 5*z + 3)/z, y = -sqrt((z - 1)*(13*z - 9))/(2*z) + (5*z - 3)/(2*z), z = [2/3, 9/13] +// curve 2 : x = -(z*(sqrt((z - 1)*(13*z - 9))/(2*z) + (5*z - 3)/(2*z)) - 5*z + 3)/z, y = sqrt((z - 1)*(13*z - 9))/(2*z) + (5*z - 3)/(2*z), z = [2/3, 9/13] +// curve 3 : x = -(z*(-sqrt((z - 1)*(13*z - 9))/(2*z) - 3*(z - 1)/(2*z)) + 3*z - 3)/z, y = -sqrt((z - 1)*(13*z - 9))/(2*z) - 3*(z - 1)/(2*z), z = [2/3, 9/13] +// curve 4 : x = -(z*(sqrt((z - 1)*(13*z - 9))/(2*z) - 3*(z - 1)/(2*z)) + 3*z - 3)/z, y = sqrt((z - 1)*(13*z - 9))/(2*z) - 3*(z - 1)/(2*z), z = [2/3, 9/13] +template +std::vector> poly00001223(const int prec = 10) +{ +return { + create_polyline(2./3, 9./13, P(1./2, 0., 2./3), + [](double z) { return P( -(z*(-std::sqrt((z - 1)*(13*z - 9))/(2*z) + (5*z - 3)/(2*z)) - 5*z + 3)/z, -std::sqrt((z - 1)*(13*z - 9))/(2*z) + (5*z - 3)/(2*z), z); }, + prec), + create_polyline(2./3, 9./13, P(0., 1./2, 2./3), + [](double z) { return P( -(z*(std::sqrt((z - 1)*(13*z - 9))/(2*z) + (5*z - 3)/(2*z)) - 5*z + 3)/z, std::sqrt((z - 1)*(13*z - 9))/(2*z) + (5*z - 3)/(2*z), z); }, + prec), + create_polyline(2./3, 9./13, P(1., 1./2, 2./3), + [](double z) { return P(-(z*(-std::sqrt((z - 1)*(13*z - 9))/(2*z) - 3*(z - 1)/(2*z)) + 3*z - 3)/z, -std::sqrt((z - 1)*(13*z - 9))/(2*z) - 3*(z - 1)/(2*z), z); }, + prec), + create_polyline(2./3, 9./13, P(1./2, 1., 2./3), + [](double z) { return P( -(z*(std::sqrt((z - 1)*(13*z - 9))/(2*z) - 3*(z - 1)/(2*z)) + 3*z - 3)/z, std::sqrt((z - 1)*(13*z - 9))/(2*z) - 3*(z - 1)/(2*z), z); }, + prec), +}; +} + +//00010123 +// curve 1 : x = -(3*z - 1)*(z*z /(3*z - 1) - 1)/(2*z*z), y = z/(3*z - 1), z = [1/2,1] +// curve 2 : x = 1./2, y = -(z - 2)/(z + 1), z = [1/2,1] +template +std::vector> poly00010123(const int prec = 10) +{ +return { + create_polyline(1./2, 1., P(1./2, 1., 1./2), + [](double z) { return P(-(3*z - 1)*(z*z /(3*z - 1) - 1)/(2*z*z), z/(3*z - 1),z); }, + prec), + create_polyline(1./2, 1., P(1./2, 1., 1./2), + [](double z) { return P( 1./2 , -(z - 2)/(z + 1),z); }, + prec), + +}; +} + +//00010230 +// no curves +template +std::vector> poly00010230(const int /*prec*/ = 10) +{ +return { + + +}; +} + +//00010231 +// curve 1 : x = (z + 1)*(z**2/(z + 1) - 1)/(z*(z - 3)), y = z/(z + 1), z = [1/2,1] +// curve 2 : x = (z + 1 + (z**2 - 3*z)*(z**2 - z - 1)/(z*(z - 3)))/(z*(z + 1)), y = (z**2 - z - 1)/(z*(z - 3)), z = [1/2,1] +template +std::vector> poly00010231(const int prec = 10) +{ +return { + create_polyline(1./2, 1., P(1., 1./3, 1./2), + [](double z) { return P((z + 1)*(z*z/(z + 1) - 1)/(z*(z - 3)), z/(z + 1),z); }, + prec), + create_polyline(1./2, 1., P(1./3, 1., 1./2), + [](double z) { return P((z + 1 + (z*z - 3*z)*(z*z - z - 1)/(z*(z - 3)))/(z*(z + 1)), (z*z - z - 1)/(z*(z - 3)),z); }, + prec), + +}; +} + +//00011023 + +// curve 1 : x = -(-2*z**2 + z + (z**2 - 3*z)*(-(z**2 + z + 1)/(2*z*(z - 3)) + sqrt(z**4 + 6*z**3 - 9*z**2 + 2*z + 1)/(2*z*(z - 3))) + 1)/(2*z**2), y = -(z**2 + z + 1)/(2*z*(z - 3)) + sqrt(z**4 + 6*z**3 - 9*z**2 + 2*z + 1)/(2*z*(z - 3)), z = [2/3,1] +// curve 2 : x = 1/2, y = -(z - 2)/(z + 1), z = [1/2,1] +// curve 3 : x = [1/2,1[, y = (sqrt(8*x*x*x - 3*x*x - 2*x + 1) + x + 1)/(2*x*(2*x + 1)), z = (sqrt(8*x*x*x - 3*x*x - 2*x + 1) - x - 1)/(2*(2*x*x - x - 1))) +template +std::vector> poly00011023(const int prec = 10) +{ +return { + create_polyline(2./3, 1., P(0, 1./2, 2./3), + [](double z) { return P(-(-2*z*z + z + (z*z - 3*z)*(-(z*z + z + 1)/(2*z*(z - 3)) + std::sqrt(z*z*z*z + 6*z*z*z - 9*z*z + 2*z + 1)/(2*z*(z - 3))) + 1)/(2*z*z) , -(z*z + z + 1)/(2*z*(z - 3)) + std::sqrt(z*z*z*z + 6*z*z*z - 9*z*z + 2*z + 1)/(2*z*(z - 3)) ,z); }, + prec), + create_polyline(1./2, 1., P(1./2, 1., 1./2), + [](double z) { return P(1./2,-(z - 2)/(z + 1) ,z); }, + prec), + create_polyline(1./2, limit_value(1.,-1.), P(1./2, 1.,1./2), + [](double x) { return P(x, (std::sqrt(8*x*x*x - 3*x*x - 2*x + 1) + x + 1)/(2*x*(2*x + 1)) ,(std::sqrt(8*x*x*x - 3*x*x - 2*x + 1) - x - 1)/(2*(2*x*x - x - 1)) ); }, + prec), + + +}; +} + +//00011123 +// curve 1 : x = z*(3*z - 2)/(2*z*z - 1), y = (2*z*z - 1)/(z*(4*z - 3)), z = [1/2.2/3] +// curve 2 : x = 1./2, y = [2/3,1], z = y/(2*(-1 + 2*y)) +// problem with close polylines, there is an over refinement +template +std::vector> poly00011123(const int prec = 10) +{ +return { + create_polyline(1./2, 2./3, P(1./2, 1., 1./2),P(0., 1./2, 2./3), + [](double z) { return P(z*(3*z - 2)/(2*z*z - 1) , (2*z*z - 1)/(z*(4*z - 3)) ,z); }, + prec), + create_polyline( 2./3,1., P(1./2, 2./3, 1.),P(1./2, 1., 1./2), + [](double y) { return P(1./2,y,y/(2*(-1 + 2*y))); }, + prec) +}; +} + +//00011223 +// curve 1 : x = [1/2,3/5[U ]3/5,1], y = (-2 + 2*x + 3*x*x - sqrt(4 - 20*x + 36*x*x - 28*x*x*x + 9*x*x*x*x))/(2*x*(-3 + 5*x)), z = (2 - 2*x + 3*x*x - sqrt(4 - 20*x + 36*x*x - 28*x*x*x + 9*x*x*x*x))/(2*(3 - 5*x + 4*x*x)) +// curve 2 : x = ]0,1/2], y = (-2 + 2*x + 3*x*x + sqrt(4 - 20*x + 36*x*x - 28*x*x*x + 9*x*x*x*x))/(2*x*(-3 + 5*x)), z = (2 - 2*x + 3*x*x + sqrt(4 - 20*x + 36*x*x - 28*x*x*x + 9*x*x*x*x))/(2*(3 - 5*x + 4*x*x)) +// curve 3 : x = -(-3*z + (4*z - 1)*(3*z/(2*(4*z - 1)) + sqrt(-z*(7*z - 4))/(2*(4*z - 1))))/(4*z - 1), y = 3*z/(2*(4*z - 1)) + sqrt(-z*(7*z - 4))/(2*(4*z - 1)), z = [1/2,4/7] +// curve 4 : x = -(-3*z + (4*z - 1)*(3*z/(2*(4*z - 1)) - sqrt(-z*(7*z - 4))/(2*(4*z - 1))))/(4*z - 1), y = 3*z/(2*(4*z - 1)) - sqrt(-z*(7*z - 4))/(2*(4*z - 1)), z = [1/2,4/7] +// problem with close polylines, there is an over refinement +template +std::vector> poly00011223(const int prec = 10) +{ +return { + create_polyline( 1./2,4./7, P(1./2, 1., 1./2),P(2./3, 2./3, 4./7), + [](double z) { return P(-(-3*z + (4*z - 1)*(3*z/(2*(4*z - 1)) + std::sqrt(-z*(7*z - 4))/(2*(4*z - 1))))/(4*z - 1),3*z/(2*(4*z - 1)) + std::sqrt(-z*(7*z - 4))/(2*(4*z - 1)),z); }, + prec), + create_polyline( 1./2,4./7, P(1., 1./2, 1./2),P(2./3, 2./3, 4./7), + [](double z) { return P(-(-3*z + (4*z - 1)*(3*z/(2*(4*z - 1)) - std::sqrt(-z*(7*z - 4))/(2*(4*z - 1))))/(4*z - 1),3*z/(2*(4*z - 1)) - std::sqrt(-z*(7*z - 4))/(2*(4*z - 1)),z); }, + prec), + create_polyline( 1./2,limit_value(3./5,-1.), P(1./2, 1., 1./2),P(3./5,5./7,5./9), + [](double x) { return P(x,(-2. + 2*x + 3*x*x - std::sqrt(4 - 20*x + 36*x*x - 28*x*x*x + 9*x*x*x*x))/(2*x*(-3 + 5*x)),(2. - 2*x + 3*x*x - std::sqrt(4 - 20*x + 36*x*x - 28*x*x*x + 9*x*x*x*x))/(2*(3 - 5*x + 4*x*x)) ); }, + prec), + create_polyline(limit_value(3./5,1.),1.,P(3./5,5./7,5./9),P(1., 1./2, 1./2), + [](double x) { return P(x,(-2. + 2*x + 3*x*x - std::sqrt(4 - 20*x + 36*x*x - 28*x*x*x + 9*x*x*x*x))/(2*x*(-3 + 5*x)),(2. - 2*x + 3*x*x - std::sqrt(4 - 20*x + 36*x*x - 28*x*x*x + 9*x*x*x*x))/(2*(3 - 5*x + 4*x*x)) ); }, + prec), + create_polyline( limit_value(0.,1.), 1./2, P(0., 1./2, 2./3),P(1./2, 0., 2./3), + [](double x) { return P(x,(-2. + 2*x + 3*x*x + std::sqrt(4 - 20*x + 36*x*x - 28*x*x*x + 9*x*x*x*x))/(2*x*(-3 + 5*x)),(2. - 2*x + 3*x*x + std::sqrt(4 - 20*x + 36*x*x - 28*x*x*x + 9*x*x*x*x))/(2*(3 - 5*x + 4*x*x)) ); }, + prec), +}; +} +//00011230 +//curve 1 : x = -(-4*z*z + z + (3*z*z - z)*((5*z*z - z - 1)/(2*z*(3*z - 1)) - sqrt(-11*z*z*z*z + 26*z*z*z - 17*z*z + 2*z + 1)/(2*z*(3*z - 1))) + 1)/(z*(5*z - 3)), y = (5*z*z - z - 1)/(2*z*(3*z - 1)) - sqrt(-11*z*z*z*z + 26*z*z*z - 17*z*z + 2*z + 1)/(2*z*(3*z - 1)), z = [2/3,1] +//curve 2 : x = ]0,1/2], y = (-2 + x + x*x + sqrt(4 - 16*x + 25*x*x - 14*x*x*x + x*x*x*x))/(2*x*(-3 + 4*x)), z = (2 - x + x*x + sqrt(4 - 16*x + 25*x*x - 14*x*x*x + x*x*x*x))/(2*(3 - 5*x + 3*x*x)) +template +std::vector> poly00011230(const int prec = 10) +{ +return { + create_polyline(2./3, 1., P(1./2, 0.,2./3), P(1./2,1./2,1.), + [](double z) { return P(-(-4*z*z + z + (3*z*z - z)*((5*z*z - z - 1)/(2*z*(3*z - 1)) - std::sqrt(-11*z*z*z*z + 26*z*z*z - 17*z*z + 2*z + 1)/(2*z*(3*z - 1))) + 1)/(z*(5*z - 3)),(5*z*z - z - 1)/(2*z*(3*z - 1)) - std::sqrt(-11*z*z*z*z + 26*z*z*z - 17*z*z + 2*z + 1)/(2*z*(3*z - 1)),z ); }, + prec), + create_polyline(limit_value(0.,1.), 1./2, P(0., 1./2,2./3), P(1./2,1./2,1.), + [](double x) { return P(x,(-2 + x + x*x + std::sqrt(4 - 16*x + 25*x*x - 14*x*x*x + x*x*x*x))/(2*x*(-3 + 4*x)),(2 - x + x*x + std::sqrt(4 - 16*x + 25*x*x - 14*x*x*x + x*x*x*x))/(2*(3 - 5*x + 3*x*x))); }, + prec), + +}; +} + +//00011231 +//curve 1 : x = [1/2,1], y = (-1 + 2*x + 3*x*x - sqrt(1 - 8*x + 22*x*x - 20*x*x*x + 9*x*x*x*x))/(2*x*(-1 + 4*x)), z = (1 - 2*x + 3*x*x - sqrt(1 - 8*x + 22*x*x - 20*x*x*x + 9*x*x*x*x))/(2*(1 - 3*x + 2*x*x)) +//curve 2 : x = [0,1/3], y = (-2 + 2*x + x*x + sqrt(4 - 20*x + 28*x*x - 12*x*x*x + x*x*x*x))/(2*x*(-3 + 4*x)), z = (2 - 2*x + x*x + sqrt(4 - 20*x + 28*x*x - 12*x*x*x + x*x*x*x))/(2*(3 - 5*x + 2*x*x)) +template +std::vector> poly00011231(const int prec = 10) +{ +return { + create_polyline(1./2, 1., P(1./2, 0.,2./3), P(1.,1./3,1./2), + [](double x) { return P(x,(-1 + 2*x + 3*x*x - std::sqrt(1 - 8*x + 22*x*x - 20*x*x*x + 9*x*x*x*x))/(2*x*(-1 + 4*x)),(1 - 2*x + 3*x*x - std::sqrt(1 - 8*x + 22*x*x - 20*x*x*x + 9*x*x*x*x))/(2*(1 - 3*x + 2*x*x)) ); }, + prec), + create_polyline(0., 1./3, P(0.,1./2,2./3), P(1./3,1.,1./2), + [](double x) { return P(x,(-2 + 2*x + x*x + std::sqrt(4 - 20*x + 28*x*x - 12*x*x*x + x*x*x*x))/(2*x*(-3 + 4*x)) ,(2 - 2*x + x*x + std::sqrt(4 - 20*x + 28*x*x - 12*x*x*x + x*x*x*x))/(2*(3 - 5*x + 2*x*x)) ); }, + prec), +}; +} + +//00011232 +//curve 1 : x = [1/2,1[, y = (-1 + 3*x*x - sqrt(1 - 4*x + 6*x*x - 8*x*x*x + 9*x*x*x*x))/(2*(-1 + x)*x), z = (1 + 3*x*x - sqrt(1 - 4*x + 6*x*x - 8*x*x*x + 9*x*x*x*x))/(2*(1 + 2*x*x)) +//curve 2 : x = [0.366025,1./2], y = (-1 + 3*x*x + sqrt(1 - 4*x + 6*x*x - 8*x*x*x + 9*x*x*x*x))/(2*(-1 + x)*x), z = (1 + 3*x*x + sqrt(1 - 4*x + 6*x*x - 8*x*x*x + 9*x*x*x*x))/(2*(1 + 2*x*x)) +//curve 3 : x = -(-3.*z*z + z + (3*z*z - 3*z)*((2*z + 1)/(6*z) - sqrt(-8*z*z + 4*z + 1)/(6*z)) + 1)/(z*(2*z - 1)), y = (2*z + 1)/(6*z) - sqrt(-8.*z*z + 4*z + 1)/(6*z), z = [2./3,(1+1.73205)/4] +//curve 4 : x = [0.366025,1./2], y = -x/(-1 + x), z = (-1 + x + x*x)/(-1 + 2*x*x) +//curve 5 : x = [1./3,0.366025], y = -x/(-1 + x), z = -(x*x)/(1 - 4*x + 2*x*x) +template +std::vector> poly00011232(const int prec = 10) +{ +return { + create_polyline(1./2,limit_value(1.,-1.), P(1./2, 1.,1./2), P(1.,1./2,1./3), + [](double x) { return P(x,(-1 + 3*x*x - std::sqrt(1 - 4*x + 6*x*x - 8*x*x*x + 9*x*x*x*x))/(2*(-1 + x)*x),(1 + 3*x*x - std::sqrt(1 - 4*x + 6*x*x - 8*x*x*x + 9*x*x*x*x))/(2*(1 + 2*x*x)) ); }, + prec), + create_polyline(0.366025,1./2, P(0.366025,0.57735,(1+1.73205)/4), P(1./2,0.,2./3), + [](double x) { return P(x,(-1 + 3*x*x + std::sqrt(1 - 4*x + 6*x*x - 8*x*x*x + 9*x*x*x*x))/(2*(-1 + x)*x),(1 + 3*x*x + std::sqrt(1 - 4*x + 6*x*x - 8*x*x*x + 9*x*x*x*x))/(2*(1 + 2*x*x)) ); }, + prec), + create_polyline(2./3,(1+1.73205)/4.,P(0.,1./2,2./3),P(0.366025,0.57735,(1+1.73205)/4), + [](double z) { return P( -(-3.*z*z + z + (3*z*z - 3*z)*((2*z + 1)/(6*z) - std::sqrt(-8*z*z + 4*z + 1)/(6*z)) + 1)/(z*(2*z - 1)),(2*z + 1)/(6*z) - std::sqrt(-8.*z*z + 4*z + 1)/(6*z),z); }, + prec), + create_polyline(0.366025,1./2,P(0.366025,0.57735,(1+1.73205)/4),P(1./2,1.,1./2), + [](double x) { return P( x,-x/(-1 + x),(-1 + x + x*x)/(-1 + 2*x*x)); }, + prec), + create_polyline(1./3,0.366025,P(1./3,1./2,1.),P(0.366025,0.57735,(1+1.73205)/4), + [](double x) { return P( x,-x/(-1 + x),-(x*x)/(1 - 4*x + 2*x*x)); }, + prec), +}; +} + +//00012003 +// curve 1 : x = [2/3,1], y = (1 + x)/(-1 + 4*x), z = 1/2 +template +std::vector> poly00012003(const int prec = 10) +{ +return { + create_polyline(2./3, 1., P(2./3, 1.,1./2), P(1.,2./3,1./2), + [](double x) { return P(x,(1 + x)/(-1 + 4*x) ,1./2); }, + prec), + +}; +} + +//00012013 +// curve 1 : x = -(-5*z*z + 6*z + (z*z - 3*z)*((2*z*z - 6*z + 1)/(2*z*(z - 3)) + sqrt(4*z*z*z*z - 20*z*z*z + 28*z*z - 12*z + 1)/(2*z*(z - 3))) - 1)/(z*(5*z - 3)), y = (2*z*z - 6*z + 1)/(2*z*(z - 3)) + sqrt(4*z*z*z*z - 20*z*z*z + 28*z*z - 12*z + 1)/(2*z*(z - 3)), z = [2/3,1] +// curve 2 : x = (3*z*z - 4*z + 1 - (z*z + z)*(2*z*z - 4*z + 1)/(z*(z + 1)))/(z*(3*z - 1)), y = -(2*z*z - 4*z + 1)/(z*(z + 1)), z = [1/2,1] +template +std::vector> poly00012013(const int prec = 10) +{ +return { + create_polyline(2./3, 1., P(0., 1./2,2./3), P(1./2,1./2,1.), + [](double z) { return P(-(-5*z*z + 6*z + (z*z - 3*z)*((2*z*z - 6*z + 1)/(2*z*(z - 3)) + std::sqrt(4*z*z*z*z - 20*z*z*z + 28*z*z - 12*z + 1)/(2*z*(z - 3))) - 1)/(z*(5*z - 3)), (2*z*z - 6*z + 1)/(2*z*(z - 3)) + std::sqrt(4*z*z*z*z - 20*z*z*z + 28*z*z - 12*z + 1)/(2*z*(z - 3)) ,z ); }, + prec), + create_polyline(1./2, 1., P(1., 2./3,1./2), P(1./2,1./2,1.), + [](double z) { return P( (3*z*z - 4*z + 1 - (z*z + z)*(2*z*z - 4*z + 1)/(z*(z + 1)))/(z*(3*z - 1)), -(2*z*z - 4*z + 1)/(z*(z + 1)),z ); }, + prec), + +}; +} + +//00012023 +// curve 1 : x = 2*z/(2*z + 1), y = 1/(2*z), z = [1/2,1] +// curve 2 : x = [1/2,1], y = (x+1)/(3*x), z = 1/2 +// problem with close polylines, there is an over refinement +template +std::vector> poly00012023(const int prec = 10) +{ +return { + create_polyline(1./2, 1., P(1./2, 1.,1./2), + [](double z) { return P(2*z/(2*z + 1),1/(2*z) ,z ); }, + prec), + create_polyline(1./2, 1., P(1./2, 1.,1./2), + [](double x) { return P(x,(x+1)/(3*x) ,1./2 ); }, + prec), + +}; +} + +//00012033 +// curve 1 : x = ((z*z - 2*z + 1 - (z*z - 2*z)*(2*z*z - 2*z + 1)/(z*(z - 2)))/(z*(z - 1)) , y = -(2*z*z - 2*z + 1)/(z*(z - 2)), z = [1/3,1/2] +// curve 2 : x = (z + (z + 2)*((z + 1)/(z + 2) - sqrt(z*z + z - 1)/(z + 2)) - 2)/(z - 1), y = (z + 1)/(z + 2) - sqrt(z*z + z - 1)/(z + 2), z = [2/3,1[ +template +std::vector> poly00012033(const int prec = 10) +{ +return { + create_polyline(1./3, 1./2, P(1./2, 1.,1./3), P(1., 2./3,1./2), + [](double z) { return P((z*z - 2*z + 1 - (z*z - 2*z)*(2*z*z - 2*z + 1)/(z*(z - 2)))/(z*(z - 1)) ,-(2*z*z - 2*z + 1)/(z*(z - 2)) ,z ); }, + prec), +create_polyline(2./3,limit_value(1.,-1.), P(0., 1./2,2./3), P(1./2, 1./3,1.), + [](double z) { return P((z + (z + 2)*((z + 1)/(z + 2) - std::sqrt(z*z + z - 1)/(z + 2)) - 2)/(z - 1) ,(z + 1)/(z + 2) - std::sqrt(z*z + z - 1)/(z + 2) ,z ); }, + prec), +}; +} + +//00012113 +// curve 1 : x = -(-8*z*z + 7*z + (4*z*z - 3*z)*(-(z - 1.)*sqrt(16*z*z - 12*z + 1)/(2*z*(4*z - 3)) + (8*z*z - 7*z + 1)/(2*z*(4*z - 3))) - 1)/(z*(4*z - 3)), y = -(z - 1)*sqrt(16*z*z - 12*z + 1)/(2*z*(4*z - 3)) + (8*z*z - 7*z + 1)/(2*z*(4*z - 3)), z = [(3.+ 2.23606)/8, 2./3] +// curve 2 : x = -(-8*z*z + 7*z + (4*z*z - 3*z)*((z - 1)*sqrt(16*z*z - 12*z + 1)/(2*z*(4*z - 3)) + (8*z*z - 7*z + 1)/(2*z*(4*z - 3))) - 1)/(z*(4*z - 3)), y = (z - 1)*sqrt(16*z*z - 12*z + 1)/(2*z*(4*z - 3)) + (8*z*z - 7*z + 1)/(2*z*(4*z - 3)), z = [(3.+ 2.23606)/8, 2./3] +template +std::vector> poly00012113(const int prec = 10) +{ +return { + create_polyline((3.+ 2.23606)/8, 2./3,P(0.30902,0.30902,(3.+ 2.23606)/8), + [](double z) { return P(-(-8*z*z + 7*z + (4*z*z - 3*z)*(-(z - 1.)*std::sqrt(16*z*z - 12*z + 1)/(2*z*(4*z - 3)) + (8*z*z - 7*z + 1)/(2*z*(4*z - 3))) - 1)/(z*(4*z - 3)), -(z - 1)*std::sqrt(16*z*z - 12*z + 1)/(2*z*(4*z - 3)) + (8*z*z - 7*z + 1)/(2*z*(4*z - 3)),z); }, + prec), + create_polyline((3.+ 2.23606)/8, 2./3,P(0.30902,0.30902,(3.+ 2.23606)/8), + [](double z) { return P( -(-8*z*z + 7*z + (4*z*z - 3*z)*((z - 1)*std::sqrt(16*z*z - 12*z + 1)/(2*z*(4*z - 3)) + (8*z*z - 7*z + 1)/(2*z*(4*z - 3))) - 1)/(z*(4*z - 3)),(z - 1)*std::sqrt(16*z*z - 12*z + 1)/(2*z*(4*z - 3)) + (8*z*z - 7*z + 1)/(2*z*(4*z - 3)),z); }, + prec), + +}; +} + +//00012123 +// curve 1 : x = (5*z*z - 5*z + 1)/(z*(4*z - 3)), y = z*(3*z - 2)/(5*z*z - 5*z + 1), z = [1/2,2/3] +// curve 2 : x = [1/2,2/3], y = (1-x)/x, z = (x-1)/(4*x-3) +template +std::vector> poly00012123(const int prec = 10) +{ +return { + create_polyline(1./2, 2./3, P(1./2, 1.,1./2), + [](double z) { return P((5*z*z - 5*z + 1)/(z*(4*z - 3)), z*(3*z - 2)/(5*z*z - 5*z + 1) ,z ); }, + prec), + create_polyline(1./2, 2./3, P(1./2, 1.,1./2), + [](double x) { return P(x, (1-x)/x ,(x-1)/(4*x-3) ); }, + prec), +}; +} + +//00012130 +// curve 1 : x = -(2 - 3*z)/(3*z - 1), y = 1./2, z = [2/3,1] +//curve 2 : x = -(-7*z*z + 6*z + (4*z*z - 2*z)*(-sqrt((2*z - 1)*(8*z*z*z - 16*z*z + 10*z - 1))/(4*z*(2*z - 1)) + (4*z - 1)/(4*z)) - 1)/(z*(5*z - 3)), y = -sqrt((2*z - 1)*(8*z*z*z - 16*z*z + 10*z - 1))/(4*z*(2*z - 1)) + (4*z - 1)/(4*z), z = [2/3,1] +template +std::vector> poly00012130(const int prec = 10) +{ +return { + create_polyline(2/3., 1., P(1./2, 0.,2./3),P(1./2,1./2,1.), + [](double z) { return P(-(-7*z*z + 6*z + (4*z*z - 2*z)*(-std::sqrt((2*z - 1)*(8*z*z*z - 16*z*z + 10*z - 1))/(4*z*(2*z - 1)) + (4*z - 1)/(4*z)) - 1)/(z*(5*z - 3)), -std::sqrt((2*z - 1)*(8*z*z*z - 16*z*z + 10*z - 1))/(4*z*(2*z - 1)) + (4*z - 1)/(4*z),z); }, + prec), +create_polyline(2/3., 1., P(0.,1./2,2./3),P(1./2,1./2,1.), + [](double z) { return P(-(2 - 3*z)/(3*z - 1),1./2,z); }, + prec), +}; +} + +//00012131 +// curve 1 : x = [0., (2. - 1.4142)/2], y = 1./2, z = (-2 + x)/(-3 + 2*x) +// curve 2 : x = [((2. - 1.4142)/2.,1./3], y = 1./2, z = -x/(-1 + 2*x) +// curve 3 : x = (z - 1)*(2*z*((z*z + z - 1)/(4*z*(z - 1)) - sqrt(9*z*z*z*z - 14*z*z*z + 7*z*z - 2*z + 1)/(4*z*(z - 1))) - 1)/(z*(2*z - 1)), y = (z*z + z - 1)/(4*z*(z - 1)) - sqrt(9*z*z*z*z - 14*z*z*z + 7*z*z - 2*z + 1)/(4*z*(z - 1)), z =[1./2, 1./1.4142] +// curve 4 : x = [(2. - 1.4142)/2, 1./2[, y = (-1 - x + 3*x*x + sqrt(1 - 6*x + 19*x*x - 22*x*x*x + 9*x*x*x*x))/(4*(-1 + x)*x), z = (1. - 5*x + 3*x*x + sqrt(1 - 6*x + 19*x*x - 22*x*x*x + 9*x*x*x*x))/(2*(1 - 3*x + 2*x*x)) +template +std::vector> poly00012131(const int prec = 10) +{ +return { + create_polyline(0., (2. - 1.4142)/2, P(0., 1./2,2./3),P((2. - 1.4142)/2,1./2,1./1.4142), + [](double x) { return P(x,1./2,(-2 + x)/(-3 + 2*x)); }, + prec), + create_polyline((2. - 1.4142)/2.,1./3,P((2. - 1.4142)/2,1./2,1./1.4142), P(1./3, 1./2,1.), + [](double x) { return P(x,1./2,-x/(-1 + 2*x) ); }, + prec), + create_polyline(1./2, 1./1.4142, P(1./3, 1.,1./2),P((2. - 1.4142)/2,1./2,1./1.4142), + [](double z) { return P((z - 1)*(2*z*((z*z + z - 1)/(4*z*(z - 1)) - std::sqrt(9*z*z*z*z - 14*z*z*z + 7*z*z - 2*z + 1)/(4*z*(z - 1))) - 1)/(z*(2*z - 1)),(z*z + z - 1)/(4*z*(z - 1)) - std::sqrt(9*z*z*z*z - 14*z*z*z + 7*z*z - 2*z + 1)/(4*z*(z - 1)) ,z); }, + prec), + create_polyline((2. - 1.4142)/2,limit_value(1./2,-1.),P((2. - 1.4142)/2,1./2,1./1.4142), P(1./2,0. ,2./3), + [](double x) { return P(x,(-1 - x + 3*x*x + std::sqrt(1 - 6*x + 19*x*x - 22*x*x*x + 9*x*x*x*x))/(4*(-1 + x)*x),(1. - 5*x + 3*x*x + std::sqrt(1 - 6*x + 19*x*x - 22*x*x*x + 9*x*x*x*x))/(2*(1 - 3*x + 2*x*x))); }, + prec), +}; +} + +//00012132 +// curve 1 : x = -(-7*z*z + 7*z + (3*z*z - 2*z)*(sqrt((z - 1)*(2*z - 1)*(14*z*z - 11*z + 1))/(2*z*(3*z - 2)) + (8*z*z - 7*z + 1)/(2*z*(3*z - 2))) - 1)/(z*(2*z - 3)), y = sqrt((z - 1)*(2*z - 1)*(14*z*z - 11*z + 1))/(2*z*(3*z - 2))+ (8*z*z - 7*z + 1)/(2*z*(3*z - 2)), z = [1/2,2/3[ +// curve 2 : x = -(-5*z + (z - 2)*(-sqrt((z - 1)*(3*z - 2))/(z - 2) + 2*(z - 1)/(z - 2)) + 4)/(2*z - 1), y = -sqrt((z - 1)*(3*z - 2))/(z - 2) + 2*(z - 1)/(z - 2), z = [1/2,2/3] +template +std::vector> poly00012132(const int prec = 10) +{ +return { + create_polyline(1./2, limit_value(2./3,-1.), P(1./2, 1.,1./2),P(1./2,0.,2./3), + [](double z) { return P(-(-7*z*z + 7*z + (3*z*z - 2*z)*(std::sqrt((z - 1)*(2*z - 1)*(14*z*z - 11*z + 1))/(2*z*(3*z - 2)) + (8*z*z - 7*z + 1)/(2*z*(3*z - 2))) - 1)/(z*(2*z - 3)),std::sqrt((z - 1)*(2*z - 1)*(14*z*z - 11*z + 1))/(2*z*(3*z - 2))+ (8*z*z - 7*z + 1)/(2*z*(3*z - 2)),z); }, + prec), + create_polyline(1./2, (2./3), P(1./2, 1.,1./2),P(0.,1./2,2./3), + [](double z) { return P(-(-5*z + (z - 2)*(-std::sqrt((z - 1)*(3*z - 2))/(z - 2) + 2*(z - 1)/(z - 2)) + 4)/(2*z - 1),-std::sqrt((z - 1)*(3*z - 2))/(z - 2) + 2*(z - 1)/(z - 2),z); }, + prec), +}; +} + +//00012133 +// curve 1 : x = -(-6*z*z + 6*z + (3*z*z - 2*z)*((z - 1)*sqrt(13*z*z - 10*z + 1)/(2*z*(3*z - 2)) + (7*z*z - 6*z + 1)/(2*z*(3*z - 2))) - 1)/(3*z*(z - 1)), y = (z - 1)*sqrt(13*z*z - 10*z + 1)/(2*z*(3*z - 2)) + (7*z*z - 6*z + 1)/(2*z*(3*z - 2)), z = [2./3,0.70263] +// curve 2 : x = (2*z*z - 3*z + (3*z*z - 2*z)*(-(z*z - 3*z + 1)/(2*z*(3*z - 2)) - sqrt(13*z*z*z*z - 26*z*z*z + 19*z*z - 6*z + 1)/(2*z*(3*z - 2))) + 1)/(z*(z - 1)), y = -(z*z - 3*z + 1)/(2*z*(3*z - 2)) - sqrt(13*z*z*z*z - 26*z*z*z + 19*z*z - 6*z + 1)/(2*z*(3*z - 2)), z = [1./3,0.70263] +// curve 3 : x = [0,0.447683], y = (-1 + x)/(-2 + x), z = (2 - 2*x + x*x)/(3 - 3*x + x*x) +//curve 4 : x = -(-2*z + (5*z - 2)*((5*z - 1)/(2*(5*z - 2)) - sqrt(5*z*z - 2*z + 1)/(2*(5*z - 2))) + 1)/(z - 1), y = (5*z - 1)/(2*(5*z - 2)) - sqrt(5*z*z - 2*z + 1)/(2*(5*z - 2)), z = [0.70263,1] +template +std::vector> poly00012133(const int prec = 10) +{ +return { + create_polyline(2./3,0.70263, P(1./2, 0.,2./3),P(0.447683,0.3555809, 0.70263), + [](double z) { return P(-(-6*z*z + 6*z + (3*z*z - 2*z)*((z - 1)*std::sqrt(13*z*z - 10*z + 1)/(2*z*(3*z - 2)) + (7*z*z - 6*z + 1)/(2*z*(3*z - 2))) - 1)/(3*z*(z - 1)),(z - 1)*std::sqrt(13*z*z - 10*z + 1)/(2*z*(3*z - 2)) + (7*z*z - 6*z + 1)/(2*z*(3*z - 2)),z); }, + prec), + create_polyline(1./3, 0.70263, P(1./2, 1.,1./3),P(0.447683,0.3555809, 0.70263), + [](double z) { return P((2*z*z - 3*z + (3*z*z - 2*z)*(-(z*z - 3*z + 1)/(2*z*(3*z - 2)) - std::sqrt(13*z*z*z*z - 26*z*z*z + 19*z*z - 6*z + 1)/(2*z*(3*z - 2))) + 1)/(z*(z - 1)), -(z*z - 3*z + 1)/(2*z*(3*z - 2)) - std::sqrt(13*z*z*z*z - 26*z*z*z + 19*z*z - 6*z + 1)/(2*z*(3*z - 2)),z); }, + prec), + create_polyline(0.,0.447683, P(0.,1./2,2./3),P(0.447683,0.3555809, 0.70263), + [](double x) { return P(x,(-1 + x)/(-2 + x),(2 - 2*x + x*x)/(3 - 3*x + x*x) ); }, + prec), + create_polyline(0.70263,1.,P(0.447683,0.3555809, 0.70263),P(1./2,1./3,1.), + [](double z) { return P(-(-2*z + (5*z - 2)*((5*z - 1)/(2*(5*z - 2)) - std::sqrt(5*z*z - 2*z + 1)/(2*(5*z - 2))) + 1)/(z - 1),(5*z - 1)/(2*(5*z - 2)) - std::sqrt(5*z*z - 2*z + 1)/(2*(5*z - 2)),z); }, + prec), +}; +} + +//00012223 +// curve 1 : x = 1/2y, y = [1/2,1], z = 1/2 +template +std::vector> poly00012223(const int prec = 10) +{ +return { + create_polyline(1./2, 1., P(1., 1./2,1./2), + [](double y) { return P( 1/(2*y) ,y,1./2); }, + prec), + +}; +} + +//00012230 +// curve 1 : x = (3*z - 2)/(2*(2*z - 1)), y = 2*(2*z - 1)/(5*z - 2), z =[2/3,1] +template +std::vector> poly00012230(const int prec = 10) +{ +return { + create_polyline(2./3, 1., P(0., 1./2,2./3), + [](double z) { return P((3*z - 2)/(2*(2*z - 1)),2*(2*z - 1)/(5*z - 2),z); }, + prec), + +}; +} + +//00012231 +// curve 1 : x = z*(z - 1)/(z**2 - 3*z + 1), y = (z**2 - 3*z + 1)/(z*(z - 2)), z=[1/2,2/3] +// curve 2 : x = z/(z + 1), y = (z - 1)*(z + 1)/(z*(z - 2)), z = [1/2,2/3] +// curve 3 : x = [2/5,1/2], y = 1/(2-x), z = x/(1-x) +// curve 4 : x = [0,2/5], y = 1/(2-x), z = 2./3 +template +std::vector> poly00012231(const int prec = 10) +{ +return { + create_polyline(1./2, 2./3, P(1., 1./3,1./2), + [](double z) { return P(z*(z - 1)/(z*z - 3*z + 1),(z*z - 3*z + 1)/(z*(z - 2)),z); }, + prec), + create_polyline(1./2, 2./3, P(1./3, 1.,1./2), + [](double z) { return P(z/(z + 1),(z - 1)*(z + 1)/(z*(z - 2)),z); }, + prec), + create_polyline(2./5,1./2, P(2./5, 5./8,2./3), + [](double x) { return P(x,1/(2-x),x/(1-x)); }, + prec), + create_polyline(0.,2./5., P(0.,1./2,2./3), + [](double x) { return P(x,1/(2-x),2./3); }, + prec), + +}; +} + +//00012232 +// curve 1 : x = z/(4*z - 1), y = (4*z - 1)/(2*z), z =[1/3,1/2] +// curve 2 : x = (3*z - 2)/(4*z - 3), y = (4*z - 3)/(2*(z - 1)), z= [1/2,2/3] +template +std::vector> poly00012232(const int prec = 10) +{ +return { + create_polyline(1./3,1./2., P(1.,1./2,1./3), + [](double z) { return P(z/(4*z - 1),(4*z - 1)/(2*z),z); }, + prec), + create_polyline(1./2,2./3., P(1./2,1.,1./2), + [](double z) { return P((3*z - 2)/(4*z - 3),(4*z - 3)/(2*(z - 1)),z); }, + prec), + +}; +} + +//00012233 +// curve 1 : x = -z/(z-1), y = -(z - 1)/(2*z), z = [1/3,1/2] +//curve 2 : x = (3*z - 2)/(z - 1), y = 1/2, z = [1/2,2/3] +template +std::vector> poly00012233(const int prec = 10) +{ +return { + create_polyline(1./3,1./2, P(1./2,1.,1./3), + [](double z) { return P(-z/(z - 1),-(z - 1)/(2*z),z); }, + prec), + create_polyline(1./2,2./3, P(1.,1./2.,1./2), + [](double z) { return P((3*z - 2)/(z - 1),1./2,z); }, + prec), + + + +}; +} + +//00012330 +// curve 1 : x = [0,1/2], y = (-1 + 2*x)/(-2 + 3*x), z = (2*(1 - 2*x + x*x))/(3 - 7*x + 5*x*x) +template +std::vector> poly00012330(const int prec = 10) +{ +return { + create_polyline(0.,1./2, P(0.,1./2.,2./3), P(1./2,0.,2./3), + [](double x) { return P(x,(-1 + 2*x)/(-2 + 3*x),(2*(1 - 2*x + x*x))/(3 - 7*x + 5*x*x)); }, + prec), + +}; +} + +//00012331 +// curve 1 : x = [1/3,1[, y = (-1 + 3*x + 2*x*x - sqrt(1 - 6*x + 13*x*x - 8*x*x*x + 4*x*x*x*x))/(2*x*(-2 + 5*x)), z = (1 - x + 2*x*x - sqrt(1 - 6*x + 13*x*x - 8*x*x*x + 4*x*x*x*x))/(2*(-1 + x)*(-1+x))) +// curve 2 : x = [0,1/2], y = (-1 + 2*x)/(-2 + 3*x), z = 2./3 +template +std::vector> poly00012331(const int prec = 10) +{ +return { + create_polyline(0.,1./2, P(0.,1./2,2./3),P(1./2,0.,2./3), + [](double x) { return P(x,(-1 + 2*x)/(-2 + 3*x),2./3); }, + prec), + create_polyline(1./3,limit_value(1.,-1.), P(1./3,1.,1./2),P(1.,1./3,1./2), + [](double x) { return P(x,(-1 + 3*x + 2*x*x - std::sqrt(1 - 6*x + 13*x*x - 8*x*x*x + 4*x*x*x*x))/(2*x*(-2 + 5*x)) ,(1 - x + 2*x*x - std::sqrt(1 - 6*x + 13*x*x - 8*x*x*x + 4*x*x*x*x))/(2*(-1 + x)*(-1+x))); }, + prec), +}; +} + +//00012332 +//curve 1 : x = -(4 - 6*z)/(2*(z - 1)), y = 1./2, z = [1/2,2/3] +//curve 2 : x = -(-7*z + 5 + (2*z - 2)*(3*z - 2)/(z - 1))/(2*(z - 1)), y = (3*z - 2)/(z - 1), z = [1/2,2/3] +//curve 3 : x = -(2*z*((5*z - 1)/(4*z) - sqrt(17*z*z - 10*z + 1)/(4*z)) - 5*z + 1)/(2*z), y = (5*z - 1)/(4*z) - sqrt(17*z*z - 10*z + 1)/(4*z), z = [1./2, 2.*1.4142/17 + 5./17] +//curve 4 : x = -(2*z*((5*z - 1)/(4*z) + sqrt(17*z*z - 10*z + 1)/(4*z)) - 5*z + 1)/(2*z), y = (5*z - 1)/(4*z) + sqrt(17*z*z - 10*z + 1)/(4*z), z = [1./2, 2.*1.4142/17 + 5./17] +//curve 5 : x = y = 1/2, z = [3/5,1] +template +std::vector> poly00012332(const int prec = 10) +{ +return { + create_polyline(1./2,3./5, P(1.,1./2.,1./2),P(1./2,1./2.,3./5), + [](double z) { return P( -(4 - 6*z)/(2*(z - 1)),1./2,z); }, + prec), + create_polyline(3./5,2./3, P(1./2,1./2.,3./5), + [](double z) { return P( -(4 - 6*z)/(2*(z - 1)),1./2,z); }, + prec), + create_polyline(1./2,3./5, P(1./2,1.,1./2),P(1./2,1./2.,3./5), + [](double z) { return P(-(-7*z + 5 + (2*z - 2)*(3*z - 2)/(z - 1))/(2*(z - 1)),(3*z - 2)/(z - 1),z); }, + prec), + create_polyline(3./5,2./3, P(1./2,1./2,3./5), + [](double z) { return P(-(-7*z + 5 + (2*z - 2)*(3*z - 2)/(z - 1))/(2*(z - 1)),(3*z - 2)/(z - 1),z); }, + prec), + create_polyline(1./2, 2.*1.4142/17 + 5./17, P(1.,1./2.,1./2), + [](double z) { return P( -(2*z*((5*z - 1)/(4*z) - std::sqrt(17*z*z - 10*z + 1)/(4*z)) - 5*z + 1)/(2*z),(5*z - 1)/(4*z) - std::sqrt(17*z*z - 10*z + 1)/(4*z),z); }, + prec), + create_polyline(1./2,2.*1.4142/17 + 5./17, P(1./2,1.,1./2), + [](double z) { return P( -(2*z*((5*z - 1)/(4*z) + std::sqrt(17*z*z - 10*z + 1)/(4*z)) - 5*z + 1)/(2*z),(5*z - 1)/(4*z) + std::sqrt(17*z*z - 10*z + 1)/(4*z),z); }, + prec), + create_polyline(3./5,1., P(1./2.,1./2,3./5),P(1./2,1./2.,1.), + [](double z) { return P(1./2,1./2,z); }, + prec), +}; +} + +//00012333 +// curve 1 : x = [1/2,1], y = 1./(2*x), z = x/(2.*x*x+1) +// curve 2 : x= [0,1/2], y = (2*x-1)/(2*x-2), z = (2 - 3*x + 2*x*x)/(3 - 4*x + 2*x*x) +template +std::vector> poly00012333(const int prec = 10) +{ +return { + create_polyline(1./2,1., P(1./2,1.,1./3), + [](double x) { return P(x,1./(2*x),x/(2.*x*x+1)); }, + prec), + create_polyline(0.,1./2, P(0.,1./2,2./3), + [](double x) { return P(x,(2*x-1)/(2*x-2),(2 - 3*x + 2*x*x)/(3 - 4*x + 2*x*x)); }, + prec), +}; +} + +//00111123 +//curve 1 : x = 1/2, y =[2/3,1], z = (2*y)/(5*y-2) +template +std::vector> poly00111123(const int prec = 10) +{ +return { + create_polyline(2./3,1., P(1./2,2./3,1.), + [](double y) { return P(1./2,y,(2*y)/(5*y-2)); }, + prec), + +}; +} + +//00111203 +// curve 1 : x = [1/2,1], y = 1./2, z = 1./(2*x) +// curve 2 : x = [1/2,2/3], y = (2*x-1.)/x, z = 1./(2.-x) +// curve 3 : x = [1/2,2/3], y = (-x+1.)/x, z = 1./(2.-x) +// curve 4 : x = [0,2/3], y = 1./2, z= 1./(2.-x) +template +std::vector> poly00111203(const int prec = 10) +{ +return { + create_polyline(2./3,1., P(2./3,1./2,3./4),P(1.,1./2,1./2), + [](double x) { return P(x,1./2,1./(2*x)); }, + prec), + create_polyline(1./2,2./3, P(1./2,1./2,1.),P(2./3,1./2,3./4), + [](double x) { return P(x,1./2,1./(2*x)); }, + prec), + create_polyline(1./2,2./3, P(1./2,0.,2./3),P(2./3,1./2,3./4), + [](double x) { return P(x,(2*x-1.)/x,1./(2.-x)); }, + prec), + create_polyline(1./2,2./3, P(1./2,1.,2./3),P(2./3,1./2,3./4), + [](double x) { return P(x,(-x+1.)/x,1./(2.-x)); }, + prec), + create_polyline(0.,2./3, P(0.,1./2,1./2),P(2./3,1./2,3./4), + [](double x) { return P(x,1./2,1./(2.-x)); }, + prec), + +}; +} + +//00111223 +// curve 1 : x = -(-5*z + (6*z - 5)*(sqrt(-(z - 1)*(2*z - 1))/(6*z - 5) + (4*z - 3)/(6*z - 5)) + 3)/z, y = sqrt(-(z - 1)*(2*z - 1))/(6*z - 5) + (4*z - 3)/(6*z - 5),z = [1/2,2/3] +// curve 2 : x = [1/2,1], y = x/(3*x-1), z = x/(1 - 2*x + 3*x*x) +template +std::vector> poly00111223(const int prec = 10) +{ +return { + create_polyline(1./2,2./3, P(1.,1./2,1./2), + [](double z) { return P(-(-5*z + (6*z - 5)*(std::sqrt(-(z - 1)*(2*z - 1))/(6*z - 5) + (4*z - 3)/(6*z - 5)) + 3)/z,std::sqrt(-(z - 1)*(2*z - 1))/(6*z - 5) + (4*z - 3)/(6*z - 5),z); }, + prec), + create_polyline(1./2,1., P(1./2,1.,2./3), + [](double x) { return P(x,x/(3*x-1),x/(1 - 2*x + 3*x*x) ); }, + prec), + +}; +} + +//00111230 +// curve 1 : x = -(-2*z + (3*z - 2)*((8*z - 5)/(4*(3*z - 2)) - sqrt(-8*z*z + 16*z - 7)/(4*(3*z - 2))) + 1)/z, y = (8*z - 5)/(4*(3*z - 2)) - sqrt(-8*z*z + 16*z - 7)/(4*(3*z - 2)), z = ]2/3,1] +// curve 2 : x = -(-2*z + (3*z - 2)*((4*z - 3)/(4*(3*z - 2)) + sqrt(-8*z*z + 16*z - 7)/(4*(3*z - 2))) + 1)/z, y = (4*z - 3)/(4*(3*z - 2)) + sqrt(-8*z*z + 16*z - 7)/(4*(3*z - 2)), z = ]2/3,1] +template +std::vector> poly00111230(const int prec = 10) +{ +return { +create_polyline(limit_value(2./3,1.),1, P(1./2,0.,2./3),P(1./2,1./2,1.), + [](double z) { return P(-(-2*z + (3*z - 2)*((8*z - 5)/(4*(3*z - 2)) - std::sqrt(-8*z*z + 16*z - 7)/(4*(3*z - 2))) + 1)/z,(8*z - 5)/(4*(3*z - 2)) - std::sqrt(-8*z*z + 16*z - 7)/(4*(3*z - 2)),z ); }, + prec), +create_polyline(limit_value(2./3,1.),1, P(1./2,1.,2./3),P(1./2,1./2,1.), + [](double z) { return P(-(-2*z + (3*z - 2)*((4*z - 3)/(4*(3*z - 2)) + std::sqrt(-8*z*z + 16*z - 7)/(4*(3*z - 2))) + 1)/z,(4*z - 3)/(4*(3*z - 2)) + std::sqrt(-8*z*z + 16*z - 7)/(4*(3*z - 2)),z ); }, + prec), +}; +} + +//00111232 +// curve 1 : x = (z - 1)*(-1 + (5*z - 4)/(2*(z - 1)) + sqrt(13*z*z - 20*z + 8)/(2*(z - 1)))/z, y = (5*z - 4)/(2*(z - 1)) + sqrt(13*z*z - 20*z + 8)/(2*(z - 1)), z = [1/3,2/3] +// curve 2 : x = [1/3,1/2], y = x/(1. - x), z = -x/(1. - 5*x + 3*x*x +template +std::vector> poly00111232(const int prec = 10) +{ +return { + create_polyline(1./3,2./3, P(1.,1./2,1./3), + [](double z) { return P((z - 1)*(-1 + (5*z - 4)/(2*(z - 1)) + std::sqrt(13*z*z - 20*z + 8)/(2*(z - 1)))/z, (5*z - 4)/(2*(z - 1)) + std::sqrt(13*z*z - 20*z + 8)/(2*(z - 1)),z ); }, + prec), + create_polyline(1./3,1./2, P(1./3,1./2,1.), + [](double x) { return P(x,x/(1. - x),-x/(1. - 5*x + 3*x*x)); }, + prec), + +}; +} + +//00111233 +// curve 1 : x = -(z - 1)/z, y = (3*z - 2)/(4*z - 3), z = [1/2,2/3] +// curve 2 : x = [1/2,1], y = x/(x+1), z = x/(3*x-1) +// problem with close polylines, there is an over refinement +template +std::vector> poly00111233(const int prec = 10) +{ +return { + create_polyline(1./2,2./3, P(1.,1./2,1./2), + [](double z) { return P(-(z - 1)/z, (3*z - 2)/(4*z - 3),z); }, + prec), + create_polyline(1./2,1., P(1./2,1./3,1.),P(1.,1./2,1./2), + [](double x) { return P(x,x/(x+1),x/(3*x-1)); }, + prec), + +}; +} + +//00112233 +// curve 1 : x = [0,1], y = 1/2, z = 1/2 +template +std::vector> poly00112233(const int prec = 10) +{ +return { +create_polyline(0.,1., P(0.,1./2,1./2), + [](double x) { return P(x,1./2,1./2); }, + prec), + +}; +} + +//00112323 +// curve 1 : x = (3*z - 1)/(2*z), y = 1./2, z = [1/3,1/2] +// curve 2 : x = -(z - 1)/(2*z), y = 1./2, z = [1/3,1/2] +// curve 3 : x = 1./2, y = (3*z - 2)/(2*(z - 1)), z = [1/2,2/3] +// curve 4 : x = 1./2, y = -z /(2*(z - 1)), z = [1/2,2/3] + +template +std::vector> poly00112323(const int prec = 10) +{ +return { + create_polyline(1./3,1./2, P(0.,1./2,1./3),P(1./2,1./2,1./2), + [](double z) { return P((3*z - 1)/(2*z),1./2,z); }, + prec), + create_polyline(1./3,1./2, P(1.,1./2,1./3),P(1./2,1./2,1./2), + [](double z) { return P( -(z - 1)/(2*z),1./2,z); }, + prec), + create_polyline(1./2,2./3,P(1./2,1./2,1./2),P(1./2,0.,2./3), + [](double z) { return P(1./2,(3*z - 2)/(2*(z - 1)),z); }, + prec), + create_polyline(1./2,2./3,P(1./2,1./2,1./2),P(1./2,1.,2./3), + [](double z) { return P(1./2,-z /(2*(z - 1)),z); }, + prec), + + +}; +} + +//00112332 +// curve 1 : x = [0,1], y = z = 1/2 +// curve 2 : x = y = 1/2, z = [1/2,1] +// curve 3 : x = 1./2, y = (3*z - 2)/(2*(z - 1)), z = [1/2,2/3] +// curve 4 : x = 1./2, y = -z /(2*(z - 1)), z = [1/2,2/3] +template +std::vector> poly00112332(const int prec = 10) +{ +return { + create_polyline(1./2,2./3,P(1./2,1./2,1./2),P(1./2,0.,2./3), + [](double z) { return P(1./2,(3*z - 2)/(2*(z - 1)),z); }, + prec), + create_polyline(1./2,2./3,P(1./2,1./2,1./2),P(1./2,1.,2./3), + [](double z) { return P(1./2,-z /(2*(z - 1)),z); }, + prec), + create_polyline(0.,1./2, P(0.,1./2,1./2),P(1./2,1./2,1./2), + [](double x) { return P(x,1./2,1./2); }, + prec), + create_polyline(1./2,1., P(1./2,1./2,1./2),P(1.,1./2,1./2), + [](double x) { return P(x,1./2,1./2); }, + prec), + create_polyline(1./2,1., P(1./2,1./2,1./2),P(1./2,1./2,1.), + [](double z) { return P(1./2,1./2,z); }, + prec), + +}; +} + +//00121203 +// curve 1 : x = (-5*z*z + 7*z + (3*z - 2)*(10*z*z - 11*z + 3)/(5*z - 3) - 2)/(2*z*z), y = (3*z - 2)/(5*z - 3), z = [0,1/2]U[2/3,1] +// curve 2 : x = ((3*z - 1)*(z*(2*z - 1)/(3*z - 1) - z + 1)/(2*z*z)), y = z/(3*z - 1), z = [1/2,1] +template +std::vector> poly00121203(const int prec = 10) +{ +return { + create_polyline(0.,1./2, P(1./2,2./3,0.),P(1./2,1.,1./2), + [](double z) { return P((-5*z*z + 7*z + (3*z - 2)*(10*z*z - 11*z + 3)/(5*z - 3) - 2)/(2*z*z) ,(3*z - 2)/(5*z - 3),z); }, + prec), + create_polyline(2./3,1., P(1./2,0.,2./3),P(1./2,1./2,1.), + [](double z) { return P((-5*z*z + 7*z + (3*z - 2)*(10*z*z - 11*z + 3)/(5*z - 3) - 2)/(2*z*z) ,(3*z - 2)/(5*z - 3),z); }, + prec), + create_polyline(1./2,1., P(1./2,1.,1./2),P(1./2,1./2,1.), + [](double z) { return P(((3*z - 1)*(z*(2*z - 1)/(3*z - 1) - z + 1)/(2*z*z)), z/(3*z - 1),z); }, + prec), +}; +} + +//00121223 +// curve 1 : x = ]3/8,1/2], y = (3 - 5*x + sqrt(-3 + 8*x) - x*sqrt(-3 + 8*x))/(2*(3 - 5*x + x*x)), z = (3 - 5*x - sqrt(-3 + 8*x) + x*sqrt(-3 + 8*x))/(2*(3 - 5*x + x*x)) +// curve 3 : x = ]3/8,1/2], y = (3 - 5*x - sqrt(-3 + 8*x) + x*sqrt(-3 + 8*x))/(2*(3 - 5*x + x*x)), z = (3 - 5*x + sqrt(-3 + 8*x) - x*sqrt(-3 + 8*x))/(2*(3 - 5*x + x*x)) +template +std::vector> poly00121223(const int prec = 10) +{ +return { + create_polyline(limit_value(3./8,1.),1./2, P(3./8,4./9,4./9),P(1./2,2./3,0.), + [](double x) { return P(x,(3 - 5*x + std::sqrt(-3 + 8*x) - x*std::sqrt(-3 + 8*x))/(2*(3 - 5*x + x*x)), (3 - 5*x - std::sqrt(-3 + 8*x) + x*std::sqrt(-3 + 8*x))/(2*(3 - 5*x + x*x))); }, + prec), + create_polyline(limit_value(3./8,1.),1./2, P(3./8,4./9,4./9),P(1./2,0.,2./3), + [](double x) { return P(x,(3 - 5*x - std::sqrt(-3 + 8*x) + x*std::sqrt(-3 + 8*x))/(2*(3 - 5*x + x*x)), (3 - 5*x + std::sqrt(-3 + 8*x) - x*std::sqrt(-3 + 8*x))/(2*(3 - 5*x + x*x))); }, + prec), + +}; +} + +//00121233 +// curve 1 : x = 1./2, y = (3*z - 2)/(4*z - 3), z = [0,2/3] +// curve 2 : x = 1./2, y = 1-z, z' = 1-(3*z - 2)/(4*z - 3), z = [0,2/3] +// problem with close polylines, there is an over refinement +template +std::vector> poly00121233(const int prec = 10) +{ +return { + create_polyline(0.,1./2, P(1./2,2./3,0.),P(1./2,1./2,1./2), + [](double z) { return P(1./2,(3*z - 2)/(4*z - 3),z); }, + prec), + create_polyline(1./2,2./3, P(1./2,1./2,1./2),P(1./2,0.,2./3), + [](double z) { return P(1./2,(3*z - 2)/(4*z - 3),z); }, + prec), + create_polyline(0.,1./2, P(1./2,1.,1./3),P(1./2,1./2,1./2), + [](double z) { return P(1./2,1-z,1-(3*z - 2)/(4*z - 3)); }, + prec), + create_polyline(1./2.,2./3, P(1./2,1./2,1./2),P(1./2,1./3,1.), + [](double z) { return P(1./2,1-z,1-(3*z - 2)/(4*z - 3)); }, + prec), +}; +} + +//00121300 + +// curve 1 : x = -(2*z - 1)*(-2*z + (4*z - 3)*(sqrt((2*z - 1)*(2*z*z*z - 5*z*z + 8*z - 4))/(2*(8*z*z - 10*z + 3)) + (3*z - 2)/(2*(4*z - 3))) + 2)/(z*(z - 1)) , y = sqrt((2*z - 1)*(2*z*z*z - 5*z*z + 8*z - 4))/(2*(8*z*z - 10*z + 3)) + (3*z - 2)/(2*(4*z - 3)), z = ]0,1/3] +// curve 2 : x = -(2*z - 1)*(-2*z + (4*z - 3)*(sqrt((2*z - 1)*(2*z*z*z - 5*z*z + 8*z - 4))/(2*(8*z*z - 10*z + 3)) + (3*z - 2)/(2*(4*z - 3))) + 2)/(z*(z - 1)) , y = 1-( sqrt((2*z - 1)*(2*z*z*z - 5*z*z + 8*z - 4))/(2*(8*z*z - 10*z + 3)) + (3*z - 2)/(2*(4*z - 3))), z' = 1.-z, z = ]0,1/3] +template +std::vector> poly00121300(const int prec = 10) +{ +return { + create_polyline(limit_value(0.,1.),1./3, P(1./2,2./3,0.),P(1./2,1.,1./3), + [](double z) { return P(-(2*z - 1)*(-2*z + (4*z - 3)*(std::sqrt((2*z - 1)*(2*z*z*z - 5*z*z + 8*z - 4))/(2*(8*z*z - 10*z + 3)) + (3*z - 2)/(2*(4*z - 3))) + 2)/(z*(z - 1)) , std::sqrt((2*z - 1)*(2*z*z*z - 5*z*z + 8*z - 4))/(2*(8*z*z - 10*z + 3)) + (3*z - 2)/(2*(4*z - 3)),z); }, + prec), + create_polyline(limit_value(0.,1.),1./3, P(1./2,1./3,1.),P(1./2,0.,2./3), + [](double z) { return P(-(2*z - 1)*(-2*z + (4*z - 3)*(std::sqrt((2*z - 1)*(2*z*z*z - 5*z*z + 8*z - 4))/(2*(8*z*z - 10*z + 3)) + (3*z - 2)/(2*(4*z - 3))) + 2)/(z*(z - 1)) ,1-( std::sqrt((2*z - 1)*(2*z*z*z - 5*z*z + 8*z - 4))/(2*(8*z*z - 10*z + 3)) + (3*z - 2)/(2*(4*z - 3))),1.-z); }, + prec), + + +}; +} + +//00121301 +// curve 1 : x = (-4*z*z + 7*z + (sqrt((z - 1)*(z*z*z - 5*z*z + 4*z - 1))/(8*z*z - 10*z + 3) + (z - 1)*(3*z - 1)/((2*z - 1)*(4*z - 3)))*(8*z*z - 10*z + 3) - 2)/z, y = sqrt((z - 1)*(z*z*z - 5*z*z + 4*z - 1))/(8*z*z - 10*z + 3) + (z - 1)*(3*z - 1)/((2*z - 1)*(4*z - 3)), z = ]0,1/2[ +// curve 2 : x = ]1/2,1], y = (-2 + 6*x - x*x - sqrt(4 - 16*x + 24*x*x - 12*x*x*x + x*x*x*x))/(4*x), z = (-2 + 2*x + x*x + sqrt(4 - 16*x + 24*x*x - 12*x*x*x + x*x*x*x))/(4*x*(-1 + 2*x)) +template +std::vector> poly00121301(const int prec = 10) +{ +return { + create_polyline(limit_value(0.,1.),limit_value(1./2,-1.), P(1./2,2./3,0.),P(1.,1./2,1./2), + [](double z) { return P( (-4*z*z + 7*z + (std::sqrt((z - 1)*(z*z*z - 5*z*z + 4*z - 1))/(8*z*z - 10*z + 3) + (z - 1)*(3*z - 1)/((2*z - 1)*(4*z - 3)))*(8*z*z - 10*z + 3) - 2)/z, std::sqrt((z - 1)*(z*z*z - 5*z*z + 4*z - 1))/(8*z*z - 10*z + 3) + (z - 1)*(3*z - 1)/((2*z - 1)*(4*z - 3)),z); }, + prec), + create_polyline(limit_value(1./2,1.),1., P(1./2,0.,2./3),P(1.,1./2,1./2), + [](double x) { return P(x,(-2 + 6*x - x*x - std::sqrt(4 - 16*x + 24*x*x - 12*x*x*x + x*x*x*x))/(4*x),(-2 + 2*x + x*x + std::sqrt(4 - 16*x + 24*x*x - 12*x*x*x + x*x*x*x))/(4*x*(-1 + 2*x))); }, + prec), +}; +} + +//00121302 +// curve 1 : x = (-z*z + 5*z + (sqrt(z*z*z*z + 8*z*z - 12*z + 4)/(2*(2*z*z - 7*z + 3)) + (3*z*z - 6*z + 2)/(2*(z - 3)*(2*z - 1)))*(2*z*z - 7*z + 3) - 2)/(z*(z + 1)), y = sqrt(z*z*z*z + 8*z*z - 12*z + 4)/(2*(2*z*z - 7*z + 3)) + (3*z*z - 6*z + 2)/(2*(z - 3)*(2*z - 1)), z = ]0,1/2[ +// curve 2 : x = (-z + (2*z - 1)*(3*z*z - 2*z)/(6*z*z - 5*z + 1) + 1)/z, y = (3*z*z - 2*z)/(6*z*z - 5*z + 1), z = [2/3,1] +// curve 3 : x = (-z + z*(2*z - 1)/(z + 1) + 1)/z, y = z/(z+1.), z =[1/2,1] +template +std::vector> poly00121302(const int prec = 10) +{ +return { + create_polyline(limit_value(0.,1.),limit_value(1./2,-1.), P(1./2,2./3,0.),P(1./3,1.,1./2), + [](double z) { return P((-z*z + 5*z + (std::sqrt(z*z*z*z + 8*z*z - 12*z + 4)/(2*(2*z*z - 7*z + 3)) + (3*z*z - 6*z + 2)/(2*(z - 3)*(2*z - 1)))*(2*z*z - 7*z + 3) - 2)/(z*(z + 1)) ,std::sqrt(z*z*z*z + 8*z*z - 12*z + 4)/(2*(2*z*z - 7*z + 3)) + (3*z*z - 6*z + 2)/(2*(z - 3)*(2*z - 1)),z); }, + prec), + create_polyline(2./3,1., P(1./2,0.,2./3),P(1./2,1./2,1.), + [](double z) { return P((-z + (2*z - 1)*(3*z*z - 2*z)/(6*z*z - 5*z + 1) + 1)/z, (3*z*z - 2*z)/(6*z*z - 5*z + 1),z); }, + prec), + create_polyline(1./2,1., P(1.,1./3.,1./2),P(1./2,1./2,1.), + [](double z) { return P((-z + z*(2*z - 1)/(z + 1) + 1)/z, z/(z+1.),z); }, + prec), +}; +} + +//00121320 +// curve 1 : x = -(-7*z*z + 7*z + ((7*z*z - 8*z + 2)/(2*(9*z*z - 10*z + 3)) + sqrt(13*z*z*z*z - 36*z*z*z + 40*z*z - 20*z + 4)/(2*(9*z*z - 10*z + 3)))*(9*z*z - 10*z + 3) - 2)/(z*(3*z - 1)), y = (7*z*z - 8*z + 2)/(2*(9*z*z - 10*z + 3)) + sqrt(13*z*z*z*z - 36*z*z*z + 40*z*z - 20*z + 4)/(2*(9*z*z - 10*z + 3)), z = [0,1] +// curve 2 : x = [1/2,(8.06225-7)/2], y = (2 - 5*x + x*x + sqrt(x)*sqrt(4 - 11*x + 6*x*x + x*x*x))/(2*(1 - 4*x + 2*x*x)), z = (2 - x - x*x - sqrt(x)*sqrt(4 - 11*x + 6*x*x + x*x*x))/(2*(1 - x + x*x)) +// curve 3 : x = [1/2,(8.06225-7)/2], y = (2 - 5*x + x*x - sqrt(x)*sqrt(4 - 11*x + 6*x*x + x*x*x))/(2*(1 - 4*x + 2*x*x)), z = (2 - x - x*x + sqrt(x)*sqrt(4 - 11*x + 6*x*x + x*x*x))/(2*(1 - x + x*x)) +template +std::vector> poly00121320(const int prec = 10) +{ +return { + create_polyline(0.,1., P(1./2,2./3,0.),P(1./2,1./2,1.), + [](double z) { return P(-(-7*z*z + 7*z + ((7*z*z - 8*z + 2)/(2*(9*z*z - 10*z + 3)) + std::sqrt(13*z*z*z*z - 36*z*z*z + 40*z*z - 20*z + 4)/(2*(9*z*z - 10*z + 3)))*(9*z*z - 10*z + 3) - 2)/(z*(3*z - 1)),(7*z*z - 8*z + 2)/(2*(9*z*z - 10*z + 3)) + std::sqrt(13*z*z*z*z - 36*z*z*z + 40*z*z - 20*z + 4)/(2*(9*z*z - 10*z + 3)),z); }, + prec), + create_polyline(1./2,(8.06225-7.)/2, P(1./2,0.,2./3),P((8.06225-7.)/2,1./3,(3.+8.06225)/14), + [](double x) { return P(x,(2 - 5*x + x*x + std::sqrt(x)*std::sqrt(4 - 11*x + 6*x*x + x*x*x))/(2*(1 - 4*x + 2*x*x)),(2 - x - x*x - std::sqrt(x)*std::sqrt(4 - 11*x + 6*x*x + x*x*x))/(2*(1 - x + x*x))); }, + prec), + create_polyline(1./2,(8.06225-7.)/2, P(1./2,1./2,1.),P((8.06225-7.)/2,1./3,(3.+8.06225)/14), + [](double x) { return P(x,(2 - 5*x + x*x - std::sqrt(x)*std::sqrt(4 - 11*x + 6*x*x + x*x*x))/(2*(1 - 4*x + 2*x*x)),(2 - x - x*x + std::sqrt(x)*std::sqrt(4 - 11*x + 6*x*x + x*x*x))/(2*(1 - x + x*x))); }, + prec), +}; +} + +//00121321 +// curve 1 : x = -(-7*z*z + 8*z + (sqrt((z - 1)*(25*z*z*z - 37*z*z + 20*z - 4))/(2*(6*z*z - 10*z + 3)) + (z - 1)*(7*z - 2)/(2*(6*z*z - 10*z + 3)))*(6*z*z - 10*z +3) - 2)/(z*(2*z - 1)), y = sqrt((z - 1)*(25*z*z*z - 37*z*z + 20*z - 4))/(2*(6*z*z - 10*z + 3)) + (z - 1)*(7*z - 2)/(2*(6*z*z - 10*z + 3)), z = ]0,1/2[ +// curve 2 : x = (-2*z*z + 3*z - 1)/(z*(2*z - 1)), y = (3*z*z - 2*z)/(6*z*z - 6*z + 1), z = ]1/2,2/3] +template +std::vector> poly00121321(const int prec = 10) +{ +return { + create_polyline(limit_value(0.,1.),limit_value(1./2,-1.), P(1./2,2./3,0.),P(1.,1./2,1./2), + [](double z) { return P( -(-7*z*z + 8*z + (std::sqrt((z - 1)*(25*z*z*z - 37*z*z + 20*z - 4))/(2*(6*z*z - 10*z + 3)) + (z - 1)*(7*z - 2)/(2*(6*z*z - 10*z + 3)))*(6*z*z - 10*z +3) - 2)/(z*(2*z - 1)),std::sqrt((z - 1)*(25*z*z*z - 37*z*z + 20*z - 4))/(2*(6*z*z - 10*z + 3)) + (z - 1)*(7*z - 2)/(2*(6*z*z - 10*z + 3)),z); }, + prec), + create_polyline(limit_value(1./2.,1.),2./3, P(1.,1./2,1./2),P(1./2,0.,2./3), + [](double z) { return P((-2*z*z + 3*z - 1)/(z*(2*z - 1)),(3*z*z - 2*z)/(6*z*z - 6*z + 1),z); }, + prec), + +}; +} + +//00121323 +// curve 1 : x = -(-3*z + (3*z - 3)*((3*z - 1)/(3*(2*z - 1)) - sqrt(3*z*z - 3*z + 1)/(3*(2*z - 1))) + 2)/z, y = (3*z - 1)/(3*(2*z - 1)) - sqrt(3*z*z - 3*z + 1)/(3*(2*z - 1)), z = ]0,1[ +// curve 2 : x = (z - 1)*(-1 + sqrt(12*z*z*z*z - 20*z*z*z + 12*z*z - 4*z + 1)/(2*(2*z*z - 3*z + 1)) + (6*z*z - 6*z + 1)/(2*(z - 1)*(2*z - 1)))/z, y = sqrt(12*z*z*z*z - 20*z*z*z + 12*z*z - 4*z + 1)/(2*(2*z*z - 3*z + 1)) + (6*z*z - 6*z + 1)/(2*(z - 1)*(2*z - 1)), z = ]1/2,2/3] +// curve 3 : x = (z - 1)*(-1 - sqrt(12*z*z*z*z - 28*z*z*z + 24*z*z - 8*z + 1)/(2*(2*z*z - 3*z + 1)) + (2*z*z - 2*z + 1)/(2*(z - 1)*(2*z - 1)))/z, y = -sqrt(12*z*z*z*z - 28*z*z*z + 24*z*z - 8*z + 1)/(2*(2*z*z - 3*z + 1)) + (2*z*z - 2*z + 1)/(2*(z - 1)*(2*z - 1)), z = [1/3,1/2[ +// curve 4 : x = -(-z + (z - 1)*(-z*z/((z - 1)*(2*z - 1)) + z*sqrt(3*z*z - 3*z + 1)/(2*z*z - 3*z + 1)))/(3*z), y = -z*z/((z - 1)*(2*z - 1)) + z*sqrt(3*z*z - 3*z + 1)/(2*z*z - 3*z + 1), z = ]1/2,1] +template +std::vector> poly00121323(const int prec = 10) +{ +return { + create_polyline(limit_value(0.,1.),limit_value(1./2,-1.), P(1./2,2./3,0.),P(1./2,1./2,1./2), + [](double z) { return P(-(-3*z + (3*z - 3)*((3*z - 1)/(3*(2*z - 1)) - std::sqrt(3*z*z - 3*z + 1)/(3*(2*z - 1))) + 2)/z,(3*z - 1)/(3*(2*z - 1)) - std::sqrt(3*z*z - 3*z + 1)/(3*(2*z - 1)),z); }, + prec), + create_polyline(limit_value(1./2,1.),2./3,P(1./2,1./2,1./2), P(1./2,0.,2./3), + [](double z) { return P( (z - 1)*(-1 + std::sqrt(12*z*z*z*z - 20*z*z*z + 12*z*z - 4*z + 1)/(2*(2*z*z - 3*z + 1)) + (6*z*z - 6*z + 1)/(2*(z - 1)*(2*z - 1)))/z,std::sqrt(12*z*z*z*z - 20*z*z*z + 12*z*z - 4*z + 1)/(2*(2*z*z - 3*z + 1)) + (6*z*z - 6*z + 1)/(2*(z - 1)*(2*z - 1)) ,z); }, + prec), + create_polyline(1./3,limit_value(1./2,-1.), P(1.,1./2,1./3),P(1./2,1./2,1./2), + [](double z) { return P( (z - 1)*(-1 - std::sqrt(12*z*z*z*z - 28*z*z*z + 24*z*z - 8*z + 1)/(2*(2*z*z - 3*z + 1)) + (2*z*z - 2*z + 1)/(2*(z - 1)*(2*z - 1)))/z,-std::sqrt(12*z*z*z*z - 28*z*z*z + 24*z*z - 8*z + 1)/(2*(2*z*z - 3*z + 1)) + (2*z*z - 2*z + 1)/(2*(z - 1)*(2*z - 1)),z); }, + prec), + create_polyline(limit_value(1./2,1.),1., P(1./2,1./2,1./2),P(1./3,1./2,1.), + [](double z) { return P( -(-z + (z - 1)*(-z*z/((z - 1)*(2*z - 1)) + z*std::sqrt(3*z*z - 3*z + 1)/(2*z*z - 3*z + 1)))/(3*z),-z*z/((z - 1)*(2*z - 1)) + z*std::sqrt(3*z*z - 3*z + 1)/(2*z*z - 3*z + 1) ,z); }, + prec), +}; +} + +//00122103 +// curve 1 : x = 1/2, y = [0,1/2] U [2/3,1], z = (3*y-2.)/(5*y-3.) +// curve 2 : x = [1/2,1], y = (2 - x + sqrt(x)* sqrt(4 - 11*x + 8*x*x))/(2*(1 - x + 2*x*x)), z = (-3*x + sqrt(x)*sqrt(4 - 11*x + 8*x*x))/(2*(1 - 5*x + 2*x*x)) +// curve 3 : x = [1/2,1], y = (-3*x + sqrt(x)*sqrt(4 - 11*x + 8*x*x))/(2*(1 - 5*x + 2*x*x)), z = (2 - x + sqrt(x)* sqrt(4 - 11*x + 8*x*x))/(2*(1 - x + 2*x*x)) +// problem with polylines, there is an over refinement +template +std::vector> poly00122103(const int prec = 10) +{ +return { + create_polyline(0.,1./2, P(1./2,0.,2./3),P(1./2,1./2,1.), + [](double y) { return P(1./2,y,(3*y-2.)/(5*y-3.)); }, + prec), + create_polyline(2./3,1., P(1./2,2./3,0.),P(1./2,1.,1./2), + [](double y) { return P(1./2,y,(3*y-2.)/(5*y-3.)); }, + prec), + create_polyline(1./2,1., P(1./2,1.,1./2),P(1.,1./2,1./2), + [](double x) { return P(x,(2 - x + std::sqrt(x)* std::sqrt(4 - 11*x + 8*x*x))/(2*(1 - x + 2*x*x)),(-3*x + std::sqrt(x)*std::sqrt(4 - 11*x + 8*x*x))/(2*(1 - 5*x + 2*x*x))); }, + prec), + create_polyline(1./2,1., P(1./2,1./2,1.),P(1.,1./2,1./2), + [](double x) { return P(x,(-3*x + std::sqrt(x)*std::sqrt(4 - 11*x + 8*x*x))/(2*(1 - 5*x + 2*x*x)),(2 - x + std::sqrt(x)* std::sqrt(4 - 11*x + 8*x*x))/(2*(1 - x + 2*x*x))); }, + prec), + +}; +} + +//00122113 +// curve 1 : x = [1/2,1], y = (-4 + 7*x - sqrt(4 - 16*x + 21*x*x - 8*x*x*x))/(2*(-3 + 4*x + x*x)), z = (-2 + 5*x - sqrt(4 - 16*x + 21*x*x - 8*x*x*x))/(2*x*(1 + x)) +// curve 2 : x = [0,1/2], y = (-4 + 7*x + sqrt(4 - 16*x + 21*x*x - 8*x*x*x))/(2*(-3 + 4*x + x*x)), z = (-2 + 5*x + sqrt(4 - 16*x + 21*x*x - 8*x*x*x))/(2*x*(1 + x)) +// curve 3 : x = [2/3,1], y = (-1. + 2*x)/(-1. + 3*x*x), z = (-1. + 2*x)/(x*(-1. + 3*x)) +template +std::vector> poly00122113(const int prec = 10) +{ +return { + create_polyline(1./2,1., P(1./2,2./3,0.),P(1.,1./2,1./2), + [](double x) { return P(x,(-4 + 7*x - std::sqrt(4 - 16*x + 21*x*x - 8*x*x*x))/(2*(-3. + 4*x + x*x)),(-2. + 5*x - std::sqrt(4 - 16*x + 21*x*x - 8*x*x*x))/(2*x*(1 + x))); }, + prec), + create_polyline(0.000001,1./2, P(0.,1./3,1./2),P(1./2,0.,2./3), + [](double x) { return P(x,(-4. + 7*x + std::sqrt(4 - 16*x + 21*x*x - 8*x*x*x))/(2*(-3 + 4*x + x*x)),(-2. + 5*x + std::sqrt(4 - 16*x + 21*x*x - 8*x*x*x))/(2*x*(1 + x))); }, + prec), + create_polyline(2./3,1.,P(2./3,1.,1./2), P(1.,1./2,1./2), + [](double x) { return P(x,(-1. + 2*x)/(-1. + 3*x*x),(-1. + 2*x)/(x*(-1. + 3*x))); }, + prec), +}; +} + +//00122133 +// curve 1 : x = [0,1], y = z = 1/2 +// curve 2 : x = 1/ 2, y = (3*z - 2)/(4*z - 3), z = [0,2/3] +// curve 3 : x = 1/2, y = [1/3,1], z = y/(4.*y-1) +// problem with close polylines, there is an over refinement +template +std::vector> poly00122133(const int prec = 10) +{ +return { + create_polyline(0.,1./2, P(0.,1./2,1./2),P(1./2,1./2,1./2), + [](double x) { return P(x,1./2,1./2); }, + prec), + create_polyline(1./2,1., P(1./2,1./2,1./2),P(1.,1./2,1./2), + [](double x) { return P(x,1./2,1./2); }, + prec), + create_polyline(0.,1./2,P(1./2,2./3,0.),P(1./2,1./2,1./2), + [](double z) { return P(1./2,(3*z - 2)/(4*z - 3),z); }, + prec), + create_polyline(1./2,2./3,P(1./2,1./2,1./2),P(1./2,0.,2./3), + [](double z) { return P(1./2,(3*z - 2)/(4*z - 3),z); }, + prec), + create_polyline(1./2,1.,P(1./2,1./2,1./2),P(1./2,1.,1./3), + [](double y) { return P(1./2,y,y/(4.*y-1)); }, + prec), + create_polyline(1./3,1./2,P(1./2,1./3,1.),P(1./2,1./2,1./2), + [](double y) { return P(1./2,y,y/(4.*y-1)); }, + prec), + +}; +} + +//00122300 +// curve 1 : x = 1/2, y = [2/3,1], z = (3*y-2)/(5*y-2) +// curve 2 : x = 1/2, y' = 1-y, z = 1-(3*y-2)/(5*y-2), y'= [2/3,1] +template +std::vector> poly00122300(const int prec = 10) +{ +return { +create_polyline(2./3,1.,P(1./2,2./3,0.),P(1./2,1.,1./3), + [](double y) { return P(1./2,y,(3*y-2)/(5*y-2)); }, + prec), +create_polyline(2./3,1.,P(1./2,1./3,1.),P(1./2,0.,2./3), + [](double y) { return P(1./2,1-y,1-(3*y-2)/(5*y-2)); }, + prec), + +}; +} + +//00122301 +// curve 1 : x = -(-5*z*z + 5*z + (sqrt((2*z - 1)*(14*z*z*z - 25*z*z + 16*z - 4))/(2*(6*z*z - 7*z + 3)) + (2*z*z - 3*z + 2)/(2*(6*z*z - 7*z + 3)))*(6*z*z - 7*z + 3) - 2)/(z*(3*z - 1)), y = sqrt((2*z - 1)*(14*z*z*z - 25*z*z + 16*z - 4))/(2*(6*z*z - 7*z + 3)) + (2*z*z - 3*z + 2)/(2*(6*z*z - 7*z + 3)), z = ]0,1/2] +// curve 2 : x = (-z + (2*z - 1)*(sqrt(12*z*z*z*z - 28*z*z*z + 24*z*z - 8*z + 1)/(2*(6*z*z - 5*z + 1)) + (6*z*z - 6*z + 1)/(2*(2*z - 1)*(3*z - 1))) + 1)/z, y = sqrt(12*z*z*z*z - 28*z*z*z + 24*z*z - 8*z + 1)/(2*(6*z*z - 5*z + 1)) + (6*z*z - 6*z + 1)/(2*(2*z - 1)*(3*z - 1)), z = ]1/2,1] +// curve 3 : x = (-z + (2*z - 1)*(-sqrt(12*z*z*z*z - 20*z*z*z + 12*z*z - 4*z + 1)/(2*(2*z*z + z - 1)) + (6*z*z - 2*z - 1)/(2*(z + 1)*(2*z - 1))) + 1)/z, y = -sqrt(12*z*z*z*z - 20*z*z*z + 12*z*z - 4*z + 1)/(2*(2*z*z + z - 1)) + (6*z*z - 2*z - 1)/(2*(z + 1)*(2*z - 1)), z = [2/3,1] +template +std::vector> poly00122301(const int prec = 10) +{ +return { +create_polyline(limit_value(0.,1.),1./2,P(1./2,2./3,0.),P(1.,1./2,1./2), + [](double z) { return P(-(-5*z*z + 5*z + (std::sqrt((2*z - 1)*(14*z*z*z - 25*z*z + 16*z - 4))/(2*(6*z*z - 7*z + 3)) + (2*z*z - 3*z + 2)/(2*(6*z*z - 7*z + 3)))*(6*z*z - 7*z + 3) - 2)/(z*(3*z - 1)),std::sqrt((2*z - 1)*(14*z*z*z - 25*z*z + 16*z - 4))/(2*(6*z*z - 7*z + 3)) + (2*z*z - 3*z + 2)/(2*(6*z*z - 7*z + 3)) ,z); }, + prec), +create_polyline(limit_value(1./2,1.),1.,P(1.,1./2,1./2),P(1.,1./2,1.), + [](double z) { return P((-z + (2*z - 1)*(std::sqrt(12*z*z*z*z - 28*z*z*z + 24*z*z - 8*z + 1)/(2*(6*z*z - 5*z + 1)) + (6*z*z - 6*z + 1)/(2*(2*z - 1)*(3*z - 1))) + 1)/z,std::sqrt(12*z*z*z*z - 28*z*z*z + 24*z*z - 8*z + 1)/(2*(6*z*z - 5*z + 1)) + (6*z*z - 6*z + 1)/(2*(2*z - 1)*(3*z - 1)),z); }, + prec), +create_polyline(2./3,1.,P(1./2,0.,2./3),P(1./2,1./2,1.), + [](double z) { return P( (-z + (2*z - 1)*(-std::sqrt(12*z*z*z*z - 20*z*z*z + 12*z*z - 4*z + 1)/(2*(2*z*z + z - 1)) + (6*z*z - 2*z - 1)/(2*(z + 1)*(2*z - 1))) + 1)/z, -std::sqrt(12*z*z*z*z - 20*z*z*z + 12*z*z - 4*z + 1)/(2*(2*z*z + z - 1)) + (6*z*z - 2*z - 1)/(2*(z + 1)*(2*z - 1)) ,z); }, + prec), +}; +} + +//00122302 +// curve 1 : x = (2*z*z - 3*z + (4*z - 3)*(-sqrt((z - 1)*(z*z*z - 13*z*z + 12*z - 4))/(2*(4*z - 3)) + (z - 1)*(z + 2)/(2*(4*z - 3))) + 2)/(z*(2*z - 1)), y = -sqrt((z - 1)*(z*z*z - 13*z*z + 12*z - 4))/(2*(4*z - 3)) + (z - 1)*(z + 2)/(2*(4*z - 3)), z = ]0,1/2] +// curve 2 : x = 1-z, y = 1-(-sqrt((z - 1)*(z*z*z - 13*z*z + 12*z - 4))/(2*(4*z - 3)) + (z - 1)*(z + 2)/(2*(4*z - 3))), z' = 1-((2*z*z - 3*z + (4*z - 3)*(-sqrt((z - 1)*(z*z*z - 13*z*z + 12*z - 4))/(2*(4*z - 3)) + (z - 1)*(z + 2)/(2*(4*z - 3))) + 2)/(z*(2*z - 1))), z = ]0,1/2] +template +std::vector> poly00122302(const int prec = 10) +{ +return { + create_polyline(limit_value(0.,1.),1./2, P(1./2,2./3,0.),P(1./3,1.,1./2), + [](double z) { return P((2*z*z - 3*z + (4*z - 3)*(-std::sqrt((z - 1)*(z*z*z - 13*z*z + 12*z - 4))/(2*(4*z - 3)) + (z - 1)*(z + 2)/(2*(4*z - 3))) + 2)/(z*(2*z - 1)),-std::sqrt((z - 1)*(z*z*z - 13*z*z + 12*z - 4))/(2*(4*z - 3)) + (z - 1)*(z + 2)/(2*(4*z - 3)),z); }, + prec), + create_polyline(limit_value(0.,1.),1./2, P(1.,1./3,1./2),P(1./2,0.,2./3), + [](double z) { return P(1-z,1-(-std::sqrt((z - 1)*(z*z*z - 13*z*z + 12*z - 4))/(2*(4*z - 3)) + (z - 1)*(z + 2)/(2*(4*z - 3))),1-((2*z*z - 3*z + (4*z - 3)*(-std::sqrt((z - 1)*(z*z*z - 13*z*z + 12*z - 4))/(2*(4*z - 3)) + (z - 1)*(z + 2)/(2*(4*z - 3))) + 2)/(z*(2*z - 1)))); }, + prec), + +}; +} + +//00122313 +// curve 1 : x = (-1 + (3*z*z - 2*z)/(z - 1))*(z - 1)/z, y = (3*z*z - 2*z)/(z - 1), z = [1/3,2/3] +// curve 2 : x = [1/3,2/3], y = (-1 + 3*x - 3*x*x)/(-1 + x), z = (1 - 3*x + 3*x*x)/x) +// curve 3 : x = -(3*y*y-4*y+1)/y,y = [1/3,2/3], z = (3*y*y-2*y)/(y-1) +template +std::vector> poly00122313(const int prec = 10) +{ +return { + create_polyline(1./3,1./2, P(1.,1./2,1./3), P(1./2,1./2,1./2), + [](double z) { return P( (-1 + (3*z*z - 2*z)/(z - 1))*(z - 1)/z, (3*z*z - 2*z)/(z - 1),z); }, + prec), + create_polyline(1./2,2./3, P(1./2,1./2,1./2),P(1./2,0.,2./3), + [](double z) { return P( (-1 + (3*z*z - 2*z)/(z - 1))*(z - 1)/z, (3*z*z - 2*z)/(z - 1),z); }, + prec), + create_polyline(1./2,2./3, P(1./2,1./2,1./2),P(2./3,1.,1./2), + [](double x) { return P( x,(-1 + 3*x - 3*x*x)/(-1 + x),(1 - 3*x + 3*x*x)/x); }, + prec), + create_polyline(1./3,1./2, P(1./3,1./2,1.), P(1./2,1./2,1./2), + [](double x) { return P( x,(-1 + 3*x - 3*x*x)/(-1 + x),(1 - 3*x + 3*x*x)/x); }, + prec), + create_polyline(1./3,1./2, P(0.,1./3,1./2), P(1./2,1./2,1./2), + [](double y) { return P(-(3*y*y-4*y+1)/y ,y,(3*y*y-2*y)/(y-1)); }, + prec), + create_polyline(1./2,2./3, P(1./2,1./2,1./2), P(1./2,2./3,0.), + [](double y) { return P(-(3*y*y-4*y+1)/y ,y,(3*y*y-2*y)/(y-1)); }, + prec), +}; +} + +//00122331 +// curve 1 : x = [0,1], y = z = 1/2 +// curve 2 : x = -(-4*z*z + 5*z + (-(2*z - 1)*sqrt(5*z*z - 8*z + 4)/(2*(4*z*z - 6*z + 3)) + (2*z*z - 3*z + 2)/(2*(4*z*z - 6*z + 3)))*(4*z*z - 6*z + 3) - 2)/(z*(2*z - 1)), y = -(2*z - 1)*sqrt(5*z*z - 8*z + 4)/(2*(4*z*z - 6*z + 3)) + (2*z*z - 3*z + 2)/(2*(4*z*z - 6*z + 3)),z = ]0,1/2[ +// curve 3 : x = -(-4*z*z + z + (sqrt(-(z - 1)*(3*z + 1))*(2*z - 1)/(2*(4*z*z - 2*z - 1)) + (6*z*z - 3*z - 1)/(2*(4*z*z - 2*z - 1)))*(4*z*z - 2*z - 1) + 1)/(z*(2*z - 1)), y = sqrt(-(z - 1)*(3*z + 1))*(2*z - 1)/(2*(4*z*z - 2*z - 1)) + (6*z*z - 3*z - 1)/(2*(4*z*z - 2*z - 1)),z = ]1/2,2/3] +template +std::vector> poly00122331(const int prec = 10) +{ +return { + create_polyline(0.,1./3, P(0.,1./2,1./2),P(1./3,1./2,1./2), + [](double x) { return P(x,1./2,1./2); }, + prec), + create_polyline(1./3,2./3, P(1./3,1./2,1./2),P(2./3,1./2,1./2), + [](double x) { return P(x,1./2,1./2); }, + prec), + create_polyline(2./3,1., P(2./3,1./2,1./2),P(1.,1./2,1./2), + [](double x) { return P(x,1./2,1./2); }, + prec), + create_polyline(limit_value(0.,1.),limit_value(1./2,-1.), P(1./2,2./3,0.),P(2./3,1./2,1./2), + [](double z) { return P(-(-4*z*z + 5*z + (-(2*z - 1)*std::sqrt(5*z*z - 8*z + 4)/(2*(4*z*z - 6*z + 3)) + (2*z*z - 3*z + 2)/(2*(4*z*z - 6*z + 3)))*(4*z*z - 6*z + 3) - 2)/(z*(2*z - 1)),-(2*z - 1)*std::sqrt(5*z*z - 8*z + 4)/(2*(4*z*z - 6*z + 3)) + (2*z*z - 3*z + 2)/(2*(4*z*z - 6*z + 3)),z); }, + prec), + create_polyline(limit_value(1./2,1.),2./3, P(1./3,1./2,1./2),P(1./2,0.,2./3), + [](double z) { return P( -(-4*z*z + z + (std::sqrt(-(z - 1)*(3*z + 1))*(2*z - 1)/(2*(4*z*z - 2*z - 1)) + (6*z*z - 3*z - 1)/(2*(4*z*z - 2*z - 1)))*(4*z*z - 2*z - 1) + 1)/(z*(2*z - 1)),std::sqrt(-(z - 1)*(3*z + 1))*(2*z - 1)/(2*(4*z*z - 2*z - 1)) + (6*z*z - 3*z - 1)/(2*(4*z*z - 2*z - 1)),z); }, + prec), + +}; +} + +//01101023 +// curve 1 : x = 1./2, y = 1./(2*z), z = [1/2,1] +// curve 2 : x = 1/2, y = [0,1/2], z = (-1 + 2*y)/(-2 + 3*y) +template +std::vector> poly01101023(const int prec = 10) +{ +return { + create_polyline(1./2,1., P(1./2,1.,1./2),P(1./2,1./2,1.), + [](double z) { return P(1./2,1./(2*z),z); }, + prec), + create_polyline(0.,1./2, P(1./2,0.,1./2),P(1./2,1./2,0.), + [](double y) { return P(1./2,y,(-1 + 2*y)/(-2 + 3*y)); }, + prec), + +}; +} + +//01101223 +// curve 1 : x = [1/2,1], y = x/(-1 + 3*x), z = (-1 + 3*x - x*x)/(-1 + 3*x) +template +std::vector> poly01101223(const int prec = 10) +{ +return { + create_polyline(1./2,1, P(1./2,1.,1./2),P(1.,1./2,1./2), + [](double x) { return P(x,x/(-1 + 3*x),(-1 + 3*x - x*x)/(-1 + 3*x)); }, + prec), +}; +} + +//01101231 +// no curves +template +std::vector> poly01101231(const int /*prec*/ = 10) +{ +return { + + +}; +} + +//01102332 +// curve 1 : x =[0,1], y = z = 1/2 +// curve 2 : y =[0,1], x = z = 1/2 +// curve 3 : z =[0,1], y = x = 1/2 +template +std::vector> poly01102332(const int prec = 10) +{ +return { + create_polyline(0.,1./2, P(0.,1./2,1./2),P(1./2,1./2,1./2), + [](double x) { return P(x,1./2,1./2); }, + prec), + create_polyline(1./2,1., P(1./2,1./2,1./2),P(1.,1./2,1./2), + [](double x) { return P(x,1./2,1./2); }, + prec), + create_polyline(0.,1./2, P(1./2,0.,1./2),P(1./2,1./2,1./2), + [](double y) { return P(1./2,y,1./2); }, + prec), + create_polyline(1./2,1., P(1./2,1./2,1./2),P(1./2,1.,1./2), + [](double y) { return P(1./2,y,1./2); }, + prec), + create_polyline(0.,1./2, P(1./2,1./2,0.),P(1./2,1./2,1./2), + [](double z) { return P(1./2,1./2,z); }, + prec), + create_polyline(1./2,1., P(1./2,1./2,1./2),P(1./2,1./2,1.), + [](double z) { return P(1./2,1./2,z); }, + prec), + +}; +} + +//01121223 +// no curves +template +std::vector> poly01121223(const int /*prec*/ = 10) +{ +return { + + +}; +} + +//01121230 +// curve 1 : x = -(-7*z*z + 8*z + (-sqrt(-(2*z - 1)*(4*z*z*z - 12*z*z + 10*z - 3))/(2*(9*z*z - 10*z + 3)) + (10*z*z - 10*z + 3)/(2*(9*z*z - 10*z + 3)))*(9*z*z - 10*z + 3) - 3)/(6*z*z - 7*z + 3), y = -sqrt(-(2*z - 1)*(4*z*z*z - 12*z*z + 10*z - 3))/(2*(9*z*z - 10*z + 3)) + (10*z*z - 10*z + 3)/(2*(9*z*z - 10*z + 3)), z = [1/2,1] +// curve 2 : x = -(-5*z*z + 5*z + (sqrt(-z*(8*z*z*z - 20*z*z + 15*z - 4))/(2*(3*z*z - 2*z + 1)) + (2*z*z - 3*z + 2)/(2*(3*z*z - 2*z + 1)))*(3*z*z - 2*z + 1) - 2)/((2*z - 1)*(3*z - 1)), y = sqrt(-z*(8*z*z*z - 20*z*z + 15*z - 4))/(2*(3*z*z - 2*z + 1)) + (2*z*z - 3*z + 2)/(2*(3*z*z - 2*z + 1)), z = ]1/2,1] +template +std::vector> poly01121230(const int prec = 10) +{ +return { + create_polyline(1./2,1., P(1./2,1.,1./2),P(1./2,1./2,1.), + [](double z) { return P(-(-7*z*z + 8*z + (-std::sqrt(-(2*z - 1)*(4*z*z*z - 12*z*z + 10*z - 3))/(2*(9*z*z - 10*z + 3)) + (10*z*z - 10*z + 3)/(2*(9*z*z - 10*z + 3)))*(9*z*z - 10*z + 3) - 3)/(6*z*z - 7*z + 3),-std::sqrt(-(2*z - 1)*(4*z*z*z - 12*z*z + 10*z - 3))/(2*(9*z*z - 10*z + 3)) + (10*z*z - 10*z + 3)/(2*(9*z*z - 10*z + 3)) ,z); }, + prec), + create_polyline(limit_value(1./2,1.),1., P(1./2,1.,1./2),P(1./2,1./2,1.), + [](double z) { return P( -(-5*z*z + 5*z + (std::sqrt(-z*(8*z*z*z - 20*z*z + 15*z - 4))/(2*(3*z*z - 2*z + 1)) + (2*z*z - 3*z + 2)/(2*(3*z*z - 2*z + 1)))*(3*z*z - 2*z + 1) - 2)/((2*z - 1)*(3*z - 1)), std::sqrt(-z*(8*z*z*z - 20*z*z + 15*z - 4))/(2*(3*z*z - 2*z + 1)) + (2*z*z - 3*z + 2)/(2*(3*z*z - 2*z + 1)),z); }, + prec), +}; +} + +//01122330 +// curve 1 : x =[0,1], y = z = 1/2 +// curve 2 : y =[0,1], x = z = 1/2 +template +std::vector> poly01122330(const int prec = 10) +{ +return { + create_polyline(0.,1./2, P(0.,1./2,1./2),P(1./2,1./2,1./2), + [](double x) { return P(x,1./2,1./2); }, + prec), + create_polyline(1./2,1., P(1./2,1./2,1./2),P(1.,1./2,1./2), + [](double x) { return P(x,1./2,1./2); }, + prec), + create_polyline(0.,1./2, P(1./2,0.,1./2),P(1./2,1./2,1./2), + [](double y) { return P(1./2,y,1./2); }, + prec), + create_polyline(1./2,1., P(1./2,1./2,1./2),P(1./2,1.,1./2), + [](double y) { return P(1./2,y,1./2); }, + prec), + +}; +} + +//01123023 +// curve 1 : x =[0,1], y = z = 1/2 +template +std::vector> poly01123023(const int prec = 10) +{ +return { +create_polyline(0.,1., P(0.,1./2,1./2),P(1.,1./2,1./2), + [](double x) { return P(x,1./2,1./2); }, + prec), + +}; +} + +//01233210 +// curve 1 : x =[0,1], y = z = 1/2 +// curve 2 : y =[0,1], x = z = 1/2 +// curve 3 : z =[0,1], y = x = 1/2 +template +std::vector> poly01233210(const int prec = 10) +{ +return { + create_polyline(0.,1./2, P(0.,1./2,1./2),P(1./2,1./2,1./2), + [](double x) { return P(x,1./2,1./2); }, + prec), + create_polyline(1./2,1., P(1./2,1./2,1./2),P(1.,1./2,1./2), + [](double x) { return P(x,1./2,1./2); }, + prec), + create_polyline(0.,1./2, P(1./2,0.,1./2),P(1./2,1./2,1./2), + [](double y) { return P(1./2,y,1./2); }, + prec), + create_polyline(1./2,1., P(1./2,1./2,1./2),P(1./2,1.,1./2), + [](double y) { return P(1./2,y,1./2); }, + prec), + create_polyline(0.,1./2, P(1./2,1./2,0.),P(1./2,1./2,1./2), + [](double z) { return P(1./2,1./2,z); }, + prec), + create_polyline(1./2,1., P(1./2,1./2,1./2),P(1./2,1./2,1.), + [](double z) { return P(1./2,1./2,z); }, + prec), + +}; +} + + +//00001234 +// curve 1 : x = 1/2, y = [0,1/2], z = 2/(3-y) +// curve 2 : x = 1/2, y = [1/2,1], z = 1/(2+y) +// curve 3 : x = [0,1/2], y = 1/2, z = 2/(3-x) +// curve 4 : x = [1/2,1], y = 1/2, z = 1/(2+x) +// curve 5 : x = y = 1/2, z = [4/5,1] +template +std::vector> poly00001234(const int prec = 10) +{ +return { + create_polyline(0.,1./2, P(1./2,0.,2./3),P(1./2,1./2,4./5), + [](double y) { return P(1./2,y,2./(3-y)); }, + prec), + create_polyline(1./2,1., P(1./2,1./2,4./5),P(1./2,1.,2./3), + [](double y) { return P(1./2,y,2./(2+y)); }, + prec), + create_polyline(0.,1./2, P(0.,1./2,2./3),P(1./2,1./2,4./5), + [](double x) { return P(x,1./2,2./(3-x)); }, + prec), + create_polyline(1./2,1., P(1./2,1./2,4./5),P(1.,1./2,2./3), + [](double x) { return P(x,1./2,2./(2+x)); }, + prec), + create_polyline(4./5,1., P(1./2,1./2,4./5),P(1./2,1./2,1.), + [](double z) { return P(1./2,1./2,z); }, + prec), +}; +} + +//00010234 +// curve 1 : x = [1/2,1], y = (2 - x)/(1 + x), z = 1/2 +// curve 2 : x = (2 - z)/(1 + z), y = 1/2, z = [1/2,1] +// curve 3 : x = 1/2, y = [1/2,1], z = (2 - y)/(1 + y) +template +std::vector> poly00010234(const int prec = 10) +{ +return { + create_polyline(1./2,1., P(1./2,1.,1./2),P(1.,1./2,1./2), + [](double x) { return P(x,(2 - x)/(1 + x),1./2); }, + prec), + create_polyline(1./2,1., P(1.,1./2,1./2),P(1./2,1./2,1.), + [](double z) { return P((2 - z)/(1 + z),1./2,z); }, + prec), + create_polyline(1./2,1., P(1./2,1./2,1.),P(1./2,1.,1./2), + [](double y) { return P(1./2,y,(2 - y)/(1 + y)); }, + prec), + +}; +} + +//00011234 +// curve 1 : x = ]0,1/2], y = (2 + x - sqrt(4 - 8*x + x*x))/(6*x), z = (2 - x + x*x + sqrt(4 - 8*x + x*x) - x*sqrt(4 - 8*x + x*x))/(2*(3 - 4*x + 2*x*x)) +// curve 2 : x = 1/2, y = [2/3,1], z = 1-y/2 +// curve 3 : x = 1/2, y = [1/2,2/3], z = y/(-1 + 3*y) +// curve 4 : x = [2/3,1], y = 1./2, z = 1.-x/2 +// curve 5 : x = [1/2,2/3], y = 1./2, z = x/(-1 + 3*x) +// curve 6 : x = [1/2,2/3], y = (-1 + 2*x)/(x*(-1 + 3*x)), z = x/(1 - 2*x + 3*x*x) +// curve 7 : x = [1/2,2/3], y = (1 - x)/x, z = x +// curve 8 : x = [1/2,1], y = 1/(1+x),1/(1+x) +template +std::vector> poly00011234(const int prec = 10) +{ +return { + create_polyline(limit_value(0,1),1./2, P(0.,1./2,2./3),P(1./2,2./3,2./3), + [](double x) { return P(x,(2 + x - std::sqrt(4 - 8*x + x*x))/(6*x),(2 - x + x*x + std::sqrt(4 - 8*x + x*x) - x*std::sqrt(4 - 8*x + x*x))/(2*(3 - 4*x + 2*x*x))); }, + prec), + create_polyline(2./3,1.,P(1./2,2./3,2./3),P(1./2,1.,1./2), + [](double y) { return P(1./2,y,1.-y/2); }, + prec), + create_polyline(1./2,2./3,P(1./2,1./2,1.),P(1./2,2./3,2./3), + [](double y) { return P(1./2,y,y/(-1 + 3*y)); }, + prec), + create_polyline(2./3,1.,P(2./3,1./2,2./3),P(1.,1./2,1./2), + [](double x) { return P(x,1./2,1.-x/2); }, + prec), + create_polyline(1./2,2./3,P(1./2,1./2,1.),P(2./3,1./2,2./3), + [](double x) { return P(x,1./2,x/(-1 + 3*x)); }, + prec), + create_polyline(1./2,2./3,P(1./2,0.,2./3),P(2./3,1./2,2./3), + [](double x) { return P(x,(-1 + 2*x)/(x*(-1 + 3*x)),x/(1 - 2*x + 3*x*x)); }, + prec), + create_polyline(1./2,(2.23606-1)/2,P(1./2,1.,1./2),P((2.23606-1)/2,(2.23606-1)/2,(2.23606-1)/2), + [](double x) { return P(x,(1 - x)/x,x); }, + prec), + create_polyline((2.23606-1)/2,2./3,P((2.23606-1)/2,(2.23606-1)/2,(2.23606-1)/2),P(2./3,1./2,2./3), + [](double x) { return P(x,(1 - x)/x,x); }, + prec), + create_polyline(1./2,(2.23606-1)/2,P(1./2,2./3,2./3),P((2.23606-1)/2,(2.23606-1)/2,(2.23606-1)/2), + [](double x) { return P(x,1/(1+x),1/(1+x)); }, + prec), + create_polyline((2.23606-1)/2,1.,P((2.23606-1)/2,(2.23606-1)/2,(2.23606-1)/2),P(1.,1./2,1./2), + [](double x) { return P(x,1/(1+x),1/(1+x)); }, + prec), +}; +} + +//00012034 +// curve 1 : x = [1/2,1], y = (1+ x)/(3*x), z = 1/2 +// curve 2 : x = 1/2, y = [1/2,1], z = (2 - y)/(1 + y) +// curve 3 : x =[0,1/2], y = 1/2, z = (x-2)/(3*x-3) +template +std::vector> poly00012034(const int prec = 10) +{ +return { + create_polyline(1./2,1., P(1./2,1.,1./2),P(1.,2./3,1./2), + [](double x) { return P(x,(1+ x)/(3*x),1./2); }, + prec), + create_polyline(1./2,1., P(1./2,1./2,1.),P(1./2,1.,1./2), + [](double y) { return P(1./2,y,(2 - y)/(1 + y)); }, + prec), + create_polyline(0.,1./2, P(0.,1./2,2./3),P(1./2,1./2,1.), + [](double x) { return P(x,1./2,(x-2)/(3*x-3)); }, + prec), +}; +} + +//00012134 +// curve 1 : x = [1-1./1.73205,1./2], y = (-1 + 2*x)/(x*(-2 + 3*x)), z = -x/(1 - 5*x + 3*x*x) +// curve 2 : x = [(0.,1-1./1.73205], y = 1/2, z = (-2 + x)/(-3 + 2*x) +// curve 3 : x = 1/2, y = [2/3,1], z = 1-y/2 +// curve 4 : x = -(z - 1)*(3*z - 1)/z, y = z/(3*z - 1), z = [1/2,2/3] +// curve 5 : x = [1-1./1.73205,1./2], y = (-1 - x*x + sqrt(1 - 6*x*x + 4*x*x*x + x*x*x*x))/(2*(-2 + x)*x), z = (-1 - 2*x + x*x - sqrt(1 - 6*x*x + 4*x*x*x + x*x*x*x))/(2*(-1 - 2*x + 2*x*x)) +// curve 6 : x = 1/2, y = [1/2,2/3], z = y/(-1 + 3*y) +// curve 7 : x = [1-1./1.73205,1./2], y = 1/2, z = x/(1-x) +template +std::vector> poly00012134(const int prec = 10) +{ +return { + create_polyline(1-1./1.73205,1./2, P(1-1./1.73205,1./2,1.73205-1.),P(1./2,0.,2./3), + [](double x) { return P(x,(-1 + 2*x)/(x*(-2 + 3*x)),-x/(1 - 5*x + 3*x*x)); }, + prec), + create_polyline(0.,1-1./1.73205, P(0.,1./2,2./3),P(1-1./1.73205,1./2,1.73205-1.), + [](double x) { return P(x,1./2,(-2 + x)/(-3 + 2*x)); }, + prec), + create_polyline(2./3,1., P(1./2,2./3,2./3),P(1./2,1.,1./2), + [](double y) { return P(1./2,y,1.-y/2); }, + prec), + create_polyline(1./2,2./3, P(1./2,1.,1./2),P(1./2,2./3,2./3), + [](double z) { return P( -(z - 1)*(3*z - 1)/z,z/(3*z - 1),z); }, + prec), + create_polyline(1-1./1.73205,1./2,P(1-1./1.73205,1./2,1.73205-1.),P(1./2,2./3,2./3), + [](double x) { return P(x,(-1 - x*x + std::sqrt(1 - 6*x*x + 4*x*x*x + x*x*x*x))/(2*(-2 + x)*x),(-1 - 2*x + x*x - std::sqrt(1 - 6*x*x + 4*x*x*x + x*x*x*x))/(2*(-1 - 2*x + 2*x*x)) ); }, + prec), + create_polyline(1./2,2./3, P(1./2,1./2,1.),P(1./2,2./3,2./3), + [](double y) { return P( 1./2,y,y/(-1 + 3*y)); }, + prec), + create_polyline(1-1./1.73205,1./2, P(1-1./1.73205,1./2,1.73205-1.),P(1./2,1./2,1.), + [](double x) { return P(x ,1./2,x/(1-x)); }, + prec), +}; +} + +//00012234 +// curve 1 : x = [1/2,1], y = 1/(2x), z = 1/2 +// curve 2 : x = [1/2,1], y = z = 1./(1+x) +// curve 3 : x = 1/2, y = [2/3,1], z = 1-y/2 +// curve 4 : x = [0,1/2], y = 1/(2-x), z = 2/3 +// curve 5 : x = 1/2, y = 2/3, z =[2/3,1] +template +std::vector> poly00012234(const int prec = 10) +{ +return { + create_polyline(1./2,1., P(1./2,1.,1./2),P(1.,1./2,1./2), + [](double x) { return P(x ,1./(2*x),1./2); }, + prec), + create_polyline(1./2,1., P(1./2,2./3,2./3),P(1.,1./2,1./2), + [](double x) { return P(x ,1./(1+x),1./(1+x)); }, + prec), + create_polyline(2./3,1., P(1./2,2./3,2./3),P(1./2,1.,1./2), + [](double y) { return P(1./2,y,1.-y/2); }, + prec), + create_polyline(0.,1./2, P(0.,1./2,2./3),P(1./2,2./3,2./3), + [](double x) { return P(x,1./(2-x),2./3); }, + prec), + create_polyline(2./3,1., P(1./2,2./3,2./3),P(1./2,2./3,1.), + [](double z) { return P(1./2,2./3,z); }, + prec), +}; +} + +//00012334 +// curve 1 : x = [0,1/2], y = (-1 + 2*x)/(-2 + 3*x), z = 2./3 +// curve 2 : x = [1/2,1], y = x/(-1 + 3*x), z = (-1 + 3*x - x*x)/(-1 + 3*x) +// curve 3 : x = [1/2,1], y = 1/2x, z = 1/2 +// problem with close polylines, there is an over refinement +template +std::vector> poly00012334(const int prec = 10) +{ +return { + create_polyline(0.,1./2, P(0.,1./2,2./3),P(1./2,0.,2./3), + [](double x) { return P(x,(-1 + 2*x)/(-2 + 3*x),2./3); }, + prec), + create_polyline(1./2,1., P(1/2.,1.,1./2),P(1.,1./2,1./2), + [](double x) { return P(x, x/(-1 + 3*x),(-1 + 3*x - x*x)/(-1 + 3*x)); }, + prec), + create_polyline(1./2,1., P(1/2.,1.,1./2),P(1.,1./2,1./2), + [](double x) { return P(x,1./(2*x),1./2); }, + prec), +}; +} + +//00012340 +// curve 1 : x = [0,1/2], y = 1/2, z = (-2 + x)/(3*(-1 + x)) +// curve 2 : x = [0,1/2], y = [0,1/2], z = (-2 + y)/(3*(-1 + y)) +template +std::vector> poly00012340(const int prec = 10) +{ +return { + create_polyline(0.,1./2, P(0.,1./2,2./3),P(1./2,1./2,1.), + [](double x) { return P(x,1./2,(-2 + x)/(3*(-1 + x))); }, + prec), + create_polyline(0.,1./2, P(1./2,0.,2./3),P(1./2,1./2,1.), + [](double y) { return P(1./2,y,(-2 + y)/(3*(-1 + y))); }, + prec), +}; +} + +//00012341 +// curve 1 : x = 1/2, y = [0.,1-1./1.73205], z = (-2 + y)/(-3 + 2*y) +// curve 2 : x = [0.,1-1./1.73205], y = 1/2, z = (-2 + x)/(-3 + 2*x) +// curve 3 : x = 1/2, y = [1-1./1.73205,1./2], z = -y/(-1 + y) +// curve 4 : x = [1-1./1.73205,1./2], y = 1/2, z = -x/(-1 + x) +// curve 5 : x = [1-1./1.73205,1./2], y = (-1 - 2*x + 2*x*x + sqrt(1 - 4*x + 12*x*x - 12*x*x*x + 4*x*x*x*x))/(2*(-2 + x)*x), z = (1 - 4*x + 2*x*x + sqrt(1 - 4*x + 12*x*x - 12*x*x*x + 4*x*x*x*x))/(2*(-1 + x)*(-1+x)) +// curve 6 : x = [1/2,1], y = (1 + x - sqrt(1 - x + x*x))/(3*x), z = (x - sqrt(1 - x + x*x))/(-1 + x) +// curve 7 : x = (1 + y - sqrt(1 - y + y*y))/(3*y), y = [1/2,1], z = (y - sqrt(1 - y + y*y))/(-1 + y) +template +std::vector> poly00012341(const int prec = 10) +{ +return { + create_polyline(0.,1-1./1.73205, P(1./2,0.,2./3),P(1./2,1-1./1.73205,1.73205-1), + [](double y) { return P(1./2,y,(-2 + y)/(-3 + 2*y)); }, + prec), + create_polyline(0.,1-1./1.73205, P(0.,1./2,2./3),P(1-1./1.73205,1./2,1.73205-1), + [](double x) { return P(x,1./2,(-2 + x)/(-3 + 2*x)); }, + prec), + create_polyline(1-1./1.73205,1./2,P(1./2,1-1./1.73205,1.73205-1), P(1./2,1./2,1.), + [](double y) { return P(1./2,y,-y/(-1 + y)); }, + prec), + create_polyline(1-1./1.73205,1./2,P(1-1./1.73205,1./2,1.73205-1), P(1./2,1./2,1.), + [](double x) { return P(x,1./2,-x/(-1 + x)); }, + prec), + create_polyline(1-1./1.73205,1./2,P(1-1./1.73205,1./2,1.73205-1),P(1./2,1-1./1.73205,1.73205-1), + [](double x) { return P(x,(-1 - 2*x + 2*x*x + std::sqrt(1 - 4*x + 12*x*x - 12*x*x*x + 4*x*x*x*x))/(2*(-2 + x)*x),(1 - 4*x + 2*x*x + std::sqrt(1 - 4*x + 12*x*x - 12*x*x*x + 4*x*x*x*x))/(2*(-1 + x)*(-1+x))); }, + prec), + create_polyline(1./2,1., P(1./2,1-1./1.73205,1.73205-1), P(1.,1./3,1./2) , + [](double x) { return P(x,(1 + x - std::sqrt(1 - x + x*x))/(3*x),(x - std::sqrt(1 - x + x*x))/(-1 + x)); }, + prec), + create_polyline(1./2,1.,P(1-1./1.73205,1./2,1.73205-1),P(1./3,1.,1./2), + [](double y) { return P((1 + y - std::sqrt(1 - y + y*y))/(3*y),y,(y - std::sqrt(1 - y + y*y))/(-1 + y)); }, + prec), +}; +} + +//00012342 +// curve 1 : x = [1/2,1], y = 1/(2*x), z = -x/(1 - 5*x + 2*x*x) +// curve 2 : x = [1/2,1], y = (-1 + 2*x)/(-1 + 3*x), z = (1 - 4*x + 2*x*x)/(1 - 4*x + x*x) +// curve 3 : x = [0,1/2], y = (-1 +x)/(-2 + 3*x), z = (2 - 4*x + x*x)/(3 - 6*x + 2*x*x) +template +std::vector> poly00012342(const int prec = 10) +{ +return { + create_polyline(1./2,1., P(1./2,1.,1./2),P(1.,1./2,1./2), + [](double x) { return P(x,1/(2*x),-x/(1 - 5*x + 2*x*x)); }, + prec), + create_polyline(1./2,1., P(1./2,0.,2./3),P(1.,1./2,1./2), + [](double x) { return P(x,(-1 + 2*x)/(-1 + 3*x),(1 - 4*x + 2*x*x)/(1 - 4*x + x*x)); }, + prec), + create_polyline(0.,1./2, P(0.,1./2,2./3),P(1./2,1.,1./2), + [](double x) { return P(x,(-1 +x)/(-2 + 3*x),(2 - 4*x + x*x)/(3 - 6*x + 2*x*x)); }, + prec), +}; +} + +//00012343 +// curve 1 : x = [1/2,1], y = 1/(2*x), z = 1/(2*x+1) +// curve 2 : x = [1/3,1/2], y = (-1 + 2*x)/(-1 + x), z = (1 - 2*x + 2*x*x)/(1 - x + x*x) +// curve 3 : x = [0,1/3], y = 1./2, z = (-2 + x)/(-3 + 2*x) +// curve 4 : x = [1/3,1/2], y = -x/(-1 + x), z = (-1 + x + x*x)/(-1 + 2*x*x) +// curve 5 : x = 1/3, y = 1/2, z = [5/7,1] +template +std::vector> poly00012343(const int prec = 10) +{ +return { + create_polyline(1./2,1., P(1./2,1.,1./2),P(1.,1./2,1./3), + [](double x) { return P(x,1/(2*x),1/(2*x+1)); }, + prec), + create_polyline(1./3,1./2, P(1./3,1./2,5./7),P(1./2,0.,2./3), + [](double x) { return P(x,(-1 + 2*x)/(-1 + x),(1 - 2*x + 2*x*x)/(1 - x + x*x)); }, + prec), + create_polyline(0.,1./3, P(0.,1./2,2./3),P(1./3,1./2,5./7), + [](double x) { return P(x,1./2,(-2 + x)/(-3 + 2*x)); }, + prec), + create_polyline(1./3,1./2,P(1./3,1./2,5./7), P(1./2,1.,1./2), + [](double x) { return P(x,-x/(-1 + x),(-1 + x + x*x)/(-1 + 2*x*x)); }, + prec), + create_polyline(5./7,1., P(1./3,1./2,5./7),P(1./3,1./2,1.), + [](double z) { return P(1./3,1./2,z); }, + prec), +}; +} + +//00111234 +// curve 1 : x = [1/2,1], y = (-1 + 2*x)/(-1 + 3*x), z = 1/(1 + x) +// curve 2 : x = [1/2,1], y = 1./2, z = 1./(2*x) +// curve 3 : x = 1/2, y =[1/2,1], z = (2*y)/(-1 + 4*y) +template +std::vector> poly00111234(const int prec = 10) +{ +return { + create_polyline(1./2,1., P(1./2,0.,2./3),P(1.,1./2,1./2), + [](double x) { return P(x,(-1 + 2*x)/(-1 + 3*x),1/(1 + x)); }, + prec), + create_polyline(1./2,1., P(1./2,1./2,1.),P(1.,1./2,1./2), + [](double x) { return P(x,1./2,1./(2*x)); }, + prec), + create_polyline(1./2,1., P(1./2,1./2,1.),P(1./2,1.,2./3), + [](double y) { return P(1./2,y,(2*y)/(-1 + 4*y)); }, + prec), +}; +} + +//00112234 +// curve 1 : x = [0,1], y = z = 1/2 +// curve 2 : x = [1/2,1], y = z = 1/(1 + x) +// curve 3 : x = 1/2, y = [2/3,1], z = 2/3 +// curve 4 : x = 1/2, y = 2/3, z = [2/3,1] +// curve 5 : x = [0,1/2], y = z = 1/(2 - x) +template +std::vector> poly00112234(const int prec = 10) +{ +return { + create_polyline(0.,1., P(0.,1./2,1./2),P(1.,1./2,1./2), + [](double x) { return P(x,1./2,1./2); }, + prec), + create_polyline(1./2,1., P(1./2,2./3,2./3),P(1.,1./2,1./2), + [](double x) { return P(x,1/(1 + x),1/(1 + x)); }, + prec), + create_polyline(2./3,1., P(1./2,2./3,2./3),P(1./2,1.,2./3), + [](double y) { return P(1./2,y,2./3); }, + prec), + create_polyline(2./3,1., P(1./2,2./3,2./3),P(1./2,2./3,1.), + [](double z) { return P(1./2,2./3,z); }, + prec), + create_polyline(0.,1./2, P(0.,1./2,1./2),P(1./2,2./3,2./3), + [](double x) { return P(x,1/(2 - x),1/(2 - x)); }, + prec), +}; +} + +//00112324 +// curve 1 : x = [0,2/3], y = 1/2, z = 1/(3 - 2*x) +// curve 2 : x = [2/3,1], y = 1/2, z = 1./(1 + x) +// curve 3 : x = [1/2,2/3], y = (-1 + 2*x)/x, z = 1/(1 + x) +// curve 4 : x = [1/2,2/3], y = (1 - x)/x, z = 1/(1 + x) +// curve 5 : x = 2/3, y = 1/2, z = [3/5,1] +template +std::vector> poly00112324(const int prec = 10) +{ +return { + create_polyline(0.,2./3, P(0.,1./2,1./3),P(2./3,1./2,3./5), + [](double x) { return P(x,1./2 ,1/(3 - 2*x)); }, + prec), + create_polyline(2./3,1, P(2./3,1./2,3./5),P(1.,1./2,1.), + [](double x) { return P(x,1./2 ,1./(1 + x)); }, + prec), + create_polyline(1./2,2./3, P(1./2,0.,2./3),P(2./3,1./2,3./5), + [](double x) { return P(x,(-1 + 2*x)/x,1/(1 + x)); }, + prec), + create_polyline(1./2,2./3, P(1./2,1.,2./3),P(2./3,1./2,3./5), + [](double x) { return P(x,(1 - x)/x,1/(1 + x)); }, + prec), + create_polyline(3./5,1., P(2./3,1./2,3./5),P(2./3,1./2,1.), + [](double z) { return P(2./3,1./2,z); }, + prec), + +}; +} + +//00112334 +// curve 1 : x = [0,1], y = z = 1/2 +// curve 2 : x = [1/2,1], y = x/(-1 + 3*x), z = 1/(1 + x) +// curve 2 : x = 1-x', y = 1- x'/(-1 + 3*x'), z = 1/(1 + x'), x' = [1/2,1] +template +std::vector> poly00112334(const int prec = 10) +{ +return { + create_polyline(0.,1., P(0.,1./2,1./2),P(1.,1./2,1./2), + [](double x) { return P(x,1./2,1./2); }, + prec), + + create_polyline(1./2,1., P(1./2,1.,2./3),P(1.,1./2,1./2), + [](double x) { return P(x,x/(-1. + 3*x),1./(1 + x)); }, + prec), + create_polyline(1./2,1., P(1./2,0.,2./3),P(0.,1./2,1./2), + [](double x) { return P(1-x,1 - x/(-1. + 3*x),1./(1 + x)); }, + prec), +}; +} + +//00121234 +// curve 1 : x = 1/2, y = [0,2/3], z = (-2 + 3*y)/(-3 + 4*y +// curve 2 : x = 1/2, y =[1/2,1], z = y/(-1 + 3*y) +template +std::vector> poly00121234(const int prec = 10) +{ +return { + create_polyline(0.,2./3, P(1./2,0.,2./3),P(1./2,2./3,0.), + [](double y) { return P(1./2,y,(-2 + 3*y)/(-3 + 4*y)); }, + prec), + create_polyline(1./2,1., P(1./2,1./2,1.),P(1./2,1.,1./2), + [](double y) { return P(1./2,y,y/(-1 + 3*y)); }, + prec), +}; +} + +//00121304 +// curve 1 : x = [1/2,4.-2*1.73205], y = (2 + x - sqrt(4 - 8*x + x*x))/(6*x), z = (-2 + 5*x - x*x - sqrt(4 - 8*x + x*x) + x*sqrt(4 - 8*x + x*x))/(2*x) +// curve 2 : x = [1/2,4.-2*1.73205], y = (2 + x + sqrt(4 - 8*x + x*x))/(6*x), z = (-2 + 5*x - x*x + sqrt(4 - 8*x + x*x) - x*sqrt(4 - 8*x + x*x))/(2*x) +// curve 3 : x = [1/2,4.-2*1.73205], y = (-2 + 5*x - x*x + sqrt(4 - 8*x + x*x) - x*sqrt(4 - 8*x + x*x))/(2*x), z = (2 + x + sqrt(4 - 8*x + x*x))/(6*x) +// curve 4 : x = [1/2,4.-2*1.73205], y = (-2 + 5*x - x*x - sqrt(4 - 8*x + x*x) + x*sqrt(4 - 8*x + x*x))/(2*x), z = (2 + x - sqrt(4 - 8*x + x*x))/(6*x) +// curve 5 : x = [1/2,1], y = 1/2x, z = 1/2 +// curve 6 : x = [1/2,1], y = 1/2, z = 1/2x +template +std::vector> poly00121304(const int prec = 10) +{ +return { + create_polyline(1./2,4.-2*1.73205, P(1./2,2./3,0.),P(4.-2*1.73205,(1.+1/1.73205)/2,(1.73205-1)/2.), + [](double x) { return P(x,(2 + x - std::sqrt(4 - 8*x + x*x))/(6*x),(-2 + 5*x - x*x - std::sqrt(4 - 8*x + x*x) + x*std::sqrt(4 - 8*x + x*x))/(2*x)); }, + prec), + create_polyline(1./2,4.-2*1.73205, P(1./2,1.,1./2),P(4.-2*1.73205,(1.+1/1.73205)/2,(1.73205-1)/2.), + [](double x) { return P(x,(2 + x + std::sqrt(4 - 8*x + x*x))/(6*x),(-2 + 5*x - x*x + std::sqrt(4 - 8*x + x*x) - x*std::sqrt(4 - 8*x + x*x))/(2*x)); }, + prec), + create_polyline(1./2,4.-2*1.73205, P(1./2,1./2,1.),P(4.-2*1.73205,(1.73205-1)/2.,(1.+1/1.73205)/2), + [](double x) { return P(x,(-2 + 5*x - x*x + std::sqrt(4 - 8*x + x*x) - x*std::sqrt(4 - 8*x + x*x))/(2*x),(2 + x + std::sqrt(4 - 8*x + x*x))/(6*x)); }, + prec), + create_polyline(1./2,4.-2*1.73205, P(1./2,0.,2./3),P(4.-2*1.73205,(1.73205-1)/2.,(1.+1/1.73205)/2), + [](double x) { return P(x,(-2 + 5*x - x*x - std::sqrt(4 - 8*x + x*x) + x*std::sqrt(4 - 8*x + x*x))/(2*x),(2 + x - std::sqrt(4 - 8*x + x*x))/(6*x)); }, + prec), + create_polyline(1./2,1., P(1./2,1.,1./2),P(1.,1./2,1./2), + [](double x) { return P(x,1./(2*x),1./2); }, + prec), + create_polyline(1./2,1., P(1./2,1./2,1.),P(1.,1./2,1./2), + [](double x) { return P(x,1./2,1./(2*x)); }, + prec), +}; +} + +//00121324 +// curve 1 : x = [1./2,0.5944], y = (1 - 2*x)/(1 - 3*x + x*x), z = 1/(1 + x) +// curve 2 : x = [0.5944,1], y = x/(1 + x*x), z = 1/(1 + x) +// curve 3 : x = [3/5,1], y =1./2, z = x/(3*x-1) +// curve 4 : x = z/(3*z-1), y = 1./2, z = [3/4,1] +// curve 5 : x = [1./2,0.5944], y = (x*(-2 + 3*x))/(-1 + 2*x*x), z = (x*(-2 + 3*x))/(1 - 5*x + 5*x*x) +// curve 6 : x = -(-3*z + (3*z - 3)*((3*z - 1)/(3*(2*z - 1)) - sqrt(3*z*z - 3*z + 1)/(3*(2*z - 1))) + 2)/z, y = (3*z - 1)/(3*(2*z - 1)) - sqrt(3*z*z - 3*z + 1)/(3*(2*z - 1)), z = ]0,0.6271] +template +std::vector> poly00121324(const int prec = 10) +{ +return { + create_polyline(1./2,0.5944, P(1./2,0.,2./3),P(0.5944,0.4392,0.6271), + [](double x) { return P(x,(1 - 2*x)/(1 - 3*x + x*x),1/(1 + x)); }, + prec), + create_polyline(0.5944,1.,P(0.5944,0.4392,0.6271),P(1.,1./2,1./2), + [](double x) { return P(x,x/(1 + x*x),1/(1 + x)); }, + prec), + create_polyline(3./5,1.,P(3./5,1./2,3./4),P(1.,1./2,1./2), + [](double x) { return P(x,1./2,x/(3*x-1)); }, + prec), + create_polyline(3./4,1.,P(3./5,1./2,3./4),P(1./2,1./2,1.), + [](double z) { return P(z/(3*z-1),1./2,z); }, + prec), + create_polyline(1./2,0.5944, P(1./2,1./2,1.),P(0.5944,0.4392,0.6271), + [](double x) { return P(x,(x*(-2 + 3*x))/(-1 + 2*x*x),(x*(-2 + 3*x))/(1 - 5*x + 5*x*x)); }, + prec), + create_polyline(limit_value(0.,1),0.6271,P(1./2,2./3,0.),P(0.5944,0.4392,0.6271), + [](double z) { return P(-(-3*z + (3*z - 3)*((3*z - 1)/(3*(2*z - 1)) - std::sqrt(3*z*z - 3*z + 1)/(3*(2*z - 1))) + 2)/z,(3*z - 1)/(3*(2*z - 1)) - std::sqrt(3*z*z - 3*z + 1)/(3*(2*z - 1)),z); }, + prec), +}; +} + +//00121340 +// curve 1 : x = -(-5*z*z + 6*z + ((2*z - 1)*(3*z - 2)/(2*(7*z*z - 9*z + 3)) + sqrt(8*z*z*z*z - 20*z*z*z + 25*z*z - 16*z + 4)/(2*(7*z*z - 9*z + 3)))*(7*z*z - 9*z + 3) - 2)/(z*(2*z - 1)), y = (2*z - 1)*(3*z - 2)/(2*(7*z*z - 9*z + 3)) + sqrt(8*z*z*z*z - 20*z*z*z + 25*z*z - 16*z + 4)/(2*(7*z*z - 9*z + 3)), z = ]0,1/2[ +// curve 2 : x = -(-5*z*z + 4*z + (-sqrt(-(z*z + z - 1)*(3*z*z - 5*z + 1))/(2*(7*z*z - 6*z + 1)) + (9*z*z - 7*z + 1)/(2*(7*z*z - 6*z + 1)))*(7*z*z - 6*z + 1) - 1)/(z*(z + 1)), y = -sqrt(-(z*z + z - 1)*(3*z*z - 5*z + 1))/(2*(7*z*z - 6*z + 1)) + (9*z*z - 7*z + 1)/(2*(7*z*z - 6*z + 1)), z = [2/3,1] +// curve 3 : x = [3/8,1/2], y = (-3 - sqrt(-3 + 8*x))/(2*(-3 + 2*x)), z = (-3 + sqrt(-3 + 8*x))/(2*(-3 + 2*x)) +// curve 4 : x = [3/8,1/2], y = (-3 + sqrt(-3 + 8*x))/(2*(-3 + 2*x)), z = (-3 - sqrt(-3 + 8*x))/(2*(-3 + 2*x)) +template +std::vector> poly00121340(const int prec = 10) +{ +return { + create_polyline(limit_value(0.,1.),limit_value(1./2,-1.), P(1./2,2./3,0.),P(1./2,1.,1./2), + [](double z) { return P(-(-5*z*z + 6*z + ((2*z - 1)*(3*z - 2)/(2*(7*z*z - 9*z + 3)) + std::sqrt(8*z*z*z*z - 20*z*z*z + 25*z*z - 16*z + 4)/(2*(7*z*z - 9*z + 3)))*(7*z*z - 9*z + 3) - 2)/(z*(2*z - 1)),(2*z - 1)*(3*z - 2)/(2*(7*z*z - 9*z + 3)) + std::sqrt(8*z*z*z*z - 20*z*z*z + 25*z*z - 16*z + 4)/(2*(7*z*z - 9*z + 3)),z); }, + prec), + create_polyline(2./3,1., P(1./2,0.,2./3),P(1./2,1./2,1.), + [](double z) { return P(-(-5*z*z + 4*z + (-std::sqrt(-(z*z + z - 1)*(3*z*z - 5*z + 1))/(2*(7*z*z - 6*z + 1)) + (9*z*z - 7*z + 1)/(2*(7*z*z - 6*z + 1)))*(7*z*z - 6*z + 1) - 1)/(z*(z + 1)),-std::sqrt(-(z*z + z - 1)*(3*z*z - 5*z + 1))/(2*(7*z*z - 6*z + 1)) + (9*z*z - 7*z + 1)/(2*(7*z*z - 6*z + 1)),z); }, + prec), + create_polyline(3./8,1./2, P(3./8.,2./3,2./3),P(1./2,1.,1./2), + [](double x) { return P(x,(-3 - std::sqrt(-3 + 8*x))/(2*(-3 + 2*x)),(-3 + std::sqrt(-3 + 8*x))/(2*(-3 + 2*x))); }, + prec), + create_polyline(3./8,1./2, P(3./8.,2./3,2./3),P(1./2,1./2,1.), + [](double x) { return P(x,(-3 + std::sqrt(-3 + 8*x))/(2*(-3 + 2*x)),(-3 - std::sqrt(-3 + 8*x))/(2*(-3 + 2*x))); }, + prec), +}; +} + +//00121341 +// curve 1 : x = [1/2,1], y = 1./(x+1), z = (1 - 2*x)/(1 - 4*x + x*x) +// curve 2 : x = [1/2,1], y = (1 - 2*x)/(1 - 4*x + x*x), z = 1./(x+1) +template +std::vector> poly00121341(const int prec = 10) +{ +return { + create_polyline(1./2,1.,P(1./2,2./3,0.),P(1.,1./2,1./2), + [](double x) { return P(x,1./(x+1),(1 - 2*x)/(1 - 4*x + x*x)); }, + prec), + create_polyline(1./2,1.,P(1./2,0.,2./3),P(1.,1./2,1./2), + [](double x) { return P(x,(1 - 2*x)/(1 - 4*x + x*x),1./(x+1)); }, + prec), +}; +} + +//00121342 +// curve 1 : x = [1/3,1/2], y = x/(-1 + 4*x), z = -x/(-1 + x) +// curve 2 : x = [1/2,1/1.73205], y = (1 - 2*x)/(1 - 3*x + x*x), z = 1/(1 + x) +// curve 3 : x = [1/1.73205,1], y = 1/(2 + x), z = 1/(1 + x) +// curve 4 : x = [1/2,1/1.73205], y = (-2 + 3*x)/(-3 + 4*x), z = (-2 + 3*x)/(-1 + x) +// curve 5 : x = (-2*z*z + 5*z + ((3*z*z - 6*z + 2)/(2*(2*z*z - 6*z + 3)) + sqrt(z*z*z*z - 4*z*z*z + 12*z*z - 12*z + 4)/(2*(2*z*z - 6*z + 3)))*(2*z*z - 6*z + 3) - 2)/z, y = (3*z*z - 6*z + 2)/(2*(2*z*z - 6*z + 3)) + sqrt(z*z*z*z - 4*z*z*z + 12*z*z - 12*z + 4)/(2*(2*z*z - 6*z + 3)), z = [0,(3-1.73205)/2] +template +std::vector> poly00121342(const int prec = 10) +{ +return { + create_polyline(1./3,1./2,P(1./3,1.,1./2),P(1./2,1./2,1.), + [](double x) { return P(x,x/(-1 + 4*x),-x/(-1 + x)); }, + prec), + create_polyline(1./2,1/1.73205,P(1./2,0.,2./3),P(1/1.73205,(6-1.73205)/11,(3-1.73205)/2), + [](double x) { return P(x,(1 - 2*x)/(1 - 3*x + x*x),1/(1 + x)); }, + prec), + create_polyline(1./1.73205,1.,P(1/1.73205,(6-1.73205)/11,(3-1.73205)/2),P(1.,1./3,1./2), + [](double x) { return P(x,1/(2 + x),1/(1 + x)); }, + prec), + create_polyline(1./2,1/1.73205,P(1./2,1./2,1.),P(1/1.73205,(6-1.73205)/11,(3-1.73205)/2), + [](double x) { return P(x,(-2 + 3*x)/(-3 + 4*x),(-2 + 3*x)/(-1 + x)); }, + prec), + create_polyline(limit_value(0.,1),(3-1.73205)/2,P(1./2,2./3,0.),P(1/1.73205,(6-1.73205)/11,(3-1.73205)/2), + [](double z) { return P((-2*z*z + 5*z + ((3*z*z - 6*z + 2)/(2*(2*z*z - 6*z + 3)) + std::sqrt(z*z*z*z - 4*z*z*z + 12*z*z - 12*z + 4)/(2*(2*z*z - 6*z + 3)))*(2*z*z - 6*z + 3) - 2)/z,(3*z*z - 6*z + 2)/(2*(2*z*z - 6*z + 3)) + std::sqrt(z*z*z*z - 4*z*z*z + 12*z*z - 12*z + 4)/(2*(2*z*z - 6*z + 3)),z); }, + prec), +}; +} + +//00121344 +// curve 1 : x = [1./2,0.5698], y = 1/(1 + x), z = (1 - 2*x)/(1 - 3*x + x*x) +// curve 2 : x = [0.5698,1], y = 1/(1 + x), z = x/(1 + x) +// curve 3 : x = [1./2,0.5698], y = ((-1 + x)*x)/(1 - 3*x + x*x), z = x/(1 + x) +// curve 4 : x = [0.5698,1], y = x/(1 + x), z = 1/(1 + x) +// curve 5 : x = [1./2,0.5698], y = (1 - 2*x)/(1 - 3*x + x*x), z = 1/(1 + x) +// curve 6 : x = [1./2,0.5698], y = x/(1 + x),((-1 + x)*x)/(1 - 3*x + x*x) +// curve 7 : x = (3*z*z - 3*z + 1)/(2*z*z - 2*z + 1), y = 1-z, z = [0.3629,0.6370] +template +std::vector> poly00121344(const int prec = 10) +{ +return { + create_polyline(1./2,0.5698,P(1./2,2./3,0.),P(0.5698,0.6370,0.3629), + [](double x) { return P(x,1/(1 + x),(1 - 2*x)/(1 - 3*x + x*x)); }, + prec), + create_polyline(0.5698,1.,P(0.5698,0.6370,0.3629),P(1.,1./2,1./2), + [](double x) { return P(x,1/(1 + x),x/(1 + x)); }, + prec), + create_polyline(1./2,0.5698,P(1./2,1.,1./3),P(0.5698,0.6370,0.3629), + [](double x) { return P(x,((-1 + x)*x)/(1 - 3*x + x*x),x/(1 + x)); }, + prec), + create_polyline(0.5698,1.,P(0.5698,0.3629,0.6370),P(1.,1./2,1./2), + [](double x) { return P(x,x/(1 + x),1/(1 + x)); }, + prec), + create_polyline(1./2,0.5698,P(1./2,0.,2./3),P(0.5698,0.3629,0.6370), + [](double x) { return P(x,(1 - 2*x)/(1 - 3*x + x*x),1/(1 + x)); }, + prec), + create_polyline(1./2,0.5698,P(1./2,1./3,1.),P(0.5698,0.3629,0.6370), + [](double x) { return P(x,x/(1 + x),((-1 + x)*x)/(1 - 3*x + x*x)); }, + prec), + create_polyline(0.3629,0.6370,P(0.5698,0.6370,0.3629),P(0.5698,0.3629,0.6370), + [](double z) { return P((3*z*z - 3*z + 1)/(2*z*z - 2*z + 1),1-z,z); }, + prec), +}; +} + +//00122134 +// curve 1 : x = 1/2, y = [0,1], z = (-2 + 3*y)/(-3 + 4 y) +// curve 2 : x = [0,1], y = z = 1/2 +// curve 3 : x = [0,1/2], y = z = 1/(2 - x) +// curve 4 : x = [1/2,1], y = z = 1/(1+ x) +// curve 5 : x = 1/2, y = [1/2,1], z = y/(-1 + 3*y) +// curve 6 : x = 1/2, y = z = [1/2,2/3] + +template +std::vector> poly00122134(const int prec = 10) +{ +return { + create_polyline(0.,1./2,P(1./2,0.,2./3),P(1./2,1./2,1./2), + [](double y) { return P(1./2,y,(-2 + 3*y)/(-3 + 4*y)); }, + prec), + create_polyline(1./2,2./3,P(1./2,1./2,1./2),P(1./2,2./3,0.), + [](double y) { return P(1./2,y,(-2 + 3*y)/(-3 + 4*y)); }, + prec), + create_polyline(0.,1./2,P(0.,1./2,1./2),P(1./2,1./2,1./2), + [](double x) { return P(x,1./2,1./2); }, + prec), + create_polyline(1./2,1.,P(1./2,1./2,1./2),P(1.,1./2,1./2), + [](double x) { return P(x,1./2,1./2); }, + prec), + create_polyline(0.,1./2,P(0.,1./2,1./2),P(1./2,2./3,2./3), + [](double x) { return P(x,1/(2 - x),1/(2 - x)); }, + prec), + create_polyline(1./2,1.,P(1./2,2./3,2./3),P(1.,1./2,1./2), + [](double x) { return P(x,1/(1+ x),1/(1 +x)); }, + prec), + create_polyline(2./3,1.,P(1./2,2./3,2./3),P(1./2,1.,1./2), + [](double y) { return P(1./2,y,y/(-1 + 3*y)); }, + prec), + create_polyline(1./2,2./3,P(1./2,1./2,1.),P(1./2,2./3,2./3), + [](double y) { return P(1./2,y,y/(-1 + 3*y)); }, + prec), + create_polyline(1./2,2./3,P(1./2,1./2,1./2),P(1./2,2./3,2./3), + [](double y) { return P(1./2,y,y); }, + prec), +}; +} + +//00122304 +// curve 1 : x = (-3*z*z + 4*z + (-sqrt(3*z*z - 3*z + 1)/(3*(z - 1)) - 1/(3*(z - 1)))*(3*z*z - 6*z + 3) - 2)/(z*(2*z - 1)), y = -sqrt(3*z*z - 3*z + 1)/(3*(z - 1)) - 1/(3*(z - 1)), z = [0,1/2] +// curve 2 : x = [1/2,1], y = (2 - x + sqrt(x)*sqrt(4 - 11*x + 8*x*x))/(2*(1 - x + 2*x*x)), z = (-3*x + sqrt(x)*sqrt(4 - 11*x + 8*x*x))/(2*(1 - 5*x + 2*x*x)) +// curve 3 : x = [1/2,1], y = (2 - x + sqrt(x)*sqrt(4 - 11*x + 8*x*x))/(2*(1 - x + 2*x*x)), z = (-3*x + sqrt(x)*sqrt(4 - 11*x + 8*x*x))/(2*(1 - 5*x + 2*x*x)) +// curve 4 : x = (-z + (2*z - 1)*(-sqrt(12*z*z*z*z - 20*z*z*z + 12*z*z - 4*z + 1)/(2*(2*z*z + z - 1)) + (6*z*z - 2*z - 1)/(2*(z + 1)*(2*z - 1))) + 1)/z, y = -sqrt(12*z*z*z*z - 20*z*z*z + 12*z*z - 4*z + 1)/(2*(2*z*z + z - 1)) + (6*z*z - 2*z - 1)/(2*(z + 1)*(2*z - 1)), z = [2/3,1] +template +std::vector> poly00122304(const int prec = 10) +{ +return { + create_polyline(0.,1./2,P(1./2,2./3,0.),P(1./2,1.,1./2), + [](double z) { return P(-(-3*z*z + 4*z + (-std::sqrt(3*z*z - 3*z + 1)/(3*(z - 1)) - 1/(3*(z - 1)))*(3*z*z - 6*z + 3) - 2)/(z*(2*z - 1)),-std::sqrt(3*z*z - 3*z + 1)/(3*(z - 1)) - 1/(3*(z - 1)),z); }, + prec), + create_polyline(1./2,1.,P(1./2,1.,1./2),P(1.,1./2,1./2), + [](double x) { return P(x,(2 - x + std::sqrt(x)*std::sqrt(4 - 11*x + 8*x*x))/(2*(1 - x + 2*x*x)),(-3*x + std::sqrt(x)*std::sqrt(4 - 11*x + 8*x*x))/(2*(1 - 5*x + 2*x*x))); }, + prec), + create_polyline(1./2,1.,P(1./2,1./2,1.),P(1.,1./2,1./2), + [](double x) { return P(x,1./2,1/(2*x)); }, + prec), + create_polyline(2./3,1.,P(1./2,0.,2./3),P(1./2,1./2,1.), + [](double z) { return P((-z + (2*z - 1)*(-std::sqrt(12*z*z*z*z - 20*z*z*z + 12*z*z - 4*z + 1)/(2*(2*z*z + z - 1)) + (6*z*z - 2*z - 1)/(2*(z + 1)*(2*z - 1))) + 1)/z,-std::sqrt(12*z*z*z*z - 20*z*z*z + 12*z*z - 4*z + 1)/(2*(2*z*z + z - 1)) + (6*z*z - 2*z - 1)/(2*(z + 1)*(2*z - 1)),z); }, + prec), +}; +} + +//00122314 +// curve 1 : x = [1/2,1], y = (-1 + 2*x)/(-1 + 2*x + x*x), z = 1/(1 + x) +// curve 2 : x = [0,4-21.73205], y = (4 - x - sqrt(4 - 8*x + x*x))/6, z = (-2 + 5*x - x*x + sqrt(4 - 8*x + x*x) - x*sqrt(4 - 8*x + x*x))/(2*x) +// curve 3 : x = [1/2,4-21.73205], y = (4 - x + sqrt(4 - 8*x + x*x))/6, z = (-2 + 5*x - x*x - sqrt(4 - 8*x + x*x) + x*sqrt(4 - 8*x + x*x))/(2*x) +// curve 4 : x = [1/2,1], y = 1/2, z = x/(-1 + 3*x) +// curve 5 : x = [1/2,2/3], y = (-1 + 2*x - x*x)/(-1 + 2*x*x), z = (1 - x)/x +// problem with close polylines, there is an over refinement +template +std::vector> poly00122314(const int prec = 10) +{ +return { + create_polyline(1./2,1.,P(1./2,0.,2./3),P(1.,1./2,1./2), + [](double x) { return P(x,(-1 + 2*x)/(-1 + 2*x + x*x),1/(1 + x)); }, + prec), + create_polyline(0.,4.-2*1.73205,P(0.,1./3,1./2),P(4.-2*1.73205,1/1.73205,(1.73205-1)/2.), + [](double x) { return P(x,(4 - x - std::sqrt(4 - 8*x + x*x))/6,(-2 + 5*x - x*x + std::sqrt(4 - 8*x + x*x) - x*std::sqrt(4 - 8*x + x*x))/(2*x) ); }, + prec), + create_polyline(1./2,4.-2*1.73205,P(1./2,2./3,0.),P(4.-2*1.73205,1/1.73205,(1.73205-1)/2.), + [](double x) { return P(x,(4 - x + std::sqrt(4 - 8*x + x*x))/6,(-2 + 5*x - x*x - std::sqrt(4 - 8*x + x*x) + x*std::sqrt(4 - 8*x + x*x))/(2*x) ); }, + prec), + create_polyline(1./2,1.,P(1./2,1./2,1.),P(1.,1./2,1./2), + [](double x) { return P(x,1./2,x/(-1 + 3*x)); }, + prec), + create_polyline(1./2,2./3,P(1./2,1./2,1.),P(2./3,1.,1./2), + [](double x) { return P(x,(-1 + 2*x - x*x)/(-1 + 2*x*x),(1 - x)/x); }, + prec), +}; +} + +//00122324 +// curve 1 : x = [0,1/2], y = 1/(2 - x), z = (1 - 2*x)/(3 - 5*x + x*x) +// curve 2 : x = [1/2,1], y = (-1 + 2*x)/(x*(1 + x)), z = 1/(1 + x) +// curve 3 : x = [2/3,1], y = 1/2, z = x/(2*(-1 + 2*x) +template +std::vector> poly00122324(const int prec = 10) +{ +return { + create_polyline(0.,1./2,P(0.,1./2,1./3),P(1./2,2./3,0.), + [](double x) { return P(x,1/(2 - x),(1 - 2*x)/(3 - 5*x + x*x)); }, + prec), + create_polyline(1./2,1.,P(1./2,0.,2./3),P(1.,1./2,1./2), + [](double x) { return P(x,(-1 + 2*x)/(x*(1 + x)),1/(1 + x)); }, + prec), + create_polyline(2./3,1.,P(2./3,1./2,1.),P(1.,1./2,1./2), + [](double x) { return P(x,1./2,x/(2*(-1 + 2*x))); }, + prec), + +}; +} + +//00122334 +// curve 1 : x = [1/2,1], y = x/(-1 + 3*x), z = (x*x)/(1 - 3*x + 4*x*x) +// curve 2 : x = [1/3,1/2], y = (1 - 3*x + 3*x*x)/(2 - 6*x + 5*x*x), z = (1 - 3*x + 3*x*x)/(2 - 5*x + 4*x*x) +// curve 3 : x = [1/3,1/2], y = 1/(2 - x), z = (1 - 2*x)/(2 - 4*x + x*x) +// curve 4 : x = [0,1/3], y = 1/(2 - x), z = 1/(2 + x) +// curve 5 : x = [1/3,1/2], y = (-1 + 2*x)/(-1 + x + x*x), z = x/(1 - x + x*x) +// curve 6 : x = [0,1], y = z = 1/2 +template +std::vector> poly00122334(const int prec = 10) +{ +return { + create_polyline(1./2,1.,P(1./2,1.,1/2.),P(1.,1./2,1./2), + [](double x) { return P(x,x/(-1 + 3*x),(x*x)/(1 - 3*x + 4*x*x)); }, + prec), + create_polyline(1./3,1./2,P(1./3,3./5,3./7),P(1./2,1.,1/2.), + [](double x) { return P(x,(1 - 3*x + 3*x*x)/(2 - 6*x + 5*x*x),(1 - 3*x + 3*x*x)/(2 - 5*x + 4*x*x)); }, + prec), + create_polyline(1./3,1./2,P(1./3,3./5,3./7),P(1./2,2./3,0.), + [](double x) { return P(x,1/(2 - x),(1 - 2*x)/(2 - 4*x + x*x)); }, + prec), + create_polyline(0.,1./3,P(0.,1./2,1./2),P(1./3,3./5,3./7), + [](double x) { return P(x,1/(2 - x),1/(2 + x)); }, + prec), + create_polyline(1./3,(3.-2.23606)/2,P(1./3,3./5,3./7),P((3.-2.23606)/2,1./2,1./2), + [](double x) { return P(x,(-1 + 2*x)/(-1 + x + x*x),x/(1 - x + x*x)); }, + prec), + create_polyline((3.-2.23606)/2,1./2,P((3.-2.23606)/2,1./2,1./2),P(1./2,0.,2./3), + [](double x) { return P(x,(-1 + 2*x)/(-1 + x + x*x),x/(1 - x + x*x)); }, + prec), + create_polyline(0.,(3.-2.23606)/2,P(0.,1./2,1./2),P((3.-2.23606)/2,1./2,1./2), + [](double x) { return P(x,1./2,1./2); }, + prec), + create_polyline((3.-2.23606)/2,1.,P((3.-2.23606)/2,1./2,1./2),P(1.,1./2,1./2), + [](double x) { return P(x,1./2,1./2); }, + prec), +}; +} + +//00122344 +// curve 1 : x = [1./2,(2.23606-1.)/2], y = x/(1 + x), z = (x*x)/(-1 + 2*x + x*x) +// curve 2 : x = [(3.-2.23606)/2,1./2], y = (-1 + x)*(-1+x)/(2 - 4*x + x*x), z = (-1 + x)/(-2 + x) +// curve 3 : x = [1./2,(2.23606-1.)/2], y = (-1 + 2*x)/(-1 + 2*x + x*x), z = 1/(1 + x) +// curve 4 : x = [(2.23606-1.)/2,1], y = x/(1 + x), z = 1/(1 + x) +// curve 5 : x = [0.,(3.-2.23606)/2], y = 1/(2 - x), z = (-1 + x)/(-2 + x) +// curve 6 : x = [3.-2.23606)/2,1./2], y = 1/(2 - x), z = (1 - 2*x)/(2 - 4*x + x*x) +// curve 7 : x = [0,1], y = z = 1/2 +// curve 8 : x = z, y = 1-z, z = [(3.-2.23606)/2,(2.23606-1.)/2] +template +std::vector> poly00122344(const int prec = 10) +{ +return { + create_polyline(1./2,(2.23606-1.)/2,P(1./2,1./3,1.),P((2.23606-1.)/2,(3.-2.23606)/2,(2.23606-1.)/2), + [](double x) { return P(x,x/(1 + x),(x*x)/(-1 + 2*x + x*x)); }, + prec), + create_polyline((3.-2.23606)/2,1./2,P((3.-2.23606)/2,(2.23606-1.)/2,(3.-2.23606)/2),P(1./2,1.,1./3), + [](double x) { return P(x,(-1 + x)*(-1+x)/(2 - 4*x + x*x),(-1 + x)/(-2 + x)); }, + prec), + create_polyline(1./2,(2.23606-1.)/2,P(1./2,0.,2./3),P((2.23606-1.)/2,(3.-2.23606)/2,(2.23606-1.)/2), + [](double x) { return P(x,(-1 + 2*x)/(-1 + 2*x + x*x),1/(1 + x)); }, + prec), + create_polyline((2.23606-1.)/2,1.,P((2.23606-1.)/2,(3.-2.23606)/2,(2.23606-1.)/2),P(1.,1./2,1./2), + [](double x) { return P(x,x/(1 + x),1/(1 + x)); }, + prec), + create_polyline(0.,(3.-2.23606)/2,P(0.,1./2,1./2),P((3.-2.23606)/2,(2.23606-1.)/2,(3.-2.23606)/2), + [](double x) { return P(x,1/(2 - x),(-1 + x)/(-2 + x)); }, + prec), + create_polyline((3.-2.23606)/2,1./2,P((3.-2.23606)/2,(2.23606-1.)/2,(3.-2.23606)/2),P(1./2,2./3,0.), + [](double x) { return P(x,1/(2 - x),(1 - 2*x)/(2 - 4*x + x*x)); }, + prec), + create_polyline(0.,1./2,P(0.,1./2,1./2),P(1./2,1./2,1./2), + [](double x) { return P(x,1./2,1./2); }, + prec), + create_polyline(1./2,1.,P(1./2,1./2,1./2),P(1.,1./2,1./2), + [](double x) { return P(x,1./2,1./2); }, + prec), + create_polyline((3.-2.23606)/2,1./2,P((3.-2.23606)/2,(2.23606-1.)/2,(3.-2.23606)/2),P(1./2,1./2,1./2), + [](double z) { return P(z,1-z,z); }, + prec), + create_polyline(1./2,(2.23606-1.)/2,P(1./2,1./2,1./2),P((2.23606-1.)/2,(3.-2.23606)/2,(2.23606-1.)/2), + [](double z) { return P(z,1-z,z); }, + prec), +}; +} + +//00123400 +// curve 1 : x = 1/2, y = [2/3,1], z = (-2 + 3*y)/(-2 + 5*y) +// curve 2 : x = 1/2, y = [0,1/3], z = (2*(-1 + y))/(-3 + 5*y +template +std::vector> poly00123400(const int prec = 10) +{ +return { + create_polyline(2./3,1.,P(1./2,2./3,0.),P(1./2,1.,1./3), + [](double y) { return P(1./2,y,(-2 + 3*y)/(-2 + 5*y)); }, + prec), + create_polyline(0.,1./3,P(1./2,0.,2./3),P(1./2,1./3,1.), + [](double y) { return P(1./2,y,(2*(-1 + y))/(-3 + 5*y)); }, + prec), +}; +} + +//00123401 +// curve 1 : x = [1/2,1], y = x/(1 - 2*x + 3*x*x), z = (-1 + 2*x)/(-1 + 3*x) +// curve 2 : x = [1/2,1], y = (4*x - x*x - sqrt(x)*sqrt(-4 + 12*x - 8*x*x + x*x*x))/(2*(1 + x)), z = (-2 + 2*x + x*x + sqrt(x)*sqrt(-4 + 12*x - 8*x*x + x*x*x))/(2*(-1 + 3*x*x)) +// curve 3 : X = 1/2, y = [0,1/2], z = (2*(-1 + y))/(-3 + 4*y) +template +std::vector> poly00123401(const int prec = 10) +{ +return { + create_polyline(1./2,1.,P(1./2,2./3,0.),P(1.,1./2,1./2), + [](double x) { return P(x,x/(1 - 2*x + 3*x*x),(-1 + 2*x)/(-1 + 3*x)); }, + prec), + create_polyline(1./2,1.,P(1./2,1./2,1.),P(1.,1./2,1./2), + [](double x) { return P(x,(4*x - x*x - std::sqrt(x)*std::sqrt(-4 + 12*x - 8*x*x + x*x*x))/(2*(1 + x)),(-2 + 2*x + x*x + std::sqrt(x)*std::sqrt(-4 + 12*x - 8*x*x + x*x*x))/(2*(-1 + 3*x*x))); }, + prec), + create_polyline(0.,1./2,P(1./2,0.,2./3),P(1./2,1./2,1.), + [](double y) { return P(1./2,y,(2*(-1 + y))/(-3 + 4*y)); }, + prec), +}; +} + +//00123414 +// curve 1 : x = [(2.23606-1)/2,2./3], y = (1 - 2*x)/(-1 + x), z = (-1 + 2*x)/x +// curve 2 : x = [1/2,(2.23606-1)/2], y = 1/(1 + x), z = (-1 + 2*x)/x +// curve 3 : x = [(2.23606-1)/2,1], y = 1/(1+x), z = 1/(2+x) +// curve 4 : x = [(3-2.23606)/2,1./2], y = (-1 + 2*x)/(-1 + x), z = 1/(2 - x) +// curve 5 : x = [0.,(3-2.23606)/2], y = 1/(3-x), z = 1/(2 - x) +// curve 6 : x = y = 1-z, z = [(3-2.23606)/2,(2.23606-1)/2] +// curve 7 : x = [1./3,(3-2.23606)/2], y = (-1 + 2*x)/(-1 + x), z = (1 - 2*x)/x +template +std::vector> poly00123414(const int prec = 10) +{ +return { + create_polyline((2.23606-1)/2,2./3,P((2.23606-1)/2,(2.23606-1)/2,(3-2.23606)/2),P(2./3,1.,1./2), + [](double x) { return P(x,(1 - 2*x)/(-1 + x),(-1 + 2*x)/x); }, + prec), + create_polyline(1./2,(2.23606-1)/2,P(1./2,2./3,0.),P((2.23606-1)/2,(2.23606-1)/2,(3-2.23606)/2), + [](double x) { return P(x,1/(1 + x),(-1 + 2*x)/x); }, + prec), + create_polyline((2.23606-1)/2,1.,P((2.23606-1)/2,(2.23606-1)/2,(3-2.23606)/2),P(1.,1./2,1./3), + [](double x) { return P(x,1/(1+x),1/(2+x)); }, + prec), + create_polyline((3-2.23606)/2,1./2,P((3-2.23606)/2,(3-2.23606)/2,(2.23606-1)/2),P(1./2,0.,2./3), + [](double x) { return P(x,(-1 + 2*x)/(-1 + x),1/(2 - x)); }, + prec), + create_polyline(0.,(3-2.23606)/2,P(0.,1./3,1./2),P((3-2.23606)/2,(3-2.23606)/2,(2.23606-1)/2), + [](double x) { return P(x,1/(3-x),1/(2 - x)); }, + prec), + create_polyline((3-2.23606)/2,(2.23606-1)/2,P((2.23606-1)/2,(2.23606-1)/2,(3-2.23606)/2),P((3-2.23606)/2,(3-2.23606)/2,(2.23606-1)/2), + [](double z) { return P(1-z,1-z,z); }, + prec), + create_polyline(1./3,(3-2.23606)/2,P(1./3,1./2,1.),P((3-2.23606)/2,(3-2.23606)/2,(2.23606-1)/2), + [](double x) { return P(x,(-1 + 2*x)/(-1 + x),(1 - 2*x)/x); }, + prec), +}; +} + +//00123421 +// curve 1 : x = 1/2, y = [2/5,1/2], z = y/(1-y) +// curve 2 : x = 1/2, y = [0,2/5], z = 2/3 +// curve 3 : x = [1/2,1], y = 1/(3 - x), z = 1/(1 + x) +// curve 4 : x = [0,1/2], y = 1/(2 + x), z = 1/(2- x) +// curve 5 : x = [0,1], y = z = 1/2 +// curve 6 : x = 1/2, y = [2/5,2/3], z = (-2 + 3*y)/(2*(-1 + y)) +// curve 7 : x = 1/2, y = [1/2,1], z = 1/2 +template +std::vector> poly00123421(const int prec = 10) +{ +return { + create_polyline(2./5,1./2,P(1./2,2./5,2./3),P(1./2,1./2,1.), + [](double y) { return P(1./2,y,y/(1-y)); }, + prec), + create_polyline(0.,2./5,P(1./2,0.,2./3),P(1./2,2./5,2./3), + [](double y) { return P(1./2,y,2./3); }, + prec), + create_polyline(1./2,1.,P(1./2,2./5,2./3),P(1.,1./2,1./2), + [](double x) { return P(x,1/(3 - x),1/(1 + x)); }, + prec), + create_polyline(0.,1./2,P(0.,1./2,1./2),P(1./2,2./5,2./3), + [](double x) { return P(x,1/(2 + x),1/(2- x)); }, + prec), + create_polyline(0.,1./2,P(0.,1./2,1./2),P(1./2,1./2,1./2), + [](double x) { return P(x,1./2,1./2); }, + prec), + create_polyline(1./2,1.,P(1./2,1./2,1./2),P(1.,1./2,1./2), + [](double x) { return P(x,1./2,1./2); }, + prec), + create_polyline(2./5,1./2,P(1./2,2./5,2./3),P(1./2,1./2,1./2), + [](double y) { return P(1./2,y,(-2 + 3*y)/(2*(-1 + y))); }, + prec), + create_polyline(1./2,2./3,P(1./2,1./2,1./2),P(1./2,2./3,0.), + [](double y) { return P(1./2,y,(-2 + 3*y)/(2*(-1 + y))); }, + prec), + create_polyline(1./2,1.,P(1./2,1./2,1./2),P(1./2,1.,1./2), + [](double y) { return P(1./2,y,1./2); }, + prec), +}; +} + +//00123423 +// curve 1 : x = [0,1/2], y = 1/(2 - x), z = (-1 + 2*x)/(-2 + 3*x) +// curve 2 : x = [1/2,1], y = (-1 + 2*x)/(-1 + 3*x), z = 1/(1 + x) +// curve 3 : x = [0,1], y = z = 1/2 +template +std::vector> poly00123423(const int prec = 10) +{ +return { + create_polyline(0.,1./2,P(0.,1./2,1./2),P(1./2,2./3,0.), + [](double x) { return P(x,1/(2 - x),(-1 + 2*x)/(-2 + 3*x)); }, + prec), + create_polyline(1./2,1.,P(1./2,0.,2./3),P(1.,1./2,1./2), + [](double x) { return P(x,(-1 + 2*x)/(-1 + 3*x),1/(1 + x)); }, + prec), + create_polyline(0.,1.,P(0.,1./2,1./2),P(1.,1./2,1./2), + [](double x) { return P(x,1./2,1./2); }, + prec), +}; +} + +//01101234 +// curve 1 : x = 1/2, y = [1/2,1], z = 1/2y +// curve 2 : x = [1/2,1], y = 1/2, z = 1/2x +// curve 3 : x = ]1/2,1], y = (-2 + 4*x - x*x + sqrt(x)*sqrt(-4 + 16*x - 20*x*x + 9*x*x*x))/(2*(-1 + x + 2*x*x)), z = (-2 + 2*x + 3*x*x - sqrt(x)*sqrt(-4 + 16*x - 20*x*x + 9*x*x*x))/(2*(-1 - x + 4*x*x)) +template +std::vector> poly01101234(const int prec = 10) +{ +return { + create_polyline(1./2,1.,P(1./2,1./2,1.),P(1./2,1.,1./2), + [](double y) { return P(1./2,y,1./(2*y)); }, + prec), + create_polyline(1./2,1.,P(1./2,1./2,1.),P(1.,1./2,1./2), + [](double x) { return P(x,1./2,1./(2*x)); }, + prec), + create_polyline(limit_value(1./2,1.),1.,P(1./2,1.,1./2),P(1.,1./2,1./2), + [](double x) { return P(x,(-2 + 4*x - x*x + std::sqrt(x)*std::sqrt(-4 + 16*x - 20*x*x + 9*x*x*x))/(2*(-1 + x + 2*x*x)),(-2 + 2*x + 3*x*x - std::sqrt(x)*std::sqrt(-4 + 16*x - 20*x*x + 9*x*x*x))/(2*(-1 - x + 4*x*x)) ); }, + prec), +}; +} + +//01102334 +// curve 1 : x = [0,1], y = z = 1/2 +// curve 2 : x = 1/2, y = [0,1], z = 1/2 +// curve 3 : x = [1/2,1], y = x/(-1 + 3*x), z = (-1 + 3*x - x*x)/(-1 + 3*x) +// curve 4 : x = [0,1/2], y = (-1 + 2*x)/(-2 + 3*x), z = (-1 + x + x*x)/(-2 + 3*x) +template +std::vector> poly01102334(const int prec = 10) +{ +return { + create_polyline(1./2,1.,P(1./2,1./2,1./2),P(1.,1./2,1./2), + [](double x) { return P(x,1./2,1./2); }, + prec), + create_polyline(0.,1./2,P(0.,1./2,1./2),P(1./2,1./2,1./2), + [](double x) { return P(x,1./2,1./2); }, + prec), + create_polyline(0.,1./2,P(1./2,1./2,0.),P(1./2,1./2,1./2), + [](double z) { return P(1./2,1./2,z); }, + prec), + create_polyline(0.,1./2,P(1./2,0.,1./2),P(1./2,1./2,1./2), + [](double y) { return P(1./2,y,1./2); }, + prec), + create_polyline(1./2,1.,P(1./2,1./2,1./2),P(1./2,1.,1./2), + [](double y) { return P(1./2,y,1./2); }, + prec), + create_polyline(1./2,1.,P(1./2,1.,1./2),P(1.,1./2,1./2), + [](double x) { return P(x,x/(-1 + 3*x),(-1 + 3*x - x*x)/(-1 + 3*x)); }, + prec), + create_polyline(0.,1./2,P(0.,1./2,1./2),P(1./2,0.,1./2), + [](double x) { return P(x,(-1 + 2*x)/(-2 + 3*x),(-1 + x + x*x)/(-2 + 3*x)); }, + prec), +}; +} + +//01121234 +// curve 1 : x = 1/2, y = [1/2,1], z = 1/2y +// curve 2 : x = [1/2,4/7], y = (3*x - sqrt(-x (-4 + 7*x)))/(2*(-1 + 4*x)), z = (3*x + sqrt(-x*(-4 + 7*x)))/(2*(-1 + 4*x)) +// curve 3 : x = [1/2,4/7], y = (3*x + sqrt(-x (-4 + 7*x)))/(2*(-1 + 4*x)), z = (3*x - sqrt(-x*(-4 + 7*x)))/(2*(-1 + 4*x)) +template +std::vector> poly01121234(const int prec = 10) +{ +return { + create_polyline(1./2,1.,P(1./2,1./2,1.),P(1./2,1.,1./2), + [](double y) { return P(1./2,y,1./(2*y)); }, + prec), + create_polyline(1./2,4./7,P(1./2,1./2,1.),P(4./7,2./3,2./3), + [](double x) { return P(x,(3*x - std::sqrt(-x*(-4 + 7*x)))/(2*(-1 + 4*x)),(3*x + std::sqrt(-x*(-4 + 7*x)))/(2*(-1 + 4*x))); }, + prec), + create_polyline(1./2,4./7,P(1./2,1.,1./2),P(4./7,2./3,2./3), + [](double x) { return P(x,(3*x + std::sqrt(-x*(-4 + 7*x)))/(2*(-1 + 4*x)),(3*x - std::sqrt(-x*(-4 + 7*x)))/(2*(-1 + 4*x))); }, + prec), +}; +} + +//01121340 +// curve 1 : x = ]1/2,1], y = (2 - 3*x + 2*x*x + sqrt(-x*(-4 + 15*x - 20*x*x + 8*x*x*x)))/(2*(1 - 2*x + 3*x*x)), z = (2 - 7*x + 8*x*x - sqrt(-x*(-4 + 15*x - 20*x*x + 8*x*x*x)))/(2*(1 - 5*x + 6*x*x)) +// curve 2 : x = ]1/2,1], y = (2 - 7*x + 8*x*x - sqrt(-x*(-4 + 15*x - 20*x*x + 8*x*x*x)))/(2*(1 - 5*x + 6*x*x)), z = (2 - 3*x + 2*x*x + sqrt(-x*(-4 + 15*x - 20*x*x + 8*x*x*x)))/(2*(1 - 2*x + 3*x*x)) +// curve 3 : x = [0.45016,1/2], y = (3 - 7*x + 5*x*x - sqrt(-3 + 14*x - 21*x*x + 10*x*x*x + x*x*x*x))/(2*(3 - 8*x + 6*x*x)), z = (3 - 7*x + 5*x*x + sqrt(-3 + 14*x - 21*x*x + 10*x*x*x + x*x*x*x))/(2*(3 - 8*x + 6*x*x)) +// curve 4 : x = [(0.45016,1./2], y = (3 - 7*x + 5*x*x + sqrt(-3 + 14*x - 21*x*x + 10*x*x*x + x*x*x*x))/(2*(3 - 8*x + 6*x*x)), z = (3 - 7*x + 5*x*x - sqrt(-3 + 14*x - 21*x*x + 10*x*x*x + x*x*x*x))/(2*(3 - 8*x + 6*x*x)) +template +std::vector> poly01121340(const int prec = 10) +{ +return { + create_polyline(limit_value(1./2,1.),1.,P(1./2,1.,1./2),P(1.,1./2,1./2), + [](double x) { return P(x,(2 - 3*x + 2*x*x + std::sqrt(-x*(-4 + 15*x - 20*x*x + 8*x*x*x)))/(2*(1 - 2*x + 3*x*x)),(2 - 7*x + 8*x*x - std::sqrt(-x*(-4 + 15*x - 20*x*x + 8*x*x*x)))/(2*(1 - 5*x + 6*x*x))); }, + prec), + create_polyline(limit_value(1./2,1.),1.,P(1./2,1./2,1.),P(1.,1./2,1./2), + [](double x) { return P(x,(2 - 7*x + 8*x*x - std::sqrt(-x*(-4 + 15*x - 20*x*x + 8*x*x*x)))/(2*(1 - 5*x + 6*x*x)),(2 - 3*x + 2*x*x + std::sqrt(-x*(-4 + 15*x - 20*x*x + 8*x*x*x)))/(2*(1 - 2*x + 3*x*x))); }, + prec), + create_polyline(0.45016,1./2,P(0.45016,0.702631,0.700106),P(1./2,1./2,1.), + [](double x) { return P(x,(3 - 7*x + 5*x*x - std::sqrt(-3 + 14*x - 21*x*x + 10*x*x*x + x*x*x*x))/(2*(3 - 8*x + 6*x*x)),(3 - 7*x + 5*x*x + std::sqrt(-3 + 14*x - 21*x*x + 10*x*x*x + x*x*x*x))/(2*(3 - 8*x + 6*x*x))); }, + prec), + create_polyline(0.45016,1./2,P(0.45016,0.702631,0.700106),P(1./2,1.,1./2), + [](double x) { return P(x,(3 - 7*x + 5*x*x + std::sqrt(-3 + 14*x - 21*x*x + 10*x*x*x + x*x*x*x))/(2*(3 - 8*x + 6*x*x)),(3 - 7*x + 5*x*x - std::sqrt(-3 + 14*x - 21*x*x + 10*x*x*x + x*x*x*x))/(2*(3 - 8*x + 6*x*x))); }, + prec), +}; +} + +//01121341 +// no curves +// +template +std::vector> poly01121341(const int /*prec*/ = 10) +{ +return { + + +}; +} + +//01122034 +// curve 1 : x = [0,1], y = z = 1/2 +// curve 2 : x = -(-3*z*z + 2*z + (3*z/(2*(4*z - 1)) - sqrt(-z*(7*z - 4))/(2*(4*z - 1)))*(4*z*z - 5*z + 1))/(2*z*z - 2*z + 1), y = 3*z/(2*(4*z - 1)) - sqrt(-z*(7*z - 4))/(2*(4*z - 1)), z = [4/7,1/2] +// curve 3 : x = -(-3*z*z + 2*z + (3*z/(2*(4*z - 1)) + sqrt(-z*(7*z - 4))/(2*(4*z - 1)))*(4*z*z - 5*z + 1))/(2*z*z - 2*z + 1), y = 3*z/(2*(4*z - 1)) + sqrt(-z*(7*z - 4))/(2*(4*z - 1)), z = [4/7,1/2] +// curve 4 : x = 1/2, y = [0,1/2], z = y/(-1 + 3*y) +// curve 5: x = -(z*z/(4*z*z - 3*z + 1) - 1)*(4*z*z - 3*z + 1)/(5*z*z - 4*z + 1), y = z*z/(4*z*z - 3*z + 1), z = [1/2,1] +// problem with close polylines, there is an over refinement +template +std::vector> poly01122034(const int prec = 10) +{ +return { + create_polyline(0.,1.,P(0.,1./2,1./2),P(1.,1./2,1./2), + [](double x) { return P(x,1./2,1./2); }, + prec), + create_polyline(1./2,4./7,P(0.,1./2,1./2),P(2./5,2./3,4./7), + [](double z) { return P(-(-3*z*z + 2*z + (3*z/(2*(4*z - 1)) - std::sqrt(-z*(7*z - 4))/(2*(4*z - 1)))*(4*z*z - 5*z + 1))/(2*z*z - 2*z + 1), 3*z/(2*(4*z - 1)) - std::sqrt(-z*(7*z - 4))/(2*(4*z - 1)),z); }, + prec), + create_polyline(1./2,4./7,P(1./2,1.,1./2),P(2./5,2./3,4./7), + [](double z) { return P(-(-3*z*z+ 2*z + (3*z/(2*(4*z - 1)) + std::sqrt(-z*(7*z - 4))/(2*(4*z - 1)))*(4*z*z - 5*z + 1))/(2*z*z - 2*z + 1),3*z/(2*(4*z - 1)) + std::sqrt(-z*(7*z - 4))/(2*(4*z - 1)),z); }, + prec), + create_polyline(1/2.,1.,P(1/2.,1./2,1.),P(1./2,1.,1./2), + [](double y) { return P(1./2,y,y/(-1 + 3*y)); }, + prec), + create_polyline(1./2,1.,P(1.,1./2,1./2),P(1./2,1./2,1.), + [](double z) { return P(-(z*z/(4*z*z - 3*z + 1) - 1)*(4*z*z - 3*z + 1)/(5*z*z - 4*z + 1), z*z/(4*z*z - 3*z + 1),z); }, + prec), +}; +} + +//01122334 +// curve 1 : x = [0,1], y = z = 1/2 +// curve 2 : x = 1/2, y = [0,1], z = 1/2 +// curve 3 : x = [0,1/2], y = (-1 + 2*x)/(-2 + 3*x), z = (1 - 3*x + 3*x*x)/(2 - 5*x + 4*x*x) +// curve 4 : x = [0,1/2], x'=1-x, y = (-1 + 2*x)/(-2 + 3*x), z = (1 - 3*x + 3*x*x)/(2 - 5*x + 4*x*x) +template +std::vector> poly01122334(const int prec = 10) +{ +return { + create_polyline(0.,1./2,P(0.,1./2,1./2),P(1./2,1./2,1./2), + [](double x) { return P(x,1./2,1./2); }, + prec), + create_polyline(1./2,1.,P(1./2.,1./2,1./2),P(1.,1./2,1./2), + [](double x) { return P(x,1./2,1./2); }, + prec), + create_polyline(0.,1./2,P(1./2,0.,1./2),P(1./2,1./2,1./2), + [](double y) { return P(1./2,y,1./2); }, + prec), + create_polyline(1./2,1.,P(1./2,1./2.,1./2),P(1./2,1.,1./2), + [](double y) { return P(1./2,y,1./2); }, + prec), + create_polyline(0.,1./2,P(0.,1./2,1./2),P(1./2,0.,1./2), + [](double x) { return P(x,(-1 + 2*x)/(-2 + 3*x),(1 - 3*x + 3*x*x)/(2 - 5*x + 4*x*x)); }, + prec), + create_polyline(0.,1./2,P(1.,1./2,1./2),P(1./2,1.,1./2), + [](double x) { return P(1-x,1-(-1 + 2*x)/(-2 + 3*x),1-(1 - 3*x + 3*x*x)/(2 - 5*x + 4*x*x)); }, + prec), +}; +} + +//01122340 +// curve 1 : x = [0,1], y = z = 1/2 +// curve 2 : x = 1/2, y = [0,1], z = 1/2 +// curve 3 : x = [0.,0.36299], y = (-1 + 4*x - sqrt(1 - 4*x*x))/(2*(-2 + 5*x)), z = (1 - x + 2*x*x + sqrt(1 - 4*x*x) - x*sqrt(1 - 4*x*x))/(2*(2 - 3*x + 2*x*x)) +// curve 4 : x = [0.36299,1./2], y = (1 - 3*x + 3*x*x)/(2 - 6*x + 5*x*x), z = (1 - 2*x + x*x)/(2 - 5*x + 4*x*x) +// curve 5 : x = [0.,0.36299], x'=1-x, y = 1-(-1 + 4*x - sqrt(1 - 4*x*x))/(2*(-2 + 5*x)), z = (1 - x + 2*x*x + sqrt(1 - 4*x*x) - x*sqrt(1 - 4*x*x))/(2*(2 - 3*x + 2*x*x)) +// curve 6 : x = [0.36299,1./2], x'= 1-x, y = 1-(1 - 3*x + 3*x*x)/(2 - 6*x + 5*x*x), z = (1 - 2*x + x*x)/(2 - 5*x + 4*x*x) +// curve 7 : x = [0.36299,1./2], y = 1-x, z = -x/(-1 + x) +// curve 8 : x = [1./2,1-0.36299], y = 1-x,(1 - x)/x +// curve 9 : x = [0.36299,1-0.36299], y = 1-x, z = (1 - 3*x + 3*x*x)/(1 - 2*x + 2*x*x) +// problem with close polylines, there is an over refinement +template +std::vector> poly01122340(const int prec = 10) +{ +return { + create_polyline(0.,1./2,P(0.,1./2,1./2),P(1./2,1./2,1./2), + [](double x) { return P(x,1./2,1./2); }, + prec), + create_polyline(1./2,1.,P(1./2.,1./2,1./2),P(1.,1./2,1./2), + [](double x) { return P(x,1./2,1./2); }, + prec), + create_polyline(0.,1./2,P(1./2,0.,1./2),P(1./2,1./2,1./2), + [](double y) { return P(1./2,y,1./2); }, + prec), + create_polyline(1./2,1.,P(1./2,1./2.,1./2),P(1./2,1.,1./2), + [](double y) { return P(1./2,y,1./2); }, + prec), + create_polyline(0.,0.36299,P(0.,1./2,1./2),P(0.36299,0.637,0.569841), + [](double x) { return P(x,(-1 + 4*x - std::sqrt(1 - 4*x*x))/(2*(-2 + 5*x)),(1 - x + 2*x*x + std::sqrt(1 - 4*x*x) - x*std::sqrt(1 - 4*x*x))/(2*(2 - 3*x + 2*x*x))); }, + prec), + create_polyline(0.36299,1./2,P(0.36299,0.637,0.569841),P(1./2,1.,1./2), + [](double x) { return P(x,(1 - 3*x + 3*x*x)/(2 - 6*x + 5*x*x),(1 - 2*x + x*x)/(2 - 5*x + 4*x*x)); }, + prec), + create_polyline(0.,0.36299,P(1.,1./2,1./2),P(1-0.36299,1-0.637,0.569841), + [](double x) { return P(1-x,1-(-1 + 4*x - std::sqrt(1 - 4*x*x))/(2*(-2 + 5*x)),(1 - x + 2*x*x + std::sqrt(1 - 4*x*x) - x*std::sqrt(1 - 4*x*x))/(2*(2 - 3*x + 2*x*x))); }, + prec), + create_polyline(0.36299,1./2,P(1-0.36299,1-0.637,0.569841),P(1./2,0.,1./2), + [](double x) { return P(1-x,1-(1 - 3*x + 3*x*x)/(2 - 6*x + 5*x*x),(1 - 2*x + x*x)/(2 - 5*x + 4*x*x)); }, + prec), + create_polyline(0.36299,1./2,P(0.36299,0.637,0.569841),P(1./2,1./2,1.), + [](double x) { return P(x,1-x,-x/(-1 + x)); }, + prec), + create_polyline(1./2,1-0.36299,P(1./2,1./2,1.),P(1-0.36299,1-0.637,0.569841), + [](double x) { return P(x,1-x,(1 - x)/x); }, + prec), + create_polyline(0.36299,1./2,P(0.36299,0.637,0.569841),P(1./2,1./2,1./2), + [](double x) { return P(x,1-x,(1 - 3*x + 3*x*x)/(1 - 2*x + 2*x*x)); }, + prec), + create_polyline(1./2,1-0.36299,P(1./2,1./2,1./2),P(1-0.36299,1-0.637,0.569841), + [](double x) { return P(x,1-x,(1 - 3*x + 3*x*x)/(1 - 2*x + 2*x*x)); }, + prec), +}; +} + +//01123024 +// curve 1 : x = [0,1], y = z = 1./2 +// curve 2 : x = [1/2,1], y = (-1 + 3*x - x*x)/(-1 + 3*x), z = x/(-1 + 3*x) +// curve 3 : x = [0,1], y = (-1 + 2*x - x*x)/(-2 + 3*x), z = (-1 + x)/(-2 + 3*x) +template +std::vector> poly01123024(const int prec = 10) +{ +return { + create_polyline(0.,1.,P(0.,1./2,1./2),P(1.,1./2,1./2), + [](double x) { return P(x,1./2,1./2); }, + prec), + create_polyline(1./2,1.,P(1./2,1./2,1.),P(1.,1./2,1./2), + [](double x) { return P(x,(-1 + 3*x - x*x)/(-1 + 3*x),x/(-1 + 3*x)); }, + prec), + create_polyline(0.,1./2,P(0.,1./2,1./2),P(1./2,1./2,1.), + [](double x) { return P(x,(-1 + 2*x - x*x)/(-2 + 3*x),(-1 + x)/(-2 + 3*x)); }, + prec), +}; +} + +//01233214 +// curve 1 : x = [0,1], y = z = 1/2 +// curve 2 : x = 1/2, y = [0,1], z = 1/2 +// curve 3 : x = y = 1/2, z = [0,1] +// curve 4 : x = [(2.23606-1)/2,1], y = z = 1/(1 + x) +// curve 5 : x = [1./2,(2.23606-1)/2], y = (1 - x)/x, z = x +// curve 6 : x = [0.,(3-2.23606)/2], y = z = (-1 + x)/(-2 + x) +// curve 7 : x = [(3-2.23606)/2,1./2], y = (-1 + 2*x)/(-1 + x), z = x +// curve 8 : x = y = z = [(3-2.23606)/2,(2.23606-1)/2] +// curve 9 : x = y = [(3-2.23606)/2,1./2], z = (-1 + 2*x)/(-1 + x) +// curve 10 : x = y = [1./2,(2.23606-1)/2], z = (1-x)/x +template +std::vector> poly01233214(const int prec = 10) +{ +return { + create_polyline(0.,1./2,P(0.,1./2,1./2),P(1./2,1./2,1./2), + [](double x) { return P(x,1./2,1./2); }, + prec), + create_polyline(1./2,1.,P(1./2.,1./2,1./2),P(1.,1./2,1./2), + [](double x) { return P(x,1./2,1./2); }, + prec), + create_polyline(0.,1./2,P(1./2,0.,1./2),P(1./2,1./2,1./2), + [](double y) { return P(1./2,y,1./2); }, + prec), + create_polyline(1./2,1.,P(1./2,1./2.,1./2),P(1./2,1.,1./2), + [](double y) { return P(1./2,y,1./2); }, + prec), + create_polyline(0.,1./2,P(1./2,1./2,0.),P(1./2,1./2,1./2), + [](double z) { return P(1./2,1./2,z); }, + prec), + create_polyline(1./2,1.,P(1./2,1./2.,1./2),P(1./2,1./2,1.), + [](double z) { return P(1./2,1./2,z); }, + prec), + create_polyline((2.23606-1)/2,1.,P((2.23606-1)/2,(2.23606-1)/2,(2.23606-1)/2),P(1.,1./2,1./2), + [](double x) { return P(x,1/(1 + x),1/(1 + x)); }, + prec), + create_polyline(1./2,(2.23606-1)/2,P(1./2.,1.,1./2),P((2.23606-1)/2,(2.23606-1)/2,(2.23606-1)/2), + [](double x) { return P(x,(1 - x)/x,x); }, + prec), + create_polyline(0.,(3-2.23606)/2,P(0.,1./2,1./2),P((3-2.23606)/2,(3-2.23606)/2,(3-2.23606)/2), + [](double x) { return P(x,(-1 + x)/(-2 + x),(-1 + x)/(-2 + x)); }, + prec), + create_polyline((3-2.23606)/2,1./2,P((3-2.23606)/2,(3-2.23606)/2,(3-2.23606)/2),P(1./2.,0.,1./2), + [](double x) { return P(x,(-1 + 2*x)/(-1 + x),x); }, + prec), + create_polyline((3-2.23606)/2,1./2,P((3-2.23606)/2,(3-2.23606)/2,(3-2.23606)/2),P(1./2,1./2,1./2), + [](double x) { return P(x,x,x); }, + prec), + create_polyline (1./2,(2.23606-1)/2,P(1./2.,1./2,1./2),P((2.23606-1)/2,(2.23606-1)/2,(2.23606-1)/2), + [](double x) { return P(x,x,x); }, + prec), + create_polyline((3-2.23606)/2,1./2,P((3-2.23606)/2,(3-2.23606)/2,(3-2.23606)/2),P(1./2,1./2,0.), + [](double x) { return P(x,x,(-1 + 2*x)/(-1 + x)); }, + prec), + create_polyline (1./2,(2.23606-1)/2,P(1./2.,1./2,1.),P((2.23606-1)/2,(2.23606-1)/2,(2.23606-1)/2), + [](double x) { return P(x,x,(1 - x)/x); }, + prec), +}; +} + +//00012345 +// curve 1 : x = [0,1/2], y = 1/2x, z = 1/2 +// curve 2 : x = y = 1/2, z = [3/4,1] +// curve 3 : x = [1/2,1], y = 1/2, z = 1 -x/2 +// curve 4 : x = 1/2, y = [1/2,1], z = 1 -y/2 +// curve 5 : x = 1/2, y = [0,1/2], z = (-2 + y)/(-3 + 2*y) +// curve 6 : x = [0,1/2], y =1/2, z = (-2 + x)/(-3 + 2*x) +template +std::vector> poly00012345(const int prec = 10) +{ +return { + create_polyline(3./4,1., P(1./2,1./2,3./4),P(1./2,1./2,1.), + [](double z) { return P(1./2,1./2,z); }, + prec), + create_polyline(1./2,1., P(1./2,1.,1./2),P(1.,1./2,1./2), + [](double x) { return P(x,1./(2*x),1./2); }, + prec), + create_polyline(1./2,1., P(1./2,1./2,3./4),P(1.,1./2,1./2), + [](double x) { return P(x,1./2,1.-x/2); }, + prec), + create_polyline(1./2,1., P(1./2,1./2,3./4),P(1./2,1.,1./2), + [](double y) { return P(1./2,y,1.-y/2); }, + prec), + create_polyline(0.,1./2, P(1./2,0.,2./3),P(1./2,1./2,3./4), + [](double y) { return P(1./2,y,(-2 + y)/(-3 + 2*y)); }, + prec), + create_polyline(0.,1./2, P(0.,1./2,2./3),P(1./2,1./2,3./4), + [](double x) { return P(x,1./2,(-2 + x)/(-3 + 2*x)); }, + prec), +}; +} + +//00112345 +// curve 1 : x = 1/2, y = [0,1], z = 2/3 +// curve 2 : x = y = 1/2, z = [2/3,1] +// curve 2 : x = [0,1/2],y = 1/2, z = 1/(2-x) +// curve 3 : x' = [0,1/2], x = 1-x', y = 1/2, z = 1/(2-x') +template +std::vector> poly00112345(const int prec = 10) +{ +return { + create_polyline(0.,1./2, P(0.,1./2,1./2),P(1./2,1./2,2./3), + [](double x) { return P(x,1./2,1./(2-x)); }, + prec), + create_polyline(0.,1./2, P(1.,1./2,1./2),P(1./2,1./2,2./3), + [](double x) { return P(1-x,1./2,1./(2-x)); }, + prec), + create_polyline(0.,1./2, P(1./2,0.,2./3),P(1./2,1./2,2./3), + [](double y) { return P(1./2,y,2./3); }, + prec), + create_polyline(1./2,1., P(1./2,1./2,2./3),P(1./2,1.,2./3), + [](double y) { return P(1./2,y,2./3); }, + prec), + create_polyline(2./3,1., P(1./2,1./2,2./3),P(1./2,1./2,1.), + [](double z) { return P(1./2,1./2,z); }, + prec), +}; +} + +//00121345 +// curve 1 : x = 1/2, y = [1/2,1], z = y/(-1 + 3*y) +// curve 2 : x = [1/2,(2.23606-1.)/2], y = 1./2, z = (1 - x)/x +// curve 3 : x = [1/2,(2.23606-1.)/2], y = (1 - 2*x)/(1 - 3*x + x*x), z = 1./(x+1) +// curve 4 : x = [(2.23606-1.)/2,1], y = 1./2, z = 1./(x+1) +// curve 5 : x = [(2.23606-1.)/2,1], y = 1./(x+1), z = 1./2 +// curve 6 : x = [1./2,(2.23606-1.)/2], y = 1./(x+1), z = (1 - 2*x)/(1 - 3*x + x*x +// curve 7 : x = [1./2,(2.23606-1.)/2], y = (1 - x)/x, z = 1./2 +// curve 8 : x = [(9-4.12310)/8,(2.23606-1.)/2[, y = -sqrt(-x*(4*x*x - 9*x + 4))/(2*(x*x - x - 1)) + (x - 2)/(2*(x*x - x - 1)), z = -(-x + (-sqrt(-x*(4*x*x - 9*x + 4))/(2*(x*x - x - 1)) + (x - 2)/(2*(x*x - x - 1)))*(x*x - x - 1) + 2)/(x*x - x - 1) +// curve 8 : x = [(9-4.12310)/8,(2.23606-1.)/2[, y = sqrt(-x*(4*x*x - 9*x + 4))/(2*(x*x - x - 1)) + (x - 2)/(2*(x*x - x - 1)), z = -(-x + (sqrt(-x*(4*x*x - 9*x + 4))/(2*(x*x - x - 1)) + (x - 2)/(2*(x*x - x - 1)))*(x*x - x - 1) + 2)/(x*x - x - 1) +template +std::vector> poly00121345(const int prec = 10) +{ +return { + create_polyline(1./2,1., P(1./2,1./2,1.),P(1./2,1.,1./2), + [](double y) { return P(1./2,y,y/(-1 + 3*y) ); }, + prec), + create_polyline(1./2,(2.23606-1.)/2, P(1./2,1./2,1.),P((2.23606-1.)/2,1./2,(2.23606-1.)/2), + [](double x) { return P(x,1./2,(1 - x)/x) ; }, + prec), + create_polyline(1./2,(2.23606-1.)/2, P(1./2,0.,2./3),P((2.23606-1)/2,1./2,(2.23606-1)/2), + [](double x) { return P(x,(1 - 2*x)/(1 - 3*x + x*x),1./(x+1)) ; }, + prec), + create_polyline((2.23606-1.)/2,1.,P((2.23606-1.)/2,1./2,(2.23606-1.)/2), P(1.,1./2,1./2), + [](double x) { return P(x,1./2,1./(x+1)) ; }, + prec), + create_polyline((2.23606-1.)/2,1.,P((2.23606-1.)/2,(2.23606-1.)/2,1./2), P(1.,1./2,1./2), + [](double x) { return P(x,1./(x+1),1./2) ; }, + prec), + create_polyline(1./2,(2.23606-1.)/2, P(1./2,2./3,0.),P((2.23606-1)/2,(2.23606-1)/2,1./2), + [](double x) { return P(x,1./(x+1),(1 - 2*x)/(1 - 3*x + x*x)) ; }, + prec), + create_polyline(1./2,(2.23606-1.)/2, P(1./2,1.,1./2),P((2.23606-1.)/2,(2.23606-1)/2,1./2), + [](double x) { return P(x,(1 - x)/x,1./2) ; }, + prec), + create_polyline((9-4.12310)/8.,limit_value((2.23606-1.)/2,-1),P((9-4.12310)/8.,(4.12310-3)/2.,(4.12310-3)/2.), P((2.23606-1)/2,(2.23606-1)/2,1./2), + [](double x) { return P(x,-std::sqrt(-x*(4*x*x - 9*x + 4))/(2*(x*x - x - 1)) + (x - 2)/(2*(x*x - x - 1)),-(-x + (-std::sqrt(-x*(4*x*x - 9*x + 4))/(2*(x*x - x - 1)) + (x - 2)/(2*(x*x - x - 1)))*(x*x - x - 1) + 2)/(x*x - x - 1)) ; }, + prec), + create_polyline((9-4.12310)/8.,limit_value((2.23606-1.)/2,-1),P((9-4.12310)/8.,(4.12310-3)/2.,(4.12310-3)/2.), P((2.23606-1)/2,1./2,(2.23606-1)/2), + [](double x) { return P(x,std::sqrt(-x*(4*x*x - 9*x + 4))/(2*(x*x - x - 1)) + (x - 2)/(2*(x*x - x - 1)),-(-x + (std::sqrt(-x*(4*x*x - 9*x + 4))/(2*(x*x - x - 1)) + (x - 2)/(2*(x*x - x - 1)))*(x*x - x - 1) + 2)/(x*x - x - 1)) ; }, + prec), +}; +} + +//00122345 +// curve 1 : x = [0,1/2], y = 1./(2-x), z = (1 - 2*x)/(2 - 4*x + x*x) +// curve 2 : x = [1/2,1], y = (-1 + 2*x)/(-1 + 2*x + x*x), z = 1./(1+x) +// curve 3 : x = [1/2,1], y = 1./2, z = x/(-1 + 3*x) +// curve 4 : x = 1/2, y = [1/2,1], z = y/(-1 + 3*y) +// curve 5 : x = [0,1/2], y = (-1 + x)/(-2 + 3*x), z = 1./2 +// problem with close polylines, there is an over refinement +template +std::vector> poly00122345(const int prec = 10) +{ +return { + create_polyline(0.,1./2, P(0.,1./2,1./2),P(1./2,2./3,0.), + [](double x) { return P(x,1./(2-x),(1 - 2*x)/(2 - 4*x + x*x)); }, + prec), + create_polyline(1./2,1., P(1./2,0.,2./3),P(1.,1./2,1./2), + [](double x) { return P(x,(-1 + 2*x)/(-1 + 2*x + x*x),1./(1+x)); }, + prec), + create_polyline(1./2,1., P(1./2,1./2,1.),P(1.,1./2,1./2), + [](double x) { return P(x,1./2,x/(-1 + 3*x)); }, + prec), + create_polyline(1./2,1., P(1./2,1./2,1.),P(1./2,1.,1./2), + [](double y) { return P(1./2,y,y/(-1 + 3*y)); }, + prec), + create_polyline(0.,1./2, P(0.,1./2,1./2),P(1./2,1.,1./2), + [](double x) { return P(x,(-1 + x)/(-2 + 3*x),1./2); }, + prec), +}; +} + +//00123405 +// curve 1 : x = 1/2, y = [2/3,1], z = (-2 + 3*y)/(2*(-1 + 2*y)) +// curve 2 : x = [1/2,1], y = 1./(2*x), z = 1./2 +// curve 3 : x = [1/2,1], y = 1./2, z = 1./(2*x) +// curve 4 : x = 1/2, y = [0,1/2], z = (2*(-1 + y))/(-3 + 4*y) +template +std::vector> poly00123405(const int prec = 10) +{ +return { + create_polyline(2./3.,1., P(1./2,2./3,0.),P(1./2,1.,1./2), + [](double y) { return P(1./2,y,(-2 + 3*y)/(2*(-1 + 2*y))); }, + prec), + create_polyline(1./2.,1., P(1./2,1.,1./2.),P(1.,1./2,1./2), + [](double x) { return P(x,1./(2*x),1./2); }, + prec), + create_polyline(1./2.,1., P(1./2,1./2.,1.),P(1.,1./2,1./2), + [](double x) { return P(x,1./2,1./(2*x)); }, + prec), + create_polyline(0.,1./2, P(1./2,0.,2./3),P(1./2,1./2,1.), + [](double y) { return P(1./2,y,(2*(-1 + y))/(-3 + 4*y)); }, + prec), +}; +} + +//00123415 +// curve 1 : x = 1/2, y = [0,2/5], z = 2/3 +// curve 2 : x = [0,1/2], y = 1./(3-x), z = 1./(2-x) +// curve 3 : x = [1./2,(2.23606-1)/2], y = -x/(-1 - x + x*x), z = 1./(x+1) +// curve 4 : x = [(2.23606-1)/2.,1], y = 1./2, z = 1./(x+1) +// curve 5 : x = [(2.23606-1)/2.,2./3], y = (1 - 2*x)/(1. - 3*x + x*x), z = (1. - x)/x +// curve 6 : x = [2/3,1], y = 1./(x+1), z = 1./2 +// curve 7 : x = [1/2,2/3], y = 1./(x+1), z = (2*x-1.)/x +// curve 8 : x = 2/3, y = [3/5,1], z = 1/2 +// curve 9 : x = [1/2,(2.23606-1)/2], y = 1/2, z = (1. - x)/x +// curve 10 : x = 1/2, y = [2/5,1/2], z = y/(1.-y) +template +std::vector> poly00123415(const int prec = 10) +{ +return { + create_polyline(0.,2./5, P(1./2,0.,2./3),P(1./2,2./5,2./3), + [](double y) { return P(1./2,y,2./3); }, + prec), + create_polyline(0.,1./2, P(0.,1./3,1./2),P(1./2,2./5,2./3), + [](double x) { return P(x,1./(3-x),1./(2-x)); }, + prec), + create_polyline(1./2,(2.23606-1)/2., P(1./2,2./5,2./3),P((2.23606-1)/2.,1./2,(2.23606-1)/2.), + [](double x) { return P(x,-x/(-1 - x + x*x),1./(x+1)); }, + prec), + create_polyline((2.23606-1)/2.,1., P((2.23606-1)/2.,1./2,(2.23606-1)/2.),P(1.,1./2,1./2), + [](double x) { return P(x,1./2,1./(x+1)); }, + prec), + create_polyline((2.23606-1)/2.,2./3, P((2.23606-1)/2.,1./2,(2.23606-1)/2.),P(2./3,3./5,1./2), + [](double x) { return P(x,(1 - 2*x)/(1. - 3*x + x*x),(1. - x)/x); }, + prec), + create_polyline(2./3,1., P(2./3,3./5,1./2),P(1.,1./2,1./2), + [](double x) { return P(x,1./(x+1),1./2); }, + prec), + create_polyline(1./2,2./3,P(1./2,2./3,0.), P(2./3,3./5,1./2), + [](double x) { return P(x,1./(x+1),(2*x-1.)/x); }, + prec), + create_polyline(3./5,1., P(2./3,3./5,1./2),P(2./3,1.,1./2), + [](double y) { return P(2./3,y,1./2); }, + prec), + create_polyline(1./2.,(2.23606-1)/2., P(1./2,1./2,1.), P((2.23606-1)/2.,1./2,(2.23606-1)/2.), + [](double x) { return P(x,1./2,(1. - x)/x); }, + prec), + create_polyline(2./5,1./2, P(1./2,2./5,2./3),P(1./2,1./2,1.), + [](double y) { return P(1./2,y,y/(1.-y)); }, + prec), +}; +} + +//00123425 +// curve 1 : x = 1/2, y = [0,2/5], z = 2/3 +// curve 2 : x = [1/2,1], y = x/(1.+x*x), z = 1./(x+1) +// curve 3 : x = [0,1/2], y = 1/(2 + x), z = 1/(2 - x) +// curve 4 : x = [0,1/2], y = 1/(2 - x), z = (-1 + 2*x)/(-2 + 3*x) +// curve 5 : x = [1/2,1], y = 1/2, z = x/(-1 + 3*x) +// curve 6 : x = 1/2, y = [2/5,1/2], z = y/(1.-y) +// problem with close polylines, there is an over refinement + +template +std::vector> poly00123425(const int prec = 10) +{ +return { + create_polyline(0.,2./5, P(1./2,0.,2./3),P(1./2,2./5,2./3), + [](double y) { return P(1./2,y,2./3); }, + prec), + create_polyline(1./2,1., P(1./2,2./5,2./3),P(1.,1./2,1./2), + [](double x) { return P(x,x/(1.+x*x),1./(x+1)); }, + prec), + create_polyline(0.,1./2, P(0.,1./2,1./2),P(1./2,2./5,2./3), + [](double x) { return P(x,1/(2 + x),1/(2 - x)); }, + prec), + create_polyline(0.,1./2, P(0.,1./2,1./2),P(1./2,2./3,0.), + [](double x) { return P(x,1/(2 - x),(-1 + 2*x)/(-2 + 3*x)); }, + prec), + create_polyline(1./2,1., P(1./2,1./2,1.),P(1.,1./2,1./2), + [](double x) { return P(x,1./2,x/(-1 + 3*x)); }, + prec), + create_polyline(2./5,1./2, P(1./2,2./5,2./3),P(1./2,1./2,1.), + [](double y) { return P(1./2,y,y/(1.-y)); }, + prec), +}; +} + +//00123455 +// curve 1 : x = 1./2, y = [2/3,1], z = 1./3 +// curve 2 : x = 1./2, y = [0,1/3], z = 2./3 +// curve 3 : x = 1./2, y = 1./3, z = [2/3,1] +// curve 4 : x = 1./2, y = 2./3, z = [0,1/3] +// curve 5 : x = [1/2,1], y = 1./(1+x), z = x/(1.+x) +// curve 6 : x = 1-x',1./(1+x'),x'/(1.+x'), x' = [1/2,1] +// curve 7 : x = 1-x', 1 - 1./(1+x'),1 - x'/(1.+x'), x' = [1/2,1] +// curve 8 : x = [1/2,1], y = 1 - 1./(1+x), z = 1 - x/(1.+x) +template +std::vector> poly00123455(const int prec = 10) +{ +return { + create_polyline(2./3.,1., P(1./2,2./3,1./3),P(1./2,1.,1./3), + [](double y) { return P(1./2,y,1./3); }, + prec), + create_polyline(0.,1./3., P(1./2,0.,2./3),P(1./2,1./3,2./3), + [](double y) { return P(1./2,y,2./3); }, + prec), + create_polyline(2./3.,1., P(1./2,1./3,2./3),P(1./2,1./3,1.), + [](double z) { return P(1./2,1./3,z); }, + prec), + create_polyline(0.,1./3., P(1./2,2./3,0.),P(1./2,2./3,1./3), + [](double z) { return P(1./2,2./3,z); }, + prec), + create_polyline(1/2.,1., P(1./2,2./3,1./3),P(1.,1./2,1./2), + [](double x) { return P(x,1./(1+x),x/(1.+x)); }, + prec), + create_polyline(1/2.,1., P(1./2,2./3,1./3),P(0.,1./2,1./2), + [](double x) { return P(1-x,1./(1+x),x/(1.+x)); }, + prec), + create_polyline(1/2.,1., P(1./2,1./3,2./3),P(0.,1./2,1./2), + [](double x) { return P(1-x,1-1./(1+x),1- x/(1.+x)); }, + prec), + create_polyline(1/2.,1., P(1./2,1./3,2./3),P(1.,1./2,1./2), + [](double x) { return P(x,1- 1./(1+x),1- x/(1.+x)); }, + prec), +}; +} + +//01102345 +// curve 1 : x = y = 1/2, z = [0,1] +// curve 2 : x = 1./2, y = [0,1/2], z = 1./(2-y) +// curve 3 : x = [0,1/2], y = 1/2, z = 1./(2-x) +// curve 4 : x = 1./2, y = 1-y', z = 1./(2-y'), y' = [0,1/2] +// curve 5 : x = 1-x', y = 1/2, z = 1./(2-x'), x' = [0,1/2] +template +std::vector> poly01102345(const int prec = 10) +{ +return { + create_polyline(0.,2./3., P(1./2,1./2,0.),P(1./2,1./2,2./3), + [](double z) { return P(1./2,1./2,z); }, + prec), + create_polyline(2./3.,1., P(1./2,1./2,2./3.),P(1./2,1./2,1.), + [](double z) { return P(1./2,1./2,z); }, + prec), + create_polyline(0.,1./2, P(1./2,0.,1./2),P(1./2,1./2,2./3), + [](double y) { return P(1./2,y,1./(2-y)); }, + prec), + create_polyline(0.,1./2, P(0.,1./2,1./2),P(1./2,1./2,2./3), + [](double x) { return P(x,1./2,1./(2-x)); }, + prec), + create_polyline(0.,1./2, P(1./2,1.,1./2),P(1./2,1./2,2./3), + [](double y) { return P(1./2,1-y,1./(2-y)); }, + prec), + create_polyline(0.,1./2, P(1.,1./2,1./2),P(1./2,1./2,2./3), + [](double x) { return P(1-x,1./2,1./(2-x)); }, + prec), +}; +} + +//01121345 +// curve 1 : x = [1/2,1], y = 1/2x, z = 1/2 +// curve 2 : x = [1/2,1], y = 1/2, z = 1/2x +// curve 3 : x = 1/2, y = [1/2,1], z = 1/2y +template +std::vector> poly01121345(const int prec = 10) +{ +return { + create_polyline(1./2,1., P(1./2,1.,1./2),P(1.,1./2,1./2), + [](double x) { return P(x,1./(2*x),1./2); }, + prec), + create_polyline(1./2,1., P(1./2,1./2,1.),P(1.,1./2,1./2), + [](double x) { return P(x,1./2,1./(2*x)); }, + prec), + create_polyline(1./2,1., P(1./2,1./2,1.),P(1./2,1.,1./2), + [](double y) { return P(1./2,y,1./(2*y)); }, + prec), +}; +} + +//01122345 +// curve 1 : x = [1/2,1], y = (x*(-1 + 2*x))/(1 - 4*x + 5*x*x), z = x*x/(1 - 3*x + 4*x*x) +// curve 2 : x = (x'*(-1 + 2*x'))/(1 - 4*x' + 5*x'*x'),y = x',z = x'*x'/(1 - 3*x' + 4*x'*x'), x'= [1/2,1] +// curve 3 : x = 1./2,y = [1/2,1], z = y/(-1 + 3*y) +// curve 4 : x = [1/2,1], y = 1./2, z = x/(-1 + 3*x) +// curve 5 : x = [0,1/2], y = (-1 + 2*x)/(-2 + 3*x), z = (1 - 3*x + 3*x*x)/(2 - 5*x + 4*x*x) +// problem with close polylines, there is an over refinement +template +std::vector> poly01122345(const int prec = 10) +{ +return { + create_polyline(1./2,1., P(1./2,0.,1./2),P(1.,1./2,1./2), + [](double x) { return P(x,(x*(-1 + 2*x))/(1 - 4*x + 5*x*x),x*x/(1 - 3*x + 4*x*x)); }, + prec), + create_polyline(1./2,1.,P(0.,1./2,1./2), P(1./2,1.,1./2), + [](double x) { return P((x*(-1 + 2*x))/(1 - 4*x + 5*x*x),x,x*x/(1 - 3*x + 4*x*x)); }, + prec), + create_polyline(1./2,1., P(1./2,1./2,1.),P(1./2,1.,1./2), + [](double y) { return P(1./2,y,y/(-1 + 3*y)); }, + prec), + create_polyline(1./2,1., P(1./2,1./2,1.),P(1.,1./2,1./2), + [](double x) { return P(x,1./2,x/(-1 + 3*x)); }, + prec), + create_polyline(0.,1./2, P(0.,1./2,1./2),P(1./2,0.,1./2), + [](double x) { return P(x,(-1 + 2*x)/(-2 + 3*x),(1 - 3*x + 3*x*x)/(2 - 5*x + 4*x*x)); }, + prec), +}; +} + +//01123045 +// curve 1 : x = [0,1/2], y = 1/2, z = (-1 + x)/(-2 + 3*x) +// curve 2 : x = 1/2, y = [1/2,(2.23606-1.)/2], z = (1 - y)/y +// curve 3 : x = (2*z*z - 3*z + 1)/(5*z*z - 5*z + 1), y = (-z*z + 2*z - 1)/(2*z*z - 1), z = [1/2,(2.23606-1.)/2] +// curve 4 : x = [(2.23606-1.)/2,1], y = (-2 + 5*x - sqrt(4 - 8*x + 5*x*x))/(2*(-3 + 5*x)), z = (-2 + 4*x - x*x + x*sqrt(4 - 8*x + 5*x*x))/(2*(-1 + 2*x + x*x)) +// curve 5 : x =[1/2,1], y = x/(-1 + 3*x), z = 1./2 +// curve 6 : x = 1/2, y = [(2.23606-1.)/2,1], z = 1./(y+1) +// problem with close polylines, there is an over refinement +template +std::vector> poly01123045(const int prec = 10) +{ +return { + create_polyline(0.,1./2, P(0.,1./2,1./2),P(1./2,1./2,1.), + [](double x) { return P(x,1./2,(-1 + x)/(-2 + 3*x)); }, + prec), + create_polyline(1./2,(2.23606-1.)/2, P(1./2,1./2,1.),P(1./2,(2.23606-1.)/2,(2.23606-1.)/2), + [](double y) { return P(1./2,y,(1 - y)/y); }, + prec), + create_polyline(1./2,(2.23606-1.)/2, P(0.,1./2,1./2),P(1./2,(2.23606-1.)/2,(2.23606-1.)/2), + [](double z) { return P((2*z*z - 3*z + 1)/(5*z*z - 5*z + 1),(-z*z + 2*z - 1)/(2*z*z - 1),z); }, + prec), + create_polyline((2.23606-1.)/2,1.,P(1./2,(2.23606-1.)/2,(2.23606-1.)/2), P(1.,1./2,1./2), + [](double x) { return P(x,(-2 + 5*x - std::sqrt(4 - 8*x + 5*x*x))/(2*(-3 + 5*x)),(-2 + 4*x - x*x + x*std::sqrt(4 - 8*x + 5*x*x))/(2*(-1 + 2*x + x*x)) ); }, + prec), + create_polyline(1./2,1., P(1./2,1.,1./2),P(1.,1./2,1./2), + [](double x) { return P(x,x/(-1 + 3*x),1./2); }, + prec), + create_polyline((2.23606-1.)/2,1., P(1./2,(2.23606-1.)/2,(2.23606-1.)/2),P(1./2,1.,1./2), + [](double y) { return P(1./2,y,1./(y+1)); }, + prec), +}; +} + +//01123445 +// curve 1 : x= [0,1/2], y = (-1 + 2*x)/(-2 + 3*x), z = 1./2 +// curve 2 : x = 1- x', y = 1- (-1 + 2*x')/(-2 + 3*x'), z = 1./2, x' = [0,1/2] +template +std::vector> poly01123445(const int prec = 10) +{ +return { + create_polyline(0.,1./2, P(0.,1./2,1./2),P(1./2,0.,1./2), + [](double x) { return P(x,(-1 + 2*x)/(-2 + 3*x),1./2); }, + prec), + create_polyline(0.,1./2, P(1.,1./2,1./2),P(1./2,1.,1./2), + [](double x) { return P(1-x,1-(-1 + 2*x)/(-2 + 3*x),1./2); }, + prec), + +}; +} + +//01123453 +// curve 1 : x = [0,1/2], y = (-1 + 2*x)/(-2 + 3*x), z = (-1 + 2*x - x*x)/(-2 + 3*x) +// curve 2 : x = 1-x', y = 1-(-1 + 2*x')/(-2 + 3*x'), z = (-1 + 2*x' - x'*x')/(-2 + 3*x'), x'= [0,1/2] +// curve 3 : x = 1-x', y = (-1 + 2*x')/(-2 + 3*x'), z = 1-(-1 + 2*x' - x'*x')/(-2 + 3*x'), x'= [0,1/2] +// curve 4 : x = x', y = 1-(-1 + 2*x')/(-2 + 3*x'), z = 1-(-1 + 2*x' - x'*x')/(-2 + 3*x'), x'= [0,1/2] +template +std::vector> poly01123453(const int prec = 10) +{ +return { + create_polyline(0.,1./2, P(0.,1./2,1./2),P(1./2,0.,1./2), + [](double x) { return P(x,(-1 + 2*x)/(-2 + 3*x),(-1 + 2*x - x*x)/(-2 + 3*x)); }, + prec), + create_polyline(0.,1./2, P(1.,1./2,1./2),P(1./2,1.,1./2), + [](double x) { return P(1-x,1-(-1 + 2*x)/(-2 + 3*x),(-1 + 2*x - x*x)/(-2 + 3*x)); }, + prec), + create_polyline(0.,1./2, P(1.,1./2,1./2),P(1./2,0.,1./2), + [](double x) { return P(1-x,(-1 + 2*x)/(-2 + 3*x),1-(-1 + 2*x - x*x)/(-2 + 3*x)); }, + prec), + create_polyline(0.,1./2, P(0.,1./2,1./2),P(1./2,1.,1./2), + [](double x) { return P(x,1-(-1 + 2*x)/(-2 + 3*x),1-(-1 + 2*x - x*x)/(-2 + 3*x)); }, + prec), +}; +} + +//01233245 +// curve 1 : x = 1./2, y = (2*z - 1)/(3*z - 2), z = [0,1/2] +// curve 2 : x = 1./2, y = 1-(2*z' - 1)/(3*z' - 2), z = 1-z', z' = [0,1/2] +// curve 3 : x = (z*z + z*(3*z - 2) - 4*z + 2)/(2*(z - 1)*(z-1)), y = z, z = [1/3,1/2] +// curve 4 : x = 1-(z'*z' + z'*(3*z' - 2) - 4*z' + 2)/(2*(z' - 1)*(z'-1)), y = z', z = z' = [1/3,1/2] +// curve 5 : x = 1-(z'*z' + z'*(3*z' - 2) - 4*z' + 2)/(2*(z' - 1)*(z'-1)), y = 1-z', z = 1-z', z' = [1/3,1/2] +// curve 6 : x = (z'*z' + z'*(3*z' - 2) - 4*z' + 2)/(2*(z' - 1)*(z'-1)), y = 1-z', z = 1-z', z' = [1/3,1/2] +// curve 7 : x = 1./2, y = z = [1/3,2/3] +template +std::vector> poly01233245(const int prec = 10) +{ +return { + create_polyline(0.,1./3, P(1./2,1./2,0.),P(1./2,1./3,1./3), + [](double z) { return P(1./2, (2*z - 1)/(3*z - 2),z); }, + prec), + create_polyline(1./3,1./2, P(1./2,1./3,1./3),P(1./2,0.,1./2), + [](double z) { return P(1./2, (2*z - 1)/(3*z - 2),z); }, + prec), + create_polyline(1/3.,1./2, P(1./2,2/3.,2./3),P(1./2,1.,1./2), + [](double z) { return P(1./2, 1-(2*z - 1)/(3*z - 2),1-z); }, + prec), + create_polyline(0.,1./3, P(1./2,1./2,1.),P(1./2,2/3.,2./3), + [](double z) { return P(1./2, 1-(2*z - 1)/(3*z - 2),1-z); }, + prec), + create_polyline(1./3,1./2, P(1./2,1./3,1./3),P(0.,1./2,1./2), + [](double z) { return P( (z*z + z*(3*z - 2) - 4*z + 2)/(2*(z - 1)*(z-1)),z,z); }, + prec), + create_polyline(1./3,1./2, P(1./2,1./3,1./3),P(1.,1./2,1./2), + [](double z) { return P( 1-(z*z + z*(3*z - 2) - 4*z + 2)/(2*(z - 1)*(z-1)),z,z); }, + prec), + create_polyline(1./3,1./2, P(1./2,2./3,2./3),P(1.,1./2,1./2), + [](double z) { return P( 1-(z*z + z*(3*z - 2) - 4*z + 2)/(2*(z - 1)*(z-1)),1-z,1-z); }, + prec), + create_polyline(1./3,1./2, P(1./2,2./3,2./3),P(0.,1./2,1./2), + [](double z) { return P( (z*z + z*(3*z - 2) - 4*z + 2)/(2*(z - 1)*(z-1)),1-z,1-z); }, + prec), + create_polyline(1./3,2./3, P(1./2,1./3,1./3),P(1./2,2./3,2./3), + [](double z) { return P(1./2,z,z); }, + prec), +}; +} + +//00123456 +// curve 1 : x = [0,1/2], y = 1./2, z = 1./(2-x) +// curve 2 : x' = [0,1/2], x = 1-x y = 1./2, z = 1./(2-x') +// curve 3 : x = [0,1/2], y = 1./(2-x), z = 1./2 +// curve 4 : x' = [0,1/2], x = 1-x, y = 1./(2-x), z = 1./2 +// curve 5 : x = 1./2, y = 2./3, z = [0,1/2] +// curve 6 : x = 1./2, y = [0,1/2], z = 2./3 +// curve 7 : x = 1./2, y = [2/3,1], z = 1./2 +// curve 8 : x = 1./2, y = 1./2, z = [2/3,1] +// curve 9 : x = 1./2, y = [1/2,2/3], z = (2*(-1 + y))/(-2 + y) +template +std::vector> poly00123456(const int prec = 10) +{ +return { + create_polyline(0.,1./2, P(0.,1./2,1./2),P(1./2,1./2,2./3), + [](double x) { return P(x,1./2,1./(2-x)); }, + prec), + create_polyline(0.,1./2, P(1.,1./2,1./2),P(1./2,1./2,2./3), + [](double x) { return P(1-x,1./2,1./(2-x)); }, + prec), + create_polyline(0.,1./2, P(0.,1./2,1./2),P(1./2,2./3,1./2), + [](double x) { return P(x,1./(2-x),1./2); }, + prec), + create_polyline(0.,1./2, P(1.,1./2,1./2),P(1./2,2./3,1./2), + [](double x) { return P(1-x,1./(2-x),1./2); }, + prec), + create_polyline(0.,1./2, P(1./2,2./3,0.),P(1./2,2./3,1./2), + [](double z) { return P(1./2,2./3,z); }, + prec), + create_polyline(0.,1./2, P(1./2,0.,2./3),P(1./2,1./2,2./3), + [](double y) { return P(1./2,y,2./3); }, + prec), + create_polyline(2./3,1., P(1./2,2/3.,1./2),P(1./2,1.,1./2), + [](double y) { return P(1./2,y,1./2); }, + prec), + create_polyline(2./3,1., P(1./2,1./2,2/3.),P(1./2,1./2,1.), + [](double z) { return P(1./2,1./2,z); }, + prec), + create_polyline(1./2,2./3, P(1./2,1./2,2/3.),P(1./2,2./3,1./2), + [](double y) { return P(1./2,y,(2*(-1 + y))/(-2 + y)); }, + prec), +}; +} + +//01123456 +// curve 1 : x = [0,1/2], y = 1./2, z = 1./(2-x) +// curve 2 : x = 1-x', y = 1./2, z = 1./(2-x'), x' = [0,1/2] +// curve 3 : x = 1./2, y = [1/2,1], z = 1./(1+y) +// curve 4 : x = 1./2, y = 1-y', z = 1./(1+y'), y' = [1/2,1] +// curve 5 : x = [0,1/2], y = (-1 + 2*x)/(-2 + 3*x), z = 1./2 +// curve 6 : x = 1-x', y = 1-(-1 + 2*x')/(-2 + 3*x'), z = 1./2 +// curve 7 : x = 1./2, y = 1./2, z = [2/3,1] +template +std::vector> poly01123456(const int prec = 10) +{ +return { + create_polyline(0.,1./2, P(0.,1./2,1./2),P(1./2,1./2,2./3), + [](double x) { return P(x,1./2,1./(2-x)); }, + prec), + create_polyline(0.,1./2, P(1.,1./2,1./2),P(1./2,1./2,2./3), + [](double x) { return P(1-x,1./2,1./(2-x)); }, + prec), + create_polyline(1./2,1.,P(1./2,1./2,2./3),P(1./2,1.,1./2), + [](double y) { return P(1./2,y,1./(1+y)); }, + prec), + create_polyline(1./2,1.,P(1./2,1./2,2./3),P(1./2,0.,1./2), + [](double y) { return P(1./2,1-y,1./(1+y)); }, + prec), + create_polyline(0.,1./2, P(0.,1./2,1./2),P(1./2,0.,1./2), + [](double x) { return P(x,(-1 + 2*x)/(-2 + 3*x),1./2); }, + prec), + create_polyline(0.,1./2, P(1.,1./2,1./2),P(1./2,1.,1./2), + [](double x) { return P(1-x,1-(-1 + 2*x)/(-2 + 3*x),1./2); }, + prec), + create_polyline(2./3,1., P(1./2,1./2,2./3),P(1./2,1./2,1.), + [](double z) { return P(1./2,1./2,z); }, + prec), +}; +} + +//01233456 +// curve 1 : x = [0,1/2], y = (-1 + x)/(-2 + 3*x), z = 1./2 +// curve 2 : x = 1-x', y = 1-(-1 + x')/(-2 + 3*x'), z = 1./2, x' = [0,1/2] +// curve 3 : x = [1/2,1], y = 1./2, z = x/(-1 + 3*x) +// curve 4 : x = 1-x',1./2,1-(x'/(-1 + 3*x')), x'= [1/2,1] +// curve 5 : x = 1./2, y = [1/2,1], z = y/(3*y-1) +// curve 6 : x = 1./2, y = 1-y', z = 1 -(y'/(3*y'-1)), y'= [1/2,1] +template +std::vector> poly01233456(const int prec = 10) +{ +return { + create_polyline(0.,1./2, P(0.,1./2,1./2),P(1./2,1.,1./2), + [](double x) { return P(x,(-1 + x)/(-2 + 3*x),1./2); }, + prec), + create_polyline(0.,1./2, P(1.,1./2,1./2),P(1./2,0.,1./2), + [](double x) { return P(1-x,1-(-1 + x)/(-2 + 3*x),1./2); }, + prec), + create_polyline(1./2,1., P(1./2,1./2,1.),P(1.,1./2.,1./2), + [](double x) { return P(x,1./2,x/(-1 + 3*x)); }, + prec), + create_polyline(1./2,1., P(1./2,1./2,0.),P(0.,1./2.,1./2), + [](double x) { return P(1-x,1./2,1-(x/(-1 + 3*x))); }, + prec), + create_polyline(1./2,1., P(1./2,1./2,1.),P(1./2,1.,1./2), + [](double y) { return P(1./2,y,y/(3*y-1)); }, + prec), + create_polyline(1./2,1., P(1./2,1./2,0.),P(1./2,0.,1./2), + [](double y) { return P(1./2,1-y,1 -(y/(3*y-1))); }, + prec), +}; +} + +//01234567 +// curve 1 : x =[0,1], y = z = 1/2 +// curve 2 : y =[0,1], x = z = 1/2 +// curve 3 : z =[0,1], y = x = 1/2 +template +std::vector> poly01234567(const int prec = 10) +{ +return { + create_polyline(0.,1./2, P(0.,1./2,1./2),P(1./2,1./2,1./2), + [](double x) { return P(x,1./2,1./2); }, + prec), + create_polyline(1./2,1., P(1./2,1./2,1./2),P(1.,1./2,1./2), + [](double x) { return P(x,1./2,1./2); }, + prec), + create_polyline(0.,1./2, P(1./2,0.,1./2),P(1./2,1./2,1./2), + [](double y) { return P(1./2,y,1./2); }, + prec), + create_polyline(1./2,1., P(1./2,1./2,1./2),P(1./2,1.,1./2), + [](double y) { return P(1./2,y,1./2); }, + prec), + create_polyline(0.,1./2, P(1./2,1./2,0.),P(1./2,1./2,1./2), + [](double z) { return P(1./2,1./2,z); }, + prec), + create_polyline(1./2,1., P(1./2,1./2,1./2),P(1./2,1./2,1.), + [](double z) { return P(1./2,1./2,z); }, + prec), + + +}; +} + +// Cube (begin definition) +using Cube = std::array; + +inline constexpr Cube convert_to_cube(unsigned int n) { + #if !defined(_MSC_VER) || (_MSC_VER > 1900) + assert(n < (1 << 24)); + #endif + return { + (std::uint8_t)((n & 070000000) >> 21), (std::uint8_t)((n & 007000000) >> 18), + (std::uint8_t)((n & 000700000) >> 15), (std::uint8_t)((n & 000070000) >> 12), + (std::uint8_t)((n & 000007000) >> 9), (std::uint8_t)((n & 000000700) >> 6), + (std::uint8_t)((n & 000000070) >> 3), (std::uint8_t)((n & 000000007) >> 0), + }; +} + +// User-defined literal operator. Given an integer in octal notation, like +// 01234567, gives the cube with the same colors. For example, `01234567_c` +// is `Cube{0, 1, 2, 3, 4, 5, 6, 7}`. +inline constexpr Cube operator"" _c(unsigned long long n) +{ + #if !defined(_MSC_VER) || (_MSC_VER > 1900) + assert(n < (1 << 24)); + #endif + return convert_to_cube(unsigned(n)); +} + +inline std::string config_name(const Cube cube) { + std::stringstream filename_prefix_ss; + for (int j = 0; j < 8; ++j) { + filename_prefix_ss << int(cube[j]); + } + return filename_prefix_ss.str(); +} +// Cube (end) + + +template +class Triple_line_extractor +{ + using P = Point; + using Polyline = std::vector

; + using Polylines = std::vector; + + typedef Polylines(*create_polylines_fct)(const int /* prec */); + + +public: + boost::unordered_map create_polylines_fcts { + // One internal corner + { 00001221_c, CGAL::Mesh_3::poly00001221 } , + { 00111202_c, CGAL::Mesh_3::poly00111202 } , + { 01101001_c, CGAL::Mesh_3::poly01101001 } , + // Two curves + { 00011022_c, CGAL::Mesh_3::poly00011022 } , + { 00011221_c, CGAL::Mesh_3::poly00011221 } , + { 00011222_c, CGAL::Mesh_3::poly00011222 } , + { 00121200_c, CGAL::Mesh_3::poly00121200 } , + { 00121221_c, CGAL::Mesh_3::poly00121221 } , + { 00122100_c, CGAL::Mesh_3::poly00122100 } , + { 00122101_c, CGAL::Mesh_3::poly00122101 } , + // One curve + { 00000012_c, CGAL::Mesh_3::poly00000012 } , + { 00000112_c, CGAL::Mesh_3::poly00000112 } , + { 00000121_c, CGAL::Mesh_3::poly00000121 } , + { 00001112_c, CGAL::Mesh_3::poly00001112 } , + { 00001122_c, CGAL::Mesh_3::poly00001122 } , + { 00010121_c, CGAL::Mesh_3::poly00010121 } , + { 00010122_c, CGAL::Mesh_3::poly00010122 } , + { 00011002_c, CGAL::Mesh_3::poly00011002 } , + { 00011012_c, CGAL::Mesh_3::poly00011012 } , + { 00011110_c, CGAL::Mesh_3::poly00011110 } , + { 00011120_c, CGAL::Mesh_3::poly00011120 } , + { 00011121_c, CGAL::Mesh_3::poly00011121 } , + { 00011122_c, CGAL::Mesh_3::poly00011122 } , + { 00011220_c, CGAL::Mesh_3::poly00011220 } , + { 00012002_c, CGAL::Mesh_3::poly00012002 } , + { 00012012_c, CGAL::Mesh_3::poly00012012 } , + { 00012021_c, CGAL::Mesh_3::poly00012021 } , + { 00012110_c, CGAL::Mesh_3::poly00012110 } , + { 00012112_c, CGAL::Mesh_3::poly00012112 } , + { 00012120_c, CGAL::Mesh_3::poly00012120 } , + { 00012121_c, CGAL::Mesh_3::poly00012121 } , + { 00012122_c, CGAL::Mesh_3::poly00012122 } , + { 00012221_c, CGAL::Mesh_3::poly00012221 } , + { 00111100_c, CGAL::Mesh_3::poly00111100 } , + { 00111102_c, CGAL::Mesh_3::poly00111102 } , + { 00111220_c, CGAL::Mesh_3::poly00111220 } , + { 00121201_c, CGAL::Mesh_3::poly00121201 } , + // 4 color cases + { 00000123_c, CGAL::Mesh_3::poly00000123 } , + { 00001123_c, CGAL::Mesh_3::poly00001123 } , + { 00001223_c, CGAL::Mesh_3::poly00001223 } , + { 00010123_c, CGAL::Mesh_3::poly00010123 } , + { 00010230_c, CGAL::Mesh_3::poly00010230 } , + { 00010231_c, CGAL::Mesh_3::poly00010231 } , + { 00011023_c, CGAL::Mesh_3::poly00011023 } , + { 00011123_c, CGAL::Mesh_3::poly00011123 } , + { 00011223_c, CGAL::Mesh_3::poly00011223 } , + { 00011230_c, CGAL::Mesh_3::poly00011230 } , + { 00011231_c, CGAL::Mesh_3::poly00011231 } , + { 00011232_c, CGAL::Mesh_3::poly00011232 } , + { 00012003_c, CGAL::Mesh_3::poly00012003 } , + { 00012013_c, CGAL::Mesh_3::poly00012013 } , + { 00012023_c, CGAL::Mesh_3::poly00012023 } , + { 00012033_c, CGAL::Mesh_3::poly00012033 } , + { 00012113_c, CGAL::Mesh_3::poly00012113 } , + { 00012123_c, CGAL::Mesh_3::poly00012123 } , + { 00012130_c, CGAL::Mesh_3::poly00012130 } , + { 00012131_c, CGAL::Mesh_3::poly00012131 } , + { 00012132_c, CGAL::Mesh_3::poly00012132 } , + { 00012133_c, CGAL::Mesh_3::poly00012133 } , + { 00012223_c, CGAL::Mesh_3::poly00012223 } , + { 00012230_c, CGAL::Mesh_3::poly00012230 } , + { 00012231_c, CGAL::Mesh_3::poly00012231 } , + { 00012232_c, CGAL::Mesh_3::poly00012232 } , + { 00012233_c, CGAL::Mesh_3::poly00012233 } , + { 00012330_c, CGAL::Mesh_3::poly00012330 } , + { 00012331_c, CGAL::Mesh_3::poly00012331 } , + { 00012332_c, CGAL::Mesh_3::poly00012332 } , + { 00012333_c, CGAL::Mesh_3::poly00012333 } , + { 00111123_c, CGAL::Mesh_3::poly00111123 } , + { 00111203_c, CGAL::Mesh_3::poly00111203 } , + { 00111223_c, CGAL::Mesh_3::poly00111223 } , + { 00111230_c, CGAL::Mesh_3::poly00111230 } , + { 00111232_c, CGAL::Mesh_3::poly00111232 } , + { 00111233_c, CGAL::Mesh_3::poly00111233 } , + { 00112233_c, CGAL::Mesh_3::poly00112233 } , + { 00112323_c, CGAL::Mesh_3::poly00112323 } , + { 00112332_c, CGAL::Mesh_3::poly00112332 } , + { 00121203_c, CGAL::Mesh_3::poly00121203 } , + { 00121223_c, CGAL::Mesh_3::poly00121223 } , + { 00121233_c, CGAL::Mesh_3::poly00121233 } , + { 00121300_c, CGAL::Mesh_3::poly00121300 } , + { 00121301_c, CGAL::Mesh_3::poly00121301 } , + { 00121302_c, CGAL::Mesh_3::poly00121302 } , + { 00121320_c, CGAL::Mesh_3::poly00121320 } , + { 00121321_c, CGAL::Mesh_3::poly00121321 } , + { 00121323_c, CGAL::Mesh_3::poly00121323 } , + { 00122103_c, CGAL::Mesh_3::poly00122103 } , + { 00122113_c, CGAL::Mesh_3::poly00122113 } , + { 00122133_c, CGAL::Mesh_3::poly00122133 } , + { 00122300_c, CGAL::Mesh_3::poly00122300 } , + { 00122301_c, CGAL::Mesh_3::poly00122301 } , + { 00122302_c, CGAL::Mesh_3::poly00122302 } , + { 00122313_c, CGAL::Mesh_3::poly00122313 } , + { 00122331_c, CGAL::Mesh_3::poly00122331 } , + { 01101023_c, CGAL::Mesh_3::poly01101023 } , + { 01101223_c, CGAL::Mesh_3::poly01101223 } , + { 01101231_c, CGAL::Mesh_3::poly01101231 } , + { 01102332_c, CGAL::Mesh_3::poly01102332 } , + { 01121223_c, CGAL::Mesh_3::poly01121223 } , + { 01121230_c, CGAL::Mesh_3::poly01121230 } , + { 01122330_c, CGAL::Mesh_3::poly01122330 } , + { 01123023_c, CGAL::Mesh_3::poly01123023 } , + { 01233210_c, CGAL::Mesh_3::poly01233210 } , + // 5 colors + { 00001234_c, CGAL::Mesh_3::poly00001234 } , + { 00010234_c, CGAL::Mesh_3::poly00010234 } , + { 00011234_c, CGAL::Mesh_3::poly00011234 } , + { 00012034_c, CGAL::Mesh_3::poly00012034 } , + { 00012134_c, CGAL::Mesh_3::poly00012134 } , + { 00012234_c, CGAL::Mesh_3::poly00012234 } , + { 00012334_c, CGAL::Mesh_3::poly00012334 } , + { 00012340_c, CGAL::Mesh_3::poly00012340 } , + { 00012341_c, CGAL::Mesh_3::poly00012341 } , + { 00012342_c, CGAL::Mesh_3::poly00012342 } , + { 00012343_c, CGAL::Mesh_3::poly00012343 } , + { 00111234_c, CGAL::Mesh_3::poly00111234 } , + { 00112234_c, CGAL::Mesh_3::poly00112234 } , + { 00112324_c, CGAL::Mesh_3::poly00112324 } , + { 00112334_c, CGAL::Mesh_3::poly00112334 } , + { 00121234_c, CGAL::Mesh_3::poly00121234 } , + { 00121304_c, CGAL::Mesh_3::poly00121304 } , + { 00121324_c, CGAL::Mesh_3::poly00121324 } , + { 00121340_c, CGAL::Mesh_3::poly00121340 } , + { 00121341_c, CGAL::Mesh_3::poly00121341 } , + { 00121342_c, CGAL::Mesh_3::poly00121342 } , + { 00121344_c, CGAL::Mesh_3::poly00121344 } , + { 00122134_c, CGAL::Mesh_3::poly00122134 } , + { 00122304_c, CGAL::Mesh_3::poly00122304 } , + { 00122314_c, CGAL::Mesh_3::poly00122314 } , + { 00122324_c, CGAL::Mesh_3::poly00122324 } , + { 00122334_c, CGAL::Mesh_3::poly00122334 } , + { 00122344_c, CGAL::Mesh_3::poly00122344 } , + { 00123400_c, CGAL::Mesh_3::poly00123400 } , + { 00123401_c, CGAL::Mesh_3::poly00123401 } , + { 00123414_c, CGAL::Mesh_3::poly00123414 } , + { 00123421_c, CGAL::Mesh_3::poly00123421 } , + { 00123423_c, CGAL::Mesh_3::poly00123423 } , + { 01101234_c, CGAL::Mesh_3::poly01101234 } , + { 01102334_c, CGAL::Mesh_3::poly01102334 } , + { 01121234_c, CGAL::Mesh_3::poly01121234 } , + { 01121340_c, CGAL::Mesh_3::poly01121340 } , + { 01121341_c, CGAL::Mesh_3::poly01121341 } , + { 01122034_c, CGAL::Mesh_3::poly01122034 } , + { 01122334_c, CGAL::Mesh_3::poly01122334 } , + { 01122340_c, CGAL::Mesh_3::poly01122340 } , + { 01123024_c, CGAL::Mesh_3::poly01123024 } , + { 01233214_c, CGAL::Mesh_3::poly01233214 } , + // 6 colors + { 00012345_c, CGAL::Mesh_3::poly00012345 } , + { 00112345_c, CGAL::Mesh_3::poly00112345 } , + { 00121345_c, CGAL::Mesh_3::poly00121345 } , + { 00122345_c, CGAL::Mesh_3::poly00122345 } , + { 00123405_c, CGAL::Mesh_3::poly00123405 } , + { 00123415_c, CGAL::Mesh_3::poly00123415 } , + { 00123425_c, CGAL::Mesh_3::poly00123425 } , + { 00123455_c, CGAL::Mesh_3::poly00123455 } , + { 01102345_c, CGAL::Mesh_3::poly01102345 } , + { 01121345_c, CGAL::Mesh_3::poly01121345 } , + { 01122345_c, CGAL::Mesh_3::poly01122345 } , + { 01123045_c, CGAL::Mesh_3::poly01123045 } , + { 01123445_c, CGAL::Mesh_3::poly01123445 } , + { 01123453_c, CGAL::Mesh_3::poly01123453 } , + { 01233245_c, CGAL::Mesh_3::poly01233245 } , + // 7 colors + { 00123456_c, CGAL::Mesh_3::poly00123456 } , + { 01123456_c, CGAL::Mesh_3::poly01123456 } , + { 01233456_c, CGAL::Mesh_3::poly01233456 } , + // 8 colors + { 01234567_c, CGAL::Mesh_3::poly01234567 } + }; +};// end triple_lines_extractor +}// end namespace Mesh 3 +}// end namespace CGAL + +#endif // CGAL_MESH_3_FEATURES_DETECTION_H diff --git a/Mesh_3/include/CGAL/Mesh_3/features_detection/features_detection_helpers.h b/Mesh_3/include/CGAL/Mesh_3/features_detection/features_detection_helpers.h new file mode 100644 index 00000000000..b3bcfb28f7a --- /dev/null +++ b/Mesh_3/include/CGAL/Mesh_3/features_detection/features_detection_helpers.h @@ -0,0 +1,72 @@ +// Copyright (c) 2022 GeometryFactory (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org). +// +// $URL$ +// $Id$ +// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial +// +// +// Author(s) : Sebastien Loriot, Jane Tournois +// +//****************************************************************************** +// +//****************************************************************************** + + +#ifndef CGAL_MESH_3_FEATURES_DETECTION_HELPERS_H +#define CGAL_MESH_3_FEATURES_DETECTION_HELPERS_H + +#include + +#include + +namespace CGAL +{ +namespace Mesh_3 +{ +namespace internal +{ + + template 1)> + struct Color_transformation_helper + { + using type = std::unordered_map; + static void reset(type& t) + { + t.clear(); + } + static bool is_valid(const type& t, const Word_type& w) + { + return t.find(w) != t.end(); + } + }; + template + struct Color_transformation_helper + { + using type = std::array; + static void reset(type& t) + { + std::fill(t.begin(), t.end(), 8/*invalid_word*/); + } + static bool is_valid(const type& t, const Word_type& w) + { + return t[w] != 8;/*invalid_word*/ + } + }; + + template + void debug_cerr(const char* title, const Array& tab) + { + std::cerr << title << " ["; + for (const auto t : tab) + std::cout << std::to_string(t) << " "; + std::cout << "]" << std::endl; + } + +}//end namespace internal +}//end namespace Mesh_3 +}//end namespace CGAL + +#endif // CGAL_MESH_3_FEATURES_DETECTION_HELPERS_H diff --git a/Mesh_3/include/CGAL/Mesh_3/generate_label_weights.h b/Mesh_3/include/CGAL/Mesh_3/generate_label_weights.h index 6d89ef94dba..9f6f5fefb76 100644 --- a/Mesh_3/include/CGAL/Mesh_3/generate_label_weights.h +++ b/Mesh_3/include/CGAL/Mesh_3/generate_label_weights.h @@ -309,9 +309,9 @@ CGAL::Image_3 generate_label_weights_with_known_word_type(const CGAL::Image_3& i * @returns a `CGAL::Image_3` of weights used to build a quality `Labeled_mesh_domain_3`, * with the same dimensions as `image` */ - +inline CGAL::Image_3 generate_label_weights(const CGAL::Image_3& image, - const float& sigma) + const float& sigma) { CGAL_IMAGE_IO_CASE(image.image(), return generate_label_weights_with_known_word_type(image, sigma); diff --git a/Mesh_3/include/CGAL/Mesh_3/polylines_to_protect.h b/Mesh_3/include/CGAL/Mesh_3/polylines_to_protect.h index b59eb144d74..e42bc0acff7 100644 --- a/Mesh_3/include/CGAL/Mesh_3/polylines_to_protect.h +++ b/Mesh_3/include/CGAL/Mesh_3/polylines_to_protect.h @@ -15,7 +15,6 @@ #include - #include #include #include // std::swap @@ -23,17 +22,23 @@ #include #include +#include +#include + #include #include #include -#include // for CGAL::Null_subdomain_index -#include + #include // for boost::prior #include #include #include +#include + +#include + namespace CGAL { namespace Mesh_3 { namespace internal { @@ -1128,6 +1133,63 @@ polylines_to_protect(const CGAL::Image_3& cgal_image, existing_polylines_end); } + +template +void +merge_and_snap_polylines(const CGAL::Image_3& image, + PolylineRange1& polylines_to_snap, + const PolylineRange2& existing_polylines) +{ + static_assert(std::is_same::value, + "Polyline ranges should have same point type"); + using P = typename PolylineRange1::value_type::value_type; + using K = typename Kernel_traits

::Kernel; + + using CGAL::internal::polylines_to_protect_namespace::Vertex_info; + using Graph = boost::adjacency_list >; + using vertex_descriptor = typename boost::graph_traits::vertex_descriptor; + + // build graph of polylines_to_snap + Graph graph; + typedef Mesh_3::internal::Returns_midpoint Midpoint_fct; + Mesh_3::internal::Graph_manipulations g_manip(graph); + + for (const auto& polyline : polylines_to_snap) + { + if (polyline.size() < 2) + continue; + + auto pit = polyline.begin(); + while (boost::next(pit) != polyline.end()) + { + vertex_descriptor v = g_manip.get_vertex(*pit, false); + vertex_descriptor w = g_manip.get_vertex(*boost::next(pit), false); + g_manip.try_add_edge(v, w); + ++pit; + } + } + + // snap graph to existing_polylines + snap_graph_vertices(graph, + image.vx(), image.vy(), image.vz(), + boost::begin(existing_polylines), boost::end(existing_polylines), + K()); + + // rebuild polylines_to_snap + polylines_to_snap.clear(); + Mesh_3::Polyline_visitor visitor(polylines_to_snap, graph); + Less_for_Graph_vertex_descriptors less(graph); + const Graph& const_graph = graph; + Mesh_3::Angle_tester angle_tester(90.); + split_graph_into_polylines(const_graph, visitor, angle_tester, less); +} + + } // namespace CGAL #endif // CGAL_MESH_3_POLYLINES_TO_PROTECT_H diff --git a/Mesh_3/include/CGAL/make_mesh_3.h b/Mesh_3/include/CGAL/make_mesh_3.h index 7160b9944d4..db1c8448811 100644 --- a/Mesh_3/include/CGAL/make_mesh_3.h +++ b/Mesh_3/include/CGAL/make_mesh_3.h @@ -232,6 +232,13 @@ struct C3t3_initializer < C3T3, MD, MC, true, CGAL::Tag_true > if (c3t3.number_of_facets() == 0) { need_more_init = true; } + else + { + helper.update_restricted_cells(); + if(c3t3.number_of_cells() == 0) { + need_more_init = true; + } + } } if(need_more_init) { init_c3t3(c3t3, domain, criteria, diff --git a/Mesh_3/test/Mesh_3/CMakeLists.txt b/Mesh_3/test/Mesh_3/CMakeLists.txt index e1bc8829add..9be90f6e430 100644 --- a/Mesh_3/test/Mesh_3/CMakeLists.txt +++ b/Mesh_3/test/Mesh_3/CMakeLists.txt @@ -31,6 +31,7 @@ create_single_source_cgal_program( "test_without_detect_features.cpp" ) if(CGAL_ImageIO_USE_ZLIB) create_single_source_cgal_program( "test_meshing_3D_image.cpp" ) create_single_source_cgal_program( "test_meshing_3D_image_deprecated.cpp" ) + create_single_source_cgal_program( "test_meshing_3D_image_with_features.cpp" ) create_single_source_cgal_program( "test_meshing_3D_gray_image.cpp" ) create_single_source_cgal_program( "test_meshing_3D_gray_image_deprecated.cpp" ) else() @@ -64,6 +65,7 @@ foreach(target test_without_detect_features test_meshing_3D_image test_meshing_3D_image_deprecated + test_meshing_3D_image_with_features test_meshing_3D_gray_image test_meshing_3D_gray_image_deprecated test_meshing_implicit_function diff --git a/Mesh_3/test/Mesh_3/test_meshing_3D_image_with_features.cpp b/Mesh_3/test/Mesh_3/test_meshing_3D_image_with_features.cpp new file mode 100644 index 00000000000..1c9607d45cc --- /dev/null +++ b/Mesh_3/test/Mesh_3/test_meshing_3D_image_with_features.cpp @@ -0,0 +1,199 @@ +// Copyright (c) 2009 INRIA Sophia-Antipolis (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org). +// +// $URL$ +// $Id$ +// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial +// +// +// Author(s) : Stephane Tayeb, Jane Tournois +// +//****************************************************************************** +// File Description : +//****************************************************************************** + +#include "test_meshing_utilities.h" +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +template +bool read_polylines(const std::string fname, + std::vector >& polylines) +{ + std::ifstream ifs(fname); + if(ifs.bad()) return false; + std::size_t n; + while(ifs >> n) { + polylines.resize(polylines.size()+1); + std::vector& polyline = polylines.back(); + while(n-- != 0) { + Point_3 p; + ifs >> p; + if(ifs.fail()) return false; + polyline.push_back(p); + } + } + if(ifs.bad()) return false; + else return ifs.eof(); +} + +template +struct Image_tester : public Tester +{ + typedef CGAL::Image_3 Image; + typedef CGAL::Labeled_mesh_domain_3 Domain; + typedef CGAL::Mesh_domain_with_polyline_features_3 Mesh_domain; + + typedef typename CGAL::Mesh_triangulation_3< + Mesh_domain, + CGAL::Kernel_traits::Kernel, + Concurrency_tag>::type Tr; + typedef CGAL::Mesh_complex_3_in_triangulation_3 C3t3; + + typedef CGAL::Mesh_criteria_3 Mesh_criteria; + + void mesh_and_verify(Mesh_domain& domain, const Image& image, const double volume) const + { + namespace p = CGAL::parameters; + // Set mesh criteria + Mesh_criteria criteria(p::edge_size = 2 * image.vx(), + p::facet_angle = 30, + p::facet_size = 20 * image.vx(), + p::facet_distance = 5 * image.vx(), + p::cell_radius_edge_ratio = 3., + p::cell_size = 25 * image.vx()); + + // Mesh generation + C3t3 c3t3 = CGAL::make_mesh_3(domain, criteria, + CGAL::parameters::no_exude(), + CGAL::parameters::no_perturb()); + + c3t3.remove_isolated_vertices(); + + // Verify + this->verify_c3t3_volume(c3t3, volume * 0.95, volume * 1.05); + this->verify(c3t3, domain, criteria, Bissection_tag()); + + typedef typename Mesh_domain::Surface_patch_index Patch_id; + CGAL_static_assertion(CGAL::Output_rep::is_specialized); + CGAL_USE_TYPE(Patch_id); + } + +public: + void image() const + { + namespace p = CGAL::parameters; + std::cout << "\tSeed is\t" + << CGAL::get_default_random().get_seed() << std::endl; + + //------------------------------------------------------- + // Data generation + //------------------------------------------------------- + Image image; + image.read(CGAL::data_file_path("images/liver.inr.gz")); + + Mesh_domain domain = Mesh_domain::create_labeled_image_mesh_domain + (p::image = image, + p::relative_error_bound = 1e-9, + CGAL::parameters::p_rng = &CGAL::get_default_random(), + CGAL::parameters::features_detector = CGAL::Mesh_3::Detect_features_in_image()); + + mesh_and_verify(domain, image, 1772330.); + } + + void image_in_bbox() const + { + namespace p = CGAL::parameters; + std::cout << "\tSeed is\t" + << CGAL::get_default_random().get_seed() << std::endl; + + //------------------------------------------------------- + // Data generation + //------------------------------------------------------- + Image image; + image.read(CGAL::data_file_path("images/40420.inr")); + + Mesh_domain domain = Mesh_domain::create_labeled_image_mesh_domain + (p::image = image, + p::relative_error_bound = 1e-9, + CGAL::parameters::p_rng = &CGAL::get_default_random(), + CGAL::parameters::features_detector = CGAL::Mesh_3::Detect_features_on_image_bbox()); + + mesh_and_verify(domain, image, 625044.); + } + + void image_with_input_features() const + { + namespace p = CGAL::parameters; + std::cout << "\tSeed is\t" + << CGAL::get_default_random().get_seed() << std::endl; + + //------------------------------------------------------- + // Data generation + //------------------------------------------------------- + Image image; + image.read(CGAL::data_file_path("images/40420.inr")); + + const std::string lines_fname = CGAL::data_file_path("images/420.polylines.txt"); + using Point_3 = Domain::Point_3; + std::vector > features_input; + if (!read_polylines(lines_fname, features_input)) // see file "read_polylines.h" + assert(false); + + Mesh_domain domain = Mesh_domain::create_labeled_image_mesh_domain + (p::image = image, + p::relative_error_bound = 1e-9, + CGAL::parameters::p_rng = &CGAL::get_default_random(), + CGAL::parameters::features_detector = CGAL::Mesh_3::Detect_features_on_image_bbox(), + CGAL::parameters::input_features = std::cref(features_input)); + + mesh_and_verify(domain, image, 632091.); + } +}; + + + +int main() +{ + Image_tester<> test_epic; + std::cerr << "Mesh generation from a 3D image" + << " with detection of triple lines:\n"; + test_epic.image(); + + std::cerr << "Mesh generation from a 3D image" + << " with detection of triple lines on bbox only:\n"; + test_epic.image_in_bbox(); + + std::cerr << "Mesh generation from a 3D image" + << " with detection of triple lines on bbox" + << " and input feature polylines:\n"; + test_epic.image_with_input_features(); + +#ifdef CGAL_LINKED_WITH_TBB + Image_tester test_epic_p; + std::cerr << "Parallel mesh generation from a 3D image" + << " with detection of triple lines:\n"; + test_epic_p.image(); + + std::cerr << "Parallel mesh generation from a 3D image" + << " with detection of triple lines on bbox only:\n"; + test_epic_p.image_in_bbox(); + + std::cerr << "Parallel mesh generation from a 3D image" + << " with detection of triple lines on bbox" + << " and input feature polylines:\n"; + test_epic_p.image_with_input_features(); +#endif + + return EXIT_SUCCESS; +} diff --git a/NewKernel_d/package_info/NewKernel_d/copyright b/NewKernel_d/package_info/NewKernel_d/copyright new file mode 100644 index 00000000000..3a69190ec6f --- /dev/null +++ b/NewKernel_d/package_info/NewKernel_d/copyright @@ -0,0 +1 @@ +INRIA (France) diff --git a/Number_types/include/CGAL/Sqrt_extension/Sqrt_extension_type.h b/Number_types/include/CGAL/Sqrt_extension/Sqrt_extension_type.h index 98effda949e..c49303dd42d 100644 --- a/Number_types/include/CGAL/Sqrt_extension/Sqrt_extension_type.h +++ b/Number_types/include/CGAL/Sqrt_extension/Sqrt_extension_type.h @@ -662,10 +662,6 @@ CGAL::Comparison_result // NT friend bool operator == (const Sqrt_extension& p, const NT& num) { return (p-num).is_zero();} - friend bool operator < (const Sqrt_extension& p, const NT& num) - { return ( p.compare(num) == CGAL::SMALLER ); } - friend bool operator > (const Sqrt_extension& p, const NT& num) - { return ( p.compare(num) == CGAL::LARGER ); } //CGAL_int(NT) friend bool operator == (const Sqrt_extension& p, CGAL_int(NT) num) @@ -676,6 +672,19 @@ CGAL::Comparison_result { return ( p.compare(num) == CGAL::LARGER ); } }; +// The two operators are moved out of the class scope (where they were friends) +// in order to work around a VC2017 compilation problem +template +bool operator < (const Sqrt_extension& p, const NT& num) +{ + return (p.compare(num) == CGAL::SMALLER); +} + +template +bool operator > (const Sqrt_extension& p, const NT& num) +{ + return (p.compare(num) == CGAL::LARGER); +} /*! * Compute the square of a one-root number. */ diff --git a/Polygon/include/CGAL/Polygon_with_holes_2.h b/Polygon/include/CGAL/Polygon_with_holes_2.h index b5a842710e9..3e4eb83c0a9 100644 --- a/Polygon/include/CGAL/Polygon_with_holes_2.h +++ b/Polygon/include/CGAL/Polygon_with_holes_2.h @@ -166,7 +166,7 @@ Both \ascii and binary formats are supported, and the format is automatically de The format consists of the number of points of the outer boundary followed by the points themselves in counterclockwise order, followed by the number of holes, and for each hole, the number of points of the outer boundary is followed -by the points themselves in clockwise order. +by the points themselves, in clockwise order. \relates Polygon_with_holes_2 */ diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Smoothing/curvature_flow_impl.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Smoothing/curvature_flow_impl.h index 411117ab751..9dea9e3b4c1 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Smoothing/curvature_flow_impl.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Smoothing/curvature_flow_impl.h @@ -70,13 +70,14 @@ public: Shape_smoother(TriangleMesh& mesh, VertexPointMap& vpmap, VertexConstraintMap& vcmap, - const GeomTraits& traits) + const bool scale_volume_after_smoothing = true, + const GeomTraits& traits = GeomTraits()) : mesh_(mesh), vpmap_(vpmap), vcmap_(vcmap), vimap_(get(Vertex_local_index(), mesh_)), - scale_volume_after_smoothing(true), + scale_volume_after_smoothing_(scale_volume_after_smoothing), traits_(traits), weight_calculator_(mesh_, vpmap_, traits_, false /*no clamping*/, false /*no bounding from below*/) { } @@ -104,12 +105,12 @@ public: if(anchor_point == boost::none) anchor_point = get(vpmap_, v); else - scale_volume_after_smoothing = false; + scale_volume_after_smoothing_ = false; } } if(!CGAL::is_closed(mesh_)) - scale_volume_after_smoothing = false; + scale_volume_after_smoothing_ = false; } void setup_system(Eigen_matrix& A, @@ -222,12 +223,12 @@ public: { namespace PMP = CGAL::Polygon_mesh_processing; - if(!scale_volume_after_smoothing) + if(!scale_volume_after_smoothing_) return update_mesh_no_scaling(Xx, Xy, Xz); const FT old_vol = volume(mesh_, parameters::vertex_point_map(vpmap_).geom_traits(traits_)); - // If no vertex is constrained, then the smoothed mesh will simply share the same centroid as the input mesh + // If no vertex is constrained, then the smoothed mesh will share the same centroid as the input mesh Point pre_smooth_anchor_point; if(anchor_point != boost::none) pre_smooth_anchor_point = *anchor_point; @@ -362,7 +363,7 @@ private: // of volume. We need an anchor point to scale up, either a constrained point or the centroid // of the initial mesh if no vertex is constrained. If there is more than a constrained vertex, // then no scaling can be done without violating the constraint. - bool scale_volume_after_smoothing; + bool scale_volume_after_smoothing_; boost::optional anchor_point; // linear system data diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/smooth_shape.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/smooth_shape.h index c71cf8b1d0b..bd4e8ad8ab2 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/smooth_shape.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/smooth_shape.h @@ -61,6 +61,25 @@ namespace Polygon_mesh_processing { * \cgalParamDefault{`1`} * \cgalParamNEnd * +* \cgalParamNBegin{vertex_is_constrained_map} +* \cgalParamDescription{a property map containing the constrained-or-not status of each vertex of `tmesh`.} +* \cgalParamType{a class model of `ReadWritePropertyMap` with `boost::graph_traits::%vertex_descriptor` +* as key type and `bool` as value type. It must be default constructible.} +* \cgalParamDefault{a default property map where no vertex is constrained} +* \cgalParamExtra{A constrained vertex cannot be modified at all during smoothing.} +* \cgalParamNEnd +* +* \cgalParamNBegin{do_scale} +* \cgalParamDescription{Whether to apply rescaling after smoothing. This is useful because +* the mean curvature flow tends to shrink the surface.} +* \cgalParamType{Boolean} +* \cgalParamDefault{`true`} +* \cgalParamExtra{Scaling can only be applied if the mesh is closed and if there is no more than +* a single constrained vertex.} +* \cgalParamExtra{If a vertex is constrained, it is the fixed point of the scaling, otherwise +* the centroid is used.} +* \cgalParamNEnd +* * \cgalParamNBegin{vertex_point_map} * \cgalParamDescription{a property map associating points to the vertices of `tmesh`} * \cgalParamType{a class model of `ReadWritePropertyMap` with `boost::graph_traits::%vertex_descriptor` @@ -77,14 +96,6 @@ namespace Polygon_mesh_processing { * \cgalParamExtra{The geometric traits class must be compatible with the vertex point type.} * \cgalParamNEnd * -* \cgalParamNBegin{vertex_is_constrained_map} -* \cgalParamDescription{a property map containing the constrained-or-not status of each vertex of `tmesh`.} -* \cgalParamType{a class model of `ReadWritePropertyMap` with `boost::graph_traits::%vertex_descriptor` -* as key type and `bool` as value type. It must be default constructible.} -* \cgalParamDefault{a default property map where no vertex is constrained} -* \cgalParamExtra{A constrained vertex cannot be modified at all during smoothing.} -* \cgalParamNEnd -* * \cgalParamNBegin{sparse_linear_solver} * \cgalParamDescription{an instance of the sparse linear solver used for smoothing} * \cgalParamType{a class model of `SparseLinearAlgebraWithFactorTraits_d`} @@ -97,9 +108,10 @@ namespace Polygon_mesh_processing { * * @warning This function involves linear algebra, that is computed using non-exact, floating-point arithmetic. * -* @see `smooth_mesh()` +* @see `angle_and_area_smoothing()` */ -template +template void smooth_shape(const FaceRange& faces, TriangleMesh& tmesh, const double time, @@ -125,6 +137,7 @@ void smooth_shape(const FaceRange& faces, VCMap vcmap = choose_parameter(get_parameter(np, internal_np::vertex_is_constrained), Static_boolean_property_map()); const unsigned int nb_iterations = choose_parameter(get_parameter(np, internal_np::number_of_iterations), 1); + const bool scale_after_smoothing = choose_parameter(get_parameter(np, internal_np::do_scale), true); #if defined(CGAL_EIGEN3_ENABLED) #if EIGEN_VERSION_AT_LEAST(3,2,0) @@ -161,11 +174,11 @@ void smooth_shape(const FaceRange& faces, Eigen_vector bx(n), by(n), bz(n), Xx(n), Xy(n), Xz(n); std::vector > stiffness; - internal::Shape_smoother smoother(tmesh, vpmap, vcmap, gt); + internal::Shape_smoother smoother(tmesh, vpmap, vcmap, scale_after_smoothing, gt); smoother.init_smoothing(faces); - // For robustness reasons, the laplacian coefficients are computed only once (only the mass + // For robustness reasons, the Laplacian coefficients are computed only once (only the mass // matrix is updated at every iteration). See Kazdhan et al. "Can Mean-Curvature Flow Be Made Non-Singular?". smoother.calculate_stiffness_matrix_elements(stiffness); diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/test_shape_smoothing.cpp b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_shape_smoothing.cpp index 201d508d085..7ed64301e90 100644 --- a/Polygon_mesh_processing/test/Polygon_mesh_processing/test_shape_smoothing.cpp +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_shape_smoothing.cpp @@ -6,6 +6,7 @@ #include #include +#include #include #include @@ -17,6 +18,7 @@ #include typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel; +typedef Kernel::FT FT; typedef Kernel::Point_3 Point; typedef CGAL::Surface_mesh SurfaceMesh; typedef CGAL::Polyhedron_3 Mesh_with_id; @@ -38,7 +40,7 @@ void test_implicit_constrained_devil(Mesh mesh) typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; typename boost::property_map::type vpmap = get(CGAL::vertex_point, mesh); - // z max is 20 in the devil + // max 'z' is 20 in the devil std::set selected_vertices; for(vertex_descriptor v : vertices(mesh)) { @@ -47,6 +49,8 @@ void test_implicit_constrained_devil(Mesh mesh) selected_vertices.insert(v); } + std::cout << selected_vertices.size() << " constrained vertices" << std::endl; + CGAL::Boolean_property_map > vcmap(selected_vertices); std::vector fixed_points(selected_vertices.size()); @@ -124,6 +128,29 @@ void test_implicit_constrained_elephant(Mesh mesh) #endif } +template +void test_implicit_unscaled_elephant(Mesh mesh) +{ +#ifdef CGAL_PMP_SMOOTHING_DEBUG + std::cout << "-- test_implicit_unscaled_elephant --" << std::endl; +#endif + + const FT ivol = PMP::volume(mesh); + std::cout << "Input volume is " << ivol << std::endl; + + Mesh mesh_cpy(mesh); + const double time_step = 0.001; + PMP::smooth_shape(mesh_cpy, time_step, CGAL::parameters::number_of_iterations(5).do_scale(true)); + + FT ovol = PMP::volume(mesh_cpy); + std::cout << "With scaling, output volume is " << ovol << std::endl; + assert(equal_doubles(ivol, ovol, 1e-10)); + + PMP::smooth_shape(mesh, time_step, CGAL::parameters::number_of_iterations(5).do_scale(false)); + ovol = PMP::volume(mesh); + std::cout << "Without scaling, output volume is " << ovol << std::endl; +} + template void test_curvature_flow_time_step(Mesh mesh) { @@ -167,8 +194,8 @@ int main(int, char**) SurfaceMesh mesh_devil; if(!input1 || !(input1 >> mesh_devil)) { - std::cerr << "Error: can not read file."; - return 1; + std::cerr << "Error: cannot read file " << filename_devil << std::endl; + return EXIT_FAILURE; } input1.close(); @@ -176,8 +203,8 @@ int main(int, char**) SurfaceMesh mesh_elephant; if(!input2 || !(input2 >> mesh_elephant)) { - std::cerr << "Error: can not read file."; - return 1; + std::cerr << "Error: cannot read file " << filename_elephant << std::endl; + return EXIT_FAILURE; } input2.close(); @@ -185,11 +212,12 @@ int main(int, char**) test_curvature_flow(mesh_elephant); test_implicit_constrained_elephant(mesh_elephant); test_implicit_constrained_devil(mesh_devil); + test_implicit_unscaled_elephant(mesh_elephant); input1.open(filename_devil); Mesh_with_id pl_mesh_devil; if(!input1 || !(input1 >> pl_mesh_devil)){ - std::cerr << "Error: can not read file."; + std::cerr << "Error: cannot read file " << filename_devil << std::endl; return EXIT_FAILURE; } input1.close(); @@ -200,7 +228,7 @@ int main(int, char**) Mesh_with_id pl_mesh_elephant; if(!input2 || !(input2 >> pl_mesh_elephant)) { - std::cerr << "Error: can not read file."; + std::cerr << "Error: cannot read file " << filename_elephant << std::endl; return EXIT_FAILURE; } input2.close(); @@ -212,6 +240,7 @@ int main(int, char**) test_curvature_flow(pl_mesh_elephant); test_implicit_constrained_elephant(pl_mesh_elephant); test_implicit_constrained_devil(pl_mesh_devil); + test_implicit_unscaled_elephant(pl_mesh_elephant); return EXIT_SUCCESS; } 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 e1b3770c225..eb3ce6042ae 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Mesh_3_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Mesh_3_plugin.cpp @@ -277,12 +277,16 @@ void Mesh_3_plugin::mesh_3_volume() mesh_3(Mesh_type::VOLUME); } -boost::optional Mesh_3_plugin::get_items_or_return_error_string() const { +boost::optional Mesh_3_plugin::get_items_or_return_error_string() const +{ using boost::get; items = {}; features_protection_available = false; item = nullptr; - for (int ind : scene->selectionIndices()) { + Scene_polylines_item* polylines_item = nullptr; + + for (int ind : scene->selectionIndices()) + { try { if (auto sm_item = qobject_cast(scene->item(ind))) { @@ -313,9 +317,11 @@ boost::optional Mesh_3_plugin::get_items_or_return_error_string() const return tr("An image items cannot be mixed with other items type"); } # endif - else if (auto polylines_item = - qobject_cast(scene->item(ind))) { - if (!items) items = Polyhedral_mesh_items{}; + else if ((polylines_item = + qobject_cast(scene->item(ind)))) + { + if (!items) + continue; auto poly_items_ptr = get(&*items); if(poly_items_ptr) { if (poly_items_ptr->polylines_item) { @@ -323,12 +329,16 @@ boost::optional Mesh_3_plugin::get_items_or_return_error_string() const } else { poly_items_ptr->polylines_item = polylines_item; } - } else { - auto image_items = get(*items); - if (image_items.polylines_item) { - return tr("Only one polyline item is accepted"); - } else { - image_items.polylines_item = polylines_item; + } + else { + if(auto image_items_ptr = get(&*items)) + { + if (image_items_ptr->polylines_item) { + return tr("Only one polyline item is accepted"); + } + else { + image_items_ptr->polylines_item = polylines_item; + } } } } @@ -341,6 +351,20 @@ boost::optional Mesh_3_plugin::get_items_or_return_error_string() const } } catch (const boost::bad_get&) { return tr("Wrong selection of items"); } } // end for loop on selected items + + //attach polylines_item to one or the other item + //if it could not be done in the for loop + //because of selection order + if (polylines_item != nullptr && items != boost::none) + { + auto poly_items_ptr = get(&*items); + auto image_items_ptr = get(&*items); + if(poly_items_ptr && poly_items_ptr == nullptr) + poly_items_ptr->polylines_item = polylines_item; + else if(image_items_ptr && image_items_ptr == nullptr) + image_items_ptr->polylines_item = polylines_item; + } + if (!items) { return tr("Selected objects can't be meshed"); } item = nullptr; features_protection_available = false; @@ -428,6 +452,8 @@ void Mesh_3_plugin::mesh_3(const Mesh_type mesh_type, get(&*items) ? get(&*items)->polylines_item : nullptr; + if (polylines_item == nullptr && get(&*items) != nullptr) + polylines_item = get(&*items)->polylines_item; Scene_implicit_function_item* function_item = get(&*items) ? get(&*items)->function_item.get() @@ -571,18 +597,28 @@ void Mesh_3_plugin::mesh_3(const Mesh_type mesh_type, ui.edgeLabel->setEnabled(ui.noEdgeSizing->isChecked()); ui.edgeSizing->setEnabled(ui.noEdgeSizing->isChecked()); + const QString sharp_and_boundary("Sharp and Boundary edges"); + const QString boundary_only("Boundary edges only"); + const QString sharp_edges("Sharp edges"); + const QString input_polylines("Input polylines"); + const QString on_cube("Polylines on cube"); + const QString triple_lines("Triple+ lines"); if (features_protection_available) { if (items->which() == POLYHEDRAL_MESH_ITEMS) { if (mesh_type == Mesh_type::SURFACE_ONLY) { - ui.protectEdges->addItem(QString("Sharp and Boundary edges")); - ui.protectEdges->addItem(QString("Boundary edges only")); + ui.protectEdges->addItem(sharp_and_boundary); + ui.protectEdges->addItem(boundary_only); } else - ui.protectEdges->addItem(QString("Sharp edges")); + ui.protectEdges->addItem(sharp_edges); } else if (items->which() == IMAGE_MESH_ITEMS) { - if (polylines_item != nullptr) - ui.protectEdges->addItem(QString("Input polylines")); + if (polylines_item != nullptr) { + ui.protectEdges->addItem(QString(input_polylines).append(" only")); + ui.protectEdges->addItem(QString(on_cube).append(" and input polylines")); + ui.protectEdges->addItem(QString(triple_lines).append(" and input polylines")); + } else { - ui.protectEdges->addItem(QString("Polylines on cube")); + ui.protectEdges->addItem(on_cube); + ui.protectEdges->addItem(triple_lines); } } } @@ -629,10 +665,15 @@ void Mesh_3_plugin::mesh_3(const Mesh_type mesh_type, approx = !ui.noApprox->isChecked() ? 0 : ui.approx->value(); tets_shape = !ui.noTetShape->isChecked() ? 0 : ui.tetShape->value(); tets_sizing = !ui.noTetSizing->isChecked() ? 0 : ui.tetSizing->value(); - protect_features = - ui.protect->isChecked() && (ui.protectEdges->currentIndex() == 0); - protect_borders = - ui.protect->isChecked() && (ui.protectEdges->currentIndex() == 1); + + const int pe_ci = ui.protectEdges->currentIndex(); + protect_borders = ui.protect->isChecked() + && ( pe_ci == ui.protectEdges->findText(on_cube, Qt::MatchContains) + || pe_ci == ui.protectEdges->findText(boundary_only, Qt::MatchContains)); + protect_features = ui.protect->isChecked() + && ( pe_ci == ui.protectEdges->findText(triple_lines, Qt::MatchContains) + || pe_ci == ui.protectEdges->findText(sharp_and_boundary, Qt::MatchContains)); + const bool detect_connected_components = ui.detectComponents->isChecked(); const int manifold = (ui.manifoldCheckBox->isChecked() ? 1 : 0) + (ui.facetTopology->isChecked() ? 2 : 0); @@ -728,7 +769,7 @@ void Mesh_3_plugin::mesh_3(const Mesh_type mesh_type, } break; }//end case POLYHEDRAL_MESH_ITEMS - // Image + // Implicit functions # ifdef CGAL_MESH_3_DEMO_ACTIVATE_IMPLICIT_FUNCTIONS case IMPLICIT_MESH_ITEMS: { const Implicit_function_interface* pFunction = function_item->function(); @@ -747,11 +788,15 @@ void Mesh_3_plugin::mesh_3(const Mesh_type mesh_type, manifold, mesh_type == Mesh_type::SURFACE_ONLY); break; - } + }//end case IMPLICIT_MESH_ITEMS # endif + // Images # ifdef CGAL_MESH_3_DEMO_ACTIVATE_SEGMENTED_IMAGES case IMAGE_MESH_ITEMS: { const Image* pImage = image_item->image(); + auto& image_items = get(*items); + const auto img_polylines_item = image_items.polylines_item; + if (nullptr == pImage) { QMessageBox::critical(mw, tr(""), tr("ERROR: no data in selected item")); return; @@ -773,7 +818,7 @@ void Mesh_3_plugin::mesh_3(const Mesh_type mesh_type, thread = cgal_code_mesh_3( pImage, - (polylines_item == nullptr) ? plc : polylines_item->polylines, + (img_polylines_item == nullptr) ? plc : img_polylines_item->polylines, angle, facets_sizing, approx, @@ -781,6 +826,7 @@ void Mesh_3_plugin::mesh_3(const Mesh_type mesh_type, edges_sizing, tets_shape, protect_features, + protect_borders, manifold, mesh_type == Mesh_type::SURFACE_ONLY, detect_connected_components, diff --git a/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Mesh_3_plugin_cgal_code.cpp b/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Mesh_3_plugin_cgal_code.cpp index c4f59578610..15efe553844 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Mesh_3_plugin_cgal_code.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Mesh_3_plugin_cgal_code.cpp @@ -13,6 +13,8 @@ #include "Mesh_function.h" #include "Facet_extra_criterion.h" +#include +#include using namespace CGAL::Three; @@ -291,7 +293,8 @@ Meshing_thread* cgal_code_mesh_3(const Image* pImage, const double tet_sizing, const double edge_size, const double tet_shape, - bool protect_features, + bool protect_features, //detect_polylines + const bool protect_borders,//polylines on bbox const int manifold, const bool surface_only, bool detect_connected_components, @@ -303,11 +306,9 @@ Meshing_thread* cgal_code_mesh_3(const Image* pImage, { if (nullptr == pImage) { return nullptr; } - if(! polylines.empty()){ - protect_features = true; // so that it will be passed in make_mesh_3 - } Mesh_parameters param; - param.protect_features = protect_features; + param.protect_features + = protect_features || protect_borders || !polylines.empty(); param.detect_connected_components = detect_connected_components; param.facet_angle = facet_angle; param.facet_sizing = facet_sizing; @@ -343,7 +344,7 @@ Meshing_thread* cgal_code_mesh_3(const Image* pImage, { namespace p = CGAL::parameters; - Image_mesh_domain* p_domain; + Image_mesh_domain* p_domain = nullptr; #ifdef CGAL_USE_ITK if(nullptr != pWeights) { @@ -359,35 +360,57 @@ Meshing_thread* cgal_code_mesh_3(const Image* pImage, } else #endif - { - p_domain = new Image_mesh_domain - (Image_mesh_domain::create_labeled_image_mesh_domain - (p::image = *pImage, - p::relative_error_bound = 1e-6, - p::construct_surface_patch_index = - [](int i, int j) { return (i * 1000 + j); } - ) - ); - } + if (protect_features) + { + p_domain = new Image_mesh_domain + (Image_mesh_domain::create_labeled_image_mesh_domain + (p::image = *pImage, + p::relative_error_bound = 1e-6, + p::construct_surface_patch_index = + [](int i, int j) { return (i * 1000 + j); }, + p::features_detector = CGAL::Mesh_3::Detect_features_in_image(), + p::input_features = std::cref(polylines) + ) + ); + } + else if (protect_borders)//protect polylines on image Bbox + { + p_domain = new Image_mesh_domain + (Image_mesh_domain::create_labeled_image_mesh_domain + (p::image = *pImage, + p::relative_error_bound = 1e-6, + p::construct_surface_patch_index = + [](int i, int j) { return (i * 1000 + j); }, + p::features_detector = CGAL::Mesh_3::Detect_features_on_image_bbox(), + p::input_features = std::cref(polylines) + ) + ); + } + else if (!polylines.empty()) + { + p_domain = new Image_mesh_domain + (Image_mesh_domain::create_labeled_image_mesh_domain + (p::image = *pImage, + p::relative_error_bound = 1e-6, + p::construct_surface_patch_index = + [](int i, int j) { return (i * 1000 + j); }, + p::input_features = std::cref(polylines) + ) + ); + } - if(protect_features && polylines.empty()){ - std::vector > polylines_on_bbox; + if (p_domain == nullptr) + { + p_domain = new Image_mesh_domain + (Image_mesh_domain::create_labeled_image_mesh_domain + (p::image = *pImage, + p::relative_error_bound = 1e-6, + p::construct_surface_patch_index = + [](int i, int j) { return (i * 1000 + j); } + ) + ); + } - CGAL_IMAGE_IO_CASE(pImage->image(), - { - typedef Word Image_word_type; - (CGAL::polylines_to_protect< - Bare_point, - Image_word_type>(*pImage, polylines_on_bbox)); - p_domain->add_features(polylines_on_bbox.begin(), - polylines_on_bbox.end()); - } - ); - } - if(! polylines.empty()){ - // Insert edge in domain - p_domain->add_features(polylines.begin(), polylines.end()); - } typedef ::Mesh_function Mesh_function; Mesh_function* p_mesh_function = new Mesh_function(p_new_item->c3t3(), diff --git a/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Mesh_3_plugin_cgal_code.h b/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Mesh_3_plugin_cgal_code.h index 4928982cf1e..03e9514ba65 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Mesh_3_plugin_cgal_code.h +++ b/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Mesh_3_plugin_cgal_code.h @@ -73,6 +73,7 @@ Meshing_thread* cgal_code_mesh_3(const CGAL::Image_3* pImage, const double edge_size, const double tet_shape, bool protect_features, + const bool protect_borders, const int manifold, const bool surface_only, bool detect_connected_components, diff --git a/SMDS_3/include/CGAL/Mesh_complex_3_in_triangulation_3.h b/SMDS_3/include/CGAL/Mesh_complex_3_in_triangulation_3.h index de6e11d647b..643de3ff7da 100644 --- a/SMDS_3/include/CGAL/Mesh_complex_3_in_triangulation_3.h +++ b/SMDS_3/include/CGAL/Mesh_complex_3_in_triangulation_3.h @@ -640,7 +640,7 @@ public: but are isolated from the complex at the end of the meshing process. This function removes these so-called \em isolated vertices, that belong to the - triangulation but not to any cell of the `C3T3`, from the triangulation. + triangulation but not to any simplex of the `C3T3`, from the triangulation. */ void remove_isolated_vertices() { @@ -669,7 +669,8 @@ public: std::vector isolated; for (Vertex_handle v : tr.finite_vertex_handles()) { - if (v->meshing_info() == 0.) + if (v->meshing_info() == 0. + && (v->in_dimension() > 1 || v->in_dimension() < 0)) isolated.push_back(v); } diff --git a/STL_Extension/doc/STL_Extension/CGAL/Compact_container.h b/STL_Extension/doc/STL_Extension/CGAL/Compact_container.h index dd409ee8f02..b11ee290e95 100644 --- a/STL_Extension/doc/STL_Extension/CGAL/Compact_container.h +++ b/STL_Extension/doc/STL_Extension/CGAL/Compact_container.h @@ -670,7 +670,7 @@ void clear(); bool owns(const_iterator pos); /*! - * returns whether `pos` is in the range `[cc.begin(), cc`.end())` (`cc.end()` excluded). + * returns whether `pos` is in the range `[cc.begin(), cc.end())` (`cc.end()` excluded). */ bool owns_dereferenceable(const_iterator pos); diff --git a/STL_Extension/doc/STL_Extension/CGAL/Concurrent_compact_container.h b/STL_Extension/doc/STL_Extension/CGAL/Concurrent_compact_container.h index 306595daf1e..389621e98af 100644 --- a/STL_Extension/doc/STL_Extension/CGAL/Concurrent_compact_container.h +++ b/STL_Extension/doc/STL_Extension/CGAL/Concurrent_compact_container.h @@ -294,8 +294,8 @@ complexity. No exception is thrown. /// returns whether `pos` is in the range `[ccc.begin(), ccc.end()]` (`ccc.end()` included). bool owns(const_iterator pos); /// returns whether `pos` is in the range `[ccc.begin(), ccc.end())` (`ccc.end()` excluded). - bool owns_dereferenceable(const_iterator pos); + bool owns_dereferencable(const_iterator pos); /// @} /// \name Merging diff --git a/STL_Extension/include/CGAL/STL_Extension/internal/parameters_interface.h b/STL_Extension/include/CGAL/STL_Extension/internal/parameters_interface.h index 19613250424..f7c37c95ab7 100644 --- a/STL_Extension/include/CGAL/STL_Extension/internal/parameters_interface.h +++ b/STL_Extension/include/CGAL/STL_Extension/internal/parameters_interface.h @@ -149,12 +149,12 @@ CGAL_add_named_parameter(mesh_facet_angle_t, mesh_facet_angle, mesh_facet_angle) CGAL_add_named_parameter(mesh_facet_distance_t, mesh_facet_distance, mesh_facet_distance) CGAL_add_named_parameter(mesh_facet_topology_t, mesh_facet_topology, mesh_facet_topology) CGAL_add_named_parameter(polyline_constraints_t, polyline_constraints, polyline_constraints) +CGAL_add_named_parameter(do_scale_t, do_scale, do_scale) CGAL_add_named_parameter(vertex_corner_map_t, vertex_corner_map, vertex_corner_map) CGAL_add_named_parameter(patch_normal_map_t, patch_normal_map, patch_normal_map) CGAL_add_named_parameter(region_primitive_map_t, region_primitive_map, region_primitive_map) CGAL_add_named_parameter(postprocess_regions_t, postprocess_regions, postprocess_regions) - // List of named parameters that we use in the package 'Surface Mesh Simplification' CGAL_add_named_parameter(get_cost_policy_t, get_cost_policy, get_cost) CGAL_add_named_parameter(get_placement_policy_t, get_placement_policy, get_placement) @@ -333,6 +333,8 @@ CGAL_add_named_parameter_with_compatibility(rng_t, rng, p_rng) CGAL_add_named_parameter_with_compatibility(null_subdomain_index_param_t,null_subdomain_index_param, null_subdomain_index) CGAL_add_named_parameter_with_compatibility(surface_patch_index_t, surface_patch_index, construct_surface_patch_index) CGAL_add_named_parameter_with_compatibility_ref_only(weights_param_t, weights_param, weights) +CGAL_add_named_parameter_with_compatibility(features_detector_param_t, features_detector_param, features_detector) +CGAL_add_named_parameter_with_compatibility(input_features_param_t, input_features_param, input_features) CGAL_add_named_parameter_with_compatibility(edge_size_param_t, edge_size_param, edge_size) CGAL_add_named_parameter_with_compatibility_ref_only(edge_sizing_field_param_t, edge_sizing_field_param, edge_sizing_field) diff --git a/Scripts/developer_scripts/list_cgal_workflows_last_run.sh b/Scripts/developer_scripts/list_cgal_workflows_last_run.sh new file mode 100755 index 00000000000..08552fafd12 --- /dev/null +++ b/Scripts/developer_scripts/list_cgal_workflows_last_run.sh @@ -0,0 +1,77 @@ +#!/bin/bash +echo "| repo | workflow | branch | event | runs on | status of last run | state | annotation | date | date since last runs | file |" +echo "| :--: | :--------: | :----: | :---: | :------: | :------------------: | :---: | :--------: | :----: | :------------------: | :----: |" +actualdate=$EPOCHSECONDS +for repo in $(gh api orgs/CGAL/repos --jq '.[].full_name' | grep -v dev ) +do + if [ "$repo" != "CGAL/CNRS" ] && [ "$repo" != "CGAL/GeometryFactory" ] + then + default_branch=$(gh api repos/$repo --jq '.default_branch') + workflows=$(gh api repos/$repo/actions/workflows) + workflows_count=$(jq '.total_count' <<< "$workflows") + for ((i=0;iis_counterclockwise_oriented()); + assert(it->is_clockwise_oriented()); } double lOffset = 0.25 ; @@ -75,13 +75,13 @@ int main( int argc, char* argv[] ) else { std::cerr << "Computes the interior offset of a polygon with holes and draws the result in an EPS file." << std::endl + << std::endl + << "Usage: show_offset_polygon [output_eps_file]" << std::endl << std::endl - << "Usage: show_offset_polygon [offset_distance] [output_eps_file]" << std::endl - << std::endl - << " intput_file Text file describing the input polygon with holes." << std::endl - << " (See inputfile_format.txt for details)" << std::endl - << " offset_distance [default=0.25]." << std::endl - << " output_file [default='innput_file.offset.eps']" << std::endl ; + << " input_file Text file describing the input polygon with holes." << std::endl + << " (See input_file_format.txt for details" << std::endl + << " or use input_file_example.txt)" << std::endl + << " output_file [default='input_file.offset.eps']" << std::endl ; } return 0; diff --git a/Straight_skeleton_2/examples/Straight_skeleton_2/Show_straight_skeleton.cpp b/Straight_skeleton_2/examples/Straight_skeleton_2/Show_straight_skeleton.cpp index 00a721fb5bf..080749ec962 100644 --- a/Straight_skeleton_2/examples/Straight_skeleton_2/Show_straight_skeleton.cpp +++ b/Straight_skeleton_2/examples/Straight_skeleton_2/Show_straight_skeleton.cpp @@ -42,7 +42,7 @@ int main( int argc, char* argv[] ) for(Polygon_with_holes::Hole_const_iterator it = input.holes_begin(); it != input.holes_end(); ++it){ - assert(it->is_counterclockwise_oriented()); + assert(it->is_clockwise_oriented()); } //check the validity of the input and fix orientation @@ -51,8 +51,6 @@ int main( int argc, char* argv[] ) std::cerr << "ERROR: outer boundary is not simple."; return 1; } - if ( input.outer_boundary().is_clockwise_oriented() ) - input.outer_boundary().reverse_orientation(); int k=0; for (Polygon_with_holes::Hole_iterator it = input.holes_begin(); it!=input.holes_end(); ++it, ++k) @@ -62,8 +60,6 @@ int main( int argc, char* argv[] ) std::cerr << "ERROR: hole "<< k << " is not simple.\n"; return 1; } - if (it->is_counterclockwise_oriented()) - it->reverse_orientation(); } Straight_skeleton_ptr ss = CGAL::create_interior_straight_skeleton_2(input); @@ -99,11 +95,12 @@ int main( int argc, char* argv[] ) { std::cerr << "Computes the straight skeleton in the interior of a polygon with holes and draws it in an EPS file." << std::endl << std::endl - << "Usage: show_straight_skeleton [output_eps_file]" << std::endl + << "Usage: show_straight_skeleton [output_eps_file]" << std::endl << std::endl - << " intput_file Text file describing the input polygon with holes." << std::endl - << " (See input_file_format.txt for details)" << std::endl - << " output_file [default='innput_file.skeleton.eps']" << std::endl ; + << " input_file Text file describing the input polygon with holes." << std::endl + << " (See input_file_format.txt for details" << std::endl + << " or use input_file_example.txt)" << std::endl + << " output_file [default='input_file.skeleton.eps']" << std::endl ; } return 0; diff --git a/Straight_skeleton_2/examples/Straight_skeleton_2/input_file_example.txt b/Straight_skeleton_2/examples/Straight_skeleton_2/input_file_example.txt new file mode 100644 index 00000000000..5797949b2bc --- /dev/null +++ b/Straight_skeleton_2/examples/Straight_skeleton_2/input_file_example.txt @@ -0,0 +1,11 @@ +4 +0 0 +1 0 +1 1 +0 1 +1 +4 +0.125 0.125 +0.125 0.875 +0.875 0.875 +0.875 0.125 \ No newline at end of file diff --git a/Subdivision_method_3/doc/Subdivision_method_3/PackageDescription.txt b/Subdivision_method_3/doc/Subdivision_method_3/PackageDescription.txt index 20a6e93a23c..4ee3a29276d 100644 --- a/Subdivision_method_3/doc/Subdivision_method_3/PackageDescription.txt +++ b/Subdivision_method_3/doc/Subdivision_method_3/PackageDescription.txt @@ -39,12 +39,21 @@ The page \ref bgl_namedparameters describes their usage. - `DQQMask_3` - `Sqrt3Mask_3` +\cgalCRPSection{Functions} +- `CGAL::Subdivision_method_3::PQQ()` +- `CGAL::Subdivision_method_3::PTQ()` +- `CGAL::Subdivision_method_3::DQQ()` +- `CGAL::Subdivision_method_3::Sqrt3()` +- `CGAL::Subdivision_method_3::CatmullClark_subdivision()` +- `CGAL::Subdivision_method_3::Loop_subdivision()` +- `CGAL::Subdivision_method_3::DooSabin_subdivision()` +- `CGAL::Subdivision_method_3::Sqrt3_subdivision()` + \cgalCRPSection{Classes} -- `CGAL::Subdivision_method_3` - `CGAL::CatmullClark_mask_3` - `CGAL::Loop_mask_3` - `CGAL::DooSabin_mask_3` - `CGAL::Sqrt3_mask_3` +- `CGAL::Linear_mask_3` */ - diff --git a/Subdivision_method_3/doc/Subdivision_method_3/examples.txt b/Subdivision_method_3/doc/Subdivision_method_3/examples.txt index 4cf879d4d09..06021185bf7 100644 --- a/Subdivision_method_3/doc/Subdivision_method_3/examples.txt +++ b/Subdivision_method_3/doc/Subdivision_method_3/examples.txt @@ -2,6 +2,7 @@ \example Subdivision_method_3/Customized_subdivision.cpp \example Subdivision_method_3/CatmullClark_subdivision.cpp \example Subdivision_method_3/DooSabin_subdivision.cpp +\example Subdivision_method_3/Linear_subdivision.cpp \example Subdivision_method_3/Loop_subdivision.cpp \example Subdivision_method_3/Sqrt3_subdivision.cpp */ diff --git a/Subdivision_method_3/examples/Subdivision_method_3/Linear_subdivision.cpp b/Subdivision_method_3/examples/Subdivision_method_3/Linear_subdivision.cpp new file mode 100644 index 00000000000..a9314fb937a --- /dev/null +++ b/Subdivision_method_3/examples/Subdivision_method_3/Linear_subdivision.cpp @@ -0,0 +1,34 @@ +#include + +#include +#include + +#include + +#include +#include + +typedef CGAL::Simple_cartesian Kernel; +typedef CGAL::Surface_mesh Surface_mesh; + +namespace PMP = CGAL::Polygon_mesh_processing; + +int main(int argc, char* argv[]) { + + const std::string filename = (argc > 1) ? argv[1] : CGAL::data_file_path("meshes/quad.off"); + + Surface_mesh mesh; + if(!PMP::IO::read_polygon_mesh(filename, mesh)) + { + std::cerr << "Invalid input." << std::endl; + return 1; + } + + CGAL::Linear_mask_3 mask(&mesh); + CGAL::Subdivision_method_3::PQQ(mesh, mask, CGAL::parameters::number_of_iterations(1)); + + std::ofstream out("out.off"); + out << mesh; + + return 0; +} diff --git a/Subdivision_method_3/include/CGAL/Subdivision_method_3/internal/subdivision_hosts_impl_3.h b/Subdivision_method_3/include/CGAL/Subdivision_method_3/internal/subdivision_hosts_impl_3.h index 476f8796db4..93141445a65 100644 --- a/Subdivision_method_3/include/CGAL/Subdivision_method_3/internal/subdivision_hosts_impl_3.h +++ b/Subdivision_method_3/include/CGAL/Subdivision_method_3/internal/subdivision_hosts_impl_3.h @@ -81,6 +81,7 @@ void PQQ_1step(Poly& p, VertexPointMap vpm, Mask mask) { int i=0; std::unordered_map v_index; for(vertex_descriptor vh : p_vertices){ + vertex_point_buffer[i] = get(vpm, vh); v_index[vh]= i++; } 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 b80a511a262..af0d0d3e22a 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 @@ -88,7 +88,7 @@ public: public: Linear_mask_3(Mesh* pmesh) - : Base(pmesh, get(vertex_point, pmesh)) + : Base(pmesh, get(vertex_point, *pmesh)) { } Linear_mask_3(Mesh* pmesh, VertexPointMap vpmap) @@ -118,7 +118,7 @@ public: } void border_node(halfedge_descriptor edge, Point& ept, Point& /*vpt*/){ - edge_node(edge, ept); + edge_node(edge, ept); } }; diff --git a/Subdivision_method_3/include/CGAL/Subdivision_method_3/subdivision_methods_3.h b/Subdivision_method_3/include/CGAL/Subdivision_method_3/subdivision_methods_3.h index c84f688703b..4aebef94d49 100644 --- a/Subdivision_method_3/include/CGAL/Subdivision_method_3/subdivision_methods_3.h +++ b/Subdivision_method_3/include/CGAL/Subdivision_method_3/subdivision_methods_3.h @@ -74,6 +74,7 @@ Catmull-Clark subdivision. \sa `CGAL::DooSabin_mask_3` +\sa `CGAL::Linear_mask_3` */ /// @{ @@ -121,7 +122,6 @@ void CatmullClark_subdivision(PolygonMesh& pmesh, int step) { * \cgalParamNEnd * \cgalNamedParamsEnd * - * \pre `pmesh` must be a triangle mesh. **/ template void CatmullClark_subdivision(PolygonMesh& pmesh, const NamedParameters& np = parameters::default_values()) { @@ -179,6 +179,8 @@ void Loop_subdivision(PolygonMesh& pmesh, int step) { * \cgalParamDefault{`1`} * \cgalParamNEnd * \cgalNamedParamsEnd + * + * \pre `pmesh` must be a triangle mesh. **/ template void Loop_subdivision(PolygonMesh& pmesh, const NamedParameters& np = parameters::default_values()) { diff --git a/Surface_mesh/doc/Surface_mesh/Surface_mesh.txt b/Surface_mesh/doc/Surface_mesh/Surface_mesh.txt index 68ffffa3ee8..82555e4488c 100644 --- a/Surface_mesh/doc/Surface_mesh/Surface_mesh.txt +++ b/Surface_mesh/doc/Surface_mesh/Surface_mesh.txt @@ -77,11 +77,20 @@ they were created must be used to obtain this information. \subsection usage_example Example -The following example shows how to create a very simple `Surface_mesh` +The first example shows how to create a very simple `Surface_mesh` by adding 2 faces, and how to check that a face is correctly added to the mesh. \cgalExample{Surface_mesh/check_orientation.cpp} + +The second example shows how to access the points associated +to the vertices, either for an individual vertex, or as +the range of points of the entire mesh. Such a range can +be accessed in a for-loop or passed to functions that expect +a range of points as input. + +\cgalExample{Surface_mesh/sm_points.cpp} + \section sectionSurfaceMeshConnectivity Connectivity A surface mesh is an edge-centered data structure capable of diff --git a/Surface_mesh/doc/Surface_mesh/dependencies b/Surface_mesh/doc/Surface_mesh/dependencies index f065be3be0a..a0c74ee9da6 100644 --- a/Surface_mesh/doc/Surface_mesh/dependencies +++ b/Surface_mesh/doc/Surface_mesh/dependencies @@ -4,6 +4,7 @@ Algebraic_foundations BGL Box_intersection_d Circulator +Convex_hull_3 HalfedgeDS Kernel_23 Miscellany @@ -11,4 +12,3 @@ Polyhedron Polygon_mesh_processing STL_Extension Stream_support - diff --git a/Surface_mesh/doc/Surface_mesh/examples.txt b/Surface_mesh/doc/Surface_mesh/examples.txt index 4087a68d44f..cd0b6a6addf 100644 --- a/Surface_mesh/doc/Surface_mesh/examples.txt +++ b/Surface_mesh/doc/Surface_mesh/examples.txt @@ -1,5 +1,6 @@ /*! \example Surface_mesh/check_orientation.cpp +\example Surface_mesh/sm_points.cpp \example Surface_mesh/sm_iterators.cpp \example Surface_mesh/sm_circulators.cpp \example Surface_mesh/sm_properties.cpp diff --git a/Surface_mesh/examples/Surface_mesh/CMakeLists.txt b/Surface_mesh/examples/Surface_mesh/CMakeLists.txt index 9c693ffaa08..b39506d8b45 100644 --- a/Surface_mesh/examples/Surface_mesh/CMakeLists.txt +++ b/Surface_mesh/examples/Surface_mesh/CMakeLists.txt @@ -12,6 +12,7 @@ project(Surface_mesh_Examples) #CGAL_Qt5 is needed for the drawing. find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5) +create_single_source_cgal_program("sm_points.cpp") create_single_source_cgal_program("sm_derivation.cpp") create_single_source_cgal_program("sm_join.cpp") create_single_source_cgal_program("sm_aabbtree.cpp") diff --git a/Surface_mesh/examples/Surface_mesh/sm_iterators.cpp b/Surface_mesh/examples/Surface_mesh/sm_iterators.cpp index c5df80646f2..6f5270b76cf 100644 --- a/Surface_mesh/examples/Surface_mesh/sm_iterators.cpp +++ b/Surface_mesh/examples/Surface_mesh/sm_iterators.cpp @@ -46,7 +46,8 @@ int main() // or with boost::tie, as the CGAL range derives from std::pair for(boost::tie(vb, ve) = m.vertices(); vb != ve; ++vb){ - std::cout << *vb << std::endl; + // Print vertex index and vertex coordinates + std::cout << *vb << " " << m.point(*vb) << std::endl; } // Instead of the classical for loop one can use diff --git a/Surface_mesh/examples/Surface_mesh/sm_points.cpp b/Surface_mesh/examples/Surface_mesh/sm_points.cpp new file mode 100644 index 00000000000..345ab3f514f --- /dev/null +++ b/Surface_mesh/examples/Surface_mesh/sm_points.cpp @@ -0,0 +1,35 @@ +#include +#include +#include + +typedef CGAL::Simple_cartesian K; +typedef CGAL::Surface_mesh Mesh; +typedef Mesh::Vertex_index vertex_descriptor; +typedef Mesh::Face_index face_descriptor; + +int main() +{ + Mesh m; + vertex_descriptor v0 = m.add_vertex(K::Point_3(0,0,0)); + vertex_descriptor v1 = m.add_vertex(K::Point_3(1,0,0)); + vertex_descriptor v2 = m.add_vertex(K::Point_3(0,1,0)); + vertex_descriptor v3 = m.add_vertex(K::Point_3(0,0,1)); + + face_descriptor fd = m.add_face(v0, v1, v2); + m.add_face(v1, v0, v3); + + // Access the point for a given vertex + for(vertex_descriptor vd : vertices_around_face(m.halfedge(fd), m)){ + std ::cout << m.point(vd) << std::endl; + } + + // Access the range of all points of the mesh + for( const K::Point_3& p : m.points()){ + std::cout << p << std::endl; + } + + Mesh ch; + CGAL::convex_hull_3(m.points().begin(), m.points().end(), ch); + + return 0; +} diff --git a/Surface_mesh/examples/Surface_mesh/sm_properties.cpp b/Surface_mesh/examples/Surface_mesh/sm_properties.cpp index 6cb870f6194..d771ad492fd 100644 --- a/Surface_mesh/examples/Surface_mesh/sm_properties.cpp +++ b/Surface_mesh/examples/Surface_mesh/sm_properties.cpp @@ -2,6 +2,7 @@ #include #include +#include typedef CGAL::Simple_cartesian K; typedef CGAL::Surface_mesh Mesh; @@ -25,7 +26,7 @@ int main() // give each vertex a name, the default is empty Mesh::Property_map name; bool created; - boost::tie(name, created) = m.add_property_map("v:name",""); + boost::tie(name, created) = m.add_property_map("v:name","m1"); assert(created); // add some names to the vertices name[v0] = "hello"; @@ -51,14 +52,34 @@ int main() std::cout << name[vd] << " @ " << location[vd] << std::endl; } + Mesh m2; + CGAL::make_triangle(K::Point_3(0,0,1), K::Point_3(1,0,1),K::Point_3(0,1,1), m2); + + m2.add_property_map("v:name","m2"); + Mesh::Property_map index; + index = m2.add_property_map("v:index",-1).first; + int i = 0; + for (auto v : vertices(m2)) { + index[v] = i++; + } + + std::cout << "properties of m1:" << std::endl; std::vector props = m.properties(); for(std::string p : props){ std::cout << p << std::endl; } + m.join(m2); + std::cout << "properties of m1 after join:" << std::endl; + for(std::string p : m.properties()){ + std::cout << p << std::endl; + } + + for (auto v : vertices(m)) { + std::cout << name[v] << std::endl; + } // delete the string property again m.remove_property_map(name); return 0; } - diff --git a/Surface_mesh/include/CGAL/Surface_mesh/Surface_mesh.h b/Surface_mesh/include/CGAL/Surface_mesh/Surface_mesh.h index ea1f3f048f9..47232cbabd5 100644 --- a/Surface_mesh/include/CGAL/Surface_mesh/Surface_mesh.h +++ b/Surface_mesh/include/CGAL/Surface_mesh/Surface_mesh.h @@ -1215,6 +1215,10 @@ public: fprops_.resize(nfaces); } + /// copies the simplices from `other`, and copies values of + /// properties that already exist under the same name in `*this`. + /// In case `*this` has a property that does not exist in `other` + /// the copied simplices get the default value of the property. bool join(const Surface_mesh& other) { // increase capacity diff --git a/Triangulation_2/doc/Triangulation_2/CGAL/Constrained_Delaunay_triangulation_2.h b/Triangulation_2/doc/Triangulation_2/CGAL/Constrained_Delaunay_triangulation_2.h index a66b36fa52b..d0c228c5880 100644 --- a/Triangulation_2/doc/Triangulation_2/CGAL/Constrained_Delaunay_triangulation_2.h +++ b/Triangulation_2/doc/Triangulation_2/CGAL/Constrained_Delaunay_triangulation_2.h @@ -191,8 +191,6 @@ Inserts the line segment between the points `c.first` and `c.second` as a const /*! Inserts the line segment whose endpoints are the vertices `va` and `vb` as a constraint in the triangulation. -\pre `va` != `vb`. - */ void insert_constraint(Vertex_handle va, Vertex_handle vb); @@ -224,7 +222,10 @@ std::size_t insert_constraints(ConstraintIterator first, ConstraintIterator last Same as above except that each constraints is given as a pair of indices of the points in the range [points_first, points_last). The indices must go from 0 to `std::distance(points_first, points_last)` \tparam PointIterator is an `InputIterator` with the value type `Point`. -\tparam IndicesIterator is an `InputIterator` with `std::pair` where `Int` is an integral type implicitly convertible to `std::size_t` +\tparam IndicesIterator is an `InputIterator` with `std::pair` +where `Int` is an integral type implicitly convertible to `std::size_t` +\note points are inserted even if they are not endpoint of a constraint. +\return the number of inserted points. */ template std::size_t insert_constraints(PointIterator points_first, PointIterator points_last, diff --git a/Triangulation_2/doc/Triangulation_2/CGAL/Constrained_triangulation_plus_2.h b/Triangulation_2/doc/Triangulation_2/CGAL/Constrained_triangulation_plus_2.h index f1471a76acb..3318770f962 100644 --- a/Triangulation_2/doc/Triangulation_2/CGAL/Constrained_triangulation_plus_2.h +++ b/Triangulation_2/doc/Triangulation_2/CGAL/Constrained_triangulation_plus_2.h @@ -22,11 +22,17 @@ point. The data structure maintains for each input constraint -the sequence of vertices on this constraint. These vertices are +the sequence of vertices on this constraint. Note that there is +not a one-to-one correspondence between an input constraint and +the sequence of vertices. These vertices are either vertices of the input constraint or intersection points. +Also consecutive identical points in the input constraint +result in a single vertex in the sequence of vertices on this +constraint. In case of an input constraint being degenerate +to a point, this point is inserted but there will not be a +zero length constraint. -\todo The following description does not match the code -Two consecutive vertices of an input constraint form a *subconstraint*. +Two consecutive vertices of a constraint form a *subconstraint*. A subconstraint is a pair of vertex handles and corresponds to a constrained edge of the triangulation, which is a pair of a face handle and an index. @@ -36,7 +42,8 @@ It further enables the retrieval of the set of input constraints that induce a s As it is straightforward to obtain a subconstraint from a constrained edge `e`, one can obtain the input constraints which induce `e`. -\tparam Tr must be either a CGAL::Constrained_triangulation_2 or a CGAL::Constrained_Delaunay_triangulation_2 + +\tparam Tr must be either a `CGAL::Constrained_triangulation_2` or a `CGAL::Constrained_Delaunay_triangulation_2` \sa `CGAL::Constrained_triangulation_2` \sa `CGAL::Constrained_Delaunay_triangulation_2` @@ -242,12 +249,14 @@ insert(PointIterator first, PointIterator last); /*! inserts the constraint segment `ab` in the triangulation. If the two points are equal the point is inserted but no constraint, -and the default constructed `Constraint_id` is returned. +and a default constructed `Constraint_id` is returned. */ Constraint_id insert_constraint(Point a, Point b); /*! -inserts the constraint `c`. +inserts the constraint `c` in the triangulation. +If the two points are equal the point is inserted but no constraint, +and a default constructed `Constraint_id` is returned. */ void push_back(const std::pair& c); @@ -255,7 +264,7 @@ inserts the constraint `c`. inserts a constraint whose endpoints are the vertices pointed by `va` and `vb` in the triangulation. If the two vertex handles are equal no constraint is inserted, -and the default constructed `Constraint_id` is returned. +and a default constructed `Constraint_id` is returned. */ Constraint_id insert_constraint(Vertex_handle va, Vertex_handle vb); @@ -264,9 +273,10 @@ inserts a polyline defined by the points in the range `[first,last)` and returns the constraint id. The polyline is considered as a closed curve if the first and last point are equal or if `close == true`. This enables for example passing the vertex range of a `Polygon_2`. When traversing the vertices of a closed polyline constraint with a `Vertices_in_constraint_iterator` the first and last vertex are the same. -In case the range is empty `Constraint_id()` is returned. -In case all points are equal the point is inserted but no constraint, -and `Constraint_id()` is returned. +In case the range is empty a default constructed `Constraint_id` is returned. +In case the range contains only one point or all points are equal the point is inserted but no constraint, +and a default constructed `Constraint_id` is returned. + \tparam PointIterator must be an `InputIterator` with the value type `Point`. */ template < class PointIterator> @@ -280,9 +290,12 @@ is used to improve efficiency. More precisely, all endpoints are inserted prior to the segments and according to the order provided by the spatial sort. Once endpoints have been inserted, the segments are inserted in the order of the input iterator, using the vertex handles of its endpoints. +In case the constraints are degenerate the points are inserted, but no +constraints. + +\tparam ConstraintIterator must be an `InputIterator` with the value type `std::pair` or `Segment`. \return the number of inserted points. -\tparam ConstraintIterator must be an `InputIterator` with the value type `std::pair` or `Segment`. */ template std::size_t insert_constraints(ConstraintIterator first, ConstraintIterator last); @@ -291,7 +304,11 @@ std::size_t insert_constraints(ConstraintIterator first, ConstraintIterator last Same as above except that each constraint is given as a pair of indices of the points in the range [points_first, points_last). The indices must go from 0 to `std::distance(points_first, points_last)` \tparam PointIterator is an `InputIterator` with the value type `Point`. -\tparam IndicesIterator is an `InputIterator` with `std::pair` where `Int` is an integral type implicitly convertible to `std::size_t` +\tparam IndicesIterator is an `InputIterator` with `std::pair` where `Int` is an integral type implicitly convertible to +`std::size_t` +\note points are inserted even if they are not endpoint of a constraint. +\return the number of inserted points. */ template std::size_t insert_constraints(PointIterator points_first, PointIterator points_last, diff --git a/Triangulation_2/doc/Triangulation_2/PackageDescription.txt b/Triangulation_2/doc/Triangulation_2/PackageDescription.txt index c15ba1ed8ed..65b8c9137e4 100644 --- a/Triangulation_2/doc/Triangulation_2/PackageDescription.txt +++ b/Triangulation_2/doc/Triangulation_2/PackageDescription.txt @@ -103,6 +103,10 @@ are described in Chapter \ref PkgTDS2Ref "2D Triangulation Data Structure". - `CGAL::Triangulation_cw_ccw_2` +\cgalCRPSection{Functions} + +- `CGAL::mark_domain_in_triangulation()` + \cgalCRPSection{Enum} - \link CGAL::Triangulation_2::Locate_type `CGAL::Triangulation_2::Locate_type` \endlink diff --git a/Triangulation_2/include/CGAL/Constrained_Delaunay_triangulation_2.h b/Triangulation_2/include/CGAL/Constrained_Delaunay_triangulation_2.h index 1cd06e3afbf..3c5ee85b923 100644 --- a/Triangulation_2/include/CGAL/Constrained_Delaunay_triangulation_2.h +++ b/Triangulation_2/include/CGAL/Constrained_Delaunay_triangulation_2.h @@ -431,6 +431,9 @@ public: IndicesIterator indices_first, IndicesIterator indices_beyond) { + if(indices_first == indices_beyond){ + return insert(points_first, points_beyond); + } std::vector points(points_first, points_beyond); return internal::insert_constraints(*this,points, indices_first, indices_beyond); } diff --git a/Triangulation_2/include/CGAL/Constrained_triangulation_2.h b/Triangulation_2/include/CGAL/Constrained_triangulation_2.h index 80d7a197e3e..42867cfbb07 100644 --- a/Triangulation_2/include/CGAL/Constrained_triangulation_2.h +++ b/Triangulation_2/include/CGAL/Constrained_triangulation_2.h @@ -828,6 +828,9 @@ insert_constraint(Vertex_handle vaa, Vertex_handle vbb) // if a vertex vc of t lies on segment ab // or if ab intersect some constrained edges { + if(vaa == vbb){ + return; + } std::stack > stack; stack.push(std::make_pair(vaa,vbb)); diff --git a/Triangulation_2/include/CGAL/Triangulation_2/insert_constraints.h b/Triangulation_2/include/CGAL/Triangulation_2/insert_constraints.h index 43731c7543a..dc08e642db7 100644 --- a/Triangulation_2/include/CGAL/Triangulation_2/insert_constraints.h +++ b/Triangulation_2/include/CGAL/Triangulation_2/insert_constraints.h @@ -34,7 +34,7 @@ namespace CGAL { IndicesIterator indices_beyond ) { if(indices_first == indices_beyond){ - return 0; + return t.insert(points.begin(), points.end()); } typedef typename T::Vertex_handle Vertex_handle; typedef typename T::Face_handle Face_handle; diff --git a/Triangulation_2/include/CGAL/Triangulation_2/internal/Polyline_constraint_hierarchy_2.h b/Triangulation_2/include/CGAL/Triangulation_2/internal/Polyline_constraint_hierarchy_2.h index 7178b1dc5fa..8154e26251c 100644 --- a/Triangulation_2/include/CGAL/Triangulation_2/internal/Polyline_constraint_hierarchy_2.h +++ b/Triangulation_2/include/CGAL/Triangulation_2/internal/Polyline_constraint_hierarchy_2.h @@ -334,7 +334,7 @@ copy(const Polyline_constraint_hierarchy_2& ch1, std::mapskip_begin(), end = hvl1->skip_end(); - for( ; vit != end; ++vit) hvl2->push_back(Node(vmap[*vit])); + for( ; vit != end; ++vit) hvl2->push_back(Node(vmap[*vit], vit.input())); constraint_set.insert(hvl2); } // copy sc_to_c_map diff --git a/Triangulation_2/test/Triangulation_2/issue_7328.cpp b/Triangulation_2/test/Triangulation_2/issue_7328.cpp new file mode 100644 index 00000000000..842145402fc --- /dev/null +++ b/Triangulation_2/test/Triangulation_2/issue_7328.cpp @@ -0,0 +1,28 @@ +#include +#include +#include + +typedef CGAL::Exact_predicates_exact_constructions_kernel EPECK; + +typedef CGAL::Exact_intersections_tag Itag; +typedef CGAL::Constrained_Delaunay_triangulation_2 CDT; +typedef CGAL::Constrained_triangulation_plus_2 CDTplus; +typedef CDT::Vertex_handle Vertex_handle; + +int main() { + CDTplus cdt; + std::vector vertices; + vertices.push_back(cdt.insert(EPECK::Point_2(0.867732088229836496, -1.098635766973843797))); + vertices.push_back(cdt.insert(EPECK::Point_2(0.868834588233415861, -1.100000000000000533))); + vertices.push_back(cdt.insert(EPECK::Point_2(0.729063637498132522, -0.927047486193771419))); + vertices.push_back(cdt.insert(EPECK::Point_2(0.760857518227448626, -0.918203415668045420))); + + cdt.insert_constraint(vertices[0], vertices[2]); + cdt.insert_constraint(vertices[0], vertices[3]); + + CDTplus cdtC = cdt; + + EPECK::Point_2 p(0.868834588233415861, -1.100000000000000533), q(0.729063637498132522, -0.927047486193771419); + cdtC.insert_constraint(p,q); + return 0; +} diff --git a/copyright b/copyright index 876931746d3..77776695009 100644 --- a/copyright +++ b/copyright @@ -9,18 +9,22 @@ R = RU Groningen AABB_tree I + Advancing_front_surface_reconstruction I Algebraic_foundations ETIMU Algebraic_kernel_d IM Algebraic_kernel_for_circles I Algebraic_kernel_for_spheres I Alpha_shapes_2 I Alpha_shapes_3 I + Alpha_wrap_3 I Google LLC (USA). Apollonius_graph_2 I Approximate_min_ellipsoid_d E Arithmetic_kernel M Arrangement_on_surface_2 T + Barycentric_coordinates_2 IG; Università della Svizzera italiana (Switzerland) BGL G Boolean_set_operations_2 T + Bounding_volumes E Box_intersection_d M CGAL_Core NYU; Chee Yap agreed to upgrade CGAL_ImageIO third party lib under LGPL @@ -29,7 +33,9 @@ R = RU Groningen Circular_kernel_2 I Circular_kernel_3 I Circulator ETIMU - Combinatorial_map Cnrs; Guillaume Damiand upgraded + Classification G + Combinatorial_map CNRS; Guillaume Damiand upgraded + Cone_spanners_2 University of Western Sydney (Australia) Conic_2 ETIMU Convex_decomposition_3 M Convex_hull_2 M @@ -41,24 +47,28 @@ R = RU Groningen Envelope_2 T Envelope_3 T Filtered_kernel I + Generalized_map CNRS Generator ETIMU Geomview ETIMU GraphicsView G HalfedgeDS ETIMU Hash_map M + Heat_method_3 G; Carnegie Mellon University Homogeneous_kernel ETIMU + Hyperbolic_triangulation_2 I + Inscribed_areas ET Installation ETIMU Interpolation I Intersections_2 ETIMU Intersections_3 ETIMU Interval_skip_list G Interval_support M - Inventor ETIMU Jet_fitting_3 I Kernel_23 ETIMU Kernel_d ETIMU LEDA ETIMU Largest_empty_rect_2 T + Linear_cell_complex CNRS MacOSX F Maintenance ETIMUG Manual ETIMU @@ -66,6 +76,7 @@ R = RU Groningen Matrix_search E Mesh_2 I Mesh_3 I + Mesher_level I Min_annulus_d E Min_circle_2 E Min_ellipse_2 E @@ -79,48 +90,80 @@ R = RU Groningen Nef_2 M Nef_3 M Nef_S2 M + NewKernel_d I Number_types ETIMU OpenNL third party lib under LGPL 3 + Optimal_bounding_box G + Optimal_transportation_reconstruction_2 I Optimisation_basic E Optimisation_doc E + Orthtree I Partition_2 M + Periodic_2_triangulation_2 I Periodic_3_triangulation_3 I + Periodic_3_mesh_3 I + Periodic_4_hyperbolic_triangulation_2 I Point_set_2 Halle transfered copyright to Inria + Point_set_3 G Point_set_processing_3 I Poisson_surface_reconstruction_3 I Polygon ETIMU + Polygonal_surface_reconstruction Liangliang Nan + Polygon_mesh_processing G Polyhedron E - Polyhedron_IO E + Polyline_simplification_2 G Polynomial M Polytope_distance_d E Principal_component_analysis I + Principal_component_analysis_LGPL I Profiling_tools ETIMU + Property_map I QP_solver E - Qt_widget I Random_numbers ETIMU Ridges_3 I - Robustness M + Scale_space_reconstruction_3 I STL_Extension ETIMU Scripts ETIMU SearchStructures E Segment_Delaunay_graph_2 I Menelaos removed Notre Dame U + Segment_Delaunay_graph_Linf_2 Università della Svizzera italiana Set_movable_separability_2 T + Shape_detection I + Shape_regularization GI Skin_surface_3 R Gert Vegter agreed to upgrade + SMDS_3 I Snap_rounding_2 T + Solver_interface I Spatial_searching U Spatial_sorting I - Straight_skeleton_2 Cacciola; Fernando agreed to upgrade to GPL + STL_Extension ETIMU + Straight_skeleton_2 G Stream_lines_2 I Stream_support ETIMU Subdivision_method_3 G - Surface_mesh_parameterization I - Surface_mesh_simplification G + Surface_mesh G; Bielefeld University; RWTH Aachen + Surface_mesh_approximation I + Surface_mesh_deformation G Surface_mesher I + Surface_mesh_parameterization I + Surface_mesh_segmentation G + Surface_mesh_shortest_path G + Surface_mesh_simplification G + Surface_mesh_skeletonization G + Surface_mesh_topology CNRS + Surface_sweep_2 T + TDS_2 I + TDS_3 I Testsuite IG + Tetrahedral_remeshing G; Telecom Paris (France) + Triangulation I Triangulation_2 I Triangulation_3 I + Triangulation_on_sphere_2 I Union_find M + Visibility_2 Braunschweig University (Germany). Voronoi_diagram_2 F I sent mail to Forth + Weights G Width_3 E iostream ETIMU kdtree T